gbutils/0000755000176200001440000000000015121032571011720 5ustar liggesusersgbutils/tests/0000755000176200001440000000000015102634161013064 5ustar liggesusersgbutils/tests/testthat/0000755000176200001440000000000015121032571014722 5ustar liggesusersgbutils/tests/testthat/test-isNA.R0000644000176200001440000000053715102634161016663 0ustar liggesuserstest_that("isNA works", { expect_identical(isNA(list(NA)), FALSE) # not atomic expect_identical(isNA(c(NA, NA)), FALSE) # length > 1 expect_identical(isNA(1), FALSE) # not NA expect_identical(isNA(NA), TRUE) expect_identical(isNA(NA_integer_), TRUE) expect_identical(isNA(NA_real_), TRUE) }) gbutils/tests/testthat/test-poly.R0000644000176200001440000000236415102634161017014 0ustar liggesuserstest_that("rpoly works ok", { ## z-1 expect_equal(rpoly(real = 1), c(-1,1)) ## roots 1, i, -i; p3(z) = (z-1)(z-i)(z+i) p3 <- rpoly(c(1, 1i)) p3 ## using polar for the complex roots (i = e^(i pi/2)) p3a <- rpoly(1, pi/2, real = 1) expect_equal(p3a, c(-1, 1, -1, 1)) ## mathematically, p3a is the same as p3 ## but the numerical calculation here gives a slight discrepancy ## p3a == p3 # [1] TRUE FALSE FALSE TRUE ## p3a - p3 # [1] 0.000000e+00 2.220446e-16 -2.220446e-16 0.000000e+00 ## Note: expect_equal ignores this small difference ## using argpi = TRUE is somewhat more precise: ## p3b <- rpoly(1, 1/2, real = 1, argpi = TRUE) ## p3b ## expect_equal(p3b, c(-1, 1, -1, 1)) ## p3b == p3 # [1] TRUE TRUE TRUE TRUE ## p3b - p3 # [1] 0 0 0 0 ## ## indeed, in this case the results for p3b and p3 are identical: ## identical(p3b, p3) # TRUE ## two ways to expand (z - 2*exp(i*pi/4))(z - 2*exp(-i*pi/4)) rpoly(2, pi/4) rpoly(2, 1/4, argpi = TRUE) ## set the constant term to 1; can be used, say, for AR models rpoly(2, pi/4, monic = FALSE) rpoly(2, 1/4, argpi = TRUE, monic = FALSE) }) gbutils/tests/testthat/test-missing_arg.R0000644000176200001440000000020515102634161020323 0ustar liggesuserstest_that("missing_arg works", { lmargs <- formals(lm) class(lmargs) # pairlist expect_true(missing_arg(lmargs$data)) }) gbutils/tests/testthat.R0000644000176200001440000000007215102634161015046 0ustar liggesuserslibrary(testthat) library(gbutils) test_check("gbutils") gbutils/MD50000644000176200001440000000436015121032571012233 0ustar liggesusers69faab4427600681fff675a4c1469cd5 *DESCRIPTION 532a775775a50b3da0a9f061da399f24 *NAMESPACE 3d25bf03cd1694e86e15c19a50ee8583 *NEWS.md 8ab411de250851f8de9d2c5803aebd09 *R/S4utils.R 4dfd508726d4d7ac4a83e778b9045a22 *R/args.R eefc1e8cd00d2c71f482e5d861641097 *R/cdf2qf.R 6f26c9bf76ae12adb0bbfec05f656064 *R/history.R a4f8dc9f80b4310e46d99693ecf76f9e *R/isNA.R df87d44b450bbd135752d8abc758dc47 *R/mintersect.R 22f64f916c2920b48e0505fb4407c500 *R/pad.R 1c4e1f551bdb5687aab77cbe0ef690c9 *R/parse_text.R 8af1fad75af507e25fc2ed84228d434d *R/pseudoInverse.R af69f105cb1da5e07b00159531194e9e *R/rpoly.R e6ece8bd36434639c48a59356526c5f1 *R/sim_numbers.R 40cf8b5be97902dada0bb54c5f1cfc47 *README.md e4def518ec4ac66446db013f0a8b0d40 *TODO 5d1b26dccdebc87f9a55ffdf108d211e *build/partial.rdb 277717e1fedeff245b07e608d5dada5c *build/vignette.rds 0ebc687753f5e512c2f0276275daefc3 *inst/REFERENCES.bib 31e78f81e4facebeb081ea29cd7a1fb1 *inst/doc/Plot_pdf.R b35d48ca7c9fffc94e9d16aa1beca62b *inst/doc/Plot_pdf.Rnw b4fd45e5b9900f8f3bde0a74f65baf36 *inst/doc/Plot_pdf.pdf 5f6bff1f73947d742c78e57ec3539a95 *inst/pkgdown.yml 4f526d86955190e00ad5f1272bb6ba68 *man/adjacencyOfClasses.Rd e7f49ca31cc3ccec8f643da536462c8d *man/cdf2quantile.Rd 3b5ae25985aea47aa67b3bedca751409 *man/isNA.Rd ef80dc26942c6ebd9d9fc3284237116d *man/isargunnamed.Rd 74bf791d3317750780d1e238154c8ac5 *man/mintersect.Rd 7aea6f6c53e8892f40e8e0c2837ba1f9 *man/missing_arg.Rd 14eb84b323fd6f3fc79258ae589efbd0 *man/myouter.Rd 73e6d0054d987b66affdfcb4402825a9 *man/nposargs.Rd 7446ed95d813cf26feb1fc28e497cada *man/objectPad-class.Rd f06b5de9d4d8064f3ebc6e146d102dad *man/pad-methods.Rd 1f612db7641b6a0aaefae8bc82a9c07f *man/parse_text.Rd d924baea827eb5de2ba4bd63fb32ca40 *man/plotpdf.Rd c92aae123f70451203e4099bc93f6b1d *man/pseudoInverse.Rd e0a1be4a490ba3615ab398f8066505b1 *man/raw_history.Rd 4ebad589a285bf2b9ba45e55bd3947ce *man/rpoly.Rd 44d5ebc28bd0b4bebd5546e76bc50d88 *man/sim_complex.Rd 24c37b9ed90d3f528370b0593ec34b6f *man/sim_numbers.Rd dbb53d28a1fb16e6de3b4563d83fdb87 *tests/testthat.R 9d7f56c495f2c960fe22a0fe5a31f81e *tests/testthat/test-isNA.R f4711c7c4912ed6f813145644d5e2ab6 *tests/testthat/test-missing_arg.R 49dd86ef70e6a35497a84bc16f814cf0 *tests/testthat/test-poly.R b35d48ca7c9fffc94e9d16aa1beca62b *vignettes/Plot_pdf.Rnw gbutils/R/0000755000176200001440000000000015102634161012123 5ustar liggesusersgbutils/R/pseudoInverse.R0000644000176200001440000000052315102634161015101 0ustar liggesusers## moved here from package mixAR pseudoInverse <- function(a, tol = 1e-7){ # todo: think about the default for 'tol'. asvd <- svd(a) asvd$d[asvd$d < tol] <- Inf # so that 1/Inf = 0, see below if(length(asvd$d)>1) asvd$v %*% diag(1/asvd$d) %*% t(asvd$u) else asvd$v %*% t(asvd$u) / asvd$d # krapka } gbutils/R/cdf2qf.R0000644000176200001440000000163315102634161013416 0ustar liggesusers## 2017-10-04 - moved =plotpdf= and cdf2q from mixAR to qbutils. ## 2017-10-05 - renamed cdf2q to cdf2quantile plotpdf <- function(pdf, qdf, cdf, lq = 0.01, uq = 0.99, ...){ if(missing(qdf) && !missing(cdf)) qdf <- function(q){ cdf2quantile(q, cdf) } from <- qdf(lq) to <- qdf(uq) plot(pdf, from = from, to = to, ...) } ## 2017-10-04 - new arguments interval, lower, upper cdf2quantile <- function(p, cdf, interval = c(-3, 3), lower = min(interval), upper = max(interval), ...){ f <- function(x, ...){ cdf(x, ...) - p } ## 2017-10-04 was: limits <- c(-10000,10000) ## wrk <- uniroot(f, limits, ...) wrk <- uniroot(f, lower = lower, upper = upper, extendInt = "upX", ...) res <- wrk$root # 2012-10-17 commented out: cat("res is: ", res, "\n") res } gbutils/R/S4utils.R0000644000176200001440000001232315102634161013616 0ustar liggesusers## class2Graph ## classesToAM("MonicFilterClass") ## search() ## classesToAM("ArFilter") ## classesToAM("ArFilter", abbreviate = 0) ## classesToAM("ArFilter", includeSubclasses = TRUE, abbreviate = 0) ## classesToAM("VirtualMonicFilter", includeSubclasses = TRUE, abbreviate = 0) ## classesToAM("VirtualMonicFilter", includeSubclasses = TRUE) ## classesToAM("VirtualMonicFilter", includeSubclasses = TRUE, abbreviate = 0) ## getClasses(asNamespace("sarima")) ## m <- classesToAM(getClasses(asNamespace("sarima")), includeSubclasses = TRUE, abbreviate = 0) ## dim(m) ## m ## search() ## ls(asNamespace("gbutils")) adjacencyOfClasses <- function(packages, externalSubclasses = FALSE, result = c("default", "matrixOfPairs", "adjacencyMatrix"), Wolfram = FALSE){ if(!is.character(packages)) stop("argument 'packages' must be a character vector of names of one or more packages") ## !!! TODO: 'requireNamespace' may have to be changed to 'require', ## since in some cases S4 classes do not become visible. ## Example: 'stats4' (maybe that's the only one, since it does wicked things with base R functions) flags <- sapply(packages, function(pkg) !requireNamespace(pkg)) if(any(flags)) stop("one or more of the requested packages is not available") keep_externals <- externalSubclasses result <- match.arg(result) classes <- lapply(packages, function(pkg) getClasses(asNamespace(pkg)) ) ## TODO: optionally prefix with package names? classes <- unlist(classes) am <- classesToAM(classes, includeSubclasses = rep(TRUE, length(classes)), abbreviate = 0) if(result == "adjacencyMatrix"){ if(!keep_externals){ # no, rectangular matrix is not standard # ## drop rows corresponding to external classes # ind0 <- rownames(am) %in% classes # am <- am[ind0, , drop = FALSE] # keep <- apply(am, 2, function(x) any(x != 0)) # am <- am[ , keep, drop = FALSE] ## prune row0 <- ! (rownames(am) %in% classes) am[row0, ] <- 0 ## remove empty col0 <- apply(am, 2, function(x) all(x == 0)) if(any(row0 & col0)){ keep <- !(row0 & col0) am <- am[keep, keep, drop = FALSE] } } cl <- rownames(am) if(Wolfram){ vertices <- paste0("{", paste0(cl, collapse = ","), "}") ## t(am) since Wolfram interpretes the direction of the edges the other way round rows <- apply(t(am), 1, function(x) paste0( "{", paste0(x, collapse = ", "), "}") ) wmat <- paste0("{", paste0(rows, collapse = ",\n"), " }\n") wrk <- paste0("AdjacencyGraph[", vertices, ", ", wmat, ", VertexLabels -> Automatic", "]") cat(wrk, "\n\n") } return(list(vertices = cl, AM = am)) } colnam <- colnames(am) rownam <- rownames(am) included <- character(0) .clpair <- function(x){ if(keep_externals || rownames(am)[x[1]] %in% classes ){ included <<- c(included, colnam[x[2]], rownam[x[1]]) paste0(colnam[x[2]], " -> ", rownam[x[1]]) }else "" } .clpair2 <- function(x){ if(keep_externals || rownames(am)[x[1]] %in% classes ) c(colnam[x[2]], rownam[x[1]]) else c("", "") } ind <- which(am != 0, arr.ind = TRUE) switch(result, "default" = { if(length(classes) == 0) return(list()) if(length(ind) > 0){ res <- apply(ind, 1, .clpair ) res <- res[res != ""] names(res) <- NULL }else res <- character(0) cl <- unique(c(classes, included)) if(Wolfram){ vertices <- paste0("{", paste0(cl, collapse = ","), "}") edges <- if(length(ind) > 0) paste0("{", paste0(res, collapse = ", "), "}") else "{}" wrk <- paste0("Graph[", vertices, ", ", edges, ", VertexLabels -> Automatic", "]") cat(wrk, "\n\n") } res <- list(vertices = cl, edges = res) }, "matrixOfPairs" = { if(length(classes) == 0) return(list()) res <- t(apply(ind, 1, .clpair2 )) rownames(res) <- NULL emptyrows <- apply(res, 1, function(x) all(x == "")) if(any(emptyrows)){ keep <- !emptyrows res <- res[keep, , drop = FALSE] } cl <- unique(c(classes, res)) if(Wolfram) warning("currently 'Wolfram' is not implemented for matrixOfPairs, use 'default' instead") res <- list(vertices = cl, edges = res) }, ## otherwise stop("the requested type of unimplemented is not implemented yet") ) res } gbutils/R/isNA.R0000644000176200001440000000052015102634161013075 0ustar liggesusers## 2014-11-10 new file isNA <- function(x){ # 2014-11-10 return TRUE if x is a single NA value and FALSE otherwise. is.atomic(x) && length(x) == 1 && is.na(x) } ## similar code used internally in package Rdpack, e.g. is.missing.arg in parse_pairlist missing_arg <- function(arg) typeof(arg) == "symbol" && deparse(arg) == "" gbutils/R/pad.R0000644000176200001440000000364015102634161013015 0ustar liggesuserssetClass("objectPad", representation("list") # , prototype = prototype(list()) ) setMethod("initialize", "objectPad", function(.Object,...) { # callNextMethod mozhe da e neobhodim za naslednitsi na tozi class. # .Object <- callNextMethod() # dali e na pravilnoto myasto? sklad <- list() get <- function(x){ if(missing(x)) sklad else sklad[[x]] } set <- function(x,value){ sklad[[x]] <<- value } .Object$get <- get .Object$set <- set .Object } ) setGeneric("pad", def = function(x,item){standardGeneric("pad")}, useAsDefault = function(x,item){ pad(x@pad,item) } # mozhe s poveche proverki! ) setGeneric("pad<-", def = function(x,item,...,value){standardGeneric("pad<-")}, useAsDefault = function(x,item,...,value){ if(length(list(...))>0) pad(x@pad,item,...) <- value else pad(x@pad,item) <- value x # the above expects that the required values are changed internally. # otherwise assignments to x and/or x@pad will be necessary. } ) setMethod("pad", signature(x = "objectPad", item = "missing") , function(x){ x$get() } ) setMethod("pad", signature(x = "objectPad", item = "ANY") , function(x,item){ x$get(item) } ) setMethod("pad", signature(x = "ANY", item = "missing") , function(x){ x@pad$get() } ) setReplaceMethod("pad", signature(x = "objectPad", item = "ANY", value="ANY") , function(x,item,value){ x$set(item,value); x } ) padcheck <- function(x, item){ # check if item is set, very crude. wrk <- pad(x,item) !is.null(wrk) } gbutils/R/args.R0000644000176200001440000000424715102634161013211 0ustar liggesusers## from package pcts # zapsmall - chops numbers # 2013-04-02 - obsolete, used it exclusively with from=1, seq_len() is better. # seqinc <- # returns a length(0) numeric vector if from>to # function(from,to){ # useful for "for" loops # seq(from,length.out=max(0,to-from+1)) # do we need "by" or other arguments? # } shiftright <- function(x,k=1){ # works only for 0 <= k <= length(x) ! if(k == 0) # 2014-02-02 bug fix was returning numeric(0) when k=0 ! return(x) ind <- 1:(length(x)-k) c(x[-ind],x[ind]) } shiftleft <- function(x,k=1){ # works only for 0 <= k <= length(x) ! if(k == 0) # 2014-02-02 bug fix was returning numeric(0) when k=0 ! return(x) ind <- seq_len(k) # basically ind <- 1:k, but empty vector if k==0 to work for k=0. c(x[-ind],x[ind]) # TODO: however, this line will not work properly for k == 0, # therefore the "if" remedy above. } myouter <- function(x,y,fun){ res <- matrix(0, nrow=length(x), ncol=length(y)) for(i in 1:length(x)) for(j in 1:length(y)) res[i,j] <- fun(x[i],y[j]) res } nposargs <- function(x,a=FALSE){# x is expected to be a call, usually the result of sys.call() wrk <- as.list(x) tot <- length(wrk) - 1 nameswrk <- names(wrk) named <- if(!is.null(nameswrk)) length(nameswrk[nameswrk!=""]) else 0 res <- tot - named # a patch needed for my purposes follows if( named == 0 && res == 2 && a[1] ) res <- res-1 res } ## 2015-02-12 removed myargnames() since it has identical functionality to allNames ## ## myargnames <- function(x){ # x is expected to be a list ## nameswrk <- names(x) ## res <- if(is.null(nameswrk)) ## character(length(x)) ## else ## nameswrk ## res ## } isargunnamed <- function(x,k){ if( 0= 0)) modsq <- x^2 minustwoRe <- - 2 * x * if(argpi) cospi(arg) else cos(arg) } res <- 1 for(k in seq_along(real)){ res <- c(0, res) - c(real[k] * res, 0) } for(k in seq_along(modsq)){ res <- c(0, 0, res) + c(0, minustwoRe[k] * res, 0) + c(modsq[k] * res, 0, 0) } if(monic) res else res / res[1] } gbutils/R/parse_text.R0000644000176200001440000000101615102634161014422 0ustar liggesusers# copied from Rdpack on 2014-03-30 and modified # # TODO: remove the original from Rdpack after publishing "gbutils" on CRAN # # 2014-04-06 cleaned up parse_text <- function(text, ..., keep = TRUE){ # see comments in parse_usage_text ks <- getOption("keep.source") if(!identical(keep, ks)){ on.exit(options(keep.source = ks)) # restore previous value on exit options(keep.source = keep) } parse(text=text, ...) } gbutils/R/mintersect.R0000644000176200001440000000046315102634161014426 0ustar liggesusersmintersect <- function(...){ wrk <- list(...) if(length(wrk)==0) # 2015-02-12 was: return(character(0)) stop("no arguments supplied, at least one is required") res <- wrk[[1]] if(length(wrk) > 1) for(i in 2:length(wrk)) res <- intersect(res, wrk[[i]]) res } gbutils/R/sim_numbers.R0000644000176200001440000000700315102634161014571 0ustar liggesusers## 2014-10-21 moved from mcompanion # 2015-10-15 - default value for sign sim_real <- function(abs, sign = rep(NA_real_, length(abs)), signprob = 0.5, absgen = "runif", absarg = list(0,1), ...){ abs[is.na(abs)] <- do.call(absgen, c(sum(is.na(abs)), absarg)) sign[is.na(sign)] <- rbinom(sum(is.na(sign)),1,signprob) sign[sign==0] <- -1 abs * sign # note: result has same shape as abs and sign. } # maybe it should be always a vector! ??? # 2015-10-15 - default value for arg sim_complex <- function(abs, arg = rep(NA_real_, length(abs)), absgen = "runif", absarg = list(0,1), arggen = runif, argarg = list(-pi,pi), ... ){ abs[is.na(abs)] <- do.call(absgen, c(sum(is.na(abs)), absarg)) arg[is.na(arg)] <- do.call(arggen, c(sum(is.na(arg)), argarg)) complex(modulus=abs, argument=arg) # note: result is a vector } # 2014-10-21: changed argument "eigval" and component # "eigval" of the returned value to "values" sim_numbers <- function(type = rep(as.character(NA), length(abs)), abs = rep(as.numeric(NA), length(type)), sign = rep(as.numeric(NA), length(type)), values = NULL, ... ){ stopifnot(is.character(type)) # new 2015-10-15 if(is.null(values)){ res <- rep(as.numeric(NA), length(type)) # 2014-06-01 was: as.complex(NA) }else{ stopifnot(length(values) == length(type)) # new 2015-10-15 flags <- !is.na(values) if(any(flags)){ # 2015-10-15 - modified # replace NA's in type with inferred types (from values) type[is.na(type) & flags & Im(values) == 0] <- "r" type[is.na(type) & flags & Im(values) != 0] <- "cp" # complex pair, not "c" # stop if values contradicts type if(!all(type[flags & Im(values) == 0] == "r") || !all(type[flags & Im(values) != 0] == "c" | type[flags & Im(values) != 0] == "cp" ) ## all(!is.na(type))--ne proveryavam, mozhe tova da e polezno ponyakoga. ## (note on 2015-10-15: this is an old comment, below it is ignored!) ){ stop("Argument 'values' is inconsistent with 'type' or 'abs'") } } res <- values } if(any(is.na(type))) # new 2015-10-15 ; todo: check that they are in c("r","c","cp") ? stop(paste("Some NA elements in type could not be resolved:\n", "\ttype = [", paste0(type, collapse=", "), "]")) sel <- type=="r" & is.na(res) res[sel] <- sim_real(abs[sel], sign[sel],...) sel <- (type=="cp" | type=="c") & is.na(res) # 2014-06-01 conditional, to keep it real if no complex values are required # otherwise res will become complex even if length(sel)==0 # 2015-11-13 was: if(length(sel) > 0) ... # (doesn't do what is intended!) if(any(sel)) res[sel] <- sim_complex(abs[sel], sign[sel], ...) list(values=res, type=type) } gbutils/vignettes/0000755000176200001440000000000015121015350013724 5ustar liggesusersgbutils/vignettes/Plot_pdf.Rnw0000644000176200001440000000720015102634161016170 0ustar liggesusers% preamble taken from the vignette in package strucchange % \documentclass[12pt,a4paper]{article} \usepackage[left=20mm,right=20mm,top=20mm,bottom=20mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newcommand{\E}{\mbox{$\mathsf{E}$}} \newcommand{\VAR}{\mbox{$\mathsf{VAR}$}} \newcommand{\COV}{\mbox{$\mathsf{COV}$}} \newcommand{\p}{\mbox{$\mathsf{P}$}} \newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \setlength{\parskip}{0.5ex plus0.1ex minus0.1ex} \setlength{\parindent}{0em} \bibpunct{(}{)}{;}{a}{}{,} \newcommand{\ui}{\underline{i}} \newcommand{\oi}{\overline{\imath}} \RequirePackage{color} \definecolor{Red}{rgb}{0.5,0,0} \definecolor{Blue}{rgb}{0,0,0.5} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \hypersetup{% hyperindex,% colorlinks,% linktocpage,% plainpages=false,% linkcolor=Blue,% citecolor=Blue,% urlcolor=Red,% pdfstartview=Fit,% pdfview={XYZ null null null}% } \usepackage{verbatim} \usepackage{shortvrb} \MakeShortVerb{\|} %\MakeShortVerb{"} \begin{document} \SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Plotting with plotpdf()} %\VignetteDepends{gbutils} %\VignetteKeywords{plot, pdf, cdf, quantiles} %\VignettePackage{gbutils} \setkeys{Gin}{width=0.4\textwidth} <>= library(gbutils) @ \title{Plotting with plotpdf()} \author{Georgi N. Boshnakov} \date{} \maketitle The function |plotpdf()| plots a function, usually probability density (pdf) or cumulative distribution function (cdf), over an interval containing the ``interesting'' part of the function. The interval is based on quantiles computed from a supplied cdf or quantile function. |plotpdf()| is most useful when the quantiles are not readily availaible but here are some examples with a normal distribution to illustrate the idea: <<>>= pdf1 <- function(x) dnorm(x, mean = 100, sd = 5) # pdf qdf1 <- function(x) qnorm(x, mean = 100, sd = 5) # qf cdf1 <- function(x) pnorm(x, mean = 100, sd = 5) # cdf @ |plot(pdf1)| works but needs arguments 'from' and 'to' for a meaningful plot. We can simply pass the quantile function to |plotpdf()| to achieve this: <>= plotpdf(pdf1, qdf1) @ Similar result is obtained by supplying the cdf, which is handy when the quantiles are not easily available: <>= plotpdf(pdf1, cdf = cdf1) @ By default, the lower and upper $0.01$ quantiles are used to set the limits on the $x$-axis. This can be changed with arguments |lq| and |uq| <>= plotpdf(pdf1, cdf = cdf1, lq = 0.001, uq = 0.999) @ <>= plotpdf(cdf1, cdf = cdf1, lq = 0.001, uq = 0.999) # plot a cdf @ The pdf and cdf of a mixture distribution are usually straight-forward. Here is an example: <<>>= pf1 <- function(x){ 0.25 * pnorm(x, mean = 3, sd = 0.2) + 0.75 * pnorm(x, mean = -1, sd = 0.5) } df1 <- function(x){ 0.25 * dnorm(x, mean = 3, sd = 0.2) + 0.75 * dnorm(x, mean = -1, sd = 0.5) } @ Here is a plot of the pdf: <>= plotpdf(df1, cdf = pf1) # plot the pdf @ ... and this produces the cdf: <>= plotpdf(pf1, cdf = pf1) # plot the cdf @ Additional arguments can be specified as for |plot()|: <>= plotpdf(pf1, cdf = pf1) # plot the cdf plotpdf(df1, cdf = pf1, add = TRUE, col = "blue") # overlay the pdf @ \bigskip{} |plotpdf()| uses |cdf2quantile()| to compute quantiles from a cdf. |cdf2quantile()| can be used directly, as well: <<>>= c(q5pc = cdf2quantile(0.05, pf1), q95pc = cdf2quantile(0.95, pf1)) @ \end{document} gbutils/NAMESPACE0000644000176200001440000000113115102634161013135 0ustar liggesusersimport(methods) importFrom(stats, rbinom, runif, uniroot) importFrom(utils, savehistory) importFrom(graphics, plot) importFrom(Rdpack, reprompt) exportMethods( pad # todo: is it necessary to export also methods for "pad<-"? ) exportClassPattern("objectPad") export( isargunnamed, isNA, mintersect, missing_arg, myouter, nposargs, pad, "pad<-", padcheck, parse_text, raw_history, shiftleft, shiftright, sim_complex, sim_numbers, sim_real, cdf2quantile, plotpdf, adjacencyOfClasses, pseudoInverse, rpoly ) gbutils/TODO0000644000176200001440000000017215102634161012412 0ustar liggesusers * for sim_real and related - allow conditional distributions (i.e. dependence between the modulus and the argument) gbutils/NEWS.md0000644000176200001440000000310015121014326013006 0ustar liggesusers= gbutils 0.5.1 - minor corrections in the documentation and file DESCRIPTION. # gbutils 0.5 * new function `rpoly()` creates polynomials with real coefficients from their zeroes (roots) given in Cartesian or polar form. * minor edits of the documentation of `adjacencyOfClasses()`. # gbutils 0.4-0 # gbutils 0.3-1 (not on CRAN) * deal with a NOTE on CRAN. * new function `pseudoInverse()` (moved here from package mixAR). * new examples for converting results of `adjacencyOfClasses()` to graph objects and plotting them. # gbutils 0.2-4 - 0.3.0 * new function `adjacencyOfClasses()` gives the graph of the classes defined in one or more packages in several ways. It can also give a Wolfram language expression which can be evaluated in Mathematica, see the help page for details and examples. * use Rd macro `\printExample` from package `Rdpack` for some examples in details section (see `adjacencyOfClasses()`). # gbutils 0.2-3 (not on CRAN) * created `README.*`. * added website created with 'pkgdown'. * added github URL to DESCRIPTION. # gbutils 0.2-2 (not on CRAN) * corrected a couple of typo's in the vignette. # gbutils 0.2-1 * New function `missing_arg()` returns TRUE if an element of a pairlist is missing. * New function `plotpdf()` plots probability density and related functions over automatically selected intervals (based on cdf of qf). * New function `cdf2quantile()` numerically computes quantiles of a given cdf. This is mainly for use by `plotpdf()`. * A vignette illustrates `plotpdf()`. # gbutils 0.2-0 * First CRAN version gbutils/inst/0000755000176200001440000000000015121015350012671 5ustar liggesusersgbutils/inst/REFERENCES.bib0000644000176200001440000000143715102634161015003 0ustar liggesusers@Manual{Rpackage:classGraph, title = {classGraph: Construct Graphs of S4 Class Hierarchies}, author = {Martin Maechler}, year = {2015}, note = {(partly based on code from Robert Gentleman) R package version 0.7-5}, url = {https://CRAN.R-project.org/package=classGraph}, } @Manual{Rpackage:graph, title = {graph: A package to handle graph data structures}, author = {R. Gentleman and Elizabeth Whalen and W. Huber and S. Falcon}, year = {2017}, note = {R package version 1.56.0}, } @Manual{Rpackage:Rgraphviz, title = {Rgraphviz: Provides plotting capabilities for R graph objects}, author = {Kasper Daniel Hansen and Jeff Gentry and Li Long and Robert Gentleman and Seth Falcon and Florian Hahne and Deepayan Sarkar}, year = {2017}, note = {R package version 2.22.0}, } gbutils/inst/pkgdown.yml0000644000176200001440000000031415121014147015066 0ustar liggesuserspandoc: 3.1.3 pkgdown: 2.2.0 pkgdown_sha: ~ articles: {} last_built: 2025-12-18T15:06Z urls: reference: https://geobosh.github.io/gbutils/reference article: https://geobosh.github.io/gbutils/articles gbutils/inst/doc/0000755000176200001440000000000015121015350013436 5ustar liggesusersgbutils/inst/doc/Plot_pdf.pdf0000644000176200001440000043644215121015350015715 0ustar liggesusers%PDF-1.5 % 7 0 obj << /Length 1051 /Filter /FlateDecode >> stream xڭVKo6W!1$EQt{XhEöڒcb -)R`p߼Ƀ7݇$gi*u=YA&+dlsgMm8yd#RE]$©b9wbJ%M&4qُU7[0%Fؚ/"d,!X3,cJ VmP"<~]qsՌ3 ީS |}.Jsn1nS8~C3;[ ]y&jof(x8Q7~nPadv4DD,%)iEb+Oqq_xFt@hz4^ȝ1:45qmB7L;$QF!`sEfXw[BQ̢|@m1?P>;3V%e=̆Tl]Si9xbsvpWg7_*H3 $Xcuk~:V-qDgdm7gLij*@ekcwDıZ xK*R{Ȕ(ߙW/!^}^#dfbч[_[BskB@J?YrJ͇q9-1 [wd@pEc蓕JX0=pU iOa8.g&`|u4Kay\~iJRUUD~n}'ϺypmI7SYϚVA &N0u\І)*ٷ ]e7xQ>am=G[ ͎W/`LU.> /ExtGState << >>/ColorSpace << /sRGB 18 0 R >>>> /Length 1062 /Filter /FlateDecode >> stream xVˎGWN*3ya$$.2|GVWu"<ⰳ|E&[/H8F\5NJ_W8@͋$gO azM0<\܍.r:R\_F ?|q?G̘ǃc2vU]I OrEzDNd\Wkoʾn[w?x  u{˿ ȀKM3\Pwp /kkK], 5^#|^'?_~u! Yl1ء ~GnNvi =KB+ʓ|:',C endstream endobj 20 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 25 0 obj << /Length 590 /Filter /FlateDecode >> stream xڵTn0Rpb)9DF▙t͢t~@w}aWeG}) HF8J8 BL"6X8φ/:p|JoU̔`6P0NPL,_v KZZfVr^ʶ>Д9+HPʞ0? ¾E8]=BTzgY3?d=$Ixkqo^3]XA*BT$.S؇U7Uo?OA딴t-o#kZ-;4iz77ƾzƪk0~8}@1u>*vnu1bk1 G9U(vk endstream endobj 5 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpYBKbHy/Rbuild5138586a1386/gbutils/vignettes/Plot_pdf-004.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 29 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 30 0 R>> /ExtGState << >>/ColorSpace << /sRGB 31 0 R >>>> /Length 1062 /Filter /FlateDecode >> stream xVˎGWN*3ya$$.2|GVWu"<ⰳ|E&[/H8F\5NJ_W8@͋$gO azM0<\܍.r:R\_F ?|q?G̘ǃc2vU]I OrEzDNd\Wkoʾn[w?x  u{˿ ȀKM3\Pwp /kkK], 5^#|^'?_~u! Yl1ء ~GnNvi =KB+ʓ|:',C endstream endobj 33 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 21 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpYBKbHy/Rbuild5138586a1386/gbutils/vignettes/Plot_pdf-005.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 34 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 35 0 R>> /ExtGState << >>/ColorSpace << /sRGB 36 0 R >>>> /Length 1094 /Filter /FlateDecode >> stream xVˎ5W*?R$ŒJh&">Svm(UsOʮ9n$@7RHI?Wp|ˏ/8@˟$w zC܀~:p1Q"78(=rUaMT3ks9¯ppTk8Pm,qKw&\}MB`Sx([0s:l\{xD[# F3KN\zc3r/DPwU2+DHϔ5Zb 䯭o(q^I?qxc!?gI #oċJ~^bI%zc##E~"ul׾_^ux=g'lk,ĭx ?n(f"h#f!ʹy F];N)hWE|,4@,mq@,äP>(dn,>&8k8}={c/k>H dΏJmPxƟ u0m?UnyOVꗓ⪯ʱ^WP;o!?uzoUh|(HY4]Ln͟5\k~ dvͷ)_o .iÜrw<,~ A?wⷙAC>h釁/!DK.>Y WS t\Mq1˜M3',a4pIN4Ԥ^j`:j 9/56:5@t~L7<@ `Uϑ +̸͞52#'![=E; we0fp|p7}Y'a`j%?3E|~;LݿG|.s׈ yD-?_//np.`Oݝo8q]z#v65W[n8JogZܵ7~ - . s,j7 NM2p38c{{ۊzEw> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 22 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpYBKbHy/Rbuild5138586a1386/gbutils/vignettes/Plot_pdf-006.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 39 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 40 0 R>> /ExtGState << >>/ColorSpace << /sRGB 41 0 R >>>> /Length 1178 /Filter /FlateDecode >> stream xO^U Sd Irn[T((p!]fڅ~|$}PJ᥋N77'ɓ\W$@RiJVM?7?wGR ?^FBWpFr3z:F%N1&4@SX\oNq*nd5N".ǩm;Xx( v?,68y* 5q@#`ɳ98הܱ06hU)74kQ"ܗFM t"o V)m'dIqZ \=Y(9$QGlxXᯋ%2g!KoyZe2Dr "~/25wI2N `(QCXVp;b z"\0>=A1QέXx qdy=PĂ$3kP9dѸ|0cd][hp O8E G,#^pm-q#^^l??Cy%o5wKp9`;g]? )Fv!$*zo}3Hn>g '"uD{$IZǢw$n/'ŨYCnguMr3xq[,1V=2AHk[8~W׷D C}4l7oq gf|lq@c=kOL 6 $~y~nU 7Ys18q3a;'`aVja4b'`~[0z;Uכk3Hy/) h_OG-Y4hr9R믞6ل)ӗ ID_nq߽>6 endstream endobj 43 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 49 0 obj << /Length 564 /Filter /FlateDecode >> stream xڵIo0V${Y hYnp8iGF&@sldQ`Hs(A}ȼe(c$B2"Q*P C(`B^H 6jk_}>eo!2f! x˘pixm74##hʼ5PXF-Ig3s' 34BE_rJqŏC: JߠIA}PK̻ LyDDPX_o3shV]e㭵V .vwZ2Ђ)dnػ<(bntBF*ﳧ'jR8'+Xi$zyTij.YBp~*k 0x|ۢ ,oʵ8ʕ%01(Y\Y灆zڰʇmSZ3Zݭe ucZ,WTn}n.`$6>m@ӜnZ@u(wkL JD5yq\- u-ڭRp77KR"ΘX@ endstream endobj 44 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpYBKbHy/Rbuild5138586a1386/gbutils/vignettes/Plot_pdf-008.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 51 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 52 0 R>> /ExtGState << >>/ColorSpace << /sRGB 53 0 R >>>> /Length 1152 /Filter /FlateDecode >> stream xVˎ5Wx *?)HaFbX%DhA,9ܷoF\e1Ӯuu>noT䒺K)ɋIdsJoͧ^mYrՏk{הӻMk$fb8T&u-E |J]ZNZ]p54."vQK?Yspplٹ(x7i%Y24YkwU V,M%65LRcݪq 59IFCG3yxSq=E9pa˘8/GQ0#c}oc}&78c22W})gsw!a_|CiIlr6՗}l=.]p$SOfNl@`aó08%y.j/NńM'wdw> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 45 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpYBKbHy/Rbuild5138586a1386/gbutils/vignettes/Plot_pdf-009.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 56 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 57 0 R>> /ExtGState << >>/ColorSpace << /sRGB 58 0 R >>>> /Length 1095 /Filter /FlateDecode >> stream x͎\E )ELٮm"@RX"4FYs쪞.E,>l*$tOwLEW_ӛ#qJϻ7?㿭?o)C-qhͨg.FeBp6z8ZԩW.ԅPo<;5UAK69+FcNEIReTlւ+L"pB8^+\Y*Ie<|HAXBuc VkpaM$HQ =BcfN U4 ~4XyRC"^8X&.C6_Uaz-@_;Kċ:‹Ti3ŗmB_)z|~/T@"iP6/J?:WQ"5o&$5\qGGKTJ&OEfs*=ZrV a|^GpGG768z[>xm\;:9Qv.ls7Fײsri;g]N/olﲳ1mŕw==O+~_*LP)W=K\58{mqn>tT;|^) yei'C#c^ Ӽ߅ z_p e;敡cLz-üLc=oscu ez0VB7BFƼ*ǝQ_yuog{O| $DXL`f=!`w)i39zCt׃1m,r4L߼ot|W.ɛXnQ9WqZv6 Z U{CCmZh] 3yݬ8|xgӤq w &n~|ػ, O[ {~r㢆rQ{jq?9/{ )7.1Ϧ,R'%>.hx ^x?hNү~~A1{Ct"wz- endstream endobj 60 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 63 0 obj << /Length 405 /Filter /FlateDecode >> stream xڥSMo Wp&R{TɭomD7U_0n6z,ao2z+i kŮU9ZXo9.'΄u !DXbu~iAxU?tfAӡ8}$W$ѱi{;l^+ރRмa$2ȶOuܦhm/ 5AAJL㤩h⩝,jKkBJ>oqC0\e50J_KAhxhj{G Vh1ojw>MBS@̙ =>;t魆p*h;LZ>ENnOŦ|PsHVA(]I@'f.8.h endstream endobj 46 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpYBKbHy/Rbuild5138586a1386/gbutils/vignettes/Plot_pdf-010.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 65 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 66 0 R>> /ExtGState << >>/ColorSpace << /sRGB 67 0 R >>>> /Length 1639 /Filter /FlateDecode >> stream xnEEnR$X"و<>UL"␅}{/uׁ‡)| eĔCs̱q1boͧ^)Տo+7!wp?bs,KcX T%cj0 50e #GnD-FUH(%?x@iJ l#J3]ćv#v )fRMƞMH5H4^$2xX`N `Yf] VG8&ط;.S lQ2ź t}fi.Ad'l5)l:V R$֋{syjb~~t=ǜ @%i6(Xo]Vlc=HH65tQHU=l`wZ6OOѧ(ߡ*(e_S#lwz_Ƿm 9y398w[Mv6d òaImr^ 9;+jgϭ6M=m-e p -{k}taߟmS^l{QuE)3Ozi*' vvI3N#zڂd6jEB\UE"]f# =8@0R. 쯚c1ʴoUm,*74iC%/PI=.9cI#% <ܱaǒV/9cIKU/XҀcI+CKn\rƒn8jt2Neҙsl'f22p" 2f7C%G #P!1s# ?sG Fne^a_Yl#~a Cl"D s]WG ' 14Rq q endstream endobj 69 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 78 0 obj << /Length1 1413 /Length2 6121 /Length3 0 /Length 7087 /Filter /FlateDecode >> stream xڍUTkJДNBoҤJoK!$tD@zUz RDA*M"l,{9'$<3;U׀_i UA"0 :H BĜp/?1( G" `}J` D9@H\ ()nG"hb{H/# IJJ(8CQpc`Pg C1^(%`\=<<h$AP4 vM` 0 :(MqCAQuM s9?d,GJC Hg0 pÝM'FHl> wbZT`CCPp Z w92kVFC:;C4(({^@ev?ǰss4B]ݠJ0X>( @]POL^._AO7v? ;nPZ lpձno`0;$o h)*?AEE'_@@!18ut?}UG#^_=!pYL.7-@ ?LwG*nNN\#v;yA`@ PcojAncX9( E~h'N~. faUy}ZO?PF@v?'$*P`/b($G.ZT  $z2q #> BƑǺ5 2M 1#֟ 25TހT۵]gOԳ<ϢbtcF/qJP8LQdDrv7}uM&xܦ*UڢQSyQ>ɶpUNΒslt6 xjY7LqaȕDU?'=)qJUw@+U^~b.95HXE0d@ʉhgDJGp>v2s*mM#4S+N;^qe*JS0rL B)Px@׏TA)2݅mRFi5] +-z` )F򮏥_%%&%, Z5%ˆ3"mcn(z}^Xlܰ22DbB}={mk |{D3B}Z eSv]?mF]pe"ۛgcic!!Ũo_4*qK0ڭ')_M !$kT,4P4Z9V΃|Z<ɫ$X+4_(dy\IIUٲ%@< %ЀcF[CSWZ S5;6v)S; 'e ,/|ŪVO@=S:xupnVGrA3#iMˆazFҍi٧$_ 2g%[&~}eGQɋGHP/BGᲟ$x8f#;ܕf#4k%r>HOwZpޜ =ZFC)fèxZDlJY)j隯]R1V=.yl_v2v|x=`^.lkMq]iTg`BXݠpx%wع7=.8aRo#ۆ̵`ϴ.YN66]x1ljMCe}'o(Ecۤ, D\2c+VҨ&Ã=6LK?+OҶc 7A =ՔU,T;h-YUr}.Djītb[i#j^phGJэfOo#Vh;W18. BdhR#۹tjgEChHjXr 7D *&|9 ʜ$*dQF*'B ԇ&\u{FQUVDs TQ muo@;ǕS. ߣ$Mzh^ sB_PM To*H8l,o,R,:{Mo|_e U'H,Ek#mF,($ץ6:w9ʏswOkާm~/VqzwrΣ _p,>cMTw2PI"wpP} VǼ"C^S/ӔcG?^{@rĥ>+\N^QBR_Lw}N"Z(-SVUeLUuq3j='-1IWU`f 1cћfw>c} U/C+e: /C3SEHH].;t=*bxTSt}`Nfm{<\Nk7*'VȴiW˰D,|]N͙R&-y}1e,ud^غ|1{3!F" 5) a '?f.C5 Iۖ^@vFw )l +N00]Q"ܹ{F#MDl 7AUq͌ODy< Z=wV_jBVJ]Ȭ'FOeS1[̭Qڗ^)*lJ<V0gKvpLlM9N)\:K HɷB˝p?Yۡ%zWŶ|Rx6D_3 \d|ҍNM d|H*NS!z_8Rb &}%n-FȊ=u<%ЏTlRddzMkc)+D{Xu-(3L;zc*m~O{r= 71ȷF8yFS\xNoчeGf֪7e)M"aQvmPͼh%vj1 6380%Anr<,o?$ #atؔL;2k{SIX$TKR:}kdT\B^ 8MƖe7*6J>nuKxFS^wy„v:hMj7 .t }!.&)5e?YSQ\IW]NTr ~}PO5N' -Ї]$Fm_ey`do{?&p7uGU18w|6 x"|]389 F}_ȣx7mi(I=4̔p n+-oAgqRk+*j&uϯ5G1P:bx.0n-:8p;(=H#kI xKq,uQ_Q9,-i4tCe_bkyΘtxX[gcvVEo_Zfv$?|  r"BexuεkL+6􊜸}Gg؞I8YՋT8S>ntf}}ٽccӋ%}3|& Z+7*X談xxmJOu_?V\ҋ~yE!?el5ȰJ}p؃֤Ig#4CT9nkdPc:aɵ.۩k\KFW&3|{mEe|V͢_,"9q#}qb CVtjKM,x"hӖ{Y<ԽӅA< ?b;)?i%Ƿ=yz&&H{7.-#ْۺDJ1i:PDvs~ &\s%CB R4U/b6ϻNgdwd'mey]gxV6_x! 3-wI;oeWij-r(S qdg 醅"W%!PW _N{w6Tp:iU=@_ZC ?kJc3OGV>cÑ"<&|@Q:^8zaJ>h\qRj-EBXK/ֽx0`cTM;M\BGur Ϲj+bNJ=1jM9ބEDHJǻ89[aMD,eٝUZJ o*O4%T< ^R79籁bU,)v@P:?Li>SrsT䭧}B";b]ޜ![t꽢عW9%a my^gz6'~w1 ڏ8Aqwȗ"ڐ!,Hq-wttOW:(JD'|A3๞;NmU{=ýE?$ Cn\K|⛭|wcGT,I1e~~+Zбj!kSv5= 73(wY{;*S#j.zheS85oVԬjO5"6O;hUvM4u6 endstream endobj 80 0 obj << /Length1 1381 /Length2 6109 /Length3 0 /Length 7059 /Filter /FlateDecode >> stream xڍt4]׶.zĈN0zDHQ#!`3c F^(QAnA>3 m( vJHKU i(+ P Z±05 G!UAc/1=0gBiY EDaTz`8`, 0B!a^(⊽_(@ZYYt c0q#X p%D\X$Kqc]  ~ 0{L&I)t{-PX_0p uፄ0hugw#'!#]p `z$#`2#Nߝ7 ^^pį~^jO($?+o~Zp Y94@YI (w"Q?^ҿE(LPD{@y !)77t?`8o¥f7F]Tàpob>F }pp jB\nd8f$]: ~T8R AA9LF^`~K!/~k %Da/SQ_7* 6R0 7 ̥~k᲍ (j[}DI6~L}Jo)*>%O [|N~E/r#Ck#yt[yɠ |;ցy(%,xZv xz+њ1+Ff5 +&%N :ΰ_#J\cMb5J [`.x:RƫCÎqdB(@g'݈m.d 319X#7`v8 pK3>_kQʗB&l3u4~aPlQ){wEXmŢA,i ^h!ژbyAeZG}ΐ.9+|˸!#M1$5е=p Llj SߩmKףzڐU3?-'UɌj}=hvN{/ILM 횪7%6EozP[e0I)UthSp}PMB.4TaכV6;ƶlj\/]% z4{|y~O?btx@>G@yͥl`ᴨ;M$Ȩ`UO]\j^&z>/s$ -8OSXKZZRnl5_Mڐ>ki{Ѝo.޵XݖıdQ')i=*Eqgdγtl$?\x+ﵛ??=ZiU6Ɇ̶}p^ߢyBJa&eyCE"^X/h-uK֩q芽n:$`K)Ş GGʬY4Fj;Aw.x5ov3 {hwM1g޵"EG=]Z H;OqŦ_5zW7E2+Q?gⱊUA귗.̂~ʷIhVƔ&.]^Ĕ65Ɖ l-oXpWz >Y|C!d$i٧~w<5XTDZA[c#Jb4 Ϟ/fL^zz^+ڡ.CLo*Lf)ޥYXkztn(-,PPzcm2Q]L9QbWf}'~ Ƽ: qE edph3Ǟ R_dj)Qi]IT' ưtF?ǥEk>a0eQsxp*?ILU=yK8ߐ_-xJu`q$ϫpp  Z|!ᩬ6XЪk908 aV^3cSsWj'QMP)Z,Z.j*lo2wwrx|180/KnbA.P)S7_ 8p曇 e{ƕ]wd-cd\&'ϑ OO*h Y25bUuwLهw,AGnYi dퟏ SUL6I8~ 7?g!`kIl4С~82$Py]vt~!R]nK #_QۈOK&]~xgŐWDG#MŁҩu/9]B\郸jVd&mWLnYBڏpXX&Z\®shLSVEp'u WO=O7$h7T3jM>;&cF5L B'Q1G}%FrJZnQGU2D+s P1#تNC@Opсv|t/}su9 rr\RN&9|%Jpe.uH{IVCC)OTeZj¿V6+f&~%F*]ih`C9}Wz7`ZC¢;1T1H)">J49zKbT;peT;C&L)h,]8V>]\E O9FкYxGDZ)f:;[?L1EBtf CM6ʢaz<NL{2ݫ9}/,}Aֈ7Ag5 vC?8Dÿ USHg\p%budow"= GB7NIa;zfwb4)g4c(9Rl^Ob/>"3Nwο@ }u}]h&tq@U֛":F[M݇?{Zxll@Q3m#C-EziGۆeܚn^a%)x֜InQ'7԰S7\o7NUOpVfWu7wYAފ4O<QqY|ʘ p]zG>%zyI٩ՓsתZNqCW^ӎ𺴽$'%DX|J~34\3W(" Vkf1Rd|}ݸ<㱺&x|۞0l\L7(|cf&DT:ŹNsT[Wk{y0>27ި&&!YBdU ܒ>pOY0~Xn[3v:nMH2P]%p[Z&Z39mˬ>}*NF r1&FJ~RSDH]Pzkn$gUc{/INЭKv1U>Xɿ+D;n[2dJ墺 4v O~C"5!&WD~x 4<,G[VSk$>_pA  4R&j#ЈP_MB&h|'8V|}}Cjz*ɩz~NQ m:J-G7 7k֊#^@U/:eG}$|tbNӥìQã5Œt# 8r?n7ʹRDp?Tz)18>sYD$c6y6e%qFNYU]z:?>pvN :vE<+/6jعe5M^=/]O*jo}ܗ%q9֚Sz)"Fmȁ!|d4nyf~A)Nds᪹x#WN⻭oݼ|𭷉M:Ꮔ l6,| Ӱ,C ܬO"KAұ:[^ 1}d߼Icz {ʦň@4Th8Vd`<vWϛ/hŷKKtZ_AN=.T(|ފ2ԜobC7o 5g#7x^ho߼ -?azW&J:6R?]M`8If~INɞ#=D|'$t"-T,iS5ޘ pO2aG5e˻d =~L˅1u]!^.)ÈM1lD x$_Mr8= QMG=7ccSm'Ag\5 g.|["X u|Ч3!>.6"z2P^u1&Uc`ss'kpВ-NU{'CivRHV?Aɫp.sKei=RL͋#{ ou8wIćH.I} W` wfNxgoλ7J9;ܩ1\=LLE\hθxKW7WzƋ,|pBY7Aꨖa :&D M'[MϾ$ Ĺzu^&KB<_rZuE=+"u [K ٍ3mqpko}n(Pݓ+31 |ו%8q; ɇ"6X4ɣfXVIs|{1s s|% kcT-[o53*ᓈ/4TJGxWb ]Gzl1\b}k-f2xBN>.Q~~Rqك/_g%C-ćش:Mw:٬X)Ώ:VSz ԍh]A!~9=zAۑ\&.bVVͪ؟\w*m몱?gz!WijSʲotuR׿盫Yp36a c:-=vEYC>v_LR{r nYPnmSy2t+J:\byʡb,iD\IվplsKӸ@SM;XWe#tY*}z6,\ϩedzoU?s&XFlX顅X#ݪ759?QOy\MԶ7!uDȯlFmiCj2ߩo< =3Vup qo|\{?Yel%YZRqۗ T}>ao@@@v?,Wa^~鋙=fD3r$ws.s+8AFV7ˈ a }rib渢9PK>S݉x endstream endobj 82 0 obj << /Length1 721 /Length2 15961 /Length3 0 /Length 16535 /Filter /FlateDecode >> stream xmpfQ-'|m۶m۶mضmۯ9ޫWjĘk^k:+{؛00sDeL0$$B&v&5c=Cp03wQ'P60pY۹Z]]]]\h]xi)M&!9y Y1 @ bhma02u29[''u5qtG #, *' S:;qC9Ww 2_m00-&f0t.G?? )&.ֲ6&r!;{gG-@P6p6?;d$jnb,oOjS'f"cblb&vgmgA:QYuaEl-lJ4p4==C }gG w==c_ ; khb?fmΈ+2%WhjvZ_jxeF bX ^; L!}3A d4A2k QoֻB[}5*,MĝsZ<$sVyCC~yG?8v£J7>U ҬyH!HX~. yaEa yb;ͭĽM;E\(<>Wo} 5H+QW.8AG1 "Tp v2(4p} (=SJ4})X(8B<|8!_cx: /槅;jR1s~5y;Jf~EB\PXIQpXQY$X&zRd< lZA)pr}MQ|M[p)wT Uaps ,3O$4[M=/PI&P#E7Sx]@"{g+0G,1ƨN!zd)GK,G~i3~>)c'[V\ clsqR}$W8-ټ,m~g5/L!L`iEnH{bJ1jϬL3Oq v:pSBw|`{+;ݮiʙVul5p+<+hض\,sQ80Cyf2D MKLz\;P5ϙ5UtML"N : Rh XXt!_;eMZDAѫYT7Ȭ" ֵn`s =Vx\J.z]GMŨ|wBGHLJ'#[yiD G_*;G0li4[ 6)%'4?.Z_s)B{w&/C k( ݩ30eU_rwՕ"u^ɜFJ2WS0im?2*|2еύ-{WlN,i WNϭs7)^b44 ^@r( bU>'bkZnþ 5u冩DXAVomgVR%i?SKn\@7H] Bֈ@i)A)(~3D蚘Wx_C^2L8k)9˾h/d7V}o GB>'J`yX wEdⱎC$x"~mK#35bjWڷ6{kО-WA6r97u'3c*͸\+#CQc1oH czG 7iLF ?'^źh8#Rjz}([M$!8L-2yw5!3xH3?NH_atv  OpK^ؼ-Ω'$F s3yIM*ve/黸Hra_ږish0K˵N8:5E] T`9կD*IӇ'9>Ѩ{ͻVtwrxZCۄ3cnQHK*V&{c\$a ~>a:9;D|:Y泞Hz. pP͠=2ĭlϸf^qxC`pۇ: I\\jXźB~biS5 \]BD=@CO`+ x`hfx^ 0Yt;]W+`uE~."\PDD=Abol"Auʑ29t-D4A)龧g۸ `ܒ6G(d*`kIQKR :tʌ76|偲 yy}EtI$vmqZw;AB ;aiXNhK"NȻ6*I֖_m}xi#ap5GULuIhi.xoIOBoCeF(ކY \ug,AqZ)/V6L6+6x#=zv}~^ޏ bHʮPg8LMPlfAbUi[Ƹ٣%Zt=A%ݾ|c20gm@{p-v!p\xU2)l!yUA(v&WѪ!oLo5$\5BoZۡ^,(⋱KaX]EW!49M,ޙ=,'QǢ!<.Z@j6GJˆTo<3gj n%@Rv` +fY)x Za~Fާʂc@A 6c:2(5J03pa֪/C~l]!q$= ;0ȴѭG`h8-:1!51:1LOxcLᠭ U6KHOvG8%A HVb%Q TZ\6 AUI$<,̘+ <_NmƳyOV-[ٸ}Bq}ιsf] 4}Kr`fw$tZlXV0d t9RL8 ˖L:U^B8خnm RЃީ=N K™m=zՂC+)_,\58cqqd3sN5e\(PIBH|֋ Lhq6.F#amNCźT0.eB6pg5))쿦=qfEmª*aH[㻖C<Te-fWgp1Z*Lz:R\Jwd -( RD'XnocMk2~Z"F/}B-o{\) m (9,Yo!M)!&3$*5D0 cOjU qࠜOJ.i2BQӏӲU5gu3˺Kqhjo/]2KWEƸꞐwx+\9r4Mi>p;?7E5L6]-LL)&h$i'rI.Tl*(Qby|kjNl;\lc&(LؾF~;1N΁LCW t'y}@:gQbgeGgjEj%Nt [~jEH!(u^1HSO{^p˘3p`^-zs% 0l}vė*럷m l{ ϱU]f6j}-`8T^N}"t|0]eZ s O3^&q/B"N0诮 DV{u? AEد 1]^Grqݿa5B>b_Fڹč;l(֥%Sd›gRFbV)=nvA6L b² (|PNaͲ]VWۍ *߃Vx˝K~?7bC +4M>ĉRwE6MGG{bt&R ƈ5YTo wߤɅqOi;q6>JlH/mM0`/)<4/Otz u(=JÀjW æ&㫋]}FMPgFrwuCkU - T^;ze+A?y#Ӟii yKג8odxOn+OcHNfW$]u Bv &2vݳ;ǒ 1qu7B2!k/j$u^2r^9ͣk&>1 dcK&s_6/ԛf踃DM@p&-j藜Dl8| c\OkuޏTpZYѩI@lqC{0'Eöʅė|dG?ZA*os\9OAgdA[= Ŗ,|BɁ[ s(( *?Z )yrQIrL]-5"O|9۞ 1og˧XZ=> otc0ƭ/ugk%p(b'eΡƟ>N\*Q{{]r`y=gWMGJ?>߻S%&$n$q6>~L)ÄW s(l$XĨȉ1)' %Tn^sg;Z:7)8M-qP)ZS^V۾$ ˚-pFӾ9;O$C.);RJ]Љ!6,c-K&uhv,g^yLw/w¢R U i_EMd-6*hxt΢]4/vjW!F:$.\)dckxjcШs*R+'= j/ I<6u鸎.cLH]p5~ÈA;IуG"2\ݏƙ$1IQXC3H+u'U9 Ko{c9bٸtXz06\~), xe@9D-Fwc3lY9:|֒acu婝LR1N:?tWiBH.KxjߪQ#ΊBQ5⏪*{.д-(u`%VVP{3e&rp*XTX$BN!4>o0 1LBcy4v'EA{l.d8Z$HEm_>^QFt5=R/0*e!4cbN!ϩ+ ^ b&z&:+lްW%| qXk:k7>ޥJqζBE^3?2]RIxT<@97޵޽ Z͞&GAᭃ rIgVzB Wgzc}9r0 vG8nr-|.R !tWםչ8J1 e r3jqdA] hZm>ȈLMe|ѠR'y4 5Rm2#dx=I4-n#PC__g}%Wg1E5|fW^f0 幒4.2zv`ǚYVd"hxN61-ǴKPkJWO?]^hWNXE10ͣ7^/b/w9e1EdɿwvЎ2Y3uܹu+̟&T}g~cۍ=̑CYpSpQIIIch+Oj h(j T(@eP9mmE3={dg|>w "/:9i1DvFts!>WE%Esȼuپ PGg'WUKVƿ_M=q30+(aB}cƁ(_~8վ@{k)-lK5~7v ?<I|~Aow\diͭ㲳$  468yg}\; ;5$`stW(Rmrפ3޺4xO܇t/q3uKhHCBT""DNMQ:B/s1U4$mohvCG6(Jtg9>(yÈJǂ˩HqVHNKĶ AkϋށWے ~5X8uHm=ed/zYƕwcx~ǒJ]SCSd6Ib'{ :Ok}x1%u_ENqQnC;1r&܄~?[aX^t$gS;aV&~@xvO#w[9P3f~p1uxgLgx-EM6NTX7&MHٌDv^yJ{$XCkV4VO

Kykbo hv0U-gЗAq@nl}#\TgTI.6p'EF3Y'T"/[ZԢhz eZ9(B90i(;.PǚzhLn 4Z9usᤁi *d#K2 v~'ܛ]@kU[%,+²ȁ 'IIJ:gF4_W:!(Ĵ׀zd@GfkYuxVp>"\럭"=9SNA:*RE y^5sޛZuMKUIԧ01Sfgqza0,??01]R-?\s>}SpڋjAd Ѭyvb,Ql,lɾHP,ith- l¸@i2W~iك\WMpecisdW"PkdQ0t]z9DuO#+Sy%hk?z, fxJFl ŭSl}+g'b.Ws0ü#Mٲ$Ē,#y,3cj92kt@yYIй鼄qD1IVםxeNK(U^&xNt{{G=lQjW5/ʇQ5';^?7%On鯳)W#jo%0Mmj~kg!?ƐsT:X]߷0~'L FN/~"g$+y7z5 8|m%D/2$abIrS1~myy!\C6DҗOaꂗâ7#ƨ^gB[1d!󄰡JN)MJ`NAfS ܛw)jj`GGvdੋc3+kgEɕ=6?+^KJ+, +ChG/ίKR=)vڴEzh6W$Ec$ƧMNr w͟K9rᶥFz/d9/SѮ!ؕlcֱP8ɤ1$1f3L]nޭV@DdQv`jZ⹾@z0zjo6!9躶ChIY0Vz[uGs&(wu 0auRu""4yӤkk*j3G:S8{X~uy=)W`Db%e-WIkLϨ]BytӰ -bmrT-`ReL5 uw*y9\1wjpzx&j usN4oTB4[̭ i@/wUCSZP|hRr1_N{IMIA|h,YqQBFY!z;ո+bC?퐖jȸHP6n[G(X¸1,'UI(VXGܜ"Z0b䥈-*1NƜPDZ.g&Cs*̯ݯ.AB$0i(J򚯛WvV6IqΜ0R]C$ν"nxFюpP.tQym'o3s!s͂&5?[S d;D\c|qIt\zU-~Oۜ,8b\+^iq!Fj0ݏ3 lv UBJX8A]ߟuE3 |5d^sGߧ[+KH|RBR g8qI;jЇP^J', T.Iuo)vmaGN) ot}禗 m zbJcRUC$ۼJZ4W>|%c2zuWCţxgi0~){>˜]-{0eB( ^8AG}/5:h ޑϢ.@$۠ĸhƙ2)AjH^X5 i :֥nK '7Z[+[}*1bkݪMMwZ|E_wPhuMW-'@rN,D`Gew!8tWTSTk9}6e__桂2emo{ީ县&s l-; 2|^TFl@EGk]SRm$`(1x6sT:܊lYMAF=<~8[a3&7w@az:5o:)6q:~`&c7.ц)4`IU*ђ [Do8HaYWV&2dY1xJ5"N:͟z0WoH%9W6bEݺ+jAۇruxDž={z8L2IiTg"KC~/$-(lފ[3/u;wT^wxt" j(,z^mwL' &l]OUy=[T ldcW}{bUƊDm3p3FK No8l5ozzCj3j¦J!F㑣wxW}kyd&hwܢkjiы7 Ѐ |-z.['mExݩ0D R.I]{ f>+0NwS!3,dxV" "6D4轜D* Fr-'A"uuBnGZ)џ%g ٤[I?qOeOn8J۾ բoYzǽ8#tf_ *1[I4vuT*J#"6b=QKOyKMf%c -.'ްHWPc6Ȓ1ٰ/bylNba .(6>:yt&@#G/ވh5ηOlP> FkO`E$WZt*JlQ`ݰ:T<*P/Q2#Qk4-U3ɭfXOp0+< 7/g[Gbk)vLYӳ4-7iV"ذb6Z2UVm??-^yУh"Z sVX)-ˉiX5{ňվ\5ö80e _8Mffq1{rq&fPW ؖjِ䖢[D/,|uygݬed{CXf\~aww>2_bpI%߼zoSB\iіeN 5 j6V#%ʱe(4E@.nQ ]"mnc$u(ѡةHdi?g}2s2^u{rQOV|:MN}.F;ME&u6$f2> stream xmweP̶-ap5 `%[p4{έ[lYzջi)e\4<@V  @]VM`Br@M\m0v9@Z`OecBZ6n3K+("u0b Cl)e]%9&@lv2@!f`;g0# `o`fo3?N.;e4$d42RR;r;ghcײ1e_Y'[l(@ 1s- v(M0?0ՐE(؂ R.`'=dP5bBvw, T .67+?qmE W' -φzrJJ2vf @寖&NI@==!iW4qqx95Z %)i r@.>7ksGg`ڲPUZkhLl%w]+ 8!+OOf<Ϗ#ct4fg2'K={cnkylx],Dƕ!0KU-.(^,kPKCrkBZpQ-A.Іj:)=}Uh )(Òv6};եYE:tj^7׷ "dOY|"c(|sdӲosw_jQZy31Xϑ+*',8;} Y> ka Y=CvǐKΫS6h~k5K=0%Nw#w3>LW w!TuXimؼv p1Ą,G^MxΟ$O~a2J֡lB çFZN6m@gfVluٟ:~sw|.ʼnIO9U?kZqq"Gyo|%MO!q#Ӊ#P/Šϩ}7%a-4F-1`J*D: `}1 H+R9Jόd%v*%jnqb#K|jITAXW' )~*!uBg#Kȩ _Tt2:}gzVCL?1VZMyFNh< Uj;S1 #+⊍d2Y?x&_jorg{*TUF@O3IzܥZ{DҸFM<_ !X CGtXElVm,* ӴѰ*+K*lv&nXf*{a[0 #Nsx޶Sd@(lj]COk ;o?ݵ4b =Ӿ^;`ݱpl4vO#L@qMo&?f5^JzNcN:)@HT,w3ȁ>=n\9#^$șוܼ>lf41SE"+7ֆ R'' PWc#΢CJ|2Q^Wu|WiU%kDj-p'Jus &`&Ԝxel#eU8f:jpfqt N8#UlLeaŻuw*t b-Qn l09򄞩MHˊCqب̠ 2LT-FQ4؎A9]&mrJ^\c/yey~>\_ޥ y=_`D nTlfm&o"܁H7I 1 -yq,b솺AuAIIL0%fLX@7Ct4E;}uai .L~Yk#^haqǬ*#„$6b^cEaWy.d, =៮lYf]:\=U،;jkTibv ͍ \g|}( &4 E+`'1'u) +D)Wf1W栢4C6G,Nh_~K1W iڕzDk3BbU*bNEO#X{w EMwՌ4xJo|]qf֘>$!RBج;JN։c4>o$t+m Z:#;iyrpvX]̃/n_tO%fw#T .#Ay_ kZ WBXjoi|mf[~d(+u>7?пG*>;2fnEBϒydt# MBÔ1I>K%5oNz$>Ao"Y f%] !sKW;SZ%} sN_EWmWAS@! =S MVCU ɽhYP̫ziQM,żqL87嬶+JV<%=DrIĥ$;ץ Ls Uϙd(zȚ& UY-2*oj3’ԖY֭4Ĉx*K)?͎&%eKlru gG@keH+\Ba FOp[LdO6gNNKG;.9O4͢¥̮4D ?AYIQJuq#*s}ŖS:u<ր9,1  [q鳢N:sBzZ-_NeB'tnT}RHx9i}MgmRK;. @Vӹ.D0ՐiDc'bӍYFgMB36)"vA0# SJDٚkuZl(uB;"Q )tjjԨ+jC0K pys[x4 u2GE0@_~FQ!Sl.~Q(~P(#::68ޚHW5CjB5nɯ2/&gsO¦)ѓyIW#Œϊ/ 9H6 TwLZNZ _MO~4ʭ0I醀YV8~W^I"##)p&X2ŀ[JQ0)nqfηNLH9')(5%3ӯ2kn'~neUfE~T%+Cs|fЄRW:GlEu|Ljl1( >55Z#|R'Sc5ųCīVWt/jPH4hեxM23*%֖SL+1Wɵto0 /E%VMԲ1$u>-Em`ImN<h _i4,'` 7W=32:81tC6'YWAl&:?$+F(l^Nc.,*fJf!GsڞNݸӫernjT'FۋX;WksM]~L t=sTK7vo|춢]>5l;rc])~ϸޔUQ♎G,#NXdU^v碣,2 ;F Fpțmkmbm@7Y;Z<mGSu,i$Ysd&{[a]{C/gC@i g%W3*|઱;A>NN89 O+' IBwQFRwl3x"KT)Xt!YG2ԧ9D3|n6/!Sݶ%3_LQub ImF\bM&T/ΆpOǷ~ϴ ViǂIql#K)ۣsn4D#zu ̬8v7UA$8&Ւ>*+"{>[t?~ GI[}ik\a` 4L*THgc41YU|3ny?mܣҁihi@O:zYP[~?=ԩkG=T-E[ŕ HˠIΒm(1ҩ}{fF[Ĝa#^#:\ ؍sF`<_$`CnՀNpp뺘i::m.>U&OD*{D'k4F\ǃ)痙pxSh&4456#{ N=׆p뇡9S]il1,[pdyޗga矬5:8&B X@7j$b>c& 'M~o ?)\Hoٿ#cɫCAޤmu,ö߀/rxV]9U8?%>@2ꄈY,vryѷ5!٬^׷m `( M/%wvayxƭ X4\ \ٌ139걿PM|<ֵ G @6L*= J9#f\ӸWHH;LQ2_t;:>La`;`?9Š5M\'Gm9>`(II{^kwfkF)#'Tmm'{=T JAˋzLFqq)n88>HQ:/#2g~6&".$G 0uPO&) Y 화ϨbPGߓ}C`Hn^B7on?bL|r<8s﬷Jkëazl?k ʃ@USsG_rvNo_m|}kԐ\Sn;d4l{0^o0AE댿A7/@\Rp\b:RFQ\iX ΍z;.|ug> =8X H0"50__M],e`~WuThz< T.Y|]ҺDM7u*Ef‹-e/ /&bII6XdP0!Vx %[ hMhgbݖ|{ZYU4Q^IQMLNy %Y, ѓOiFu{+gx+M1ʅr!o Hqeh^^gbx[ӽ=c`g+|-]G8w<|E)q]A[f"9:5CwH_~? g|ZgG캠x),'#'ג%%JW(LZ>~_>,t렕Tbu߮ { jt2!ReFY͊wлV=Q3sTHtN8hJe\+6n {1j@!AkN?n X훃$^N~Ӝߎ[wJx->0qɠ z{=/&Ҕ ٷ3Bo."a寱sQc׵ɍ?:V"YG) fX}9ޡP,voRLok`mwd@e[rI~҃iSEby1{ Wy~= 3DB2#@>ipf@U*.W %MWGwG%Zğ!IMrDXdݭ|R}w-: O6dFE3wjg Jӈ+˳ɩ68JUMV~ݍ=Dsť!\ J9|9f<+wq4 #!e rc[̕Bd+u@_0|)R"vU{z JB+).Vo> %9j xQpd& ~WE {Hc'F]0vrEIw dP= Dg*u)wC6Qc?L P/xKm"m]p Sb#hX.554/ʹHy^=gm7$n9{g *<`8Qm–V/Ctjg^rM\8P/򯋁S]:˄cG EHwO wQ+thQbj{D[.抱PH8-h3ad b԰7Q|2K6yu_,s694 ׼ֵ* Ubgm+y'>}Ji<ӕ=;`L@ G[H}C̊nK6Ep :bލ]Js s_lDz,+^fEEGvs{uMSiQZ)xu~kslZvYUaoJ œ&6^^™G܌F񸆟v'9EsAԕyCtcJ5gݨv'/_TD#oެL_s 4f,AyuCBjl;)4RB/U r{Ȫ8b'L(i0HI}k{hȀL1 Y4AűsfP Z:46o+aW+v׍g RGg]AޣwC)Nó00^-ûpVŒret4SD ȽlY%?}J% S5o ƭ\c6`qXYThf鷭gyLa;BF-SX8> stream xmweP[- .!0  ܝw.%K:\Y4ig+0b H)d2`(fj Pu1fX$=&'ֿ@]0?,`v%)M1ieMjPuv`vM p/5/2/ s'bE3 l lo ? #5B_B![˧5?OM7YXުG׳6\㬚TP2uy%P* >qI<7O[]ă2!KYCjrMӛk7-˒h;#G,Q _# le/馘7}GWƊ'&^v;3/y>=)Lz* { 5[LULoТ _2+}|jNT@"8GU=CAac;@RJg/wbjR+۶V0|0TMW ŗ M(!(h\드q,I1Gӆ*c96_EUѥ}0/2ꬌ8kN%2N!9jw]g{̴^,X'';fM V0]7+8>m:\0ӳ90Fء2sIixvM-N`< Wˁjk$=ZKi^%1p% ,Tf I݇ŶJd98D\GA.#\xlTբ/`=Xۢ1♳ezGd:a:š@oDYՈ so+Zü PA@tTETy}HabqO8CYsMw\UC}DASiUIYԇu<=I}J\HZ Of ['E ]J19OFT ?yMݘmyxVDA_Eu} 0w;[ެşaKvf$Onurų~Hd7ՒQ:Dvu]m8bÆ+*Eؘ0^KA+AKV ]TRԌ!:M {Jк'z=׳yz֥+eLzQvi?tPlzn|2s>;}gj])-wt!}>SIX:U Ǫ [{djl96 PH繰HWWh7jlM!F[[MTt5TsݙA LOԸ=4ߍ._(R]m˼imO k| njNBe( `1t 9Z3GZ=gu9300V&e8Q:`/ D60\6 ޝ h.dHYDo? m&\۫- O9 `;9Pe5G #|F;AS{{ 8IBC3`p+h8ā|ُ;}L{Uʛ8k5,91ꕖA(^ae_ $tu=Գ_[ހszFlRsg r{K~.:%i/c70^ 1.s-dI6Waށ3nO.SXcѫeOҽcKGy?rQiR}c!ThvxZi"k1 nU5D2;| z{DֻwVĽز#'L(z,pGR)£iCZ2~gةgfA4֘:w~]?ʥ9ERI'WfԻKۘ;K iuRY49fH.[14$ӎFZIJ`["pؠ/9K*K&P7%-Ps#7o|VOt*l7+]xIQUHo 4yJwHNFx?W].5d/ L7ZĆ'4n3d}FaibHmǩYwxh?e).3x%X!=f9qeӖ{n9{]Ve\NW9AѮ.{9ORٵ>-# S y2٢ 9 t]w ^+x5W. w#m''uEaK4D~&;N3$c#D^}PAd+ g;9qE'm0N1#%74|iwdD8<>1̉RLLGe-ֻ{~޵XT-p,%Q$]\ #L*%zGH 1y2u%΃w6f$U#$u4C(M}I7_=%}4sp5>{9 &&;m0n茑d[i5wL"w|1?F%(4-ƽz.lͪM|NCv-yd8~yS>k~dGKiAoT,T gdۼmPNi_f)̸caȎN]ݬl>{.cnZfW!&[AVA}[Y=ab?f+k_cLcm V%)3($ڏzXXbz$+R_" DUemT/Пp^6<Yĸr_9/gԺ1vjtNp?3*2&LO߅ 'II(- #ri(ƔpldI߳e\(ԍ$ly`bm[2rgr{ ڝӓ8OcOJEZ,>FFUawh[ z2f-T:wS4w#><{о&)UNS<~%#!/'{ՊXs BuHo3/:1ɅlwWSq?DcZm^É'm:Kު&4s62VaKZ-W_s)47?&TzG=vk. %H\4pCWZۉñl_0-W{?Jd&3a}^)wkC?'rɊ]^Y 0{ rZ쫻6*gޛG‰M28GPYEfTzNQRv*'NAR75͘w2$1o`gG2EWT8c2F!w.c&˒3{Ix=wZߚLji Df63d%H%%-M;G\&S>qzI]%]fe0.Sl-[؃%rɪ(Pm.N0b̻"% @ui$Cw~]ˤw*KM*V~~cm~f8(VVdbkpo8V pi12~6r&SH)u_'TW3s !w՘>83m ~Ez]tQ{{r609'LvQY>ǧֹSMwdy [Zy[ aEaί'Ջ%ͬHŘAJŁuzSKJ) C#/̘a?FF o2%,!pS(rj-> #ew%~+03SwV1',+O,|-Wp_ezHKLMάg4=(j.~~;xhs]z*b<&d~6K|& ʢHZ6oזsI+f̛3^FRW3KoPGceD@~_~SQ6, xD eT~Dna;ll=[V. ¹eM~-d7fpa4i6R.Ys+څHgs]H}k(/Z'5K$:.'oHrX\u"}`N) b OB*YkTߝ{'aدmzL{k:"` CBH@GZO69Q8rYNᛐ{`// .7H)FV9.: &%dtO nػhGb-~Tx _ͺSK3~Mr&gk/]B"3V-(DKOʓQr28~|ꌤ } [25nx[P 9I:Qn,WeW[z#0/wH59Sے VQ.'ykLEqr; ?~* yMcy3nu57޷~:˽Ver:UufPK?$VyF o 20DQRA퉓jՕBLXK91#νdM"̔4p W>r))ùRx79W3蕴ll6/h./n"3g#(F(; h(]-wKm:qXRhd-tcmu R7XF 0,Z6.kw(Z;Hj9zWt*ŽW,>GyubPBd' 4'% A7wC] O_>s5PHkS ,^VV>δ&_G(' ]Ku>Nuį<$jX_ r,)hP:Qs |rk":F`z >W咐=ۛgDlkKKF|.]lnrj^/bvjgpb--a'ӽ=`Kњ <1 xOD{Դt7v(rz4;5oK%T%" 'l(~4UYs줦{>髶x}DJT9&=}(#"`+swmb[B(b7\\aL.TsZȐ c4bie G_,EER6nlm'd3SIIJ|tG?~n9+y{؜fø?*nE,@3=,<@19qf MR>jձP>燈 LH@CWyAhR%9\O z5" . 97>.v%c'kpS~ Umo8dY>pY~SCbT\#wðM-DfCip p-b.B.4($d}~v:aWC[;Y6", |1|Tg J1m91ti`li')V@ϟyGʷ&|x'k"q- @ K"3IVP?CSfF:{ ~%l/jfؚD] L?z͕Qk}Ɩ vּ+XwYteT!X@eGWv_CY`cX3i4hh;'hͣ}Z xX4 L} 杴wjL ~c[ZkD@_攛 zMh__! `yO~ſ_&{&8R~A_6+,.(p'̈́ڄ"ș__+G7/pN9K?GV}نf*BGdc]\]TH H).@ endstream endobj 88 0 obj << /Length1 737 /Length2 25968 /Length3 0 /Length 26559 /Filter /FlateDecode >> stream xlcpnݲ6۶mvbضmvb۶|=ԩji}uWϮ.͘xT$TTYXaEfF.VbF.f"0&253VΌJ @$`j'ITl\l:? i@Fzn6%*hfT5:TP0Rc,ZqQ^&[0}D٣Xxdw=qpu@7M pdr;U>#E$vɛDW!:0~yތf Gݝ͗ \,s'CRݢ]ChWX3Zl@&5`+wo{ٕYON }KZd.j>Ew蝍@w?C|VH׃}:A raF%a8p`{i*_aPBt2,d N3rJJ?*^R⒳:P5Z,F.J}_bDSں v2 A!1ލS& H)omZ=OP-T[/>Z׫R^pbbRB^BŞw?P/Xq3fcZoCk=m9SjbY!ovitbg36Th\#~Qo:| M^0Zi2B Sis~6OΦC113|'H}^Ou\xjj8Ϳ:޷-oN\/v:<*K 8|/JŵWy6 Eq^`g?6X_ǔ,M1dW\yȶEѩױQҰݦH:xxbFdfh4'Z%d}d"xF+K7!!}ˤd,16- z܆AF-ZDQ ++zQ%rx5z@Eƌ!zT1.bQ)5ßDZ? VtFm,ekM&kud$X ǐs !dLw80iÝ̙i/ԅیK!&jZI!`}CQa("Be9d[AWUpYK)l.%7eu+_|mhd8( l~ETpm[8QieC1票KHƇţZ]WN>/Џ\XٰZàB8 ]9|.cC~+(zd |<8U"Ң^C^ }*W%j%~ZN}g_*a =- a=G4K=aFiTU#ZÖ\P85{c45.6~rfJ}dp qƆf.9Fq4lE+MtPNԟD5bF 6GU-t$ȣQ֣F54s;l5IY83( !:f @_]HF*D K_x#(Rc*ühk 2톂µa1NԪk{IhqSqN>FI37<4>q17ۋef :nmLZDÛua1gp-<2$.GDQD9?hNypV Dm+~*LT?#y(C۲: EAtB'>%\_` 2+!y3Kk6QPqdF%<# |j HV7%<{KG~L(Ivޏpem];95yϛw%5G#RyMxh!c2`DWQROu[;3@ъpf!9-(0W7Nf3G1sg948k3o[]eܑjN%&i8`Rk950G %x:/ o gђ-Ek ߀n- t#yiC}FDE?گ''»1Hl",̠H2τa.OǮaQl~. pQQoCPy/aHuOծV՚lyݟ@:jq*[10ac j{zQ=1*Y@7ʉXPI9z&\W[ݒ"2EOZFg}fJ5-M-wjW]zGZ>me wS8dukVy]c׾r5=6|/D~o%툂t08(PE}:^3RK9fN\ℿa517oru&#z#oמ(h]\LOHnF =-v ;^7;mjQoxO#R{`cq,W;+*8^i< MH17E-C]2y "HgN]M[J˔A+EFevޗ8$lBHⷔcj#{-N4F0aiQtF_PO 6j81GLN]9)fms3ԗw;ǰ!GH=א0ϻfLY1rUvҪ?O |ڡӅp2˴ 'tcnn_`LlbM.C'/'iiywfw-TNS{VHJ9&oN /X'&k%< 9 xk[AE OYSF]8- <#5hJ Wx'[r[10kuGH("6 ŗɎTJsͻYo;׸q2 fҿ|<LTGf9(&s8m\XE^Tq> ^~/9aodkN(FǨJoGgjP2>SΉ 5֍W` ]{_Dkx 6`Tn v8m0sGlW, GWY5b8Cl'0]J'/ի9qw{r&sgoX.z׌jAM!#Dk&f޷Xh45bHVq4S|S(s8v!fi \hP.XuN1 cEZv*m7FVKaUMvVE4 .GPBdOCWh{PydSLr8fnXFL7V?W6/\$lYR+T Mҽ[lz5슘Uy7u=ץȯɅڍTI?p,Tzfoy Cz: U)ɛ`|mqCy@iiXqMT87@rY#rH V@Ϻ>g%-` J{eBb\^̾[ `Gq `PK`>covKgwFشY c;pXsiҦWR`* Yt<+\c{WbNژӨ⮩"U)u)-cfoN4b j/ vj0ƍA-ȏ?s?'4]Yqgr.yu"еpi?hG:2o1F;H\*(V|vcѮkq#O{t6oTޓFg\~˨ս!6yD -=PϨW(2%i'\k$?C2A\j/(ݖzIy+>B p'6ΉE3C=(KpX 6WФDDZL9"]]ciAN mMAnj$n\,Pok)P٪si~ F$|gzqj9.T1;?|UwDa*?9_F?V]p U'CN">}OјOSLl% oLG! -_S$&MAݿwLfklCJ$Y!hPp~:F>p`h'TlA yXd%PYl6RoM jsE8?qH$V?宁<0 "찯(1@)hUXuPD4خqT}A.eyK'!Wp %l֢iwppܝ>iӯ耐𣙗0k-%Ӌ޶)ݎ[)t3aTANe°y6$,I⋹0O%#w;*/uJ쪥|WqE) |TM v8he 'j]mVaA>́7jK"Z$ƯC=Zk1bXA'!mt+yy(Byjcb|K %۩cڽvt ?h.Uvu줼1?2} 9INU exz EPٵTr,_?jDt/ qU Z:Q jG{uW/p~ō*x^6cNl]qZ.X([!7g] K ۮZ5RVOv,Vita"O.?|@zؿyuRy &Lbq 'Jj}# i*DҽhocY]A\iGul#7+*ܮ;Ar30U0"z 2r.ucpp4e"*ZM*wOni7RY6ONcWt9oM#Q DžR8 C0Z ѧ(/Ӡ0ԛ $~ʝ7q@13& ѹHGW.%peF4e+~.ͨ|x<7j)2n 6RGlAV ̀0-{ mVӨb $˂m۪v3apNo@[-$B!ZQ)p[c&i=c2^8MPGu *@vNn hjc Eo`KPN|#fg^9ia|Jeh:Bj#_+$Y8[`nϞsMzfl07 M^үSf3㶨tCWT9q/u-Dm V-g|E/R2?.#7c3MAxo]Ilkb{# "ڎ 9ESIMywebmE@A tai%Slh KC^r7r#~ޗhފ&Ol1[ɡ+t.L5O\q^kԣC~de9̻0|Ȋm[<ڦ]b ~q6)F)'-?#ɩĚ}|+fuDI2E˯4쳒5ĖݫStQ;􅪑_ӔI߳7@gen81e3#nP)ji#ؒ˱̽d]X% 2>A.σq񳏯&t'Y#hh-gڍv9}NEʚµ&mP :ZVB`9JMTNxeڗP=@t4og "% ?彺5+{-MNH(MțDx(K|V# J-% @)UmNWU/o _809Պ  kV$g0T$ sbLvP? #?oH.K2!4,7ט NJLG/-XrX2wJ FGbH TvV'1_W. g6PW0:/NP)WၳaH8-rp ^_?oI\_Q l͂ &JǪT?3=WCe=dtLrĀuVYԪϏZ6mmS[30Y:8ߕXnd8Prf'!?]GPcrcA'D鱿OP mmCwͳ58_s%"<'e{<6vw4 wm#ͯtػi?3)a-Yf`|FsFgLUQ́Tj5_$ySFpP4G"3?/LwPO;"@(Q 'cw"` Ju ZKC䗊W'g ["*ȊQE֥="j{FdDe:5xb ӻ] Ʃ QۭsN@h0g[$1whiΫF 5[+usJr(da5AslVtp! r6Saq 'Oo*zrQɯSv`[O*+{N}$(]|8h tqeG";}"7jBBТty@EQM_'T#I%X4hWoɂ+i纏˽.w"Gc~"›.0==Kk] !Cv@Cw>=wt #^`;v Q`/c|\R0K>̜++D,Ippwk] &3Az[to3, >\aPO3bȌo,}`9x؛ѩ뤾Da8J68;$&8Sx p|+*yxyaݕf(;^0V3$.P2TNb=Wݛfc/,S~}[ C |P!dĚ\zf[Hga(\ZFd@Jɝ]8HԏOhS;U swYaIb횒 7&L`GT<}`X5iA~Aen?ILR* pg < mhn5o5:a:hs*\\?ݺ.wH\/o}7rY}W_v/@69XY`㬏>/y͵?:q),!ISL&UIu'R! u0.'Ճl? ߊbz9Ãk]7J'F [8KO\;6Eø CuhHĺ{#C6?4BS̽iǯX#qæ)niJ7!$$ aWF2AGΈS!zHR:FΕa A\>*̑aø 7PG-p@U)c9߀ l:9CQ:Ca5zx1_n2n_w'vU,W%ltqOVV?jZOu1&1tDťT[:ɺ39 l=`s(9"#_wv(7H=5 obW˟BnUѠ'faqi69tȅԈ!1B3][(q"MAꪊQ+4xY1!j1I\vF_fT6u]3<|'C,{p"0+yTG(4|hGt@@3[ZM-hm$X{ :K{&VT1:~HX*O+ǜppoǾsRIәkfΖRaՇx?Ҕ܄5J:(Y!$ \^ E% mCmV)ב%ޘõwcm *F~jWO !C4~>DRY /@jzu[c"*O{L!vj !\,xjw6ٮV}rhs)-s؃\mJL%/q|zfJPŃc?DTj\w+آ#`oq\DD_ xXy1Dgh|m:W^SVzڤ[QKe_*`?=py_#|3|Y24/D@̵hE>B>e< x;QIu:nzfQAj̩>xZM~ǐtԴlR4b@#lT9;@cRO9KvdJVc cF%c։%P t`y@SgCYOT+;Sm X~[3E t }17U,`! -mi$ou`C?LwV'kZ~Ǩn¿]GY3:v%0?S".>+'ft10`ǁN0rz+t-RR"˵ُ=$gFw*G34CXCaYh-菜^PA -г'^Bnn6C)yehdh"r xRi|VP0PFd)7&ϸnp3Rát8ƪd1-+;MuIf8+ڰDHX.Y9D%k>ڞe3]J+#RD\OV],H(uV17!ߧbLӳ5^w]2=W`7@_t|f&I ?^֐lkI+Qr 'K@Z:( F䑬Lzj: 8+KCJq#1 ~3;q›3y% EC8tEiXCIGE9JٜUGJc!?=B KVqw_,c<+#['̲ @I,ĨZi@pJFğƤFoH!pB\x9G"L )"ʉ2¼!MAE{>} s7]G.oGl9XaGB5Vq@EI<Hq|`g]BM,<Ǻ, UdTzպ~$N"/; 2 'JF|'kWNjY/q;ѺR.~'" 偂=D)ׁSWSxS"Yq&S#AN]'w!G;E${umxAi{@cqzn\R -shv_qI ǧ:v3ֶ]hGvXISF$H[V'(;LuPZ-ϲbk4").{?2>hH@QY=eFbɊ5m5?xtw[o!V;oXVڎIş>$9YrD9GX)_ jO5,o;<{lj! 0%1nzMnAOacWM^Y:V/ lU+zq+*7 >b:yW#`Y3F74TY:9ilS BGQϛ_M]T |pj-X0L' 7/RPNu-#F1bX^=Y,,hPY xLRǍᝤ1Vع?u1x9l`Eصn9?3Yv4s6kBV4se4Y)dSVkՐd#٨!pxIȊ#D׿,7oˁkv6&. r L&&2ivػ^FV)YyƯr(jyF@ˆ_S rJ?5ua=$dLͤ7H~o/G}#XV\ķwag©Eg/{ǐԱr3UM#I?JH#bAUc4Ŷ]_Qûo!dTK!Ϝ&!Շ b< pArK+wF(<ʨ&@{s7ȝ3ݬPzl' $f$xy}Y!3yd1{#Y>U(Dl:M81_d A -|ST!-~PLܷͶK9D0O!o56Ob(׿n0H8}IYghmY_zڕ+Nu"JOfMSD@AZn! 򑉓mJƳ|* J4CS鐤˨:w_v:WW!k;ό ?]tBfV\1 w78pFWWmE*-S4L%BUrC?2 }nf!–8,"$",aEx٬h$I~/c7zJz!2*jB*$P,ۣ~X.U˿uKZ=w™Gjke_$x/҂,Xza/yYoP~ h ;" V!]DWWVab5kȀHUS eCXH58Ks^C"ke6އF?"qBYڟ>wȘ}k W0r7%Vw6 LT6l+ (p+kE^IrG1Gs`f!qϡ5a 1;h[[O1pR- Y|_$ y4\QB8EqdS%Wl1n=X3jyâьà f>ISG6]l]h񱃀,>]`>KѪMʷd$|^HfZv.AI.fh6*-lΘlg ̳,z.{4½|)Qu-xy29wf-.D(E1mN<7r. ~lfT\cP=)%ȾnxrK72Dd5=KS:m\(;I4"/Y`]#@b(!lf㯆w=W]:qPÀDM9|LFi9yK"31FϙA,5Np\8/,(6@DX3Dս!;S IA X^#V ]4((mIŴ9B٘?Oђ6+ɟŔ@*A#_{0lmRwgIb0FvJQ!81"3A2݁ɵzl{+x4gk?VKʱ3T~^KްF'(z9R.b;(Qs=v 3R%)F[] R\yնBYfSj7K ֽRM?\ljI^Ju' RҪ8,7jfI3F^z_s/Lri;PD17+WnK m;tŕDt֬->bn5 k9 ]Sf E)E]E=uVwD3NS xr#ht2f+Ny#ɂxEK=OA`.F$&`W3Hx,k #%+U(R// yM5\o:Qun8* I47a>&yj -4Yxxt>ȸe- 7uo(TSZãS RBŠf>'Ƌk `x);Z`l'IQcټ5\GeV^ a&ڈlҟ/Nj)ӟx{+2vߟIO\BT>BU$Nk7qm&$ޔp=?7}akֈ/j/unI;mTXXisޑ%HA<6D_?J@<o9(fJUUO/#.fmWqS,W9X,ulg9!湎R4a9f G;Ӟ-J8n"aC%YYS4;RT:ao!TA:x#o—Qow v33.'k'`>4ԫJq(IB%eŢʆPY*Cu|kMSӡ׸lןR~H-xNX h}I2Wʕc#q@%/y}FR 6Ь*}y'ot .S!>s{KEf;_,nsWXa%ȦK;_5rGrf3<2Լ)V4U@:Y{&LzP%klelMªp@14xoL[R2X1l6a"R : YK~*U?AO>TҷW(9 C;XjMNQ@Yp/*!ۿÙ̖*Bw@ u\E,՝9 t?b(a ؜Ȉmz|,k aXᎈRWT> {G\OLz\ՅؽM@:,?@ea9]JI&#c @L߄k̗79*S' ̦CX*/P Hr];es?vmt@ci:}w}y/J"7KҴ8kE|=x*vH ڭ)B! *40h[u"^-!B?-ؖQdAT|Dhy 1fNyHK!_:$ڡ%DZ`VJ+I-mn0^P[G@+Vq a7M)zD ګ;O4Sء _7)Ț>vqA+BJG QvYqr*B"=lw*'"\|-dggaN$78zd[}A,WM M$R3@K-LFµX@rrƼ="pZKʵMgHB[a8hh :l<*R`X&EkECbεΡJU*d@T<Ża1(`CQ{*qבB9 Bq꺋_׳wG1,-'9^=+),/Q!|um\_ݱc.@fpKd~)A ٛ hU$ 4,:Q%ٰmU\nCZ3`# Vl w#>4f8Ҥ׺G3xo?'F34BERBr$gՑBZg3W. M?LiqGECZܩKcDB< Bpls1Yfؠ} a0EE;v&cEWВqz /$Ch*ڰ# ModbPC/^^Ap䌈@k E#aR)Nhd)G e.y!zoL+VUCԤjm*fAw@w]۝*q1}($Ӗ gS}+*C4c#Z۶?KaXԦ^Rq|ĖD8൙;bWŋG.CivPxæotӃ"R¸`.hf#CZo >%p|kįd)RQ-}p,~$  \v>=*iP 6e?^yͽK*)C.‰=1AvFjbL'h4wekoĨOC[u)סdFDq%Koi џoi޵>-b>ӣkb( #qeYoay:ΐ|&s:JP@e@VX#B+HkzWez$4MUpj\1@@xX;y]tF_QT!ᅨq&=|̊NnL/PrvFlɲ@&)xhYw%w9@J0Ҷr$$G^C@p2ZqF|;tкjMvD:i' THbړv>M [NEXrnڱr3%V(oCq^by3( Hq?tD,nDdFLqWCs郀Q:5QF3-jʸPDl!ޱ$L^|d4۳GW7-ي1Uz9_?<9qХb=)!P FM+pkLxdE HJ3D8~dyq fm11pJ!ų^hy.MDNo%||J\a xUdB0؜\œ1U¢o,AHߵ!$ݔ95.{l'b82/ $./ʯRFm{7 1" FNE@ [pǠH%₧[k v{+ϨVPw4SopRŸ8w x)۲tkI 9p;9[NdިtW(dv~LR;e-h)Yw8bhWZ8MTD/8Yj VC}p?o(Ep1.ԧB[2vy,8tQbnvhٮж-t'p$gE#c7VO' sVOuaTa1ŗF{IX8VȏPT_BY6Kd}Ln]3F:3 LU[C(+S;p,['TPՊ|sKj2ZBΙafM:,"ĴZ9쭵ܬUBa6wJ+u%6 DIYK:C[,9ǥ[Wp͋a~F/eK _#!R,_rGYK v_H, k" aat2Ml0Ճ% 1hYKdWi endstream endobj 90 0 obj << /Length1 725 /Length2 26580 /Length3 0 /Length 27018 /Filter /FlateDecode >> stream xlc.5<Ƕm۶umm۶g۶9E\jUvTwW6PE\UL `bio'j& 0;x:Y[RPIncdjikDnocfibA&JOO'@hfi QPԒ W#l]m,Me-Mv*B3{'B7ML-3ع\!fdoK('*$ J(& *BhdgJ(+Ow;g-Z6FkQ'[0LL&.sK;M̞nSW C~hHEh 0jc#od upu8ٛK{w'<57B1.KgqK?z8{mGVGg*A]UFJX_a1;{SK;sB4r2_ǿŠFΠ?Em9#'KBFJ?73#3! ;#! +!'35qurعK?%0Y[7 Jk +1TYf^A058¾WwÛ 0۽ܑo!6ONE-cTn+5_cٚȃDܹd*ROfJ;!K0Ew#mǯ.>IPQdjij,B ^@vnȰ , +ô:OoqY_]uiah/+Z<tN:7eF5.la?1*D x`̯ӫ ҌlW7wpRu;-(Xq#۩gd.Y_o>hY85ms"3e^$"'nY~mrJ8DȕވiAԿlͧe#K{*;bFEA[@U1GOdf<+Zu4%xe͹ްg*!6@I!XCb/2t{u80e6 M[n] ]`&-+*(YJ4 Vj=-'6V݃ ^Q[!7lH$J5q{q,kbێqvP=aߊe MRz@ߣ{XkYrj bZJVcRu!pĀ_!m,s (c5)D(N/Xu86Y-_\Y<,/-yE&rΰ|$2H9{ -H~\w3}Rn@s^QKa7Į%]Wehx2$D+3[JZoDOd_rp*})H3%AmϬL?soYQX#=t[$u:v5R̪COc8gǺH` ]TȶaS^ kؒ1-7Eſ 5Df#Æ-'756q4PIJAJCt S~dQ!= IzdY D vۋWј>^ ["L!>w'7?g? a`tuO4`8Ptx#'1o7A"Q@ *Ԍz垕ntrh Ƶg;kRW)Fl;BC UT([^0r(U(N QkKQr 9 ds;̆10 vaş'=kuȭ,bWߖ(9Eܑ3/o`9&fZn5fʨJ'}?H$lUB;mfyQ[h!͚TRJe?ɠ`O~^ dg?JM=!z }>gZQ9 7Xoa%2Kp~pB.iCfgA\Qsta71æ b'Qt p$Ht,R$:sK3|,[TN@PS*ǝ8HAX cH9<Ę 厌'B)Z`H&3RS%QXsR^vԔ< l/sRS$EKG</iD ܲ`rj<"LUaI Ŕ3rl'ā\&J xR_629F_ RcQzKQK@hAEQDws,PŮfАϨ3L.> (&"1;!?d&(VXE(51b( Vy.~|JK23A.&v=S] DiP6_=)$ᮾFX uK&+*\0c"[(8E2>ʽZwhW9PXyXBPBn6xW~[;6%1O"*%4y%k$,Ft[6e5&<F$/z2f.CRTw/,klw'T >KA˖qlkI۝/'ӟ #6">Iԡvhڠkf|baKB~J;R{lR8 V{!ajJ})bοǢucڹq/oFQGreW3aE^ʼӨG/d&c S.LQ_W"cG[>|ujZOϒH56܎r*%Q52Kc;+P-5jl&s4Lc]؏hhrr3HaZ2w*En1P&ã[45ΞO+Fe_G #{"0Y7 "9)DšEϝ81dT֔=ShA0|Ip& "voՍjh t/sqSuoPإ7p8zB8ER[b~1dX< *?=|rNe6{.}qrss8W S-UYEʗvg)”KQ@6f52?*R.U> 7+.ˮML 5Vާa\(CgLX`z:iWJeiSO,Ip{):o}.H4P)^ 7pK'>ǮHՐ}JՑ"M2 -0f3K@?+} ^U.=w6dg.BIy`5E,)퉛/p< Tm5ǽV4ay}r ujnuXt 6+yE8_kE%2޲7^{*ta:V3YS00 rPըlN(uƯc2?y.hϜ%KUP5ѫFκ1:kGFsЩu XD~"rkm,zwjc<jqsfE~qɰGNt~ B4L!q!=d+/5v K'pk$uБX:.E"X.N/&IYޕ;zk$0>}`\{I"4=Dpٌܮe̽nhh`o7 Hu}ɷWmMMD]o]92#d,?J o ~M^>_?ڕĬ8*:uA Ar$/խ/@ă,pb]`4, lNH$;uM9rKVNOC7Px8kVv\+3ʇBPbU{;p y9>{߼\0G'-f6f`h($į6$nEoh_vA8).& / bTk\K/nQ(?ndCV8llmeJ)qnl'9TǤU:>MgmaҚfna. i=IrBnNIߣ(-`bO I<“gOMK4a%-J7Z G(ka)h4 sXi5J_&q(rTH^$=<=5ylvC%;a鯁o4WtE!l-'/l1Ѻ7`qw4Xz\$GZfF &| =: "/Tw2!-|\U?[$%VV\v؎7L!赂7C?g(EW?"i'zh f(lS@k ac@0nU n-ioy rj;qy,p* w9r*x]IOX ]HG I|vM^ |C Ss>,{"K·Di`~wJhkv*Hq0Lt2 WJBs2L7u{50i yANY=Hz2Z=jyRFCMxXCWI;ׯ ôm~V]IVWn^e˄,)V-|$KՋVR#O2zdRN}z'7Fo5[%-6 )ZpFFX ӭ3}\MnfI?p> 0ߎ̖ba7. +S `d:5"C,p0qW,'*_QDӽS. 鞳3\%'ݩ |kg/6)lϥ[VykY023?eϮkO&j,BdMi22OkӼ CٶUSX@c~Ni3n &sS!߇\YVx9VO5 lzblċk8C):"9|}۹^ +/@=/G@X=č 7Un1uEӇIL9T)>ցG|;9Z[G+-7HɶmxgHX}dR*WT6@@@W kX$ -a>tH߆I=q <*5\xxbLy"6N%#>By0""p(b 1T1y}Ӕ0kk/gYGbJJMϜ8u=oa1HaDUhre]30k aۆ cw4cTAKqJ.w>GN%lgWVu ) S- m\zHTcXu:o 5ιO$5a^Pt4P+{W9P{J"ūXqi\x :Dl% ͠3ηO>,+g %;$"5;c\mpaeKtY*ah:]oTa++TH&E_ajcIr# YKhC\۔Q~N[gr$\n?h߅ZF$K!.2L l̈CiMjqn"* &C 4RA諾Ph&E[sN4Fceٺ|x|e_3 YZ3s1pttXMm'.<2_ߙO ^q(R9DGdnT$!eULD~J{oܢ j,I8,'NQC8S?0Ɩ-ӭAĬh-T8dx*߽q~ONƅ;/Q%ۼm&)L[ŕN@T'3{#6u!)<%ժfh2ST/Fp1j]qXG)I2{-+x>&Y԰AOƕ5,4⤤tGhͲ5MHS Ag; ;J|INe /j*f>=[a-wGB|"/-%͙Ux0`;WZ˜{mwri9пeNoat'Cq<ؒ*kr=UM<}q%Xq.2gK1. LiȽ3s^ pcb(PVB{ԕOmME&n\|,^ئw3; x³e?}^H ȾXT-buYdG7Z1]:t)fuFhSU)"3pk[l:b]K @:YT+5.'HF8.ErR5Rk_*:2Qvce)!R/ciC^zuTN3Hl õ]ydwHorZ[Ö9ljMsP ڀA:L~֩4% ?4Ҿ$â/_Xf4|Cbp+uhG2#uC\ f!P<7IOFUqЁ%/%ӡ[E$QHąxpL?%Uu nP]Q@2#XR%26Ż6;=Lr.EȈ4h:/Lؼn&€pu@1⹵A C=D++]3rv]F$Zϡ'E~z(Z~?EmKнױ'UalN6R\ B#qp>/lzu:)FKYֱ@ i-+246275RD{+V%Q*#JEstF&za%|!CajM:_k//G_"GvW; dV9*N[]֜_ &~@,(p3)@Y0O2I{N&$k.2C)J8Ձnp:ˤo4J섂=D5p1|C6#n=+$zQ^y`aF1gɝ%3وg r@%9%ԕuf?`An`Y7LJN"NA{~D˼VCMڞ?Pbˌp+=a{ $= 6c-I ]ˢv.%("T(L:ad:D)*l -*z: HoAI2}Q<4OJaf#F|_WH ql[oBS)*BV땫Og Ucgy(u<&.φaUf86ݤ:l}a轚a8C~9Еse!P"0XAa~Q= K^lFG$F8a4+4S~&KBE#g+lཪDυ6%ԤV8ho<}c^z͗!Ύ Do,Iaդ6bNu_Q")>Owa0: WJ,r»sZg +c{e>&2nlUە,1ٸc,ANzPV٢h`;vjf7zP& vySe| h;r]bSfpsLѮ%E̋Y)S1=B;N!] Ts(HTZbRg= $]K [\;6@$cf)JUa*B6&P嗾:EJgȰ$Jc[c?3t2ĝXOU9zr>6|pkY [#V]<_?~Q3C~ f,:£_X[NaaB!m=aI:NT].I^1ԶKnA @mēeL%N ݸwhe6l;D&{Hms1pbgI3JV8;)IIg1~(EF*J.E18 =%xYDCLi']ϱ]?%&(ΕaVm5u-L]5<4QzL&WINv\"54C`z2|]e;^Pdjin`}DDuKkzK؇P{|Ŀ%her u >Q̞-e"QtLcX9[zO{sN0f5\p,RR nWe5yOn>&ZDwr0&_jqp|{TcMuE,: _Kvsh,իu˃Pe~'֎19/20STXp݋ؚUmj\qRvtĵIg3[21@2YO.vmD! ɡ#к!F˷JH;@7RZLC2_%P;e65=ov-A#Wyb`ɟ /Ƣd.יn P+S\%дۜBâL%ˏ{T3QlؖMKn#8 >1-g?j}Fw.\'xv$qȌDI"s@IXMk>-B(C L#(TQg])W qW˩Pkfuw^$_U'[u‡;sbAoEK '#))8QQ`^&CW#apR z:emc[Uo&u[a){JGI3Xi#whnBj2:`C < l߄?&3"xN25{ψTafeԩxw \O# SrЮg TZH6 }]i{l2Iaǣ):k/1V4Yn v(Lgq lUee괻XD`!X5 /f匴]m(HZC7&~XT5Z5䦑yĥ2=X$zhs֡EwӣZ͍n( 8iMJ՛TQՑu#4ĊӨFz+Nx]5۳#.*?~,NXe@z+#:|~^\r#m3_8 $)sܖ{u_mD 3Wj Ylz ++:;D/V`id;@dNM[ W6A}`p޸ITs-y[FcX(lұpQN×y@»EPaG!˥Aހ >$#֛" Y5iqM|!;~H eQi4)A cӢ,QC_7Pow[k=b2` wVݫ_d A1KPH`P$/zv:KoR*zF*vK~f3~ഔVr }cTQYf>^HD-Ńq~h5tdт|43|_&HMRMy:"ČYzTϵ+*㽇[P;HV%p59H Dc_b.!ҔǢ)Ogxܼؑ*vAl MxҁKpǭu4Ėʼ!<ڠ%YMoF"ٽAcо#qp`<\w.?59d0^ޔ~QtJϾ Q^_4"D^XyKoW[QH=6Ϣ"ߚt94\u%o*2{uyI>Pgs˸ ?|X4HZΫ4;YUR kQ9XxbwÝתhhfR|j<BCѤ%;3k!}~T׼c< :A2X$.8:;(6MG(|Ap'}yC%) 8DQ]ECU8F*{] %{j5 wK;r i'=U'1ϣ{L-ģJ\vZF{UrO~1; R^ȗ-Ʌ7h歝χ&+ʕ} y8t*9b lIvt9%Vp`Ȥ#̅#%zL5iYzjpz!BY\ZV5>HPjxhv\Xx*5&j F*XMuH,uVbfL-lTQ[r?XNƵm]khn☘ B0+[=8l7z=!j̨u7c0@ͯ90krn"S\dI񬽪KPwG.,h+ogAf;IG)d?m9~H.:R]ֈHZ;o>b8$ ZJR5(BkϿbONGn!Kdf6DR ^\j(bR>y,Qy-)/$9d2 96s$)s' @>%qQ7X펟v?C)egOx!ZWC%w`4EڧI{f=$S딌 TNW'|ӫO\CM/,Wg Mj@yз' #Ѧ1ܼn aݛ;vSzIuxژke~ L%C) \'s (q"D }X 0 # ޵ckpODPF).k+&us\ \X&^ÄϲzL60b& gjj7/aSU-'#qPO &}r'.!}|%%5w#Jگ}aD_\(>JJī:]E\S\_x8M8, -"O s!֢HR0hO3lfxw\ wvn$]lWeۊ:\Lr}t_7'8 @."Vs-nW+<~EE ^,JՖ|!6`>!Τ>Q(A>AU-+㞚sfǶms'ٱm۶mNضm۶gŪ~ZBkte]Ug7EJ2uB` kI7S ;XĥpdRzR0iVe9NwC4~s6\RVN%t}&zPytIY` M4[?Ck'Jo#JuNɿ +zYR/T8v{,3#Π q I 3=L:VaXF&Zd E?큊*~d[‚)'`x 2Zl c3gG.:rtNYY=p.}Ȝ%"(ob^pcB_AJj}4q=|4|r,<q+-Sz~UڐX).0D_ir%q_g!sW#9Pn=Q:oe$[V۫<%KH7 }C*_?-Vɋ㉉ؖ> tUbQqBj?,RlVͮZyحxՄQJ -&󢸚n|=*5F"u窻Qr̓1T[<$|LMďG< ɮ}) kw?ež&<2\5MyO|Q "_%:'7hG;\$GKf_tn>Y n&N:v2IC0e9y4 %v`Lh.զLAԑes.sʷFwEdVPBFn:[آ,?xL<v`-ΎB#:9mUj㣮@j hЌbp.P0uxvaJ*EL!{f1nY RLYz2D ϲ?}aQ~[f!Fz)|fNs I[p2Ro)9 e63@錚'jPCZ쭗,zKF qw f%?v1<%zvmiA\(Eᐃt wڳ3E-O-0]SsZwA\-҄%ݽNЎ2VGwB&Q]|1@#@]<ݟ(mT_])?םle|*Y,bI'N^" 2ܾ+*4zp2~L@l^Z`eF9Fq"'P?B/1͖8rt-dN[WeG򵭦JP8r l'W./HwǫF2u(6Wf1`on4̭OX9k^T2)U$m,WNԗQBk /nIP9ݞY?sJA}ttg?vcʐQ65kI9û*ľ0Ba"F!iѢЫpsf Œ1!bd-\{?TMD%2;rZA:Tt\֢hPH1t&8J2JXk#k{RTIgDf:>@B3pp wȵХJ#(}9Ìi2GJ5:RJT(e]{jKER>h&Bh״etBϲxUx@L@}b4Je76ec9r1yHi >b$. fg/(>bE?[!(%P@XBڹڷN։;`nyZϿh$5p "̅X*  }3CZI/4#.w#2VwQ+#bUzb2yU e)7o^9s#D!GM.Cj_#ZXkObCi[<٥]a2%:@V=ԳRE-H;RKQ$NlhQsQk>bScGN9d|AmP|E2S)}rxr✯94~a+=a.MdQhcn6'$o,dsLAO[(;.f0wG?ouG?nΊԷNEy[v/AG9;9`!Va$L_go S$ZHKp%_]kn2$Pm҄ uV+NW0t39csd[^X)]N)"^6{b(I1-|w4\_z (>I ";q ĦGE @S>2C?Qik#U1KʈǭdF* W o4{dlX׸ZbJ_#_?=AP>D`!R \K3Nȕt! I2'J~]Bq]WmU~(%/\L Y4m1}A3=- +0f {8y0C!j=`Qw(YP5$~rpN@OnBjkZ; b}H=$2VzyLNj4ٛ;uIBNLNyjW'v?gb/3ԹIS*q[%jgP,tL@II.",CopqKK{|p:a/5r-AK*ŒAo*,n"/|Ƨ삌/ZbPA"Q}EF.rE"I*GVxS[bhGfq ĕ Hήgq(Ĩ0 ]s-1hJI}f"Kz E;)ZxÁOpfHqqvO(+Y’d$VI<6!WZm藢_ [wJ-ddDX:Ù Ņ#Vg !Fd9b^7?QX!z ?n#Q+qc?@ t{7tڴSaHkiZ2$)ohVUө9"l$`d-Ԯ~KƩ;A*Our}l:.yG=U"v0q[  nSb @YH-S>N>죠40o\5f} p}c/VAdt)ՆֲMH Rq*df@R:;<\]P\~}.>Y608&oPi4;HsEv6Ŷ ;s&s{VX9vi&j3񩓅x8! tx\1bz;2um0Wp ,u&/m=zÈV?Ɍ=ZrGʹȇ@"MBGOX])¤+ gP -r-L*,d˅j7 jLk=I4!>d9Ji#<[8}T>]lSN~k74aotkGMd25MjMW> ,)Q2c*Fȟ}ʍ 3Tt]E#S6+]{6@W(9XBt2%/(t!4-kUk9QcJ/ղ:;,yZ|1ڧBrB,ݐ?YKWM)k- v^$ dž$0ߝr\U9,1MbKsE8q.y||z&/jjpE$Bm,KH{͌o,PZb4IcP8"꿶[[7N,R«S{/g0Q5@<FG ʸ0]'⎼%HܮIG B֝B760j)1O6)L$߀7cV|seLRmԾ x'qmԍ52#CV47hpY ΪB=Om->0:i :`*%T!7*p!Ά]2GXYjMrd= ϽW SrU[{?_Qs3G )y_GϠluvqO3baciw_jġn :Z^UJ+LԔ7z$9Z| Qº(JWWL)-[^](:: HsYW^Sv` J*dj)X~^\0kuucûP~"bJ2[:.,\M[/6L"pbb)"UޑόO Ps̔F?" bǔNQJ63Gkn/j`{1x4h8Z{4Ldz9H)< z>E 70Cd򓀼aS=şb,'p@NZ!I24U]ח˙e$8,+3Fـ}ǿU(P(>ɩO' Ynlt|;1%k+Ѽ JGDM _Ev}OW~O!?K 0G$BK%#ۼ$8)Wfj L`䁸4 тDݣ22;?K8jmxPxP|cRmը %u&otl p7;|vԶ",_w,L:Xja^^n1‰0㇬G#k ؜|b4@М)fc_bPo>)7?6E*84ôttjn}\S{b˞l8o9(.|m~JJQތ_p I/L<2&f+&[p3wezV3%zNԛ\ 1ƥP#P;bȬNz3(6+]Xbx"=88 #n%pψbr#%\x7qƒThslv=Gglj_QKu{hVBJķp@K̭Tg8ru0Km[t."Ԇ v𜙼MϘ]Mn.Q]6c9 xob9>*=vva:jKc:rk7Kqt hTfF:Ead%hߎC× \"ґ?i>dl\{ÙLم"%,5EUs5IopUC[+q zE@rQ;kуC`dp-7CE!hMFDDK|H +({:1Xfx;`&xNr1aN̋AQtVʵ}?MǩZf0ܫ6=H;|c#RQxth|l#Χ'6 uvKG8H{,(K7t=bYVy%0I us WbuTΎˣ 5rNZ!Ƕh[  wOK2,m[[lȖ IĭӶvXP/Uu"Eshup(M.m"b#{ Xݳv{ժVD2[c jGbNUZKwˠ FmzԌjc qp99TFI-%lCđνKް*\!CYy7((SG<~shf%FO0[!G]-ZHoz2*r5T}MWn:[fHE%QR^SqT-11Eh +`Tž;ar3ˇzEr ĪK*hk "p *YE`G rhXOk5g?Y'yYs6 Ewv{4I13>_(g3Ð-ϐ2 h ,\{dMJ+[;DQȮ<;Ġl#Vc)h3dj|v+(0kb^U9܍me]PTP4pcTuG].W̺-!tEԘX* )=\̥?]3ykTSu$qi&{K 0:X.]Sp,)1ǃUu߯U:ԗO݄?[9AA[>T&V_RFNu 8[V3t%|e ׄ6|obޘjxP/TlSYOӳ %Fy^_hbi*=^6w%J AS(Q o5$W&Q &{ܓ[^ ,ywt3 9C 4J,t靦a*V:t(@IЌCJ[|+9 Z;Wۜ/bWJ}Nfuw_fv*G.Uj3-{a2lK DHնUb`/qΦc?Ψm)/ta]ȼ B2ar$eFr7Wqtdsba)xZ,7\]KdVz.0gU\GcrI)[y4 K{,ǦOhK™UoДcv'p; M;R|d ΅` O+g?`-RMK@!@0*8'覉3:4xm;6_6_4邰<[܃n=BƆk,?fò%bmw>[XlAtXz@y К@OFTY{"7IIy*~/`ڟtvVxy8 4"6Úzd)zɗp;ehu/RSA};.Vh)yNMm]|M0!UQrM (Ž>` ֿ20 }L\`UPIza|tvoӌl` %q{9:Ƹu",kERd~æ#q .\[5ah+@ dՊnh)gNIk~oghO]=X;rU'Ųk,};SтRDygR]&\e7DVRCj3dNŲ|+n P~L˓NPk'I6a{G_!񛱎ܲ! k'M"輽eftV>)]Mhہ~nt Rp`*S,u/*:yUf^pf-y`[wU\5w=,5rK˲<|+!-m'5ʦ{,4G*2 ۄ! endstream endobj 92 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS 9_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZK endstream endobj 93 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream x}UMo0+J! ᫊"Rj.RI73W3njNelܬ;WW\?pu4{SlY]jwOusR^u5sx0ֳ0;]nL#;z,gS t;en>r8S0qj>w};B U5gѻ9x};a`TG?y:o&ߏE]&AjZu/?v_t|z;:ذfhkܸ_\zu \7g"NyOܵڿB`ilB =@ )U 9yI(J5<T` M55֜RhR 1ڟS(yq( buX& &q,1+N978Nsk`q8 ^8% FMq.5Sh@kO ׏p$q1/]}/ĩ»p^`D3F?x[a 1ec!/1g)cd?4dK^| МQV1Կ'1t?ƺ9Y?ГrYs֟'g)437YgD3\ib-z3zs ,>G|ZV|ƾ3ֵ33qgng3tZ[Yog,g[3 =L3z/gd ,gz)R؇O5_TTV *M2GZN(:pTy 8kn":qw{Y-7]%# endstream endobj 95 0 obj << /Length 867 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rj.RI73W3njNelܬ;WW\?pu4{SlY]jwOusR^u5sx05rtlf)OS`)?>RTO)suߖSIQg Lڮ9ˈ;~?˥?y|#7~l/3bV+պ};85wѩƆ56CN]]₥+U9q~=W(_KdR$| 4hd52HHNsL FU*q8cMMh QEk%RWp gn~FȋCam `42W0A/c9^'-pʹ)pq[[i])9^W5js7 Gb_#xb~ ' ˏ1}cLu'No ޅ0&1Ie76Z cx-~`& y%Q?K'!/h],KV0d 1էM=Ռ3g1Y ~i?'?!>L9g)q:#eNC?lыѣc`83ֲ3#>w+>Cӊ݊͊T_|~+>Cg!>cB|/g)g{!>_|&~'a9K!B>,TGbPq> stream x}UMo0+J! ᫊"Rj.RI73W3njNelܬ;WW\?pu4{SlY]jwOusR^u5sxu5rtlf)OS`)?>RTO)suߖSIQg Lڮ9ˈ;~?˥?y|#7~l/3bV+պ};85wѩƆ56CN]]₥+U9q~=W(_KdR$| 4hd52HHNsL FU*q8cMMh QEk%RWp gn~FȋCam `42W0A/c9^'-pʹ)pq[[i])9^W5js7 Gb_#xb~ ' ˏ1}cLu'No ޅ0&1Ie76Z cx-~`& y%Q?K'!/h],KV0d 1էM=Ռ3g1Y ~i?'?!>L9g)q:#eNC?lыѣc`83ֲ3#>w+>Cӊ݊͊T_|~+>Cg!>cB|/g)g{!>_|&~'a9K!B>,TGbPq> stream x}UMo0+J! ᫊"Rjn" W3nj<4nV~ߝoGM?k]{7[7rSmtɛy=TCA:fL9 4Rӫ~R~J}6O7SVk-#SkQ70j$#z7Go䎛n˥?qHM0Z7u@O؞OW1Jj;THcui׸a׽`J-zoDpמk uA )`JbD>`2$`TY'``9&*8XV`TR&4`(ZsJ5RH+hg b.h\e`^bsN[sS9ӺuSrk4"nXCA8%ľFp O<cǘ_81Bx.B Àh'2xk=6u2,bق6E0F,eLLu /Y1<*T71DV3ΜX7g19=zr֟P.O{S3u9(uF: XE/V|FV|gXˊؗV|ƺV|V|&ޭ V|N+>w+>7+>S} u B|)W|FL| ,B/^ &+jRP׊C8ƒI\U E'j\2wAsMMD>NC/SB=t].Z9K endstream endobj 98 0 obj << /Length 866 /Filter /FlateDecode >> stream x}UMo0+J! ᫊"Rjn"B73W3njehܬ;WWU\8׺v=ߩonTtƓ7]ziTCA:fM9Ηfi<WOlJQn8N[hEOrDz=4CH޾Gwt>X.Ouá{Qן tzutZ}]ˏѩ]3NN46[w>7,^e]׵͙SwPG*X$D F @F@k} 89@FJuFF#`R0JRq eF)kjBS` F5(Z#.9Bkx>w{7E^ kCXq pD zAet 8alSM3?rN%NbQDa 8>#h0\?I`\~KWc?qc.\X7ьO*ezl,d mY50ymȋ,aYʘ8 xAf_14g%cxU>ob쉬f 9돱ncsO{(g1?\֟g Yg 9LsQ.(ug^/u ?L[ V|FV|oV|3[: 3 ~!>CO!>S 33>Y^ ?a!SMW,:?8ÇqG湪N$ոd2 }ν_V,z薛.ZP endstream endobj 102 0 obj << /Producer (pdfTeX-1.40.25) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20251218151656Z) /ModDate (D:20251218151656Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 2 0 obj << /Type /ObjStm /N 68 /First 535 /Length 2707 /Filter /FlateDecode >> stream xZ[s۶~ׯc<8LlljIl֌hy*H[(vuflh ,{`SL &,34 ϔrLe/Y`VjfpAd`>`zD&HSR0Pځi=la*`L0ALf"cZ%"noL{,l2fgt`xYf0 uYzK 0!%dH0 Jc0e Ar Z1 YʹpR(P+BCN7XQ"8,ZaPsRg6/hBy@?A & , Jǂ#e;?䆶 "@Ͱ:g&F-V ̜4Os ㏌0:g9c??kZ0&,z|4Ť#?.j>5%v*e[}e3t`JZ}8 Ӊ7n؛ySV)ؓ% #1; Z o;-FًY>*5{=oCofp>(f4d]ފ|OM|NGduA8,F_=|2O+g~GC6uuY'r׳rlR⢀H6|\N5 1bT\@Za䗳K) Q7hXq>U~>+)`+a%I >| Fu|rQ>oxuYM 'z4g 5.ߘ1}g|4 FLMy3*\"H&ETm?EL( ?>o1H#I@^|mY.חfzί ίcrMV߭i/jD# -"l3aQrN>$谞w{y|ݘeśJgJgXt[ z,tpdP*&8=8i{vugtBx§ŬNL'oˣV4I$X!e'1bVu6;8vWBf oS%a$&hّɇU½d2YW+3_~?T#5x!/(E5K~ů^^WQ-S>:&'hF-t"!ħx\͊7V|ο?W׊6QҸַiNAi\/t]D}"IH_VH돟2s6i3Չ8⚿տ.ZIGIқ]m?%+ޱ BW Б[Zn)Z 9?ƦzC5w;v,Ļ%V1Gq}Y1ۧ&%d>>/fuyy8nV_@z}amƺB_wa;l"3~M9TU*VhImuuMuJ 7$[#N(p[Ѝ7r~ ˵'PpD$L+*64j[E.L̟B{Ϗ4;;T6C}K4S=Tm'Zgq^3O+M rV7T({׼}r\[D=MJ^pKҺg/ֹ]ntX2#6Q3YvE;bPIm9k p(Cmnf5 oshp3q^Yr͡۞ͬaС[r jn~ /^|c~ Ѿ_LogE`>ٯOO|차Nd }|QЇgC.:翖Y#Z.*j)^DZ]hw-k|WP Wjx=-&2s& endstream endobj 103 0 obj << /Type /XRef /Index [0 104] /Size 104 /W [1 3 1] /Root 101 0 R /Info 102 0 R /ID [<2D43F5C7F864B6C798B1EB54E01BF856> <2D43F5C7F864B6C798B1EB54E01BF856>] /Length 291 /Filter /FlateDecode >> stream x=/asZ}E^mUU]$ &݀dɧ C9wܜ t<RJ$| UzD-Q -v'Ot;vT\{c**" ŀ$R7$"$D!aŰ!O7Qqyf{S"AUlI1*D8|v\L'?V̋,qqk㜘3bV䈫 "/6Ţ((%ÖoK+럥Uoi̜[Z'[_6ǐ2X}c2H8mGّ;ucEj& endstream endobj startxref 146175 %%EOF gbutils/inst/doc/Plot_pdf.R0000644000176200001440000000474415121015350015341 0ustar liggesusers### R code from vignette source 'Plot_pdf.Rnw' ################################################### ### code chunk number 1: Plot_pdf.Rnw:61-62 ################################################### library(gbutils) ################################################### ### code chunk number 2: Plot_pdf.Rnw:77-80 ################################################### pdf1 <- function(x) dnorm(x, mean = 100, sd = 5) # pdf qdf1 <- function(x) qnorm(x, mean = 100, sd = 5) # qf cdf1 <- function(x) pnorm(x, mean = 100, sd = 5) # cdf ################################################### ### code chunk number 3: Plot_pdf.Rnw:85-86 ################################################### plotpdf(pdf1, qdf1) ################################################### ### code chunk number 4: Plot_pdf.Rnw:91-92 ################################################### plotpdf(pdf1, cdf = cdf1) ################################################### ### code chunk number 5: Plot_pdf.Rnw:97-98 ################################################### plotpdf(pdf1, cdf = cdf1, lq = 0.001, uq = 0.999) ################################################### ### code chunk number 6: Plot_pdf.Rnw:101-102 ################################################### plotpdf(cdf1, cdf = cdf1, lq = 0.001, uq = 0.999) # plot a cdf ################################################### ### code chunk number 7: Plot_pdf.Rnw:106-112 ################################################### pf1 <- function(x){ 0.25 * pnorm(x, mean = 3, sd = 0.2) + 0.75 * pnorm(x, mean = -1, sd = 0.5) } df1 <- function(x){ 0.25 * dnorm(x, mean = 3, sd = 0.2) + 0.75 * dnorm(x, mean = -1, sd = 0.5) } ################################################### ### code chunk number 8: Plot_pdf.Rnw:116-117 ################################################### plotpdf(df1, cdf = pf1) # plot the pdf ################################################### ### code chunk number 9: Plot_pdf.Rnw:121-122 ################################################### plotpdf(pf1, cdf = pf1) # plot the cdf ################################################### ### code chunk number 10: Plot_pdf.Rnw:127-129 ################################################### plotpdf(pf1, cdf = pf1) # plot the cdf plotpdf(df1, cdf = pf1, add = TRUE, col = "blue") # overlay the pdf ################################################### ### code chunk number 11: Plot_pdf.Rnw:136-137 ################################################### c(q5pc = cdf2quantile(0.05, pf1), q95pc = cdf2quantile(0.95, pf1)) gbutils/inst/doc/Plot_pdf.Rnw0000644000176200001440000000720015102634161015702 0ustar liggesusers% preamble taken from the vignette in package strucchange % \documentclass[12pt,a4paper]{article} \usepackage[left=20mm,right=20mm,top=20mm,bottom=20mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newcommand{\E}{\mbox{$\mathsf{E}$}} \newcommand{\VAR}{\mbox{$\mathsf{VAR}$}} \newcommand{\COV}{\mbox{$\mathsf{COV}$}} \newcommand{\p}{\mbox{$\mathsf{P}$}} \newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \setlength{\parskip}{0.5ex plus0.1ex minus0.1ex} \setlength{\parindent}{0em} \bibpunct{(}{)}{;}{a}{}{,} \newcommand{\ui}{\underline{i}} \newcommand{\oi}{\overline{\imath}} \RequirePackage{color} \definecolor{Red}{rgb}{0.5,0,0} \definecolor{Blue}{rgb}{0,0,0.5} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \hypersetup{% hyperindex,% colorlinks,% linktocpage,% plainpages=false,% linkcolor=Blue,% citecolor=Blue,% urlcolor=Red,% pdfstartview=Fit,% pdfview={XYZ null null null}% } \usepackage{verbatim} \usepackage{shortvrb} \MakeShortVerb{\|} %\MakeShortVerb{"} \begin{document} \SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Plotting with plotpdf()} %\VignetteDepends{gbutils} %\VignetteKeywords{plot, pdf, cdf, quantiles} %\VignettePackage{gbutils} \setkeys{Gin}{width=0.4\textwidth} <>= library(gbutils) @ \title{Plotting with plotpdf()} \author{Georgi N. Boshnakov} \date{} \maketitle The function |plotpdf()| plots a function, usually probability density (pdf) or cumulative distribution function (cdf), over an interval containing the ``interesting'' part of the function. The interval is based on quantiles computed from a supplied cdf or quantile function. |plotpdf()| is most useful when the quantiles are not readily availaible but here are some examples with a normal distribution to illustrate the idea: <<>>= pdf1 <- function(x) dnorm(x, mean = 100, sd = 5) # pdf qdf1 <- function(x) qnorm(x, mean = 100, sd = 5) # qf cdf1 <- function(x) pnorm(x, mean = 100, sd = 5) # cdf @ |plot(pdf1)| works but needs arguments 'from' and 'to' for a meaningful plot. We can simply pass the quantile function to |plotpdf()| to achieve this: <>= plotpdf(pdf1, qdf1) @ Similar result is obtained by supplying the cdf, which is handy when the quantiles are not easily available: <>= plotpdf(pdf1, cdf = cdf1) @ By default, the lower and upper $0.01$ quantiles are used to set the limits on the $x$-axis. This can be changed with arguments |lq| and |uq| <>= plotpdf(pdf1, cdf = cdf1, lq = 0.001, uq = 0.999) @ <>= plotpdf(cdf1, cdf = cdf1, lq = 0.001, uq = 0.999) # plot a cdf @ The pdf and cdf of a mixture distribution are usually straight-forward. Here is an example: <<>>= pf1 <- function(x){ 0.25 * pnorm(x, mean = 3, sd = 0.2) + 0.75 * pnorm(x, mean = -1, sd = 0.5) } df1 <- function(x){ 0.25 * dnorm(x, mean = 3, sd = 0.2) + 0.75 * dnorm(x, mean = -1, sd = 0.5) } @ Here is a plot of the pdf: <>= plotpdf(df1, cdf = pf1) # plot the pdf @ ... and this produces the cdf: <>= plotpdf(pf1, cdf = pf1) # plot the cdf @ Additional arguments can be specified as for |plot()|: <>= plotpdf(pf1, cdf = pf1) # plot the cdf plotpdf(df1, cdf = pf1, add = TRUE, col = "blue") # overlay the pdf @ \bigskip{} |plotpdf()| uses |cdf2quantile()| to compute quantiles from a cdf. |cdf2quantile()| can be used directly, as well: <<>>= c(q5pc = cdf2quantile(0.05, pf1), q95pc = cdf2quantile(0.95, pf1)) @ \end{document} gbutils/README.md0000644000176200001440000000520415121011116013170 0ustar liggesusers [![CRANStatusBadge](http://www.r-pkg.org/badges/version/gbutils)](https://cran.r-project.org/package=gbutils) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/gbutils)](https://www.r-pkg.org/pkg/gbutils) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/grand-total/gbutils?color=blue)](https://r-pkg.org/pkg/gbutils) [![R-CMD-check](https://github.com/GeoBosh/gbutils/workflows/R-CMD-check/badge.svg)](https://github.com/GeoBosh/gbutils/actions) Simulate real and complex numbers from distributions of their magnitude and arguments. Optionally, the magnitudes and/or arguments may be fixed in almost arbitrary ways. Plot density and distribution functions with automatic selection of suitable regions. Small programming utilities: check if an object is identical to NA, count positional arguments in a call, set intersection of more than two sets, check if an argument is unnamed, compute the graph of S4 classes in packages. # Installing gbutils The [latest stable version](https://cran.r-project.org/package=gbutils) is on CRAN. install.packages("gbutils") You can install the [development version](https://github.com/GeoBosh/gbutils) of `gbutils` from Github: remotes::install_github("GeoBosh/gbutils") # Overview Package `gbutils` is a collection of (mostly small) functions used interactively or in packages. ## Numeric computations - `sim_numbers()`, `sim_complex()`, `sim_real()` - Simulate real or complex numbers from (possibly partial) polar form specifications. - `cdf2quantile()` - Compute quantiles from a given distribution function. - `pseudoInverse()` - Compute pseudo-inverse matrices. - `rpoly()` - create polynomials with real coefficients from zeroes (roots) given in Cartesian or polar form. ## Graphics - `plotpdf()` - Plot functions with automatic determination of the "interesting" region (typically probability density and distribution functions) ## S4 classes - `adjacencyOfClasses()` - Create inheritance graphs of S4 classes defined in one or more packages. ## Programming utilities - `isNA()` - Is an object NA? - `isargunnamed()` - Is an element of a list named? - `missing_arg()` - Is an element of a pairlist missing? - `parse_text()` - Parse expressions. - `nposargs()` - Count the number of positional arguments used in a call. - `shiftleft()` `shiftright()` - Rotate vectors. ## Other - `mintersect()` - Set intersection of arbitrary number of arguments. - `myouter()` - Outer product using a non-vectorised function. - `raw_history()` Get the command history in a character vector. gbutils/build/0000755000176200001440000000000015121015350013013 5ustar liggesusersgbutils/build/vignette.rds0000644000176200001440000000035515121015350015355 0ustar liggesusersuQ=0|. BR B q󗫯kZ`="SX,EYvEkXTMNWH\,J`Y=#YN18kf#_=Ϣ(ݒctJc K%: c<,J\lm:~k@uFAhcwyw~C+m+'%׹ gbutils/build/partial.rdb0000644000176200001440000002571015121015347015153 0ustar liggesusers}kwIzċHJ.^u!% uj4$DICivfv04&#ݐe4qv\lq67ljI6=sr?S7v? nLhުlG*JvI-&aOjVJ+fatIsIz7_Ŀ7`e$OAܚ˹JnFxmk7kQrre̵*6;_lJM)OU7 zzf0mk~7}& u{=h ƲmG3qL@<1hHUV~*< 9V1= ͉HwP(N?. s~*P[2YW3LV hEp %2pKa5j"Bv^e|N@<1U֥JQ,{Hup5Ze̲Yٲ5ees ]iW;ۨeF߶TKi Ĵ靟~zo&9CQ,b$ ߺmjՅnSdtKIȓxZٺS-ja$]5C:e͵Oi/jy>IrqT9WgCrUZrQi;@, vU[MRZ;7BD%PB(Jc<TL9>1]ATA?ZnP 2SQw6r{8< ^!a}o򜺑&ޔ|{FVšw:rGt-U>FZ#0KiʴO5q/jYQ2*=QIy`r,XO NJQ<&tb[;pj}&v|;Tw ](MZOgtNt^-K%~j(oZP,3 NxLbl7іc41bN=amG:(l#B' h'!oPm ffKknJ44G(kPJ%Y7닺͇^PN䙅i!cYW*>$y'ڡƇ#S~Ʋld"g6n,zy8r0hn-7B H5P$ͤ[/#qB\͘aV#!AzW<=^QߛCA3$[pxgtN@Po\Y&Te4 9 f B!F̼|-yds7g!*g;M=6Ndx O@5 H} ]'0!{禤hJ`eβEy\,f{uXar cCao ^)/Q$2,^=Mt$@NnY;(31 DOZRIDKϖ݄9Y!m.]yG8>|mq\^o{G~/R#cL7_eR-IjD3|M#F3djߒa`m潭Cwwt2ػ4MF'g禦F]70 9+[v=]b)kjz}0.J¾&+8fN#-5b=T 8lÓl0(qbKL+zgl MMGi[ЉX][i.4UjW (5B/"CO6aJ4Xt9.2QJU>\݄鋋78 H{>n X r4%w 8Y=Qޗ@V6l!`eS}HK\Ì8C";bTYs`ƮPʳ~/ne{~GB?焝pʬt?့ x{Z7ON}]JNO'!Zhʆr[FڰNm1̂ddup^6:F惝z,붎pnQuò ?+O i!?Xe=Dgz(n>ȱJ[i h[ X3Ӓ'C׫}\]X Ĭk˚9<qnT|ڈm"&@/)y z[q蚆Lm>v/]j3Hps]s8yHY-=~!ȇӊd>w2Ց)N @LC|]QӥjBC(E/ }r<|rfY=/~Ş{3yQ_Wd# eUGd1f],Bu83+N6B)Qn0ғB+2.'L.\Z~Xi 4kw6u<,#h*Aw*ސeo>mwՅl=B <' OSґ-a)= !Exp\7n!_Ld *?f[;RXm_)t`_l8{*ln " ɉ97wr&?9~q: +_^AYYe'je 叟#^9Tm";~-eNHOͥ%9d&wTl/t}*jp,X xx;)AV_a_Pǚ*?AP])2sC$B!mF]f+I": ?D⫱|rqm7iJpݣC$Y.ؤ(kD2#5n<̗p@lH# LY<19(LR<Y}J3[4Xv5 x *D粀x6$׀!_gV_N%G)3;Ą6~:$}{xrIb!9! Mk i nҔa&?tߴX/dH!062q_V63Ez6'yxX5*(f1]BlӘS Իi_ހ>9vQV*M4d,䡈_dtV,z3|kUAᝰZuG} ]UZrȹ)b39yMQr7!TV,qxO }FA61{o \7p/JG @VD8SAiȧur6ňPٜFhܩ++'1di]]Ƽ@$pttI% pӡcĿtaE6/}.R*ԯq?X-聗Gzl4\EvΒ!͇3 41Jaj{3\guͭ(rF,Jr83YIZ!C5U wNĎ/B5\~%ȱvQ7y`[R9Ys"Z=ȱNl78տonٌ* 3E{-A^VG(w AixUiٚPD%<Xk% xYxN do 'gn3ݱf.U ֛`N}|o # r̋H:Z_Bڄj#>Jp` 'Rv?,=z7ԗR]+ 2z'NF[wVPbewrh%w[kt賩kykɒ*\{hSAj*yo$osi.4u;] k+,S:])ߗ 0ncuץ%oI>8#ױ8:N%A0wD% 9ŒR'prq ȲhNCVX눻{Х_^| +$f 8KH=%M .ʖs`|XAt/B"N!α;pg1lD³ Q"9 M0Ssk1 B](s WWψ7xAy?$C W/G$ Y=]Oچ)m5^oY2 6=Dj&nv~6F *{Ӑէi7΁T; jTZ!6 w <Y=n?xǦf}"tMLK1w&2׀c+)9AAH80U^!Go$=ܞ 623 $Jx )uTˡOY*"qI{9|Z@<rrb+㳽ϵх쑠ҊUɪ O)'FK%ܳٝ& yo?J" B>'u_yAKPOkDE7<OBߞ6jkzL&F:|xb=tަ#@<V3mu#tt}ɿh䕾r;=<zyz˃!8f"f< j"9-@;~惷`&UM܊Yh r'~zt׺^I۫,8_:)}߯Y5ܬ UM{Z/01'֟ph{'50Q=%MMh˦gs~^nr}Q8&n5ɞ'9R=-%5o-7&g$>#lěIӐ>re>@!fbtjV3!m-gR~G$:s^X.œ_o%! bsX^ܓl2AD=4t[ ˆ !5\C Dh[Za EWyuh[e6o[IFYk01v-5i1-nř秞d*EFֲrA!4#k=]m|{u1OBؙnZf&ЗFDK@< Ut^ $Zβ^K) 8X-嵪l o1ձqSS%R@<4MWe̓0> bL&PйsF*#oKodA>R GՅ9NDJP}D(n8'_ ?@!I f?>PEfN{H`pXTMCjwYQ~I҅J&Xo$+-XVjn~U:;'+ vJQ )ܹ):MB'!w ڑ|JYE#ͲQX* {i6Bʚaz;aӲE,OCVS>K!߁)CVwkEnkT} La#g:#B_GGYӯS,,,: a_?ۗ y;2/=2_zߺUQc o@ Eơ4$B&M)rS~3R^[3x$=1(.d-GS?V5F2%X~DxNUujeZ)sEÕ8yh!/ˮ]_ ![D/ P湛N(Ǩa!kIQIޅ|S5FT20'-z(wgpmNIw*ExrryG׵cE J)M)FDK@҉^v E+:ց}E{)#سk*T>|}HïEv Kɞ.> ;!^|#>~-! I2MGqC?u?$J_ 0v`x.n7W HNp7DDR2WD JU&}u#J.UW7h90ō&ų֮|k=;!Xނ~.xa d0NTc?B(D&c∭]5l :/W2x^v:+Ҵ Ǖietgf3,D+QoћN{Yȿy»Gx M*5r#Z<LdLsʣYhI: O) ⟼΅S6FF;:y;p#<z[L<(r?>57K+xhs| arm eՎd6\,jT>/ 9 MF|s!<9Q'ae4YExz~Sr9))JFlZ#B1׫,iUvlU6FOI8yU<gN 9VLghvT<%% Ewαbk-o,W3]d7]t2uhtv>ъEHx'%xi8Y*xT~sf+Y9ʇp'P'?!,qgŶxZ.$: @>XПG Hy0QZ3!$WT*I䡎!Dir@?_ܳʑwar%F 'Ʉ0lI3Kd;ѳͫe`[tn҈¿D.p o])m@h;b3V240mC-,^izWxRQTW4ҝ/؍9l^RﭕOKEkI(y+믇}Ÿ^OV)]} ^:?l,ņ?M-Y( /`gK VRH)zP W-h>ǵN:[^wl|Y`"#9j/TTX{cOK+{W!oLeX7h-Z`G4L-8j9JԤ`wodIoWmIda kbA_7B\93ܐzxDHϵ)3LljsMUӚʃwKRD 1=ncF#[!^0Rc[*u .:ח/>4߱|qQΐt"_Ƅվ|W(kp6ҽ1W$E-]x!Fn4޼pkv6-̓XVa~\4%S\{i({l~dx"$>m>&iBL=*A|nU?wޭBHǑ/Iȓ?`,nVm&< h,44U]h@P iS:/!O?.\{uuxO$S1aCty\@x1A9La/"#_,bt DŽyDÞ|2|[Xt.ǐ3!@sa򱻩'iy=kKA*B.&:b4aoo%tp%\26U6| -$+} eǏ?%58~[zn;޼ձJadշcKfK ffr-J0_AN(7?8R"~CR:~0U*QIqtйJ%8NO!4n1Y4_PZ5 ЛsHmed-;r]4U BRMekW͙ZT@ݍ_C罍o̵q ꕆ\ߝ U_sy__xbgbutils/man/0000755000176200001440000000000015121015350012467 5ustar liggesusersgbutils/man/isargunnamed.Rd0000644000176200001440000000222715121012637015443 0ustar liggesusers\name{isargunnamed} \alias{isargunnamed} \title{ Is an element of a list named? } \description{ Check if a component of a list is not named. } \usage{ isargunnamed(x, k) } \arguments{ \item{x}{ a list. } \item{k}{ an integer, specifies a position in \code{x}. } } \details{ \code{isargunnamed(x,k)} returns TRUE if the k-th component of \code{x} is not named and FALSE otherwise. Argument \code{x} is typically a list of arguments used in a call to a function, such as the one obtained by \code{list(...)} in the body of a function definition. If \code{k} is not positive or larger than \code{length(x)}, \code{isargunnamed} returns FALSE. } \value{ TRUE or FALSE } \author{Georgi N. Boshnakov} %\note{ } \seealso{\code{\link{match.call}} in base package} \examples{ li1 <- list(a=1, 2, 3) isargunnamed(li1, 1) isargunnamed(li1, 2) ## wholly unnamed list li2 <- list(1, 2, 3) isargunnamed(li2, 1) isargunnamed(li2, 2) ## using in a function definition f1 <- function(...){ dots <- list(...) for(i in seq(along=dots)) cat(i, isargunnamed(dots, i), "\n") } f1(1) f1(a = 3, 4, c = 5) f1(x = "a", y = "b") } \keyword{programming} gbutils/man/raw_history.Rd0000644000176200001440000000143315102634161015337 0ustar liggesusers\name{raw_history} \alias{raw_history} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Get the command history } \description{ Get the command history.} \usage{ raw_history() } %- maybe also 'usage' for other objects documented here. \details{ The command history is saved to a temporary file with \code{savehistory} and read back into a character vector. } \value{ a character vector } \author{Georgi N. Boshnakov} %\note{ %%% ~~further notes~~ %} % %%% ~Make other sections like Warning with \section{Warning }{....} ~ % %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} \examples{ \dontrun{ hist <- raw_history() length(hist) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{programming} gbutils/man/cdf2quantile.Rd0000644000176200001440000000441615121011606015344 0ustar liggesusers\name{cdf2quantile} \alias{cdf2quantile} \title{ Calculate a quantile from a distribution function } \description{ Numerically calculate a quantile from a distribution function. } \usage{ cdf2quantile(p, cdf, interval = c(-3, 3), lower = min(interval), upper = max(interval), \dots) } \arguments{ \item{p}{ a number in the interval (0,1). } \item{cdf}{cumulative distribution function, a function.} \item{interval}{interval in which to look for the root, see section \sQuote{Details}.} \item{lower}{lower end point of the interval.} \item{upper}{upper end point of the interval.} \item{\dots}{any further arguments to be passed to the root finding function and the cdf, see section \sQuote{Details}.} } \details{ The quantile, \eqn{q}, is computed numerically as the solution of the equation \eqn{cdf(q)-p=0}. Function \code{uniroot} is used to find the root. To request higher precision, set argument \code{tol}. Other arguments in \code{...} are passed on to \code{cdf}. \code{uniroot} needs an interval where to look for the root. There is a default one, which is extended automatically if it does not contain the quantile. This assumes that argument \code{cdf} is an increasing function (as it should be). To override the default interval, use argument \code{interval} (a vector of two numbers) or \code{lower} and/or \code{upper}. This may be necessary if the support of the distribution is not the whole real line and \code{cdf} does not cope with values outside the support of the distribution. } \value{the computed quantile as a number} \author{Georgi N. Boshnakov} \seealso{ \code{\link{plotpdf}} } \examples{ cdf2quantile(0.95, pnorm) cdf2quantile(0.05, pexp) # support [0,Inf) is no problem for cdf2quantile(0.05, plnorm) # for built-in distributions. ## default predicision is about 4 digits after decimal point cdf2quantile(0.95, pnorm, mean = 3, sd = 1) cdf2quantile(0.05, pnorm, mean = 3, sd = 1) qnorm(c(0.95, 0.05), mean = 3, sd = 1) ## request a higher precision: cdf2quantile(0.05, pnorm, mean = 3, sd = 1, tol = 1e-8) cdf2quantile(0.05, pnorm, mean = 3, sd = 1, tol = 1e-12) ## see also examples for plotpdf() } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{distribution} gbutils/man/sim_complex.Rd0000644000176200001440000000675415102634161015317 0ustar liggesusers\name{sim_complex} \alias{sim_complex} \alias{sim_real} \title{ Simulate real or complex numbers using polar form} \description{ Simulate complex numbers with given distributions for the modulus and the argument and real numbers with given distributions for the absolute value and the sign. Some of the values may be partially or fully specified. } \usage{ sim_complex(abs, arg, absgen = "runif", absarg = list(0, 1), arggen = runif, argarg = list(-pi, pi), ...) sim_real(abs, sign, signprob = 0.5, absgen = "runif", absarg = list(0, 1), ...) } \arguments{ \item{abs}{ vector of absolute values. } \item{sign}{ vector of signs (1 or -1). } \item{signprob}{ probability for a positive sign. } \item{arg}{ vector of arguments (of complex numbers). } \item{absgen}{ generator for the absolute values, a function or a character string naming a function. } \item{absarg}{ arguments for \code{absgen}. } \item{arggen}{ generator for the arguments of the complex numbers, a function or a string naming a function. } \item{argarg}{ arguments for \code{arggen}. } \item{\dots}{ not used, simplifies the call from \code{sim_numbers}. } } \details{ \code{sim_real} simulates real numbers by simulating separately their absolute values and signs. \code{sim_complex} simulates complex numbers by simulating separately their moduli and arguments. Both functions replace \code{NA}'s in argument \code{abs} with values simulated by the function specified by \code{absgen}. Arguments for \code{absgen} are specified by the (possibly named) list \code{absarg}. Similarly, \code{sim_complex} replaces \code{NA}'s in argument \code{arg} with values simulated according to \code{arggen} and \code{argarg}. Further, \code{sim_real} replaces \code{NA}'s in argument \code{sign} with a random sample of ones and minus ones, where the probability for the positive value is \code{signprob}. Only \code{NA} entries in \code{abs}, \code{arg} and \code{sign} are filled with simulated values, the remaining entries are left unchanged. This means that some (and even all) values may be specified partially or completely. \code{abs} is combined with \code{arg} or \code{sign} to create the result. These arguments are expected to be of matching shape and length but this is not enforced and the usual recycling rules will apply if this is not the case (not recommended to rely on this). The default range for the (complex) argument is (-pi,pi). } \value{ for \code{sim_real}, a vector of real numbers for \code{sim_complex}, a vector of complex numbers } %\references{ ~put references to the literature/web site here ~ } \author{Georgi N. Boshnakov} \note{ Currently the shape of the result for \code{sim_real} is the same as that of argument \code{abs}. But \code{sim_complex} always returns a vector. Probably this inconsistency should be removed. } \seealso{ \code{\link{sim_numbers}} which offers more flexible interface to these functions. } \examples{ ## x[1] is fixed to 1, x[2] is negative with random magnitude: x <- sim_real(c(1,NA,NA,NA), c(1, -1, NA, NA)) ## z[1] fixed to 1, the remaining elements of z ## have random magnitude and fixed arguments: z <- sim_complex(c(1,NA,NA,NA), c(0, pi/2, pi, -pi/2)) ## without restrictions sim_complex(rep(NA,4)) sim_real(rep(NA,4)) ## moduli unrestricted; arguments restricted sim_complex(rep(NA,4), c(0, pi/2, pi, -pi/2)) } \keyword{distribution} \keyword{simulation} gbutils/man/adjacencyOfClasses.Rd0000644000176200001440000001654115121011331016504 0ustar liggesusers\name{adjacencyOfClasses} \alias{adjacencyOfClasses} \title{Adjacency graph of classes in packages} \description{ Get inheritance graph of classes in one or more packages. } \usage{ adjacencyOfClasses(packages, externalSubclasses = FALSE, result = c("default", "matrixOfPairs", "adjacencyMatrix"), Wolfram = FALSE) } \arguments{ \item{packages}{names of one or more packages, a character vector.} \item{externalSubclasses}{ if \code{TRUE}, exclude subtrees of classes not defined in any of the packages listed in argument \code{packages}. } \item{result}{ format of the result, can be missing or one of \code{"default"}, \code{"matrixOfPairs"}, \code{"adjacencyMatrix"}, see section \sQuote{Details}. } \item{Wolfram}{ if \code{TRUE}, print a suitable graph expression to be run by Mathematica, see section \sQuote{Details}. } } \details{ \Sexpr[stage=build,results=hide]{library("gbutils")} \code{adjacencyOfClasses} computes a graph representation of the dependencies of S4 classes defined in one or more packages (as specified by argument \code{package}) and returns a list. The contents of the list returned by \code{adjacencyOfClasses} depend on argument \code{result}. Partial matching is used for the value of argument \code{result}, e.g., "adj" is equivalent to "adjacencyMatrix". If \code{externalSubclasses = FALSE}, the default, subclasses defined outside the requested packages are excluded. This is typically what the user will be looking for. To get a complete tree, set \code{externalSubclasses} to \code{TRUE}. The S4 classes are represented by the vertices of the graph. Component \code{"vertices"} of the result gives them as a character vector. References below to the \eqn{i}{i-}th class or vertex correspond to the order in this vector. No attempt is made to arrange the vertices in a particular order. An empty list is returned if this vector is empty. If \code{result} is missing or \code{"default"}, the edges of the graph are represented by a character vector. Each edge is represented by a string with an arrow \code{"->"} from a superclass to a subclass. Here is an example that shows that this package defines one class, which is a subclass of \code{"list"}: \printExample{adjacencyOfClasses("gbutils")} This illustrates the effect of argument \code{"externalSubclasses"}: \printExample{adjacencyOfClasses("gbutils", externalSubclasses = TRUE)} The edge, "vector -> list" was omitted in the previous example since this relationship is defined elsewhere. This resulted in class \code{"vector"} being dropped also from the vertices, since it is not defined in \code{"gbutils"} and none of the remaining edges contains it. If \code{result} is \code{"matrixOfPairs"}, the edges of the graph are represented by a character matrix with two columns, where each row represents an edge from the element in the first column to the element in the second. In this example there is one edge, so the matrix contains one row: \printExample{adjacencyOfClasses("gbutils", result = "matrixOfPairs")} If \code{result} is \code{"adjacencyMatrix"}, the adjacency matrix of the graph is in component "AM" of the returned list. Element \eqn{(i,j)} of this matrix is equal to one, if the \eqn{j}{j-}th class is a superclass to the \eqn{i}{i-}th. In other words, the \eqn{j}{j-}th column gives the superclasses of the \eqn{i}{i-}th class. Here the element in position (1,2) is non-zero, so \code{"list"} is the superclass of \code{"objectPad"}: \printExample{adjacencyOfClasses("gbutils", result = "adjacencyMatrix")} Note that including the vertices in the result is not redundant, since some may not be in any edge. This can happen if a class does not have any superclasses and subclasses. As described above the result is not converted to a graph object but it can be fed to functions provided by a number of \R packages. An additional option is to use argument \code{Wolfram}. If \code{Wolfram} is \code{TRUE}, a suitable Mathematica command is printed. It can be evaluated in a Mathematica session (e.g., by copy/paste) to produce a graphical representation of the graph and/or be manipulated further by it. This feature is a side effect, the return value of \code{adjacencyOfClasses} is as controlled by the other arguments. For example, the return value below is as without argument \code{"Wolfram"} but, in addition, the printed line defines a Wolfram language graph in terms of its vertices and edges: \printExample{adjacencyOfClasses("gbutils", Wolfram = TRUE)} Setting \code{result = "adjacencyMatrix"} in the last \R command exports the graph in terms of its adjacency matrix: \printExample{adjacencyOfClasses("gbutils", Wolfram = TRUE, result = "adjacencyMatrix")} } \value{ a list with some of the following components (as described in section \sQuote{Details}): \item{vertices}{a character vector of S4 class names,} \item{edges}{the edges of the graph, in the format controlled by argument \code{results} (not present when \code{result} is equal to \code{"adjacencyMatrix"}),} \item{AM}{the adjacency matrix of the graph (present only when \code{result} is \code{"adjacencyMatrix"}).} } \references{ \insertRef{Rpackage:graph}{gbutils} \insertRef{Rpackage:Rgraphviz}{gbutils} \insertRef{Rpackage:classGraph}{gbutils} } \author{Georgi N. Boshnakov} %\note{ %%% ~~further notes~~ %} % %%% ~Make other sections like Warning with \section{Warning }{....} ~ % \seealso{ \code{?methods::classesToAM} which is used for the main computation here, \insertCiteOnly{Rpackage:classGraph;textual}{gbutils} for a suite of related functions. \insertCiteOnly{Rpackage:graph;textual}{gbutils} for creation and manipulation of graphs, and \insertCiteOnly{Rpackage:Rgraphviz;textual}{gbutils} for visualisation of graphs. } \examples{ adjacencyOfClasses("gbutils") adjacencyOfClasses("gbutils", TRUE) adjacencyOfClasses("gbutils", FALSE, "matrixOfPairs") adjacencyOfClasses("gbutils", TRUE, "matrixOfPairs") adjacencyOfClasses("gbutils", FALSE, "adjacencyMatrix") adjacencyOfClasses("gbutils", TRUE, "adjacencyMatrix") ## as above, also represent the graph using the edges adjacencyOfClasses("gbutils", Wolfram = TRUE) adjacencyOfClasses("gbutils", TRUE, Wolfram = TRUE) ## here the graph is represented by the adjacency matrix: adjacencyOfClasses("gbutils", FALSE, "adjacencyMatrix", Wolfram = TRUE) adjacencyOfClasses("gbutils", TRUE, "adjacencyMatrix", Wolfram = TRUE) if(requireNamespace("graph", quietly = TRUE) && requireNamespace("Rgraphviz", quietly = TRUE)) withAutoprint({ ## another package adjacencyOfClasses("graph") ac1 <- adjacencyOfClasses("graph", FALSE, "adjacencyMatrix") ## note the use of t() below gr_ac1 <- graph::graphAM(adjMat = t(ac1$AM), edgemode = "directed") if(require("Rgraphviz", quietly = TRUE, warn.conflicts = FALSE)) plot(gr_ac1) ## more than one package ac2 <- adjacencyOfClasses(c("graph", "Rgraphviz"), FALSE, "adjacencyMatrix") gr_ac2 <- graph::graphAM(adjMat = t(ac2$AM), edgemode = "directed") if(require("Rgraphviz", quietly = TRUE)) plot(gr_ac2) }) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{programming} \keyword{S4classes} % use one of RShowDoc("KEYWORDS") gbutils/man/isNA.Rd0000644000176200001440000000364415121012414013615 0ustar liggesusers\name{isNA} \alias{isNA} \title{Check if an object is NA} \description{ Check if an object is NA. Always return TRUE of FALSE, a logical vector of length one. } \usage{ isNA(x) } \arguments{ \item{x}{any R object.} } \details{ \code{isNA} returns TRUE if the argument is a single NA, i.e. it is atomic, has length one, and represents an NA value. In any other case \code{isNA} returns \code{FALSE}. \code{isNA} is suitable for use in conditional constructs since it always returns a single value which is never NA. Note that \code{identical()} distinguishes different types of NA, i.e. \code{identical(x, NA)} is TRUE only if \code{x} is NA (logical). } \note{ The requirement that \code{x} is atomic means that \code{isNA(list(NA))} gives \code{FALSE}. For comparison, \code{is.na(list(NA))} gives \code{TRUE}. The same holds for classed lists, such as \code{is.na(structure(list(NA), class = "myclass"))}. } \value{ TRUE or FALSE } \author{Georgi N. Boshnakov} \seealso{ \code{\link{isTRUE}}, \code{\link{is.na}}, \code{\link{identical}} } \examples{ v <- c(1, NA, 3) isNA(v[2]) # TRUE ## a vector of two or more Na's is not isNA isNA(rep(NA,3)) # FALSE ## a list containing NA is not isNA isNA(list(NA)) # FALSE ## ... but is.na(list(NA)) # TRUE ## identical() distinguishes different types of NA: class(v) # "numeric", not "integer" identical(v[2], NA) # FALSE, NA on its own is "logical" identical(v[2], NA_integer_) # FALSE identical(v[2], NA_real_) # TRUE vi <- c(1L, NA_integer_, 3L) isNA(vi[2]) # TRUE class(vi) # "integer" identical(vi[2], NA_integer_) # TRUE identical(vi[2], NA_real_) # FALSE ## is.na(NULL) would give a warning isNA(NULL) # FALSE ## a length zero object is not NA, so isNA() returns FALSE: isNA(logical(0)) # FALSE ## is.na() has a different remit and returns a 0-length vector: is.na(logical(0)) # logical(0) } \keyword{NA} \keyword{logic} \keyword{manip} gbutils/man/mintersect.Rd0000644000176200001440000000233715121012776015151 0ustar liggesusers\name{mintersect} \alias{mintersect} \title{Set intersection of arbitrary number of arguments} \description{Set intersection of arbitrary number of arguments.} \usage{ mintersect(...) } \arguments{ \item{\dots}{arguments to be intersected, vectors of the same mode, see \code{intersect}.} } \details{ The base \R function \code{intersect} is a binary operation. \code{mintersect} works with any positive number of arguments. If called with one argument, \code{mintersect} returns it. This is unlike \code{intersect} which gives an error in this case. Calling \code{mintersect} with no arguments is an error (as it is for \code{intersect}). } \value{ a vector representing the intersection of the arguments } % \references{ % %% ~put references to the literature/web site here ~ % } \author{Georgi N. Boshnakov} % \note{ % %% ~~further notes~~ % } % % %% ~Make other sections like Warning with \section{Warning }{....} ~ % % \seealso{ % %% ~~objects to See Also as \code{\link{help}}, ~~~ % } \examples{ mintersect(1:20, 3:18, 7:12) mintersect(letters[1:20], letters[3:18], letters[7:12]) mintersect(1:4) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{programming} gbutils/man/sim_numbers.Rd0000644000176200001440000001567115121013747015323 0ustar liggesusers\name{sim_numbers} \alias{sim_numbers} \title{ Simulation based on polar form specifications } \description{ Simulate real and complex numbers from polar form specifications. The numbers may be partially or fully specified. The distributions of absolute values and arguments/signs are specified independently. } \usage{ sim_numbers(type = rep(as.character(NA), length(abs)), abs = rep(as.numeric(NA), length(type)), sign = rep(as.numeric(NA), length(type)), values = NULL, ...) } \arguments{ \item{type}{ character vector specifying the types of the eigenvalues, see Details.} \item{abs}{ vector of absolute values (moduli).} \item{sign}{ vector of signs (for reals) and arguments (for complex numbers), see Details for interpretation.} \item{values}{values, see details.} \item{\dots}{ additional arguments to be passed to \code{sim_real} and \code{sim_complex}.} } \details{ % NA's are filled with simulated values. \code{sim_numbers} simulates a vector of real and complex numbers with given distributions of their polar parts. It is possible also to fix some of the numbers or one of their polar parts. The length of the simulated vector is inferred from the length of \code{type} or \code{abs}, so one of them must be provided. \code{sim_numbers} is a flexible front-end for \code{sim_real} and \code{sim_complex}. \code{sim_numbers} generates a vector of values with types specified by argument \code{type} and/or inferred from argument \code{values}. The recommended way to use \code{sim_numbers} is to provide argument \code{type}. % and use the other arguments only when needed. \code{type[i]} specifies the type of the i-th element of the result: real (\code{type[i]=="r"}), complex (\code{type[i]=="c"}) or representing a complex conjugate pair (\code{type[i]=="cp"}). If \code{values} is provided, the imaginary parts of its non-NA elements are used to fill \code{NA} elements of \code{type} ("r" if zero, "cp" otherwise). Some (or even all) values may be fixed or partially fixed with the help of arguments \code{abs}, \code{sign} and \code{values}. A non-missing value of \code{values[i]} fixes the i-th element of the result to that value. Simlarly \code{abs[i]} fixes the modulus and \code{sign[i]} fixes the sign/argument of the i-th element. If \code{values[i]} is not \code{NA}, then it takes precedence and \code{abs[i]} and \code{sign[i]} are ignored. For real numbers \code{sign} is the sign with possible values 1 (positive) or -1 (negative). For complex numbers, \code{sign} is the argument and is in the interval (-pi,pi). If \code{values} is supplied, then \code{NA} entries in \code{type} are replaced by "r" or "cp" depending on whether or not the imaginary parts of the corresponding entries in \code{values} are equal to zero. A check is done for consistency when both \code{type[i]} and \code{values[i]} are non-missing. Generally, \code{values} is meant to be used for values that are fixed and available directly in Cartesian form, to avoid having to fill the corresponding entries of \code{abs} and \code{sign}. \code{NA} entries of \code{abs} and \code{sign} are filled with simulated values, the remaining entries are considered fixed and left unchanged. The default generator is uniform (0,1) for \code{abs}, uniform (-pi,pi) for the argument of complex values, and 1 or -1 with p=1/2 for the sign of real values. To specify a different generator for the moduli and absolute values, use argument \code{absgen}, giving it a function or the name of a function. The arguments for this function can be specified by \code{absarg} (as a list). Similarly, the generator for arguments of complex numbers can be specified by \code{arggen} and \code{argarg}. Finally, the probability for the real numbers to be positive is given by \code{signprob}. These arguments are not in the signature of the function since they are passed on directly (via \code{"..."}) to the underlying \code{sim_complex} and \code{sim_real}, see their documentation and the examples below for further details. } \value{ a list with components: \item{values}{vector of values; it is of type \code{numeric} if all values are real and \code{complex} otherwise. } \item{type}{a character vector of the types as above} } %\references{ ~put references to the literature/web site here ~ } \note{ Values of type \code{"cp"} (complex pairs) are represented by one element, the complex conjugate elements are NOT generated. (todo: maybe add an argument to control this) The convention for the sign of a real eigenvalue is 1 and -1, not 0 and \eqn{\pi}. % In the lower level function \code{sim_real} this argument % is called \code{sign} not \code{arg}. The checks for consistency between \code{type} and \code{values} are not complete and only straightforward use is recommended. The current defaults for the arguments, see the signature above, require that at least one of \code{type} and \code{abs} is not missing. % For compatility with old versions of the function (before the % introduction of \code{type}), \code{values} may be a character % vector. In this case \code{type} is set to \code{values}. } \author{Georgi N. Boshnakov} \seealso{ \code{\link{sim_real}}% , \code{\link{sim_complex}} } \examples{ ## one real number and one complex conjugated pair ## (maybe to specify a cubic polynomial through its roots) sim_numbers(type = c("r", "cp")) ## here the real value is fixed to have modulus 1, leaving the sign unspecified sim_numbers(type = c("r", "cp"), abs = c(1, NA)) ## now the real value is fixed to 1, ## the complex pair has argument +-pi/2, and free modulus: sim_numbers(type = c("r", "cp"), abs = c(1, NA), sign = c(0, pi/2)) ## using argument 'values' to fix some values; ## here the the third value is fixed: sim_numbers(type = c("r", "cp", "r"), values = c(NA,NA,3)) # type[3] = "r" sim_numbers(type = c("r", "cp", "cp"), values = c(NA,NA,3i)) # type[3] = "cp" ## type[3] can be left NA since it can be inferred from values[3]: sim_numbers(type = c("r", "cp", NA), values = c(NA,NA,3)) # type[3] = "r" sim_numbers(type = c("r", "cp", NA), values = c(NA,NA,3i)) # type[3] = "cp" ## it is an error to have a mismatch between args `type' and value: \dontrun{ sim_numbers(type = c("r", "cp", "cp"), values = c(NA,NA,3)) sim_numbers(type = c("r", "cp", "r"), values = c(NA,NA,3i)) } ## simulate 10 reals with the default generators sim_numbers(rep("r", 10)) ## simulate modulus from Rayleigh distribution ## rR <- function(n, sigma = 1) sigma * sqrt(-2*log(runif(n))) sim_numbers(type = c("cp", "cp"), absgen = rR, absarg = list()) # test the the components are N(0,1) ## (not run to save time for CRAN check) ## \dontrun{ ## v <- sim_numbers(type = rep("cp", 10000), absgen = "rR", ## absarg = list(sigma = 1)) ## ks.test(Re(v$values), "pnorm") ## ks.test(Im(v$values), "pnorm") ## } } \keyword{ distribution } \keyword{simulation} gbutils/man/plotpdf.Rd0000644000176200001440000000543415102634161014442 0ustar liggesusers\name{plotpdf} \alias{plotpdf} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Plot a probability denstity function } \description{ Plot a probability denstity function with x-axis limits determined by quantiles of the distribution. Quantiles are computed using a quantile function or cumulative distribution function, whichever is supplied. } \usage{ plotpdf(pdf, qdf, cdf, lq = 0.01, uq = 0.99, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{pdf}{probability density to be plotted, a function.} \item{qdf}{quantile function to be used for computation of quantiles, a function.} \item{cdf}{cumulative distribution function to be used for computation of quantiles, a function. This argument is used if \code{qdf} is not given, see `Details' section.} \item{lq}{lower quantile, used in the computation of the left limit.} \item{uq}{upper quantile, used in the computation of the right limit.} \item{\dots}{additional arguments to be passed on to the \code{plot} function.} } \details{ The function plots \code{pdf(x)} over the interval (xmin,xmax) where xmin and xmax are the \code{lq}th and \code{uq}th quantiles, respectively, of the distribution. The quantile function, \code{qdf}, is used, if supplied. Otherwise the quantiles are computed numerically from the cdf. Argument \code{pdf} is not required to be a pdf, it may be any function. For example, the same way of choosing the limits may be appropriate for a plot of the cdf, see the examples. Similarly, \code{qdf} and \code{cdf} need not be related to \code{pdf}. } % \value{ % The function is used mainly for the side effect of producing the % plot. The return value is that of \code{plot}. % } \author{Georgi N. Boshnakov} \seealso{ \code{\link{cdf2quantile}} } \examples{ pdf1 <- function(x) dnorm(x, mean = 100, sd = 5) qdf1 <- function(x) qnorm(x, mean = 100, sd = 5) cdf1 <- function(x) pnorm(x, mean = 100, sd = 5) plot(pdf1) # needs to specify 'from' and 'to' args for meaningful plot plotpdf(pdf1, qdf1) # using quantile function plotpdf(pdf1, cdf = cdf1) # using cdf plotpdf(pdf1, cdf = cdf1, lq = 0.001, uq = 0.999) # ... and non-default quantiles plotpdf(cdf1, cdf = cdf1, lq = 0.001, uq = 0.999) # plot a cdf ## a mixture distribution: pf1 <- function(x){ 0.25 * pnorm(x, mean = 3, sd = 0.2) + 0.75 * pnorm(x, mean = -1, sd = 0.5) } df1 <- function(x){ 0.25 * dnorm(x, mean = 3, sd = 0.2) + 0.75 * dnorm(x, mean = -1, sd = 0.5) } plotpdf(df1, cdf = pf1) # plot the pdf plotpdf(pf1, cdf = pf1) # plot the cdf c(cdf2quantile(0.05, pf1), cdf2quantile(0.95, pf1)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{hplot} \keyword{dplot} gbutils/man/myouter.Rd0000644000176200001440000000232515102634161014472 0ustar liggesusers\name{myouter} \alias{myouter} \alias{shiftleft} \alias{shiftright} \title{ Functions for some basic operations } \description{ Small utility functions } \usage{ myouter(x, y, fun) shiftleft(x, k = 1) shiftright(x, k = 1) } \arguments{ \item{x}{a vector.} \item{y}{a vector.} \item{k}{a non-negative integer.} \item{fun}{a function, see `Details'.} } \details{ \code{myouter(x,y,fun)} computes the outer product of \code{x} and \code{y} using the function \code{fun}. The result is a matrix with \eqn{(i,j)}th element equal to \code{fun(x[i],y[j])}. It is not required for fun to be able to work with vector arguments. The function does the computations in \R using a simple double loop. So, it is a convenience function, not a speed improving one. \code{shiftright(x,k)} rotates the vector \code{x} \code{k} positions to the right. \code{shiftleft(x,k)} rotates the vector \code{x} \code{k} positions to the left. } \value{ for \code{myouter}, a matrix, as described in `Details' for \code{shiftleft} and \code{shiftright}, a vector } %\references{ ~put references to the literature/web site here ~ } \author{Georgi N. Boshnakov} %\note{} %\seealso{ \code{\link{pcAcf}} } %\examples{ %} \keyword{programming} gbutils/man/rpoly.Rd0000644000176200001440000001016515102634161014134 0ustar liggesusers\name{rpoly} \alias{rpoly} \title{Polynomials with real coefficients} \description{ Compute the coefficients of a polynomial with real coefficients, given its real zeroes (roots) and one representative for each complex pair. If complex numbers are given in polar form, there is an option to specify the complex arguments as multiples of \eqn{\pi}. } \usage{ rpoly(x = numeric(0), arg = numeric(0), real = numeric(0), argpi = FALSE, monic = TRUE) } \arguments{ \item{x}{ if \code{complex}, the roots (including the real ones), otherwise the moduli of the complex roots of the polynomial. In both cases only one representative for each complex pair should be included. } \item{arg}{ the complex arguments corresponding to the moduli in \code{x}. This argument is not needed when \code{x} is complex. } \item{real}{ the real roots of the polynomial. This argument is not needed when \code{x} is complex. } \item{argpi}{ if \code{TRUE}, then \code{arg} represents the complex arguments as a multiple of \eqn{\pi}, see section \sQuote{Details}. The default is \code{FALSE}. } \item{monic}{ if \code{TRUE}, the default, the coefficient of the highest term of the polynomialis is set to 1. if \code{FALSE}, the constant term is one. } } \details{ The complex zeroes of polynomials with real coefficients come in complex conjugated pairs. Only one representative from each pair should be supplied to \code{rpoly}. The other is added automatically. Of course, all real roots should be supplied, if any. If \code{x} is complex, it should contain all real roots and one representative for each comple pair. Otherise, if \code{x} is not complex, it contains the moduli of the numbers and \code{arg} contains the complex arguments. The two should be of equal length. With the default \code{FALSE} for \code{argpi}, the k-th root of the polynomial is \code{x[k]*cos(arg[k]) + i*x[k]*sin(arg[k])}. If \code{argpi} is \code{TRUE} it is \code{x[k]*cos(pi*arg[k]) + i*x[k]*sin(pi*arg[k])}. By default, a monic polinomial (the coefficient of the highest order term is 1) is created but if \code{monic} is \code{FALSE}, the constant term of the polynomial is set to 1 . The options for \code{argpi = TRUE} and/or \code{monic = FALSE} are convenient in some applications, e.g., time series analysis and digital signal processing. %% ~~ If necessary, more details than the description above ~~ } \value{ a real vector containing the coefficients of the polynomial. } %\references{ %%% ~put references to the literature/web site here ~ %} \author{Georgi N. Boshnakov} \note{ When \code{argpi} is \code{TRUE}, \eqn{\cos(\pi a)} is computed using \code{cospi(a)}. So this may differ slightly from the equivalent result obtained with \code{argpi = FALSE} and \code{b = pi*a}, which is computed as \code{cos(b) = cos(pi*a)}, see the example. } % %%% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ \code{\link{sim_numbers}} } \examples{ ## z-1 rpoly(real = 1) ## roots 1, i, -i; p3(z) = (z-1)(z-i)(z+i) p3 <- rpoly(c(1, 1i)) p3 polyroot(p3) ## using polar for the complex roots (i = e^(i pi/2)) p3a <- rpoly(1, pi/2, real = 1) p3a ## mathematically, p3a is the same as p3 ## but the numerical calculation here gives a slight discrepancy p3a == p3 p3a - p3 ## using argpi = TRUE is somewhat more precise: p3b <- rpoly(1, 1/2, real = 1, argpi = TRUE) p3b p3b == p3 p3b - p3 ## indeed, in this case the results for p3b and p3 are identical: identical(p3b, p3) ## two ways to expand (z - 2*exp(i*pi/4))(z - 2*exp(-i*pi/4)) rpoly(2, pi/4) rpoly(2, 1/4, argpi = TRUE) ## set the constant term to 1; can be used, say, for AR models rpoly(2, pi/4, monic = FALSE) rpoly(2, 1/4, argpi = TRUE, monic = FALSE) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory (show via RShowDoc("KEYWORDS")): % \keyword{ ~kwd1 } % \keyword{ ~kwd2 } % Use only one keyword per line. % For non-standard keywords, use \concept instead of \keyword: % \concept{ ~cpt1 } % \concept{ ~cpt2 } % Use only one concept per line. gbutils/man/parse_text.Rd0000644000176200001440000000343315121013266015143 0ustar liggesusers\name{parse_text} \alias{parse_text} \title{Parse expressions residing in character vectors} \description{ Parse expressions residing in character vectors. Similar to parse() but keeping or not the source is controlled by an argument rather than global options. } \usage{ parse_text(text, ..., keep = TRUE) } \arguments{ \item{text}{the text to parse, normally a character vector but can be anything that \code{parse} accepts for this artgument.} \item{\dots}{additional arguments to be passed on to \code{parse}.} \item{keep}{required setting for option \verb{keep.source}, see section \sQuote{Details}.} } \details{ This is like \code{parse(text=text,\dots)}, except that whether or not the source is kept is controlled by argument \code{keep}, not by \code{options("keep.source")}. \code{parse_text} sets \code{options("keep.source")} to \code{keep} (if they are different) before calling \code{parse} and restores it afterwards. } \value{ an expression representing the parsed text, see \code{\link{parse}} for details } \author{Georgi N. Boshnakov} \note{ The usual setting of option "keep.source" in interactive sessions is TRUE. However, in `R CMD check' it is FALSE. As a consequence, if the documentation of a package uses functions that depend on option "keep.source" being \code{TRUE}, then some examples may run fine when copied and pasted in an R session but (rightly) fail `R CMD check'. The oposite may also happen, in that the documentation passes `R CMD check' or Sweave files successfully build but some examples do not work when copied and pasted in an interactive session. } \seealso{ \code{\link{parse}} } % \examples{ % } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{programming} gbutils/man/objectPad-class.Rd0000644000176200001440000000526215102634161015767 0ustar liggesusers\name{objectPad-class} \docType{class} \alias{objectPad-class} %\alias{pad,objectPad,missing-method} %\alias{pad,objectPad,ANY-method} \alias{pad<-,objectPad-method} \alias{initialize,objectPad-method} \title{Class "objectPad" objects and methods to store and retrieve information } \description{Objects of class "objectPad" can be used as storage of information. There are methods for storage and retrieval. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("objectPad", ...)}. Currently the \code{...} arguments are ignored and an empty object is created. Objects of class "objectPad" have no user-level slots. Values are stored and retrieved with the function \code{pad}, for the former purpose using it on the left-hand side of an assignment. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Object of class \code{"list"}, inherited from \code{"list"}. } } } \section{Extends}{ Class \code{"\linkS4class{list}"}, from data part. Class \code{"\linkS4class{vector}"}, by class "list", distance 2. } \section{Methods}{ \describe{ \item{initialize}{\code{signature(.Object = "objectPad")}: ... } \item{pad}{\code{signature(x = "objectPad", item = "missing")}: ... } \item{pad}{\code{signature(x = "objectPad", item = "ANY")}: ... } \item{pad<-}{\code{signature(x = "objectPad")}: ... } } } %\references{ ~put references to the literature/web site here ~ } \author{ Georgi Boshnakov } \note{ The methods for this class are set to work directly on objects from classes that have slot \code{pad} of class \code{objectPad}. Classes may define additional methods for the function \code{pad} (it is generic) to adapt it to their needs. % todo: Ne si spomnyam dali narochno napravich metodite da ne priemat % poveche ot edin argument za item. (Obstata fuktsiya za replacement pad<-() % priema ..., no analogat i pad() ne go pravi.) Zatova otkomentiram % nyakoi ot prmerite po-dolu. } \seealso{ \code{\link{pad-methods}} } \examples{ # create a pad and store some info. pa <- new("objectPad") pad(pa,"apple") <- "fruit" pad(pa,"sweets") <- "sweets" # pad(pa,"apple","dentist") <- "keeps away from her/him" # pad(pa,"sweets","dentist") <- "helps meeting her/him" pad(pa,"young Gauss") <- 100*(100+1)/2 pad(pa,"layman") <- sum(1:100) pad(pa,"apple") pad(pa,"sweets") # pad(pa,"apple","dentist") # pad(pa,"sweets","dentist") pad(pa,"young Gauss") - pad(pa,"layman") # create a class of vectors with a pad setClass("vecWithPad",representation(x="numeric",pad="objectPad")) a <- new("vecWithPad",x=1:10) pad(a,"mean") <- mean(a@x) # Compute and store the mean, and pad(a,"mean") # retrieve it } %\keyword{classes} \keyword{internal} gbutils/man/missing_arg.Rd0000644000176200001440000000300515102634161015264 0ustar liggesusers\name{missing_arg} \alias{missing_arg} \title{Check if an element of a pairlist is missing} \description{Check if an element of a pairlist is missing.} \usage{ missing_arg(arg) } \arguments{ \item{arg}{the object to test.} } \details{ The argument passed to \code{missing_arg} is typically an element of a \code{pairlist} or the list produced by \code{alist()}. \code{missing_arg} returns \code{TRUE} if it is missing and \code{FALSE} otherwise. Objects of type \code{pairlist} come up at R level almost exclusively as the formal arguments of functions. \code{missing_arg} can be useful when they are manipulated programmatically. } \value{ TRUE or FALSE } \author{Georgi N. Boshnakov} %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} \examples{ lmargs <- formals(lm) class(lmargs) # pairlist missing_arg(lmargs$data) ## which arguments of lm() have no (explicit) defaults? sapply(lmargs, missing_arg) ## This gives an error: ## pairlist(x = 3, y = , z = 5) ## an example with alist() pl2 <- alist(a = "", b = , c = 3) class(pl2) # list ## this shows that 'b' is missing, 'a' and 'c' are not: sapply(pl2, missing_arg) # FALSE TRUE FALSE ## superficially, 'b' is equal to the empty string: pl2[[2]] sapply(pl2, function(x) x == "") # TRUE TRUE FALSE ## with pairlist the results are the same: g <- function(a = "", b, c = 3) NULL a.g <- formals(g) class(a.g) # pairlist sapply(a.g, missing_arg) # FALSE TRUE FALSE a.g[[2]] sapply(a.g, function(x) x == "") # TRUE TRUE FALSE } \keyword{programming} gbutils/man/nposargs.Rd0000644000176200001440000000375715102634161014634 0ustar liggesusers\name{nposargs} \alias{nposargs} \title{ Function to count the number of positional arguments used in a call } \description{ Calculates the number of positional arguments used in a call. } \usage{ nposargs(x, a = FALSE) } \arguments{ \item{x}{ a call object, usually obtained from \code{sys.call()}. } \item{a}{ if \code{a[1]} is \code{TRUE} make a correction to distinguish \code{x[]} from \code{x[i]}, see details. } } \details{ \code{nposargs} is mainly for use in the body of function definitions, paricularly for functions or methods that wish to mimic the behaviour of \code{"["}. \code{nposargs} gives the number of positional arguments used in a call. It also takes into account empty arguments like those used in expressions like \code{x[1, ]}. Optionally, it makes a particular correction that is peculiar for "[" - if there are no named arguments in the call and the count of the arguments is 2 and \code{a[1]=TRUE}, it decreases the count by one, i.e. returns 1. This is to distinguish between a \code{x[]} and \code{x[i]} which both would give 2 otherwise. I have forgotten the details but, roughly speaking, x[i] becomes "["(x,i) while x[] becomes "["(x,), i.e. \R puts the comma after x in any case. } \value{ the number of positional arguments in the call } \author{Georgi N. Boshnakov} \note{ I wrote this function (a long time ago) for use in methods for \code{"["}. \code{a[1]} above is typically obtained by a call \code{missing(i)} somewhere at the beginning of the function. In my application I put the results of several such calls in a vector, hence the check for \code{a[1]} rather than \code{a}, For \code{"["}, we may set \code{a = c(missing(i), missing(j), missing(k))}. } % \seealso{ ~~objects to See Also as \code{\link{help}}, ~~~ } \examples{ f <- function(x,y,z,...){ call <- sys.call() nposargs(call) } f(a,b,c) # 3 f(a, , ) # 3 f(a, ) # 2 f(a) # 1 f(, ) # 2 f(, a, ) # 3 f() # 0 } \keyword{programming} gbutils/man/pseudoInverse.Rd0000644000176200001440000000220115102634161015612 0ustar liggesusers\name{pseudoInverse} \alias{pseudoInverse} %- Also NEED an '\alias' for EACH other topic documented here. \title{Compute a pseudo-inverse matrix} \description{Compute a pseudo-inverse matrix using singular value decomposition and setting very small singular values to zero.} \usage{ pseudoInverse(a, tol = 1e-07) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{a}{a matrix} \item{tol}{a number, the threshold for non-zero singular values.} } \details{ The singular value decomposition of \code{a} is computed and singular values smaller than \code{tol} are set to zero. The result is formed using the standard formula. } \value{ a matrix } %\references{ %%% ~put references to the literature/web site here ~ %} % %\author{ %%% ~~who you are~~ %} % %\note{ %%% ~~further notes~~ %} % % %%% ~Make other sections like Warning with \section{Warning }{....} ~ % % %\seealso{ %%% ~~objects to See Also as \code{\link{help}}, ~~~ %} \examples{ ##---- Should be DIRECTLY executable !! ---- } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{math} gbutils/man/pad-methods.Rd0000644000176200001440000000353515102634161015177 0ustar liggesusers\name{pad-methods} \docType{methods} \alias{pad} \alias{pad<-} \alias{pad-methods} \alias{pad,ANY,ANY-method} \alias{pad,ANY,missing-method} \alias{pad,objectPad,missing-method} \alias{pad,objectPad,ANY-method} \alias{padcheck} \title{ Store and get data in pad objects } \description{ Get and store information in a pad. \code{pad} can be used on the lefthand side of an assignment to store information in an object and as normal function call to retrieve previously stored information. } \usage{ pad(x, item) pad(x, item, ...) <- value } \arguments{ \item{x}{ the object where the information is stored. } \item{item}{ the \code{item} to be stored or extracted. } \item{value}{ the value to be stored } \item{...}{ additional arguments (??? are these really possible? !!!) } } \details{ This is a generic function. There are methods for \code{x} of class \code{objectPad}. The generic works with the slot \code{pad} of \code{x}. Currently there is no check if there is one. To remove an item use \code{pad(x,item) <- NULL}. So, by definition, items may not have the value \code{NULL}. \code{padcheck} checks if \code{item} has a value and if so returns \code{TRUE}. Otherwise it returns \code{FALSE}. } \value{ The requested item. If \code{item} is missing a named list containing all stored items. } \section{Methods}{ \describe{ \item{x = "objectPad", item = "missing"}{ get all items stored in the pad \code{x}, as a named list. } \item{x = "objectPad", item = "ANY"}{ get the requested \code{item} from the pad \code{x}. } \item{x = "ANY", item = "missing"}{ get all items stored in the pad of \code{x} as a named list. } \item{x = "ANY", item = "ANY"}{ get the requested \code{item} from the pad of \code{x}. } }} \author{ Georgi N. Boshnakov } \seealso{ \code{\linkS4class{objectPad}} } %\keyword{methods} \keyword{internal} gbutils/DESCRIPTION0000644000176200001440000000337215121032571013433 0ustar liggesusersPackage: gbutils Type: Package Title: Utilities for Simulation, Plots, Quantile Functions and Programming Version: 0.5.1 Depends: methods Imports: stats, utils, Rdpack (>= 0.9) Suggests: testthat (>= 3.0.0), classGraph, graph, Rgraphviz RdMacros: Rdpack Authors@R: person(given = c("Georgi", "N."), family = "Boshnakov", role = c("aut", "cre"), email = "georgi.boshnakov@manchester.ac.uk", comment = c(ORCID = "0000-0003-2839-346X")) Description: Plot density and distribution functions with automatic selection of suitable regions. Numerically invert (compute quantiles) distribution functions. Simulate real and complex numbers from distributions of their magnitude and arguments. Optionally, the magnitudes and/or arguments may be fixed in almost arbitrary ways. Create polynomials from roots given in Cartesian or polar form. Small programming utilities: check if an object is identical to NA, count positional arguments in a call, set intersection of more than two sets, check if an argument is unnamed, compute the graph of S4 classes in packages. URL: https://geobosh.github.io/gbutils/ (doc), https://CRAN.R-project.org/package=gbutils BugReports: https://github.com/GeoBosh/gbutils/issues License: GPL (>= 2) Encoding: UTF-8 Collate: parse_text.R sim_numbers.R isNA.R mintersect.R pad.R args.R history.R cdf2qf.R S4utils.R pseudoInverse.R rpoly.R Config/testthat/edition: 3 NeedsCompilation: no Packaged: 2025-12-18 15:16:56 UTC; georgi Author: Georgi N. Boshnakov [aut, cre] (ORCID: ) Maintainer: Georgi N. Boshnakov Repository: CRAN Date/Publication: 2025-12-18 17:10:17 UTC