tgp/0000755000175100001440000000000012655611525011072 5ustar hornikuserstgp/inst/0000755000175100001440000000000012655414745012054 5ustar hornikuserstgp/inst/CITATION0000644000175100001440000000321212506600653013175 0ustar hornikuserscitHeader("To cite tgp in publications use:") citEntry(entry = "Article", title = "{tgp}: An {R} Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models", author = personList(as.person("Robert B. Gramacy")), journal = "Journal of Statistical Software", year = "2007", volume = "19", number = "9", pages = "1--46", url = "http://www.jstatsoft.org/v19/i09/", textVersion = paste("Robert B. Gramacy (2007).", "tgp: An R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.", "Journal of Statistical Software, 19(9), 1-46.", "URL http://www.jstatsoft.org/v19/i09/.") ) citEntry(entry = "Article", title = "Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with {tgp} Version 2, an {R} Package for Treed Gaussian Process Models", author = personList(as.person("Robert B. Gramacy"), as.person("Matthew Taddy")), journal = "Journal of Statistical Software", year = "2010", volume = "33", number = "6", pages = "1--48", url = "http://www.jstatsoft.org/v33/i06/", textVersion = paste("Robert B. Gramacy, Matthew Taddy (2010).", "Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with tgp Version 2, an R Package for Treed Gaussian Process Models.", "Journal of Statistical Software, 33(6), 1-48.", "URL http://www.jstatsoft.org/v33/i06/.") ) tgp/inst/doc/0000755000175100001440000000000012655414745012621 5ustar hornikuserstgp/inst/doc/tgp2.Rnw0000644000175100001440000001563012655414745014172 0ustar hornikusers\documentclass[12pt]{article} \usepackage{Sweave} %\SweaveOpts{eps=TRUE} %\usepackage[footnotesize]{caption} \usepackage{caption} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amscd} \usepackage{epsfig} \usepackage{fullpage} %\renewcommand{\baselinestretch}{1.5} \newcommand{\bm}[1]{\mbox{\boldmath $#1$}} \newcommand{\mb}[1]{\mathbf{#1}} \newcommand{\mc}[1]{\mathcal{#1}} \newcommand{\mr}[1]{\mathrm{#1}} \newcommand{\mbb}[1]{\mathbb{#1}} %\VignetteIndexEntry{new features in tgp version 2.x} %\VignetteKeywords{tgp} %\VignetteDepends{tgp,maptree} %\VignettePackage{tgp} \begin{document} \setkeys{Gin}{width=0.85\textwidth} <>= library(tgp) options(width=65) @ \title{Categorical inputs, sensitivity analysis,\\ optimization and importance tempering\\ with {\tt tgp} version 2, an {\sf R} package for\\ treed Gaussian process models} \author{ Robert B. Gramacy\\ Booth School of Business\\ The University of Chicago\\ rbgramacy@chicagobooth.edu \and Matthew Taddy\\ Booth School of Business\\ The University of Chicago\\ taddy@chicagobooth.edu } \maketitle \begin{abstract} This document describes the new features in version 2.x of the {\tt tgp} package for {\sf R}, implementing treed Gaussian process (GP) models. The topics covered include methods for dealing with categorical inputs and excluding inputs from the tree or GP part of the model; fully Bayesian sensitivity analysis for inputs/covariates; %multiresolution (treed) Gaussian process modeling; sequential optimization of black-box functions; and a new Monte Carlo method for inference in multi-modal posterior distributions that combines simulated tempering and importance sampling. These additions extend the functionality of {\tt tgp} across all models in the hierarchy: from Bayesian linear models, to CART, to treed Gaussian processes with jumps to the limiting linear model. %, except in the case of multiresolution models which apply only %to the (treed) GP. It is assumed that the reader is familiar with the baseline functionality of the package, outlined in the first vignette \cite{gramacy:2007}. \end{abstract} \subsection*{Intended audience} \label{sec:discaimer} The {\tt tgp} package contains implementations of seven related Bayesian regression frameworks which combine treed partition models, linear models (LM), and stationary Gaussian process (GP) models. GPs are flexible (phenomenological) priors over functions which, when used for regression, are usually relegated to smaller applications for reasons of computational expense. Trees, by contrast, are a crude but efficient divide-and-conquer approach to non-stationary regression. When combined they are quite powerful, and provide a highly flexible nonparametric and non-stationary family of regression tools. These treed GP models have been successfully used in a variety of contexts, in particular in the sequential design and analysis of computer experiments. The models, and the (base) features of the package, are described the vignette for version 1.x of the package \cite{gramacy:2007}. This document is intended as a follow-on, describing four new features that have been added to the package in version 2.x. As such, it is divided into four essentially disjoint sections: on categorical inputs (Section \ref{sec:cat}), sensitivity analysis (Section \ref{sec:sens}), statistical optimization (Section \ref{sec:optim}), and importance tempering (Section \ref{sec:it}). The ability to deal with categorical inputs greatly expands the sorts of regression problems which {\tt tgp} can handle. It also enables the partition component of the model to more parsimoniously describe relationships that were previously left to the GP part of the model, at a great computational expense and interpretational disadvantage. The analysis of sensitivity to inputs via the predictive variance enables the user to inspect, and understand, the first-order and total effects of each of the inputs on the response. The section on statistical optimization expands the sequential design feature set described in the first vignette. We now provide a skeleton which automates the optimization of black-box functions by expected improvement, along with tools and suggestions for assessing convergence. Finally, the addition of tempering-based MCMC methods leads to more reliable inference via a more thorough exploration of the highly multi-modal posterior distributions that typically result from tree based models, which previously could only be addressed by random restarts. Taken all together, these four features have greatly expanded the capabilities of the package, and thus the variety of statistical problems which can be addressed with the {\tt tgp} family of methods. Each of the four sections to follow will begin with a short mathematical introduction to the new feature or methodology and commence with extensive examples in {\sf R} on synthetic and real data. This document has been authored in {\tt Sweave} (try {\tt help(Sweave)}). This means that the code quoted throughout is certified by {\sf R}, and the {\tt Stangle} command can be used to extract it. As with the first vignette, the {\sf R} code in each of the sections to follow is also available as a demo in the package. Note that this tutorial was not meant to serve as an instruction manual. For more detailed documentation of the functions contained in the package, see the package help--manuals. At an {\sf R} prompt, type {\tt help(package=tgp)}. PDF documentation is also available on the world-wide-web. \begin{center} \tt http://www.cran.r-project.org/doc/packages/tgp.pdf \end{center} Each section starts by seeding the random number generator with \verb!set.seed(0)!. This is done to make the results and analyses reproducible within this document (assuming identical architecture [64-bit Linux] and version of {\sf R} [2.10.1]), and in demo form. We recommend you try these examples with different seeds and see what happens. Usually the results will be similar, but sometimes (especially when the data ({\tt X},{\tt Z}) is generated randomly) they may be quite different. \SweaveInput{cat.iRnw} \SweaveInput{sens.iRnw} \SweaveInput{optim.iRnw} \SweaveInput{it.iRnw} %\iffalse \subsection*{Acknowledgments} This work was partially supported by research subaward 08008-002-011-000 from the Universities Space Research Association and NASA, NASA/University Affiliated Research Center grant SC 2003028 NAS2-03144, Sandia National Laboratories grant 496420, National Science Foundation grants DMS 0233710 and 0504851, and Engineering and Physical Sciences Research Council Grant EP/D065704/1. The authors would like to thank their Ph.D.~advisor, Herbie Lee, whose contributions and guidance in this project have been invaluable throughout. Finally, we would like to thank two anonymous referees whose many helpful comments improved the paper. %\fi \bibliography{tgp} \bibliographystyle{plain} \end{document} tgp/inst/doc/tgp2.R0000644000175100001440000005416712655414745013635 0ustar hornikusers### R code from vignette source 'tgp2.Rnw' ################################################### ### code chunk number 1: tgp2.Rnw:33-35 ################################################### library(tgp) options(width=65) ################################################### ### code chunk number 2: cat.iRnw:4-8 ################################################### library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 3: cat.iRnw:73-77 ################################################### fb.train <- fried.bool(500) X <- fb.train[,1:13]; Z <- fb.train$Y fb.test <- fried.bool(1000) XX <- fb.test[,1:13]; ZZ <- fb.test$Ytrue ################################################### ### code chunk number 4: cat.iRnw:83-84 ################################################### names(X) ################################################### ### code chunk number 5: cat.iRnw:91-94 ################################################### fit1 <- bcart(X=X, Z=Z, XX=XX, verb=0) rmse1 <- sqrt(mean((fit1$ZZ.mean - ZZ)^2)) rmse1 ################################################### ### code chunk number 6: cat-fbcart-mapt ################################################### tgp.trees(fit1, "map") ################################################### ### code chunk number 7: cat.iRnw:103-104 ################################################### graphics.off() ################################################### ### code chunk number 8: cat.iRnw:118-121 ################################################### fit2 <- btlm(X=X, Z=Z, XX=XX, verb=0) rmse2 <- sqrt(mean((fit2$ZZ.mean - ZZ)^2)) rmse2 ################################################### ### code chunk number 9: cat-fbtlm-trees ################################################### tgp.trees(fit2, "map") ################################################### ### code chunk number 10: cat.iRnw:129-130 ################################################### graphics.off() ################################################### ### code chunk number 11: cat.iRnw:164-167 ################################################### fit3 <- btlm(X=X, Z=Z, XX=XX, basemax=10, verb=0) rmse3 <- sqrt(mean((fit3$ZZ.mean - ZZ)^2)) rmse3 ################################################### ### code chunk number 12: cat-fbtlm-mapt ################################################### tgp.trees(fit3, "map") ################################################### ### code chunk number 13: cat.iRnw:173-174 ################################################### graphics.off() ################################################### ### code chunk number 14: cat.iRnw:196-199 ################################################### fit4 <- btgpllm(X=X, Z=Z, XX=XX, verb=0) rmse4 <- sqrt(mean((fit4$ZZ.mean - ZZ)^2)) rmse4 ################################################### ### code chunk number 15: cat.iRnw:204-205 ################################################### fit4$gpcs ################################################### ### code chunk number 16: cat.iRnw:216-219 ################################################### fit5 <- btgpllm(X=X, Z=Z, XX=XX, basemax=10, verb=0) rmse5 <- sqrt(mean((fit5$ZZ.mean - ZZ)^2)) rmse5 ################################################### ### code chunk number 17: cat-fb-mapt ################################################### h <- fit1$post$height[which.max(fit1$posts$lpost)] tgp.trees(fit5, "map") ################################################### ### code chunk number 18: cat.iRnw:236-237 ################################################### graphics.off() ################################################### ### code chunk number 19: cat.iRnw:268-271 ################################################### fit6 <- btgpllm(X=X, Z=Z, XX=XX, basemax=10, splitmin=11, verb=0) rmse6 <- sqrt(mean((fit6$ZZ.mean - ZZ)^2)) rmse6 ################################################### ### code chunk number 20: sens.iRnw:4-6 ################################################### library(tgp) seed <- 0; set.seed(seed) ################################################### ### code chunk number 21: sens.iRnw:374-375 ################################################### f <- friedman.1.data(250) ################################################### ### code chunk number 22: sens.iRnw:381-384 ################################################### Xf <- f[, 1:6] Zf <- f$Y sf <- sens(X=Xf, Z=Zf, nn.lhs=600, model=bgpllm, verb=0) ################################################### ### code chunk number 23: sens.iRnw:395-396 ################################################### names(sf$sens) ################################################### ### code chunk number 24: sens-full ################################################### plot(sf, layout="sens", legendloc="topleft") ################################################### ### code chunk number 25: sens.iRnw:414-415 ################################################### graphics.off() ################################################### ### code chunk number 26: sens-mains ################################################### par(mar=c(4,2,4,2), mfrow=c(2,3)) plot(sf, layout="sens", maineff=t(1:6)) ################################################### ### code chunk number 27: sens.iRnw:442-443 ################################################### graphics.off() ################################################### ### code chunk number 28: sens-indices ################################################### plot(sf, layout="sens", maineff=FALSE) ################################################### ### code chunk number 29: sens.iRnw:455-456 ################################################### graphics.off() ################################################### ### code chunk number 30: sens.iRnw:506-511 ################################################### X <- airquality[,2:4] Z <- airquality$Ozone rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- rep(2,3) ################################################### ### code chunk number 31: sens-udraw ################################################### Udraw <- lhs(300, rect=rect, mode=mode, shape=shape) par(mfrow=c(1,3), mar=c(4,2,4,2)) for(i in 1:3){ hist(Udraw[,i], breaks=10,xlab=names(X)[i], main="",ylab="", border=grey(.9), col=8) } ################################################### ### code chunk number 32: sens.iRnw:524-525 ################################################### graphics.off() ################################################### ### code chunk number 33: sens.iRnw:537-539 ################################################### s.air <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, rect=rect, shape=shape, mode=mode, verb=0)) ################################################### ### code chunk number 34: sens-air1 ################################################### plot(s.air, layout="sens") ################################################### ### code chunk number 35: sens.iRnw:546-547 ################################################### graphics.off() ################################################### ### code chunk number 36: sens.iRnw:563-566 ################################################### rect[2,] <- c(0,5) mode[2] <- 2 shape[2] <- 2 ################################################### ### code chunk number 37: sens.iRnw:570-571 ################################################### sens.p <- suppressWarnings(sens(X=X,Z=Z,nn.lhs=300, model=NULL, rect=rect, shape=shape, mode=mode)) ################################################### ### code chunk number 38: sens-air2 ################################################### s.air2 <- predict(s.air, BTE=c(1,1000,1), sens.p=sens.p, verb=0) plot(s.air2, layout="sens") ################################################### ### code chunk number 39: sens.iRnw:578-579 ################################################### graphics.off() ################################################### ### code chunk number 40: sens.iRnw:602-609 ################################################### X$Temp[X$Temp >70] <- 1 X$Temp[X$Temp >1] <- 0 rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- c(2,2,0) s.air <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, rect=rect, shape=shape, mode=mode, verb=0, basemax=2)) ################################################### ### code chunk number 41: sens-air3 ################################################### plot(s.air, layout="sens") ################################################### ### code chunk number 42: sens.iRnw:615-616 ################################################### graphics.off() ################################################### ### code chunk number 43: optim.iRnw:4-6 ################################################### library(tgp) seed <- 0; set.seed(seed) ################################################### ### code chunk number 44: optim.iRnw:179-183 ################################################### rosenbrock <- function(x){ x <- matrix(x, ncol=2) 100*(x[,1]^2 - x[,2])^2 + (x[,1] - 1)^2 } ################################################### ### code chunk number 45: optim.iRnw:188-189 ################################################### rosenbrock(c(1,1)) ################################################### ### code chunk number 46: optim.iRnw:197-200 ################################################### rect <- cbind(c(-1,-1),c(5,5)) X <- lhs(40, rect) Z <- rosenbrock(X) ################################################### ### code chunk number 47: optim.iRnw:216-218 ################################################### XX <- lhs(200, rect) rfit <- bgp(X,Z,XX,improv=c(1,10), verb=0) ################################################### ### code chunk number 48: optim.iRnw:226-227 ################################################### cbind(rfit$improv,XX)[rfit$improv$rank <= 10,] ################################################### ### code chunk number 49: optim-fit1 ################################################### plot(rfit, as="improv") ################################################### ### code chunk number 50: optim.iRnw:241-242 ################################################### graphics.off() ################################################### ### code chunk number 51: optim-fit2 ################################################### rfit2 <- predict(rfit, XX=XX, BTE=c(1,1000,1), improv=c(5,20), verb=0) plot(rfit2, layout="as", as="improv") ################################################### ### code chunk number 52: optim.iRnw:270-271 ################################################### graphics.off() ################################################### ### code chunk number 53: optim.iRnw:410-411 ################################################### f <- function(x) { exp2d.Z(x)$Z } ################################################### ### code chunk number 54: optim.iRnw:425-428 ################################################### rect <- rbind(c(-2,6), c(-2,6)) X <- lhs(20, rect) Z <- f(X) ################################################### ### code chunk number 55: optim.iRnw:432-445 ################################################### out <- progress <- NULL for(i in 1:20) { ## get recommendations for the next point to sample out <- optim.step.tgp(f, X=X, Z=Z, rect=rect, prev=out, verb=0) ## add in the inputs, and newly sampled outputs X <- rbind(X, out$X) Z <- c(Z, f(out$X)) ## keep track of progress and best optimum progress <- rbind(progress, out$progress) } ################################################### ### code chunk number 56: optim-progress ################################################### par(mfrow=c(1,2)) matplot(progress[,1:2], main="x progress", xlab="rounds", ylab="x[,1:2]", type="l", lwd=2) legend("topright", c("x1", "x2"), lwd=2, col=1:2, lty=1:2) plot(log(progress$improv), type="l", main="max log improv", xlab="rounds", ylab="max log(improv)") ################################################### ### code chunk number 57: optim.iRnw:462-463 ################################################### graphics.off() ################################################### ### code chunk number 58: optim.iRnw:478-479 ################################################### out$progress[1:2] ################################################### ### code chunk number 59: optim.iRnw:504-505 ################################################### formals(optim)$method ################################################### ### code chunk number 60: optim.iRnw:509-510 ################################################### formals(optim.ptgpf)$method ################################################### ### code chunk number 61: it.iRnw:4-8 ################################################### library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 62: it.iRnw:125-128 ################################################### geo <- default.itemps(type="geometric") har <- default.itemps(type="harmonic") sig <- default.itemps(type="sigmoidal") ################################################### ### code chunk number 63: it-itemps ################################################### par(mfrow=c(2,1)) all <- cbind(geo$k, har$k, sig$k) matplot(all, pch=21:23, main="inv-temp ladders", xlab="indx", ylab="itemp") legend("topright", pch=21:23, c("geometric","harmonic","sigmoidal"), col=1:3) matplot(log(all), pch=21:23, main="log(inv-temp) ladders", xlab="indx", ylab="itemp") ################################################### ### code chunk number 64: it.iRnw:143-144 ################################################### graphics.off() ################################################### ### code chunk number 65: it.iRnw:210-217 ################################################### ESS <- function(w) { mw <- mean(w) cv2 <- sum((w-mw)^2)/((length(w)-1)*mw^2) ess <- length(w)/(1+cv2) return(ess) } ################################################### ### code chunk number 66: it.iRnw:363-366 ################################################### exp2d.data<-exp2d.rand() X<-exp2d.data$X Z<-exp2d.data$Z ################################################### ### code chunk number 67: it.iRnw:372-375 ################################################### its <- default.itemps(m=10) exp.btlm <- btlm(X=X,Z=Z, bprior="b0", R=2, itemps=its, pred.n=FALSE, BTE=c(1000,3000,2)) ################################################### ### code chunk number 68: it.iRnw:400-401 ################################################### exp.btlm$ess ################################################### ### code chunk number 69: it.iRnw:412-415 ################################################### library(MASS) moto.it <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), bprior="b0", R=3, itemps=geo, trace=TRUE, pred.n=FALSE, verb=0) ################################################### ### code chunk number 70: it.iRnw:419-420 ################################################### moto.it$ess$combined ################################################### ### code chunk number 71: it.iRnw:424-426 ################################################### p <- moto.it$trace$post ESS(p$wlambda) ################################################### ### code chunk number 72: it.iRnw:432-433 ################################################### ESS(p$w) ################################################### ### code chunk number 73: it.iRnw:438-439 ################################################### as.numeric(c(sum(p$itemp == 1), moto.it$ess$each[1,2:3])) ################################################### ### code chunk number 74: it.iRnw:450-452 ################################################### moto.reg <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), R=3, bprior="b0", trace=TRUE, pred.n=FALSE, verb=0) ################################################### ### code chunk number 75: it.iRnw:458-461 ################################################### L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(moto.reg$trace$post$height, p$height, hw)) ################################################### ### code chunk number 76: it-moto-height ################################################### barplot(b, beside=TRUE, col=1:3, xlab="tree height", ylab="counts", main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) ################################################### ### code chunk number 77: it.iRnw:469-470 ################################################### graphics.off() ################################################### ### code chunk number 78: it-moto-ktrace ################################################### plot(log(moto.it$trace$post$itemp), type="l", ylab="log(k)", xlab="samples", main="trace of log(k)") ################################################### ### code chunk number 79: it.iRnw:503-504 ################################################### graphics.off() ################################################### ### code chunk number 80: it-moto-khist ################################################### b <- itemps.barplot(moto.it, plot.it=FALSE) barplot(t(cbind(moto.it$itemps$counts, b)), col=1:2, beside=TRUE, ylab="counts", xlab="itemps", main="inv-temp observation counts") legend("topleft", c("observation counts", "posterior samples"), fill=1:2) ################################################### ### code chunk number 81: it.iRnw:535-536 ################################################### graphics.off() ################################################### ### code chunk number 82: it.iRnw:559-561 ################################################### moto.it.sig <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), R=3, bprior="b0", krige=FALSE, itemps=sig, verb=0) ################################################### ### code chunk number 83: it.iRnw:565-566 ################################################### moto.it.sig$ess$combined ################################################### ### code chunk number 84: it-moto-pred ################################################### plot(moto.it.sig) ################################################### ### code chunk number 85: it.iRnw:572-573 ################################################### graphics.off() ################################################### ### code chunk number 86: it.iRnw:599-602 ################################################### Xcand <- lhs(10000, rbind(c(-6,6),c(-6,6))) X <- dopt.gp(400, X=NULL, Xcand)$XX Z <- exp2d.Z(X)$Z ################################################### ### code chunk number 87: it.iRnw:607-609 ################################################### exp.reg <- btgpllm(X=X, Z=Z, BTE=c(2000,52000,10), bprior="b0", trace=TRUE, krige=FALSE, R=10, verb=0) ################################################### ### code chunk number 88: it-exp-pred ################################################### plot(exp.reg) ################################################### ### code chunk number 89: it.iRnw:615-616 ################################################### graphics.off() ################################################### ### code chunk number 90: it.iRnw:628-630 ################################################### h <- exp.reg$post$height[which.max(exp.reg$posts$lpost)] h ################################################### ### code chunk number 91: it-exp-mapt ################################################### tgp.trees(exp.reg, "map") ################################################### ### code chunk number 92: it.iRnw:639-640 ################################################### graphics.off() ################################################### ### code chunk number 93: it.iRnw:664-667 ################################################### its <- default.itemps(k.min=0.02) exp.it <- btgpllm(X=X, Z=Z, BTE=c(2000,52000,10), bprior="b0", trace=TRUE, krige=FALSE, itemps=its, R=10, verb=0) ################################################### ### code chunk number 94: it.iRnw:672-674 ################################################### exp.it$gpcs exp.reg$gpcs ################################################### ### code chunk number 95: it.iRnw:682-684 ################################################### p <- exp.it$trace$post data.frame(ST=sum(p$itemp == 1), nIT=ESS(p$w), oIT=exp.it$ess$combined) ################################################### ### code chunk number 96: it.iRnw:696-699 ################################################### L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(exp.reg$trace$post$height, p$height, hw)) ################################################### ### code chunk number 97: it-exp-height ################################################### barplot(b, beside=TRUE, col=1:3, xlab="tree height", ylab="counts", main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) ################################################### ### code chunk number 98: it.iRnw:707-708 ################################################### graphics.off() ################################################### ### code chunk number 99: it-exp-trace-height ################################################### ylim <- range(p$height, exp.reg$trace$post$height) plot(p$height, type="l", main="trace of tree heights", xlab="t", ylab="height", ylim=ylim) lines(exp.reg$trace$post$height, col=2) legend("topright", c("tempered", "reg MCMC"), lty=c(1,1), col=1:2) ################################################### ### code chunk number 100: it.iRnw:732-733 ################################################### graphics.off() ################################################### ### code chunk number 101: it-expit-pred ################################################### plot(exp.it) ################################################### ### code chunk number 102: it-expit-trees ################################################### tgp.trees(exp.it, "map") ################################################### ### code chunk number 103: it.iRnw:760-761 ################################################### graphics.off() tgp/inst/doc/tgp.pdf0000644000175100001440000515565412655414752014131 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 5763 /Filter /FlateDecode /N 99 /First 840 >> stream x})v0[,7qy Z;?͞K]y` '7c) 07o.oG3w9ݖ{|*;E8(h䕆_8@pk|2|q< ]>XsI ߐV\ӺYF';i"TQQ?`!L7y2JnۤHLb^nyH@p%џ2xt@L Ev+<(Dž`V@t6Ѿ+ov@iRڸOs,&_ɵ%><H @ʑ_\jM? RQz?!eLSH;пwm3u0^X+lh1_x)]~Tsꠇ09 |t{J2nݕߜeWM![!-1ʧ5»E[4R>UXBp4,ALEXBH'oP:nޠSx{;U`FZ(Qw&$YݝGF(icl1 jB51.opT2M6dl+bЅܨϚ28P`G-艜a 냝\?}8z =TJc[hN_5:S.^"xV:-hO[;Zb75vi0 " +ҟmpQSoM2X ʟ gQ`nw3G>^)290Ğu DȼxCFѵ33<{Zi)BϪzOӢ {c~(G;pd G,h9k܎v g SKdzM/0 ,a&"C ->\^(cWj}6q\ꊬ-oU[dED|{ ϮW| qp( @#),q}YRY5c͘ ( ?iC5,S0s p=?'SP 1uA ǝe]y[]뵯vf~3E2 &:}H< V8Š 7 w|܅HiMH (5exz̀8&bȟgt6Z B}c K|4]p8==`Pr(ϋAfe~tvH%CNaM?o!F'l]߲VSd-e%5ʒQFxRSkk%ݓF~ rE{SKʤ++'lM2mh0[P8<0Y!B9aMqNm!/T]Lۙmwwv?i4}&VQJmXH`*n#s{vp4QZT,nҩ+J[nԠ3ӎpgyG+ !7D8&TGԼ+ja Dc!Dlp]Z0f 8GU:HQ{Ǡ;rv !R$k3K.1/;MQKD* -o1E`דӻrZ.v}RNNq i1/n趼ZrRDPEN#ueW+M!!aۈ {RŒ8\qPѤ}ЪOtbgZ:6M$j|*D\#+4۝sRvxnʎ PuK-l85W~b9  ]axhaoO.&U?d7A`¯E!Zc0 9d.π+*wRNuRuFq՚b9ݜx&ɿmlmShgnQdC4/QQe>>]' X8=S@k@%\+L9" >="!_Èwnل+|O[kr7;q7h/][/ӏ/hO|đ} 9O>6N|s]Ф$RdA_> 5"yJG8ZCX- TV6/|:HY#"656%p5&yDg hPirY٣׼[ 㼜u1jTdyWOF6{9ثg?__DW=` ?$ZQעQE_C˻BH$w[# #ykQndáS> stream 2016-02-06T10:05:57-06:00 2016-02-06T10:05:57-06:00 David M. Jones CMTT12 endstream endobj 102 0 obj << /Type /ObjStm /Length 3001 /Filter /FlateDecode /N 99 /First 923 >> stream x[s6~>M t:v&v\Mtwt]!ԃzPZ,~."A""I𯈱5o„+0p)ap[a# $Tdpn@8 "\Z >%H$2!`@HxDD AHU@("BB0Dhaqa5P4Ft^}qYfG?_ +.3;H-N\< ASJ𬯫\wX;`(K1Pɏ?zF LI:/K$'($t<^>ե6: &yYUUvyL"VT JP\G]'W=>JO ְ'DҭL9b|gr/4F +π.^A0fQ):A43KWY;0B,`qRj^oV0Ń}`Ze۲iJQQ|QyUN]Ձ484G&Mn27:廓˛3ɭ mnh?shޕ^p 답Ok (/*8vԒ ) WLцnSyd nFJ-E"*d[GFC|xvr0@SǖPL$y:;M6AG 북ZNc{GC`!4vJ^9.<0,9<GEI{@{}^/bKĪnX&%?B /^T7-E<JoXm\B9jڻ[abjҶe^k[Tm ۶+ tP%Xe2Vpy4~A_>B+n-9^kCmsa"ߺ'Uovwx(~m+ж" eFtcl v S:nvg$hFCWOns$qdJ^~őmwX,ߞn<u l цXi6'bC [Qb7YKA`'.OW%UHW%e*9.KwU>C`Eanی`Jg9 'տy}}s H\)+MxGJT\/@o>}ʔN@2$ٖW]ĮZيS~:m>|4YV%2 0!⥏ͪӅTC:0+VpumT-M:V 5G׆aJCj-T7CվA V퓂E= ŞSJRVZ#\pM*wqM!{8"=M}O}cGS9|]:/ِd/mVuh^%:;3GKT~y:H}.'1DotY&v9SO][ 0*8(8 c#l_`˛z>jZ}tӱ6$%>IcmR[}.grКTɭ`g'|yۊ)? 0r 씶;]0}FM0]_y~=TW5yje*~NĈ^]4cw}DrԅѼrki1xWއ׸;M?N=(RG 1) :OE e&EC6rufaa3H|JY=!FpXTnEE$_ևa6Cn4 ?F!Og,+ ~ ⳜEH냒#q!ca;l@o4<NUt} 9dھendstream endobj 202 0 obj << /Type /ObjStm /Length 1489 /Filter /FlateDecode /N 98 /First 872 >> stream xYMo8ﯘ_Pc94m==Xąoh+!Kmmd#͛2ʒ"ָ:>Y NG ABh(} ik` -#x ^ K2dh_r+ l `"@V944 HS-MֲaZS41}'@xxdCy y etX(ٲX(eb'aGOs Bꝉ4@#gȱLW0|tM0TL+t5.@"opp &g3l= pL{ar0IdPO =M0X J1`6pn/F¯ HΈAќ"rLhFBea+ I,"ky(:+#E//,bER $M10,'Fn ^o2pL&&,-'Xk]nV')+{_>,>bN7o$ G͓j!+%F󎹻_hh-.?AC6?bf-ߟ`+cWWyJ҈wcp4 UUX!Q-Fؘ#`x!h׶(oێCoO$!|h C!eo+4no6^\79#׿߭&'Ǎ)IN<}׬`y^gZboߚNpHi^E(Gd)R,RbiL@ Hۮ4S@ P@dd5*.} dL4EE5.'=D}eg6P8I|L?"fpY$]Y>UJ-Iiv)3z=]n1 ?~2E2gMQ;2Bʛbޚ#\'#i(+bANlM!0HsH4W)Z 䙱|R|b|b''9کr>d 7CJ{$GڜyH & |1~x]xE~)VvGt0&,V'ވ:kֲu 3+]b,,`cV#J+dX.L%ΒdX$3ng=Icw񪷂Guk'UvVB=u? iFU>M]F ZJaqNiڇ'V'ՍBQj=Ӂ;bHm:RWp=u_.]i_X*C쭘igkux00xEc*cţV[Vh~i?Lq:^WZsudJ1U9m˷_ S)Wܾezψ?endstream endobj 301 0 obj << /Filter /FlateDecode /Length 5015 >> stream x\r$q}GqƱӪEeK 9$=K3 z筻zAfFuVVɓ{ÅW~m{`.>/_W..o?†0X/_6[3LH ֒]?"LL4Đ5vLeWFx]ڎF6`M|}֥)d}G?֘Tj7]i6U?j~syca¼E[5f7G`ϛ05n~Gl3u`}` fh7Om/d,,`k/U]mM. 8 l4%i;Lj nn3:wf܆ܷ)Cݢm)g Ƹ7 m69[aa> OٗHdWl4NpY%5>HL3z|rCuMfˤMbKwoٸ- flp@@S/!K&GPa˳~# ڮ;LO(_bJTmձ K & 2d0HQNVh3%j@J)XX+>v#`ŴɜMa5#ߐy8Oʩ)&U\{L %G,~^rPZ^#Mj#>rjŶ tQX3+HX4xbJo1$7ϼ>&6}tVQP8 pWŃU3)uH@(@ĻRr rXu[Vۓ\Maõ/EPjEsPLIC= 99EfA^'5A CvV9h;hS=bԱO1pHMһy~݆\ڕ3eHjO[y因5r5ǶZ=W%!E _ЃnPv|v䵩Dى^LDHvM#4PxWE:Caց$gP6)&TN}ϣt̏|j:Ro  a| i+Сn})2f1Q:?!bop.L^~ r^M 72Y2.#p~eox FQ`|ڌLO:e'~t~hP=`!M6pH\d ). tq15f[X94WMV(#Ȭ]%:*,.g&yDѷX^FP6a3x }O<2}BHh}v8on8ܧVNguX.N1ҋӉGza,lB+&+&DWw<8e$I~ki` zeIM\^j `&HZZѬa [9(kI}ia7X;pnt|Z^2v;T4A\5EIJ"]M,9)<BB - GcJ<>Xbs>M?`'#_QH)]M-X҆VL\Ż1& 3XªJdǹ"GZ`a7}gUnI[~FYHvCuN<='FWPJ[ԁݖz{F5,zBB;m#V0#洜Xr:[I6rԴTpt4Mv(yj[NOw<η*]H[e}oD5e(~4^qZьU Jtč{Ғ"f:wd{s65AyČc3@\nM}Fw28d/UB}:hwbn"˥6rg⹳&]卾\he{О؅|':oL6]*?/򰸼%PK߮W>BA9V (I=CfDV2?i8y[PSS&8Y/lew}{<l}ϯj\Rg w:^)a٪>omC:._ ̲pؗ v, FxU'"!G_VfA˵S=p%圏VMF@ /忶5pw׃ \l3!hEԎWTԽ |Q#/2`q(](_Lj}!A q͟'uՏ  Ljir] 73-~;!tKo>\^ vpE˱G'L'돓oҜEyCih)~+dt%8qgߏ/D݆S-ZW3Q'P*ӊlvʜ4:Uc:ã t[" &*{(~ӏP+ *}>$NN |J5s7؋doAERpEvdﻨD<ƹ=`ik5H 9h1wh]da)2g;: ;xV̿hY}˥Yi=> y*>DycgulT6C:N:4|O)cQfo"XNsӖNt=ڂIR+3Qg,85"lG⊗ @:aӏ j~w fA-M( #v6=a~. (VBQ&pTݎ^zxCX ~ZUL1{j-]:FZ5Fް5lkVW,TsrTޜqmp,:?_|PG {Y_=NW~5!]}}jXȎӛj{X[ȉtB]-ذi!*ZӂbX|]};x*h'_~,͡endstream endobj 302 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1458 >> stream xmTmPW%Y5NiTiQAQ $|B o%@R88V:UEXuZkog`ř{w͹s1_ qqD\25}wE X<H|M&6M@&ŏD8na4YYm,$ 7C:{֬0z5MR1JFWE4ΘUihfӂ3-KRldS> !hLf%FYRWKF)Ӭf1d5k0l0+իS4` 09 c,[EaX2p5*N/X?2%,U ˨p n >@QG+le\PDG`0B-sEjzP'ne.~L`; tUHlk/q@fTHa^|if[ ov=&xr]X[Rfxd Q I_¸Ư*9uֱIJHq0txMGQ(tzͩ:0[Pq`r"m:I YmlO |QuUv]r*\%G4%5]P .`X]=qy ,%Y5tC[ N0tKIE.}3d5A?|y'˼|K⚈_p|B:SeAoGbV[cmSYlAaVdSC]ۅ@H<p*w<}C$w SCx3{bSs%͜.Ln=tjj`-}nDnަa"b}slp#i5#9]hT}a@O OPi(nJ.ؖSх0|3iv?1,μC0Ê G ow##Cygi{oKn"|gȵe1L`u%n΍Tn߃7\76a3hv5L»&>9}M"AGCpԩЭ+2*(hO]f.+9 fX!c_zG476 (W&_.{wqDj8XbaYhEd5s_ coE q| p@~"tMLNC*˦[m>bZXCJ173k5JFqG2 !gendstream endobj 303 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2470 >> stream xVkTSW@թ7mmG[;c * B[B%BHB"(QVڇSlgj״'\:5?fJ# o/$IaDt̢Oz'=(;,4m˸(3(O Vh3W> c! Z|XltquAbց*kY-W8J\{2wH/ b__A Cd"` @yJC';uCA[+-e& 6,׵;[ҵh\F'lZ8u-[iceó)Pc6lM}S[)߫O ;6.aޥw~ibfCPkG=s䡏< I_e>ú& %Fb7'Sq^Ҭx%dW s" LvP?a-*gCYoB<d?V~zd7ל)3uP'b4 PVwz:ϸFSWؓڍT|[ryDOE=٫THBcNts:(q,@[Xخ C$D~u>nj}ip ۜȁwQȧ|Paor$KKbWo߭illzSWa0Tr-g}DbHׯ,(}-]$#'OXSbxUnTCA6Y9ƑS{#'IېoB6P_e~Tץ3OIgM_ճщ;R Pemgzx§ZNVBéL&hpsM6'}ʹ;d4AyԦ P+2(}EE3hZ0t+, 2!wPSјHנUZ{bfI[\:oo2;r]b'{Ρt}hd.k-k{)'skWw݈Um*/7 u",FeQ ZpSXK: ?$TH)€~&0}ךp MY)Qq.1 U iF짛F܇i\cTđۄVry1<`!_yR}͍x M>5 0mlbj 8ƈ.V]e#'s1 O-c\Z*WU5.S^u\ oC;hhf߄U|63SE T{u'30C7Wn`)hZc`e}<5ykדuCP\/(rs'8)`DLGK?~Q6iYhl}#,b7BOy 9(3iWyJ3bkg ǵc$Zlm7u>S&oۨuպꚋ#AL|@pͻ؀|'6!Nܾ#~V?fiJMLendstream endobj 304 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 329 >> stream xcd`ab`dddw 641U~H3a!O/nn߷}=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUMB9)槤1000103012{='8÷}%`wyV]پz>3l[Bz߳f/;a* r\,<'\azWendstream endobj 305 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3720 >> stream xW PgqdIL'&1M"oz(EKT93/#\ ( x &^]q$$ͱok}O ( ׺in^_Tc/)qG%8=0)x)Ld &6=2*)&48D<>yܹ':M:yq:&4_ QGkpjm!ZmԼ)S&GN ^:9!TNW:/h#77y=2"*Nq ThyY$=fy6.WR@:(8d]zf-8a0c7qz5Ƈ2Ɲ,e1fx23,ƋfbfF11.f$3" e?+Cf SR~2塙CCl'f0f ' ?8q #?:r7mONr'HpY)CEӱ &zNFgAEƤ9h2KOA֛@#Hp ݎc%vU*ћJυ b9 X@?Ryo!Ǎl^.$hdG_֒Kٌ;9,'Wy4MG|Z]Lߕ8w ( y/v]v*zW)0yG'3߽*|@ˆ~Ucw0j8ؼVCWȭ@71^")ܗc}}͐2tY–~=y6, 3 DQ4K WDEˈO֜:ֵG?j^0>VԱ$DJӈ?%tJϫj.Ê+~:P 8Ʈ%,Q^מ58];u|G^JvEsOSn"7FJ}$ 7EAb=2 DY'\g_fY'=^}R.'C C< WHh2[+3:ư =xI䔅X)2(Sa5/~+&[ngU.R?VS玎]멱VW bN&d~lX*uyۚg;WW'n=.6#E +.uI-Nh\Pf)V Es/l'Oߴ+j+ :?DGM(}&_`*m;*uS*Y 7/&7e.(M`k2#OJ~ [Av^VABX}nnCq uaV\:~Y;Ha/?TTi*r1U{jjjۃ"a|Lno6/̆&tEoW';/FC-bG ȧ /.'[i\JIjU9nNi {oQRNCq ZJԽI1E _Ñ82],l 32!ɢ+I K*G:~:|_cC Ej*9M]Qb&B\A%]:֋b;3\mk'?3!3%3ThX,m@/)yxTs";d@N"U6]T; ]_.b1rl5DPS]!ʽ=}\~Vi:5ݰt'2N 2sZ"J|*Iec*脵IG=ȏfs] TEW;Nқ/sp`ϜQJi 39%3M~p8Nf,h)%o *9Vʲ4*^Z=@l lMԚq6"넶s6,UzdT5~cQ/o "[{Qe[Ϩ/+ ,o{ 1g.}UI$@6tNE>7c W!Xj1@[d-Pq@%LUyE& ,@( n/b4~nPc2O'Νfl' 3lkUR悆֏;ѿj'8 ś8;AvbHh/uu AWۢg98ETE p1_j}&9fO` _P9%UqYÝ[۷ZX Z Kږv,{ B)\GoGu~7xQR7 ׫ޭ~#@qNkYV4D2dub;S:JዼC}<_ Blqi z ֧N5CO@NWiZ(ư;Jy5T ݞu)R5ԜT_KԹ> stream x={LSw{]*cCǞ$[>2&RKֶPcPzJ ב2P!!S 1lb[۹s:,'99'9{TxEӴX_o'l„E\RH6~xs#)M,Fݬ+) Kii{v/ʵfFm3Rmj|QZ|BFjJOIlrK\ݼMg-峵R[21u_rSUk3Z(fbUPT CRQ)%ubCkQT5u.%-dkؠpG &w Ԃ=0'EU\2_|3c;A:0^QQxUHb##?`&']Őǂ^2AΊeBmH4-"4A>:PÞ] &WpndoCD>x|fa~]uF&|\VH!d/%[}MC+)n= $*U8?}lV#ݿ^3(v0vp[σ⫀/Oe2 . ,S N`= Pµ D nEP11H1G%v'}b5?~so279Pb7E?'?/˸@H9Hr6y9prpx?euu[4Q(cH:("Tt̀ ş@G=!~Hnc M*{VC71#rrO~cfeA⳸}}]]-G |,FcM6he })A2Ea4ĭ"/mol,`I `#q[FwVs4@{j2<8CC1=Dd&c`H 𲲳]BVuvɉv&% {|RxT+ҧ> stream xX XSg>1sDj<f: ׅv:Jm-U\ Pd@ |IX [MdQ""n:3:Nݦ.vui?yv ~~wDQH$r_GHxnq81_q71n7cDqeB*&*Z==l~~}͝$.B&T(+b"i_V^yᅔ9qIsE3|SbށI=˔j7C"gW%$#Tkxa|ĿOHT%WI Mݕ~XE܋^>co9 3YLa1S@f=ld613L:g2o0ۘ2&Yά`^bV2eV1/35̛F<ˌa\Wq"Ɲ`fSьY%=78Z|etz%l֟3c W/W+<8?XL37>T")͔I*jXA>\vfjEÁba*^[۟ O>ڭ^dastAOMt;ԀTd*G%ɬl^q!Q`'>9k@cn|]񦋻p삋}mW'IM,Vl]+#lVЈq8S#n`ChQv#*عl3H׾f4d*'c8&w] 8#{ȷJenkk-_6[N^^߫y}:=%LHz6RY$S+$oݹۿqv}I-#3\SBYi|TqҔGăH}D2t@!#)$6)t ٺ[OX;ackc "-eppJ(pvA$cg}#2 !27+78,2!/ %mT~GVC؆+O}xw rSQ[\1=<.'_FK6&czgz_(Ud4(؛ %?E.x>?2ǟ:x 2|%27ddAP~-5dmhAG,/{Ta`8=3,`(0rv6NzP¨49WD6 4SH'~K<<?.s a7D>ٱP)@̞>D3gWHE[1vdEY4aV?V+^MGw w {C:ZwEYl+X|Hfjesia)Pj[JFZM轾.zytDg;o)?j`KT?KŹ=;6/ ]KolmQd7578|7+md6kG'o0넋2LJpLe3'~wПqv1#NU eb|< c0#zU_KahWڽ<%^P^V~б"Bhp5GV Lc39qӊdՖ=@B -mTuZ`olIA0=c/Mq 8HnF NadQqv+<@aI;M oJ Kݥ!ѐԵPl;N(OQOOG'$iKCKqVۓ;ͬmڪ>ԔJϯ"0qPGIUb4 >ї''j]ू iy?sUjUZFBHO?sA+eL^v6V̧k4>$]خi[lx.6_"gy4,yk >=_^>1U~'q:ν^"ۡYpz],L2GplHI4dKAuPGKH.F/T H`RMęAdl]Ign!nH2F'qݿ;rL4e%'7%<Ԍ̜ z'տTǠ/_w\?qLu_*eO'мkOCXy0P妬w:BغyO0'e+<J5=O&ơa)o3T5^:xN7rO*H]Y uѕw9E0ba.}f̌eT{9Lr \;I<ܹ[z֪=  ڨylڢ6*Uhj/AJYU܌҆> vT1@S\h)o8 c sF"O M u+%նTtړ(~qû {mۚ--lk]kw W>j:ȷR?&HO;=ጘ?//HE:s~ 5Њ?W&3q%¼hl۬@ƂHwǝש@<hA,oY8j3סǜ7[Ӛt%yw6(@$md^WPZNg--}EeǿjxbާWnb3;{{d?nȈ(TVt <-+)u ]PaZ⎣qи%w4}Q60'MkSdtoIQSb/+]XnclnnW1aendstream endobj 308 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1331 >> stream xS{LSw;Edݖmf4P65*aqR -Hoio-°:&Ȩ+Čl38%L27] &Kn~'9|;$!!H"cl +$Y>[8WlE_𓁟YT4T*J24푼1Ϥ @MrQx`ehHH2"[kkeZiՂTTn5z \㲅 VuyoXr֬5Ҧ)A*G-y#lEК1|d M:UgDOl$6 $z"%HsrB ΑA>OOuQ"/#6A}{e u3Ow'Բc*6awxSuNh0KF'{z,6g) Rskބ.JAW=/jh'?w~ Cɇkp1+1T*N& ~.+C:lb&hI\gd44X7SE /cH<@ߺwC׫|Ɏh% ӫV;tQM KQRg~jKRyI*9Aw# чAa;T#`e/U!3kX]lf~odX˲ٲDEt[QE_e$W < gl @;[]p8`@]kFԎ=OO1~ÿ3/ӧtd4G׽h21LRT;ǖ^?ʡsUW+mp}?pD,hIvM<>)>Gtosdg l&.,96’!iʙt8nn?Zvm'=~Y20%P%5Z*9Xfs]@?޸nw58TR'*$5s|ڬ3g/؝9nSF+MGӞ]f ``#-JIHHIU(fT&ent{go nN"Q Zx^xEp:[Z,ï1Yn?@y^D'> stream xcd`ab`ddds T~H3a!Sk7s7넾G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRYt^}י1y#no~\~r]O9V=׋翛}}5۟'Wgq>7<_s.wt3\Xpso/)nxendstream endobj 310 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5041 >> stream xXXTg־0s/rKT(V VT,3iқ^C)` b &jI]FײFfgÜ}1&H9,xNp"sdd# \>-ز͎$3%ٱ-]ͱB5ތd&7g F?3q8DFd-O96˛7yhS_N^fk@2\CK%"n啋$dE\pjG-Ь$)mo|ͫ;eIeHB!5XNX6TEZ(.(=yY\V'a.64NrYK#u^!xr6Cz;kZHAoX+`YƱ a1>JX  |s?ww^Y~|P:pWL)eր Dо"Fac d,WJ5'NLv&u;]o=w]֮tbW| W*(wHh4/54lfX2|8g'\{UyndiHqQ:\0a-}9 v PO%&GoL;m>z=^(Y'(XE93j5Pú;* hĔI4B@OEt &WU1hs8ʚ+t ύ+cӷG6R>b伱tt[z:̘ HuJ$ h78o_H국UyΙe"lO4 >JM,Afci8gw5Z#OM Pdq߉;HR? 8l}ypBxa\D%N TErE !M@J:L\BZ#f0kHP_& 9lUݯ2K2󱶫e1j 8DPQBKbC!BiBП.V,&,4e8Ecy+{$%ulB݁*,dBi n(B֓!H 7G-`CJwӌ?X1Or'ߒQ#^fs 62pW7udU@3FwC%58&< 1ȂZՍ'ʖ qd~nSpʱ%E{!)J$X"ԙF{5&洣xһ5b{c8JL<~,r92S[yv4֖wNg0̐9SA71搨̺#a?pߴ5k+3Jt\B (,UF+.2J4O /siGGxR5PTE%9:r\=sښs*MGȎm웓VYz8\o9sęMZg-=5^E7ÎV3ߺ~>;b<Ðz4C /t"iggYׂ)COaiǖz p9\ڼN{єK’p*F#O@u%17toR:axxb F8/qfPn)^qb ͻ\|뼚ed YA7*=¥>9SbkbD_>kĘ-'~\62\'KMiCG@Ubknɔ,IDFO;Lz,@]/6sЏl"2~H{B{]hZZn,??w_U'"^#"xpZ7JFgOxJP(ʹcLQHoiSz-%zQR!mQmC3o)I&ɰAwG!k:ޞq'v 6ٹ(ė'PEXE K6E9|ii~`TBK F&tE!g!jfrƳtNHfTT%|ݰH-G.=^h[k!l0+@ՄiRI.2 nJKq&i,,Vi2#԰7VF:?(>yT|K`%q7LӅbPb5J8WJO>= b5jHm9[JM.#夕M\Y6-/GVPzf}dc] {57Tm?N|b}29[!4; :s:wΛCQI2u6owuvunjo6jyF.\ %Bl K#hBL tזd.1!X"22s; ~s=N_:s t$LX:U57@X'>&]A+|<T/2@6&׸xɍ\N1<`/1iIj]+zmh[,@Jg3+37=kn i ?> stream xzt׶ä́+l #SB%Jtw[.%mIȲll1 BHHs|&kiYef3#zD"d& A=nXRٞ`}ЧAЩבD$IHѦ. j?m3_i_&3 TmƗ.ՃZ5} 6[EHNqR a?&pHb2 6,7\bͷjmPKR=aq)Du]%TkROWN]8q=co7C0h2ȁ{`)mX qg*FzgVX#3,YiEp-vk<ڙiw:`;}FQV')ϵ,ڨ'gBi3Z :#(I* @+1a~;IIW ԫ,ߡbҧf!MƉ} NSM*ItӫD13[H/ 3O"Z} уxŀ*BЗP<]Kr| I5xwtMf45l^\BmO|" 8tIowxwfUWТ=YtZTk?}X$I09, [Us) `|7@YL)hXEL*?>!_e0J:6HXned rI $EA)ǻH*Xe*` u{jWٹ{}[Nwc=$hH$kFDḧ́Ƙ&1t I!) CIi~̄%I(II}VAB,cL$8wk~`,^u4}Ţ4 8o"}@۬FhF '924k:8&,hc)Ʒz''$D'a607Ps؎d 7.B^ iew<=~nJ C!H<0Ԛ?DK w5܉oӽNΩ4BR ґՖp:KєG q5.8,;3=#m&da DjT) )**W&ճX]P)IU)?!1 l߱˻KoγyF` @R>%r٠#]tS6XoC-Dq֞$< OƓ#x Z/F_[>&\U 0O0 5heD3~T # WqW\No\ NcrΌ-8h} z]u,V'-oKT]DZߤ 5×PgOٯ*&BW%xDa9VfČcx+KLOinW]dMυh,' ?1]6Ʌ97 !9$.wY}SJ1 |Zs=GeYs`1b~*f(8P&B`.S6hrB!))wp-jy:PLqPB i,><_4 #]rAjVj6AExEQO4}F:lR.3^\kފC|W+kx92m&>_K̇j#Sx==zy XpyuBXrIVA+A;gَD5)Tf:;(TgǦ)s2§d۱ȐK}DgR`֫㐫A6۴}]zZGܐ>}gnT c+ѦGh8@n.~[v*؁^TN9!GX^ nfbe~ȊbCEnrXANOyC'>P{Wfpff= >ϑ\%L.͵GMmhf:bo YܣU\Si^! Ŀ願+n⯄r`bu ~/j/DrJwEb`\wy9b~ mm!Rp;cF1.^N5X)TŠ(: {5ĚFwlccv+cd2S3PTc?xt9gͯ%QIpzŘq5ϢwNdxq*2AaU;7S N3~H5Ovv<*՜qHMSi2#xe_ŗ#e(6"cW^GE0P{p_J_=b^r@4}mW$ݬjfU g_L!c& ds~M#H\KNP+՜I[moh߇pI"=#cp/TJlx<-F49q+5;\4h"'Ȭآw3"b_" K`&0PYw7 0=&g3ėHb;Ǡ0=@( ]b\ ꃨϾ5~[_nOZ s| AS`6G D"\`22e6Ua__ֵ:/ETxVV)02s˪#B5>ĸ7$ƝT(+28*Kdӊk) c" K2ʊjÜ.K^ŋs6zb#v7#m7&g'1 n@֨O-7bZTqj;!I듺 &%vG7>C=aE[G:7,uzY1q6Dz0yn*70V Y{]EK^(25u`38d){>) `Òx 6"ѴMA^)sNU:* !I#S.m8mąmJ[kQ6_bcBf)T=+'rTםe)idRlMpi<0(d2֐*7O9Ut}vaIU#o7ͫ O'?f tNeNxvX$&.^Wzp2ӧ qb@YNJKHF2ioRgiP6Q(fօĭ;d'{u Z]NZyv{C& ϖݙn )9C:||%+nZ^~Q(B^g ƞvJ"9򂸂TC>T2ͧNyCW) /./&ԓd}f) 7($n>@p˾R>VP@1e4L삘!G8JA &!Ocũ9%@NP;OltK$zqQQjvU^h4#sG79@]xdJ8]c])՚yh_ޮѯuBgi Sa탉#l.nwϴ][e۪) "v)QT+=؁)-ji0Yvsж~*xB6#lx?uyf] ;'Zok.݀ WYwXkNqp.f,A2v1dd̃K+ǮsyU  BdAʭZ1| kr 7L}U~'rHB2J2 e_p09?xh"ΞgvH2V'Lv8܃މjШOO6Y3goa oӒ*8d$eDT, BaeL6M?ُ=/:~fTLvgʩ1筙^m6;B4g>v1'ũ9Rk5!$H$i v(PiX2 Zeuf#g !>1/C"d4Yychig3B|d {>GVҔD8w# Q *akEHLf$Hſfe 4m6ǟn7Ļ SwFy{qh3mP&Րy骴$TɲmaK vd8&$L<$F1:3tT.mhӎ̈BO;le/* q q ADzBҕkL呦1I;]zʤ T0tj¦^KE{ِ#;# Z-0:IIZr,.P$]C80K!em `A_ځlm&f&.#N½Y:8-H&} Y;9N:;,KsKv_+גּ nA1s7Ga+-\m^~kvS`q)u)ӷ| 6J"֠K)a%+i¬y7 MEݓX:= G>y2,sLA;HCáDž[g쎽)Ӧ+W/l^}o~p.2&8b:&G.'!D,uFҟշm+x4qQ+.,z}nUxk;Ss?[ҿrF]a}h;tǺȍ}"sH}= 䤿|0(#8"\Py|^qCr}RWfƮS8@/D^ޚ_V {⍥}H{/ 㣥;,q9sWOJ BLNӁVehstBv0"l#EΡ&4KxowdӳtzHgrIIJn뒥 Xe^Ek糾z{ZezOkbNOjl;6cRB,$NKLx6lYfWzeLm^YƯ_,aqM|Z+Bhއ́\88"ZPpWa%f~EMmϣ&tJܾeUsVvgybiC ܥ5G}H2tTgm; CfM vf~Von\~UR03BdEJoH2^"~X5S - pu|' (Ml~7ѲK;+aשP)L{2٤.K !ܨdZn!t^zszN7y͘է%CߠwHendstream endobj 312 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7158 >> stream xX\TGkW6W{c=%E+,R^wA7X5q}1јMb&&g͐]`ɋ{ms2G 2{GNԽ)Ѝ{Kt^ٙAB4Ȭqw p76A@H²0zηg̟TӧϷsxtwzJz}N/wiERiޓd\H<=Z%vpv^/^nm<4e~!Rw}.w?EQ6, ܲ|Ϙ9k7vNXœ?|{ɔL4(j, 5GS먅ʁH&QdjB9QTj3zB-Q[{Jj:5IR(;j6CRj5KFRT?ʊR(3MʜM[G1Oj D SCj| ]!x~5QB\̕xQDds 鿬 >tA9~9ސC9iجa aWycoޛ_*}r _tFDkU9xImQ' qpwZ( >G1_٥{GFo90[Xu)~yCSENfs n$"fb1wDK>[DWDB~ u2]w;_=ؖ3B7D.pn#!3\M4W]#En(y,tpHpԍtGo$yq]MIؗ:]-|4R|$O0SjSYQRW}dަUayK~tqLىݻx/0(k>!5gn.wN39ډJ[jFatIG S۴ǯ9UxZъHH\.HNbP:㽗IkQG=}{.,9?1SDHҘ[j)Z=Υ֓ę)^YO&cHvc1PK`j=#5#t46۲m#b|Lw^U)J#o8shRW$ٸؕyx&ūV0ƪ >Ɍ6 >3I0$:y&y^͟mz}2VsJ{X)b5FFtc&VFeMLU6Doʋԡ }MT9#~G|y- rbi=S}ww3>gGMYT#}z ],[i'^HQ߫?gl Jt1Bvj`F 6rތ]\u"pՔ|OKs2FI;Vj"yը;3鑇![VU^ɨL?# ^QkvG'ؓ5S_i֮65K4 N3d:% 3kt4Zv'%Z)8uB4Hy}va,~R JGI=R#H 2I`xX뾝ώe~׫nk!((1"6U%Fɷ fOՃTDqʳ\Qjuiq/0,s0N AGՙq$GcO΂Ԭj R f^5j"ncDۯanji{fBV|AB*DE99EY_CV9FD QIUMVܪÆZUWQizb^M«D:n )SPQxҕY3LWz{i)q}^I[JvwS~'8mCG1[.Z ?QxyOt5;l#;Ahy̆A3Q/`8ڧC֐P#BpIOS:Msb[T*oݓ'6a}gִSNttƍ;VCbg+`s~Ţ\/+^ZwkPrvs;{ȶ..N O6=1olk<ĔV4Tl٢G{oG̻˗Q],Ř <$6#yހ7^vzSZ91+xJtQL<%G65U5%6b:qYcB̳ť $=w@QyMR/ Kڐ;GZպj+DtRnяݺyt~ >-txWM_B#؇GDn#j E!!rR}Z&ZaSw箢*.AVgl%9h׍b>b>?eXZ\jVRPR__YYpPr~Vcٌӎd\뒏(˔2>[ʬ\&iD[v^8]Ȼ ?_PZތNZi=uť'V4f()/skPL%\h'l &P(:a/ufIzF=3ݗ@FJRfꥥҐpFa~t?Zk@`٣-_4.S6tFH(_^0D}i}Ҹv)4[_!}9#zW 1Mk쩧dhk['vgF&~ݬ_h<{Ϟ=z C6}XRw>}ƈw`[$M`Se( 1>h?EPG"qkᓇ8{&Sz[Ԯ.r_@7b}"8Dx5~{FS uę=vQ]7kD&^[YqURG0% 6-ɞ;,O8盧RU~=ULjjYW}2F,<SfKjQ6y_2MZx 0f ~k^̞( $z;a;;Ɠd;<>jHxu)8N1eh* `$eI凳L2d <ƳwA+QvCyg~{նЗ x͟>T]UZ_T8b|}֊-lסvE{N$tT'Gl/@dI߳E0ߢ}$&3|%0&LV[SQq~ (<;s8̖ gu~X焜|fЮV&5K @KA٩_9>cp,E#8Hc0_lW{@1 \ZeB K5+PK7 ^(DλvׁrcyPCsnqqn2{iΜ JsSՒ6l?JI;v^u]u^u6:t iNu_B1tK폷m;Ž[]__oEsx8E'uI誵KFMy2 o޵l&vmVs/^v<}}8)7uSM鮱'rǤbKUdzh=AeR=v3oS'D'xec&CCZE갊 ,ϧl9ʖ$HBT,8 v&@<=Ζ?삍ytz.Dt2%8npgv[!hmf쉢y[ &2=p@|Q2:ڧhOٌ 0<|A:EHɄ7q%0<#HjXa;lap!ә-~>_ݍAMje<#L[\k/wV])K '43ڄ69o[ìG*#de*>T瑼}ޥppO#)`HoPj Ocuv&VlOFQ cuꂖoy\A"I.V}lPp`/a搷q?:N:Ԟ{R [m_{YZOvQ)DVt>kr (l58ƶCJ;k4N~eyi:"Ke rRp_+cSP$:,?c쾼y66-kOn|;V^WPP"R7jۺ}ݒ?z]c \kS\*mBZ]]ʙ*yAD\2Nxg\bT<[[ť+I*)/*'Oy|lCp@(3`/nS&K0 /T&HM F.C}M<]ѳD-naALJ2P\E DFq*۴ SW(Yɢ"&ZdVn)mU޻mP~ZkxͫqS|j0k?F*oV>lt(S_ӓ}5|Idсjƚ Ix>XQ/X> stream xECMSS10$J  *f]WouCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSS10.CMSS10Computer ModernrR1-S3+v鋠21j2TZl]EV7ҋ#J2PG$PDDKP Źp:wPN8[QQUUQuPWb  7 Ȏ ٖ endstream endobj 314 0 obj << /Filter /FlateDecode /Length 6457 >> stream x\I7rw̏=\X KLءqhFCljؤ(̏w.( z:’rOyR3_ϯ<ϡvqΕ W-~f9(htb"h6 f+#G{`+U0JO6 ,0/4<; U;.֩]Ё*(n_Pgc}ph4V8jp  JEn-8ׯB08( rS; d t<|0?y b$5 s y~8 u>dKw% 6?v^}>0kqW(ι,MI 820phycl_;$1&FDjgӇt"3NWZ࢕@da @(`.Y^) l&EF.JZܽ xY×4a5 H%C u}(Xd t +gԌz IY y|TR FD .~WA齾AӫmDEDJ*)򋵒o OįF}fP!oY"I;^+6+S'AX:T&@T\xS|ۗxŞpQ{;(`ÃFI!<=@=NJx1sXߑҿJ}@{Tduv-x$L/a톸yq#!4qH*iB4aZ#"1* 5V(_W@v~6þhdy1 IsSGI7XPJ9Қ0_d37Tp*pLmm6I@Vsi xQϑ\a&NfO\/A°zV*ZV;тC4%FHMvơd6̥W ~袂I2Hk l$FU\0 e T_,yʚ]YgG'nE\|?`_ k6U}+,l}}~3juC7lR!+v^J,BNKZ "em G(K7eZa5M l52$=+Ka?Ϝ`jY4 !q'җ[IU*x r] aW:s cR` ` fԒe{Ͽ^_ku0mA Nw5X(Zod{־F2naYEbZ֮wӷ%|EO q@!YqNa0NjX,\ m_eC:Y4bIjҧeur}$D۲:3_2*oQES,Q5+ ȭ!ViߛfBBjYBKD&|.xŽ跀=1miEE6Wh18ہ =oKU,(QAah({Uĭ>P3%twn2te.rxYq6`5Tez.nNmW{B\ *!$Cе{$q.' `MS%61miF[J(`uh.K6OhaMte[hlȒ奼蹒ėN~08y ֊Y*@83+ f -@H7ӊ lav=/+QӢceoI2@/c0}$G1üż A]~>,ܭ}gKH;y)FeaRF[ɈͯHuИ? r jZ [ۢ8ttVZag ?8 #VֿxpoaGd 鵞w?KD7jcpb5bLٷ6<Տ|BL,Cugr%% ; Q IzUlݮ̋|24rs.yEmۈW.F`9f}KĜ4-a)`JR T))T}X~UL~Nw"0$'AsHBD$:HT3H lWiY5BS8"BC^Գ4 f\CF@R͌OwQ-=<[aH[YgjUH{Z,B+2sػmh[[lĪtxUζ"QvǙ=%QVb}~a)S5SZXP)9/Y8b\0&k oi4 n4 #[a"2D9PٛWۮl~.I.`ٕcI鎺/Gqhgbۘ:. pA|Mskќ0^$W+Y`xƚ*譜ͺsi4|h)4e/C"vP\  ،rfՂ'ohʠ$ɉ"Qcsl&0mA7z3zm,)cE tē9Q"T"@ NOBB NaU~n[*bkEZ2mY\[$WDž7r<~c[x#*k$͖}3\MLcr 4DQ`7r ;2&RF JbUAw.VȒ0wNl2l,xJJ}bMl[gio-VV)?¢4fZwʲdޏtF-xUhVR1h4z?9%'[՛< <~Q_-ȥ[tt+~]ZB+R%⪺|sl0,4l?>cxkKdD>BwSk= ;*Jq@M$DL3b]M(Xf$kvQt=a}87ᏵE H[|҃v;Tl!=FVp&KV3K7\΁q)P*Xk7,N( R&qpո{O:4!B OΝw(S[Kh+Ql3wU 06&l2ד aO0YʌkZ!t\ ݇i+rK]}"f 8[U4D~ 3$y_+<=} $܋:>V䓑u2psuRx@ cjх#=d(7~]NevUt/q^Ѭ~),uHFBBRK#rd"e*WgE}Th*s `1u\8}TP$Rt6@5}}V$9'}بK5A^7EFrEm`g;_q.D<)P3NxXh'c]D[RO.UG88Ez*^^}g#Õ@o5٫D5+d5:͒yoZo4@[[ʖs Y#l[yT[02O*~_늓[T}XfUݩ AQ|wZ5>jUؗEO891,-zU<eY@VCXk ڽ:Нi4'ex؄ĉ_)7}Ũa4u-ٺUe\hC2XL j޲ܠ1+ARXEf?ǁAڭDH~%h{kr,#EIt wRK,JaGZȅA %όO4+jF/<1!,`(_pل}*Qjz?Sy!Rq`k 瞤ۏ,͏X:@&L3 `Ol1[E譄 Gj(_{U>_|u^vBN/uɹ9b%uMV{>-dеWz"\cmK I"z8У[U| WWSl=f"8A$ȕb9>9lF6Cȃ61 ͤu= 88|YYATa'(nՏ!.ܜ՚/. duqT5BKTTQ3[05 T\p5_RnːӬ^2=Ta^u{YՍ2'Do6}+Li'4,Y߫,+., ^JI'I/ [vlXwzMX'o݃)%(zP97O8&T0tqqh6frqySyol[ϙy);#LwH6ڭZ%"RAk??$jendstream endobj 315 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5931 >> stream xY XSWھ1KQ^j[jmjպUAqCCXl$d}  n`KN[:V;gj;'pj;0 c7MwI2`X)U)،Y.]dn , X)<#6:)<0، Ó秤ż6{n .#6`ktztZVtT)Ón۪$~fFtZd ^XF*5ioX>k <;⭜MQn ߖx1s bH32~Q{F}2|kc'4\O;|q~l~kO6!h—;'cnML4}NpsPLFh0Uŧ@WXRu em eF"iq:ІZlM 1hTϟ,miIiz;p8K~ͱ{l181 &eG@Cl`,FZ NH *!hI-yUEJ3 p@\~;HD{nk=h (mů=phf%soG_'A\8 T!W fw%N^ _;eV(4 @#|{f\f,' f3PZgz)u+0h_eaP5ۄ\oȌe4f>Gc_x&Ř*n~'|n;t AamsМl)rPgBR4JSo ,xLd2MGډX(M.f93n@.YtMPD+_ ?|TeioY]y!wprϕ'QZ23PaTzLhVkE2dv sn]DFLK+J{ VPBZZ/x.քp>3:y#-I [ -;Πо<,˳s6Z!WK O=A[P0Cee4sWqcY'έAL_r#T,0޿<}aw[#mMw zN;ey. y6*vOۇӆf׿:(Ke,Y}H훜ULVSCL9'rV PWf2s=/Pub{n7l\ v^AGC: "!@KCh|zyT0KMꗜkN!N!"+@,V/JQg~R2˞C n{ Woª2vy I,Po0]y)I@?eRm,Jd+l~,3`PB,v:5]EѩkRWNųɧ{[jG * J]Eg jfPLڸv;F0&U\@'Rё3Dxw̕f3Rq8gzsJGMJwy8+|% cL3!m CZQ0zu`6YǴ jS4?D\AM׾-c {fqJ-u$;,a fF1s|LrVw O#3w/Ei6핟k:B#+u}';qԮ*5[RGMz꽍Nfs2؏dž}ԖmeTݖ4 gng&f 2#]Eϡ +3"%JpC+t-iX렔tfiiYQ37SU[OH@~w MBA/D)ڏXZi wLD>FB`!U˴Z55K.J͓ڠ^!SŠfZ,yK G#4ӛ(u/7-CkA_Zk3b.ϱ&- m=C  E6f!w 8p<2_G @Wha'4DVP /1$ɉ&f=J3@'7Y24=v.2CY-H wvƽ\G}t&=bޣ^|Ɋ) p Z]SM{ nHFKC šZGYJr\y/rܞu{quiJ#H_e8ϲ43*a_>qh0yy ƹEh> O.f Z . ()tz^R[Sa&8}sAQ b0MvH <M Ru?ksT_Ft{`:K֔*V !dl,&ȕafH/2Gc]TA!kY rB!2dR=+qYӛ vpEZV&( OфZ 7*:'dO\@hX%PZ|8wӿA[q_ fNMK¼䐌@@M;x.|Hx*3bCQ"8{D|Q0-ݫA6/,fI,*%j*78)!$u}Pkp҆Q3wUx5X-?4̱w?F3GPJ?Qt6zֈV{'n8f`mqHʌti"NzY//(ZFFFoAs )?(:EUK*q>,h`=WPgϏ'Z-GZ'V$_#v:v&TuB4'Ϣ.ϱC.X>+>1uzL9{>w2V j^Qe26 e/r6ۊ۶_&#FEgj36dJ}\in3t};֮L*TVqYo0F~>ѿ]E`A y,HLØm.v\N3x5xGME;`74 ߖuw)dRnCI. jkuˡr3m,>gZ/-:ʁ|P#ڄG:Y1^ Մ -{B8 rp `0PzNgsCO7T#.P)|<0[ce0MH^)SC\Uvy!$ՐbPB uC]-ڭA+9vܝJ V=u )/e(@Ƨ hձJ;h/#B+{m(|MMUAgՠb-kMIuuܡR6\hhwGm]/b-bp׏Ryo+\[e(Ք"-wMvx ~ B?=܇vy U7^̌d< 4 9~@)?!bXh']:) IVWKw }ʭV%&$f Z].5tuy_z=x&F^] *RmP+X4wfȴYuyfz@p1^qB{9UJѻCgW@.9X|B!jQƐ+T< ?^xd%yTl_G|y@6 lS^lvr^ ٸ7R4I"r&<^hė3/EJ샆"h5k  Y{}lw pKm`p<Hroýʎenue45j1#1cendstream endobj 316 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1072 >> stream x}Lwz=("]\gLX..EMBY^鋝Xʛ"塆&) P9 Ft2c ddm02&k}> aʬܤν. s$D;PNFฮJ53]C'''+T6jUz*Ke.u*sR1|~l6YXGbQVʥM}:TJGS!P2:L, mcF*HHLcN,ۅEaRLUb[0!`x4~[)JAsV_S#@ۀW*w#rߗ6~NZ֕XE~sM{<7{*kTBA=Ӫ8f)2 XQ3!p42LECjaGn6KWFEݍhǕQY0)y{<=~PcstFTo>nt*虢̽aD{(>")!6`}qlz@O$dL-/55UN! 9LJOOCy![K[遛ꜝ#[ݜ҅mnj[ɶ ܒ-dSa1endstream endobj 317 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 864 >> stream xeLe߷WdӻK f#q(J ͖ 퀆kr0ˠD27!,;,#Y"]jbt- 3&yxi_&I?iw ؚ` ܻ{zOteRdW@+ުj6ԹSژt)s7;^xnHh#$85 S(6c^J1E.F{G%yl6,%KHO?$-\/ҿ  < hh O|f!ь孀P7Ib$HH~:HggzzDHdNG.Oϒt4Hc(M3 qi,;5(Rn`;(lAif'Of{KXX);Bグ0)> stream xY XS׶>1sbQֹ:P3UQPddB<pB-UkZZ{>t{Nm_oik# [2IĿ,ǪOgX0! 6n½Q"+v #blpmΞvioTn0 ^1^1!N}cmD,5+>>~Wh(%vmclFFخ kkLЈ( >Qa+|Cb(Z4lY+VEq]>q$~7:m  u=gkϛ0 -4)inSv>#y,P@MBm&RIdʉBmR(;ʙFP۩ej95rVP3JjZM͡j-:G6P5zRxj eMPcq4JBR/PC({*N-,pj5R ֑ Q)@(He5¶V%S-ΈQ=Fc±!:zh0a ~reՈȊ?ZX=/JGG?&r'aظ|>zlKsljٍ ^ns^n@b[:2SUL%T`gzUϏk uzW*<t{A/A&ll1h&l|[Xy`n\OK/_(XXR J&F Ps]~®?HrD4mÓ,Z'™cyJZ1\>=WvxktAj+@!Va#*eCDxZ C_~XՄ^O MC"DhԾ]20o1p'Ndn\bu*G ,|ԊosÄ44V4=z:q"*⇠vOxvJ9Tкw}/ J2y յsIM7)5wxE}qUx[P0%P\N2n)$ hA Ƶ F~ )f{O)c¿:Ub~ĝF u/*83Pk@v 29M,|M8 _CI_-Lyt#䯃lOLj5rYՙG1mɏzV,&")y&`-&֬$CM47UR_52=$ yѴhi-? F J; yCAi?]$sr3HX!!!Ϧq/Td풹AN69 @4 ?.H'U 5%Bo>*W3D|ayq$v,[5YODRPFG@N9bMCS< TTPMt;rDRsAQnq8[秨2*Ś' nӤ+Ebzd BaׯZg~lkBkuꚦX KtsBqY([ofbyꑃ800E J{$AW1p0rg{.D^@]w77ȁMcU-WK r$KKʌ +v˜ g~Jʼn?a+ٶQ~r CU@x,IK/ ʨLilij5߲!˂̬hc$#PM& D2|둯ڌп5)-J={ lS$jK+j=BtʈX1--owc~I3z}i"<+)x^L3 t;De(AB5g: ϳƋIk%e+r$83H =:1J$4%T/V*,ZKoh#I 7_KU),+ gMLV!/_mm^2H" ^l*T׎AYr9d$63 xjP%.m*DYոVX8 xШvx=Zi,ɳܔn;"%.zG{8@Ot cb63Z5mB?M/S(i*(NT@Cv{ͯxɊZ=?pdw?HmnZ`R"<6,xiZV.ʖ͓%Z^A ԱZd{ 1%a*fHN!WJ`@;G*\bFN1 j!fnAտTFŻ5kte ,Z+B#ЛO_R ,`'A!afxf,hC7he6D{!_[ڟë?ޗ'Z'.+1Urr I,M*$晴3˝tfUojűQ 5!uI.>, Y#+4ΠJnS+S uht5z}I0_ë~9)dD`[l-q:šEr+х|w!{D G׈s;?:i\_HvF eEzB5ʇȆk `\=ш{g`+Lz󹷳4> ,1ZaSBsqb6xb}kTcHhTtH`SPߤH5:߆ȝ*%VIjKA4%ԄG&l?~ dHEا+cӿxRЛhP(UJ! 7HԡB"09֗~4CIZLV-(~1)!EK4*m t,MWHUzeB'bƚ_UD\0ԫ]@EMy\E|E|Y|m$0I 2 gR,{ /HTw3fh$TAe<i =\H|p fK?Rɺy[2c?_ =lYgS_Bil3SXosdDsol'v!T6'p<㼓P!/N֦Um""W l7šL6̳i=iZ9+!)E~O5jx߻G`1Q87QzN: w4f=,\5C,u}%9YYٜ:Y!i/&VVh|L n|+$IȬ_%]9>ڤTXbj|5I+jŅ\:BW'zWNuv1'pgvx韭 2>6 ^p+h|+ FYÚ 7mgNy j:yȬ!2O  tw2.N+M{ZRI0Ⱥ:;@40=q/]mvSٲ&G~fΗߺO>܀Ne2P'^V`~D[.qn]3j][w0 CqHFNşՕT^ҟ)?v;"DOѺ .Dh{5* oMHis}V`Ok4>cC~;XM .9W"0o͍5B]R1KB2FYdH =?euQi!TpQ(":X<0E,.^L{𕐏2> 7hcJ vqA7"_܁-Q$| =b~pg%>Hn"XBf^lT&DZ<$ay9 /*ab0Pn7j vbpNendstream endobj 319 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2952 >> stream xW PSw1ڍ+jK=ֻjzU+BpC 9H$E @BB@ThmRhR{;>wfvvw:ܙ7y]/,lbqVn]'),jqNq@l!|䡩N@qhxbe+9 QZJ7;ioҥK^h)oy@mKRY| !E&(x_LHr-\( $@$fKx,ohC+Y9%op@aXd aH,_U$$fdf-aX ۂb[ l%6ۅ¢l-{{ۀEcSl26; Hq}ydMؼ#9Gmj̜1 _:~썈!Z wyjknm<: x{POs;bN |O(Ϗ UT'ӷ%.7e~щ08ߌ >Y"'tͻ rY"Mx~Vu{ jFe\A3jM0D* C(n+\[iLOɠY ?+7 a2=Bcʠ x%[N%~w1=;4t355fVb0>VXh:jS!N as쑵26(Kk$ s¬7yE2Ё&2+wgUɐ'g2pZ+Ɉ=}gljZ-$6h Pxbuɪ | n"˿FxB"VBc4ɐO'ۈ־Fíכ.FrBP(.>C9/sf^I_V7X]^W4"(4Hpm4k'&"TqN7tĜMm2D.8*™H o G,$J8$@3tx+bbQӨ孥kqP,icY NGOFGT1ɧPi+)@g+&' ) ^Ճxgz&ocNڒ{U%5en/b{a~qiwh93Z"eT2=Q6oggx6+P)]R׉3"ZÉO/Iӷ_._&(MYCFnk-mUPPb2DPz8gTb,HSvW^=PguoL;>;m l]]v}xa)[ϱѝ6^۟#=@/H~2}B=cS(:DSEXZoROf3Cꧾ5:,5ٮ_1dѺ0(0 &`rIfWӈT#`"^=IF ]`FX-`)ox8T&m4P70I+\xЊf d?w|N(yf V'4q_V@L$J L?3@!5tׁfo%QZ}JCiԫJfYt> stream xV{TT?gH>sZ>AVZ)!!]/)!QD0 y03΀p )f,3pB&hM\qDϽk{f[wf8{޿ۇ$$踄%ĩ8-@N|o*R(45mܿ u&@D"I4Z+ge勖.}b{ܜeT) JI!_kJ7hZɨJ I+PfJx!WpуO.OKD<<1XO$/+hY"XIyd/%g nhpSrYM`Yx0vuLƫGtCZ<P-өGsmdىv2|eD_VRNQ6z~*w?ȡT"C>eH sEB at&2 cp$AY=lndsĠ|;3=W7DQ`,.leuijoi*8l z=ny9"<@U%ƈr5gK+1x'T2P/XLzqᤉ+{Z%Bmz?A{.㻎e pe쌩Z[:9VΖӄI(>~K<|da1],E<^|%H_=D/O'Әpg:Ay[- n{zN(q#/LI1 z~_MܐJvѓizpCǼ̱ Bt!7prO/>ewۃN2.C87nZvh1+=g y( tjB|(ܶm/?FeeS=H>8҇.Dž[[ή/u))i$&KcepZ0\q8@^!h/Ɣ醉On&E^E'^]<㟫/y"EPudg)ƃCk6$&`)[C4wkc7Ѯw`4bX_( S@{JTqA¬<.C['{[n["&@y+1jOG (ht5T8Yf-g+.G.7& LS*w O )jlcfƒo;wz.grDRΊȴRΥOy=w{QEa 23%;M#-U5܈;j?u%p3쁼:Y[jVBSZae ]lے%LMh v Ta*ٮfBR׶w5oGı⅋dLpDD)PU B;%RftI|onTѻJ !q\H`64X uCendstream endobj 321 0 obj << /Filter /FlateDecode /Length 2062 >> stream xXKoW rHfol81@,/Ê5.)r9>_uT 8lVjà4ǫWg\O^;P&|HoW?^z˗0mM\_0|? U.Ţwd\I#z8> U J3!AQDi~jsx/8VkFuv|2KQGSvfmVgwIIܽQ'HhKƎgffFG2Tu4lr6P"ϟ! .BDRwP5d7|sv=Snދ7|h %)wB<1)RYhL+¥LD.O(t> g&6ďV{p9[mǿqPe{;.F+ ܑ @v7@W!ZMy|_ttEWD'o7Kd"+^C5oQ[p[ïۭW[ȁl!G}" h)C67H<ۖ<=l3B:39\%w krBά|)gLNLrhT= %XL0K4 38S]ɄD1m=)&1eW 0_5&$^Jr|]a *41hk ȸ6gB^1[-3tv2Xz-=Ǘ#$u>PLIj`d ѓζEޢyG< MI]:,=SUstRIyUrGK.d59c>İLΘ 7dNy(E9s.9]:\@^Lw؋Nx)ň F|󦹕N0CI۷s]rigšgChcIQ<)pG<^KU?H}i{7oϽXze+6ESWӱ__`{_.4MB0E F+*}*60 { ޷ 5Wޕ/7endstream endobj 322 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2415 >> stream x PWpT)4ή'I]hvSB8vGl$$Ht@BB cv|p9gINu@&Mf:>p8ܼAb}/W}EvSjV6$CbA d_y;d?4Z[Zl:c7p2P:-`#Qe|I!K=I6/9ۜ3!q8~yKNSV& O^ԓTf'k!)tNFg P2uTWQ x-?<>P7o =s-%}^#o{,Ldw( ^8|$w#E gGw&=.DSW3+ {.ӣ>E)])\i,1SZI(LC79zܸY3ۥZ8e&:|Þ>t LJ,[(I8@llooi$uZ| vXٱ}F͐YPZF!=!F=@68MhVBln(z8&ӫlM]]g~wpo"' N>sր_=w/Gzn>,Q>fQkw{ 2Pax\RI(C"DWusݑ.dƭ;^F5鉇NށOZ# ӲKDNWUէ)bUi7&K1h66*)qKS54ACmyV&V+X #D[kI_Ŕ%7̃w%.8;_u "vQlQ0[g|u ʏ'FFT(,_ٰJ桜Ż 6CB@8vOuk*eUCQDВ?ܛƥG?L5z)4vH&!Y!ի.y-{ >d4˛ vuaB2vWݻ+T|75~b]G3S}Fog7H] eN]l'8ﱊb>{zJݦ40k' XD1w3Ỹ vy;SGzB&K(EkWy+^C]~|bYWfQ-K}$ynqfɡ3À_IvqzJ 'os\ %(jm.CX,z1[?lpԆr}HpY+Fv>$d`97xoZZ2a}?tQ('Uʤ2uX=Л%׿7mʇFhraw͐kDgΣEc(m 8 uW}+4a/1piv8ీFkc/\?|:wwx`?dF,O9L2f'ѣgPR .$ ̇MڭyyV=qS[7GKuҨPw8 ؙκ\Tz?,ۧIʾ~63$orFr)Ï,cSrh Iecҳ݋Q+Qib*M^e(FO܂2L*[}䠋yAXL.|`f{ty+g!G'3+K3yF."Cs.cKR-#RSL[paؿ?h.Dendstream endobj 323 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /DecodeParms << /Columns 504 /Predictor 15 >> /Filter /FlateDecode /Height 360 /Subtype /Image /Width 504 /Length 11505 >> stream x} 4E}g]y_uQn֠(FETk͚OExW1QOY ]nhEWb@Nw !QwZ@v'ݪꞙ~{Sݿ?6@Zbc`w_S4 5EC|M_S4 5EC|M_S4 5EC|M_S4 5EC|M_S4 5EC|M_S4 5Ey(#"Nz!Mv]x9ch ~!^W4jy[!7<`` L!_7;6[o{װFz- yOo9^Ո26{._0;FBeьÃ:?fH[;QQc(5Bۈ;S\c1B`CKw@4akaχoL=MI4'[o5`ǖ1寍=KS|S>)Q&z5">\A.K> FWwHW>zgߊ&%|sqQO?CQwǖ.*\c;D*|=g&0'I*y] 7mC%O?'GW.qPu<|hk5J<6o33I0] *=>Y_c0H8Ơ͹AHsNuG$za65ݝU"^[=JomCo0k!h)k!h)k!h)k!h)k!x7 tsCO 2o7X6p~ ܆Z!h)bӳ_b8K6O.[#6搁t˓? _'?|[mJ4O;?(@?wl_=:pL;zH5_L+hGC^u= *]? ۈrˢ5<(7OCS m?kfƳ\iFˡ5;c+Z%6W79_H]췭 ލJˡ7JHi ӛ[a.⋡ɻNŌ!/. E 91ʡ_F0\;__4@錜rM(4  &!~2L!PWEL'`{zWmC|dft˶3_;4O脇N. go'!cUXw鲁V9ve@, 0Y3P]((|d+kDWM Ե6k|>9Tq䗠3*ugz+_q}e .`YϮgh9ƵPλA{8ܹ.ck $>-:9 4^ +@ՕnoZ?~dއ]~Fnp'}@tUl#eA4(fלx;>²wE9 vum0/byOif>_w9]}557e sH "kh1cic#&JwWO!@KBsfQn-|] lş Cu*=aFlHàͣ`t`7:(택 X[LL+ڙ߯O- fVc[\ATR0:Pv ׂBqI D :+ܮMẑg`kR]q03\} f|4F?%b"c,@w,WLHKfC 6+NK/6} P1vc;+pQ r7L{OO(EIk{G LCC'L2_L]T?aztߨW_׾bѡA`5LQ)a]hg8/J}0< ]"'B:b8_XC(FB'@Yvam@N _> )ji g_Xnv>}9(+KOGOGOwBu ?,IW Ai_rmxJ0(u(B 39(hW2oJK<-ΔU<A N`Vy_nBr/~b35a7, `'%hL_\s%&>Oݚ)cx7^<<6r`ш!YѤX zlIC3Tܹˏ-) 8 ]!R-L2_ ,px]Ztu_LvLo~MxIH| 4gLlE,heehiaE\iq_Oi֦O<9F/>؊x?<_~:⺶s/PL^~;·Q尓ϸC]߳E 2#P2̈FVX?Y1sܨjֈPJ+#%mIKhdݖ~? |ū?G߯o:-cD\J#etK>ynWN푿GzO?^u֍'_v}k4m * vN KtxQߝ s}zNmi7{ x]w 9n .KʷOnEC3q(H1Z#E~|Egn~Ȏ/Xcno\@`!}eߓ;Pv g"QxJ;YL`w|~Ekuws\+>oe2:@ !WRsu_uo󭙵;|":B%W2Ϻp9TQٟ"3Ã$ ;Ϋ|trs<Ōr? hg*tyt,Qi5ZZIIS`>5S{Ɠuh8AQF]pFQ~O0Z 7'f]gMnOR݆AIdUz(ǴrV񺲊6sudyn7Gډz|w_t`ȵ]|{ע3 Ai+gNjKPԜqE * {4Ճ!F$薕.[j^[&>7T cz/29aW4#BC<\^Z #Ȑ:1_wߗu{"uJ70j&N.I#{e3&'nQu&3/s!qiltrMܗl,Ne~vbN@m*&1[#ꢸa.8)zE;eAܠrM`|y=o[2) { {s7ym!6.J6MDn9WܨLvv\ZiDklAh˄ڢ#zX?$`,V@J(3XvBlcŹDJe0\OVx:wSsdF;<( 2s+eET#!jhUea<Sm,davulk8ѧĺ5ArG]|'!IY(ӻVTz~x5\KB"\O{cjbbX92 -E7~P({7uDҒQ2*֛x;& xZrQ@ ḨW=خL[r;o=͗R/R7yΗ>aï\VAʧ ٶe]-r/ (=1xÏbe \x0'}(-CVE< %:|PV,:G ,?n/@; 9dLʆDCn'}b 9;s'>J<+'mjZr(*:п/\h'RqOh)9G##,q𕥷'"x~'T5P+@|Y2v5M [sʢr'>5>J{ٲ>&%љ_ų?CpTT̂z/ 0^asb'>*@ںHzA?lRh@1%Fb⿆X5{&qu Ό4R_2o[UYK*;\#-V' M~{0Sv4)9*D<k^ }P>[=D&G"=t@]o$* 0);lJ$83)?c΁~XLMDV * Qό0:=YK&XʚTkI6U721 .'V¸XVOß1ˀ;Ȼ7RUq,x{, iqZ ~w|9 jڠX_aݍۃ?/Z$ʝɗȸ¨:'ߺ+3D_Ody䔗K0&YV;s cZ kkPm 9IA^\arߢa3/S⹬Uq(ѓX!ހ߰H}Үbk(/Jut,VᖬxNqHT+[;s aڣNǧTR烎$ny vx.=L'L@H PW5TTl|2gZpdLcF#sE u_J5`_֦tI(djz<5U:OΠOr?!U$> 赽EF,VxkSfi}Y/\B1uBC)ZJjv<Upd"ev=¥N-NPA%kܜi cl̶:%KQA/ Ng@vczPMU$^KIr%^rGdP{oX9Ҩo?5lOl:]MTx 0B>SmJf@dr_Q*"C*-xQ+dܩEYFW @ͅ|E -S,..Lrċ+OzzЫU ێM.F R>ik\|]=̨O>tAY&P9EO''!uw݀VY&PAYeCʰzCCEk"R.#9uu T(S;v@լI-3oT~ $TaO5˜gԹ>]RSď pC6Det.CrZħ%6R#ԫi%>]T8jS[q_/Txhgڪv&R/7v&~Px_PeGH;*MO &>?U^XT?er@!6vT:tΡHdeZ|@ڽ]5+~jL jCGCUJ>P?@Ն6|4P!~ %M<\e!P7%4 5EC|M_S4 5EC|M_S&2ZĝYSDQ;s@0l`0Q@? :P&bG ƞh9%ۮF75Fnm.z6Q';=!Ά,J5G}"DLQM](a(@s;C]]Eɺ١<8GyCc(8pj!h)k!h)k!h)k!h)k!h)9'Yv_+P@S~%Kx?;uPwŌ~WWS#}1'|VnWJ!>E|]x|5LZ{x#A<2߿=uEC|M_S4 5EC|M_S4 5EC|M_S4 5EC|M_S4 5EC|M_S%xendstream endobj 324 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Height 360 /SMask 323 0 R /Subtype /Image /Width 504 /Length 7744 /Filter /FlateDecode >> stream xݽmy!B2\PE 7IT)5)S1!C0UĤ\$[F1]{3o}֚5̬ߞιWPtՋ[l8Nrrņ`@`?j/l3;^҈Ž^/pe͞> OզuұJڌm}oǸnȖ؏}};yTcqVxef;? >1r&6)d_7I;΁Ķihrs%mʇg$EVy; ik粫sD/ |W> ys}c0<|Huqj֊댳 oZ$r%Y&>|pe.~?cb;`en6<@6rC= PQ$MDi7RXQ tTe@O7-4J^ެ[R Jfa5Q ^]޶8Q WJK*(P~>q,yJ;f_h)i, 1@kEmAE']h*?ȞLvKF)N_ 9 Jv U<Q 4R<䏇Z_簻c5JFje1n@ sp(k<n@u Q 2{yn@]|9p(*jƿcLop(*F³wEid|ɿĖ~WF)PKR{7Rt=/2QOjp=iZQ?mLmp3@>|3 jFe|,`1ZA"v,|5R_9V7ePeԗR|򇧕~ N j+n]"}eXJ}]Ftl/55"/;VKMzR7[cNESfԟXypբi5<3.9>e9[m|*\~ii3%cGwmHyl |&lN=eӜk]`5A)O0r6Td2S7#="o1Vr;T*Pf,DKN}Iw¦6PF)fXɝŗzy3_BƵ cx׆((TKԇ6.~vg|Ȟ$#J2nfnSe/- W5mkJ2:+i3_#c<ynb"kQ3LFqؾ}[E(r'2mo:kQof9{0F̟e_:Q fYy&3ƍWX;`5J!Bԟ7.veRgoKfC̲F)k#̐?Y`5J!E /`a̵F)"GW.zRD iWZWsسCF)"GOʀ bQXRD۹\Oi_?%ڍn ҫPXRDyK59&D݇]Zs=J7_3ފ7<[y5x{-{Ŵ"4JbϨڸ3 ą4CBG6rQWL;=,yF)R9ۯCg\NTObEH_ԋj+G^ k|h[l3vy>DJNP_Fv&O>y!3Qt[E ϹmaU9ǒ0}=vrsVTVE)lᔎ58c-ٷu,riǞEi"&Q/./}wXIY )od9?ȠT#57MJQ+F6yӾ l|bΫ'jѝC[c\דª |2Z|jqov__,,ΝM%tU."|$y} #-8 VĠRkP+pgϹDxuW,ojK5`\VA9Ma)[;yk#%/y8rGg'*KqqֈS*62\F+Ⱦ%yyrKuQ/]K:R/k',_j%JqͶTV³pJ9[ٱ>VI{|'产܎؎`Vl!_2QY /sdY\G]BrbءznnJ> || [ƴ ܹVN%֬ޱ9~5nnṚtG(i9`"ZS,DqyIҮރE}OOn“Li82=XVl)“k .GДz_*^kDNsJ}rÄ ]-J(+gHEmz=ջo)aݽU_w ^ O 쌖)1{DZ`Y~O6g|F`jXc5]Y+oײg)ΞzJ}q51 dQ+QrySg Ja̜z>Kf[2ziau5S>#'>j"mH9E0`iK۴=C5|+(E3#,ֆ/rU~H'Q0_λ6#tڴ,KkBN¯W+L7 (ť?{uWnNQmܸr;`?BЇAPK=gGT:[V碿PoL7z+r0J!\|Nƿ?|lǼ}GrpYhc)]rFowy_mW@3Ês>0 \OWya]r~\u4BA)$|Us>.VuhO~|xG]N؟.mѰAfdpW_4dݷf/Rk}v*?&bLK˫ ՙ779w΃_*x6U}{ 9 ՙS×3gty?ߚ 1Xa..kݱD%!'ݙs^J=O:K{%!0Ϊ3ò7o9PA'?t7V¼H?M49o3Ê7S<]a?_do+1^4ꇽ1/H#ƝR?^*R<:Q_6'22N͇Dns= H zW?x?ѻt 9u9Ѻo.cWv҄>zDܲCX&ݝ߂#k?K삐"珬T62{K1s,N9qnj7R69Pyn5&o'7l%)޽ Wsr>"Z37Igo6oϚ"oGGkCu&6<+W=r|spڏ]8M^N^J_{e:>Zs~2F1Hm߹kCuFn'{W'5697cnեsWd3ڱ*yҏo{<9*=eUKѥQ*{6a8G0{SΟ:2~gk=sz=]rnC%p?tlP6uǼO|Y#: )/r]9?x5&ͲRK&N-cWQAnnHr |JTnJҋ[smRr'v:UM^k[Zkho/~_Y9s {xڙ ֹd'n6{@}Ncl 9U$B^ <};=`p9o8%%6'C8p8wEIy np;Nj~%aP :W7wp$|  7Mޙ/P??VSNh\}j7r>9!o;J}8N?=dOgb o- *yߧbSOηpzzc]ÈL[tsr3XlF?mmVSD;rzrN_5)OߡbM,`EM=9ߎgK|O 5s 4,c@ηe{9ЖOXM7Y9_u<7RD >y%'$M)~弫bJqQ?3bm|}][~!4JΓΧܒ"W˜|( yLp(Er90~]٥sxwtDŽ7Rd)9wCr 4JEC\gO^KfB3"4J%~l+#)v^C>Ur#4JPgIlǻUrs"4JQc*#QQ ̆p(E?M)NI!/!in(㖇GY9r3|3(0!Me(災}UR]TwBDiWJ맱a-y=5M7RRL3ȟqr3#4JQ_buFiI>n6XQbS.~ը!n(ɓν}1({!19M%scK'19M% 9lp jR NVlf[X ܌( GqK?N˨Ar[X ܜ'%BWylbpc??OnH?* ycpSiUײ/hXQCVN_1 M5Tedrk[ xn34qT+*ƴ@9f@jO߹By,lpsL}iuy,dpc??LO%X$V՝rQz`u3J1"ox{-y+ ww.Y,YQ<[<9{#_Nw_Q92e0-9? F+`y`^^r~#vVvSܟXbFOƧ.=ś<Ei8xOc7F)q댋/0$(M?:;GS>Eiׯ/^8&K7R4ƧWQJa'AXb9oD,.e+q>AXs9tzΎ㫝9y/c:xMwMusY`5> GdyD\18G15rÕ- H[l35a=M7][oDKiGt${'Wu c?yE9o|pw ; {ȕ?xnp>¦qendstream endobj 325 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /DecodeParms << /Columns 504 /Predictor 15 >> /Filter /FlateDecode /Height 360 /Subtype /Image /Width 504 /Length 11514 >> stream x} T}rx9Võ}Ep 5^тhQEj'&+ڢ6s@I}!P5EZ6QNT$wҋ\>lv"žk:.tVX ?L¤Y]OV?r"&ӿW$l±|)oxM#N/?: ct1჏ bnql)x<$`mPkGE=t"quڝ^W.ۃKL4CM /xs>.#GD}C|\_aٶ`tp%N9gԜS[ yѭ6ɮFŶʴ6F !`H'oyŚ4q;)tx/ xWޡžӑA3_#]n'sg=" ڨk<諏, }J#{wAfܪy7zf/S#@p.i,wZOfogYd}Gj{/ lұ>hAR@"!e,Yf`G|OpZ(r T݃m񅒣 KFk%`ٻ %>!I՟) sP hx3O-jvh=Tj-vb/IWCCHddgS^NZneFB.qWC I%Ը"fBC(k[PnƈfoIusGa}MgyXr`1v-H,#)K%]]u9\eOuz/ xAU8e^:.֋cPK*VY dZ3{ADCb2l x)ݥl! XсW=tXb돼v_^x][J!>i:$Pb C\y]Uqe?9>{M9ã#`yKlt \ m՟M~ p <~\p_J'DC|&2E)Ȼf߰r !>Q 2ODXLE/.#wOKE^hԑ >¶ڕLρ\tqH$B eDfM")L78@igKTץɷhC֭Bh*]8%>1 cu>yBE9$'I6ʩ4fJJ DG'|f㍤2Z@}D>^_7:N&޳2RMj0{^a]( z( \Suؾ5sY!o_=_ f۴{H5EB8S$@cM7w*K|w~&!:hdOX_; 4E(~)F{ClMUxfB ݅t d/Q5eSv r g ]*ׂf8@Ey 55*/IS JGUJGTz>8*qg=ڠEv,3?}=pYCE7 dlA XnIb~Ib RG8]+ֳ Fܸer,ӱfTV"ƚ]?w ])aӮrm/:BXJLa͈XB8N!N:=.8N;EϺfŒCy:3= ]p++|bx.} sc(6qcDCf3ΪݷbT4Z= 9F0 ?N8Nt<~S:Wra7r~ƣo߹;vM;o~Jw~>~;oOm-AbF8j2(X ǪX o?}osQ߻/<^ ~՛ڳN*4Njk.}gWzo[.}򥗭z ϋ7 ڍ_̓[xEg'\y`K=lpJOBu\TJ~ΖO1n/˘bW*|| BCȃ_r]A;gWerOuW_}0g4,J~ O}a_=|ף+WO>O_O ztQ6}nqMx6KOro lpQLkr'| EQOw?xo*/MG=9?9D:x6V0s⃎Q{[8'|k[{v;[wnm?|3أ޿o;?|& X 'x-X@̴nϗ(ke䩛>e7 |6lGϮK_*h;N}IoSwAg.zϣ.;t4Ezg?e}"RWx':eiEPU!cI"2*=GFtpe?d";˺?׳IO2~~[E y 'ɻGsyjDB¬2<~L]{ oF=w\t& ְ]~GR7ZS5I?N}/0.*wnfᲥ/>_sdgO܍ԗ x\ْ^P Xpi?•P&HH)[,Qss1]'JJJ%&Ha"8,P ޵Í࠰%EYv[A7^,QhhX1+Tx:~#dMis;Ғ>{Qw%I ʡv6bg,*› zoʍ Ne]uQYX/Uf.۱uXy35ê*Lן_:BhNeH@S+8*#_:'2m@ZV8F}6#S69Yk)#Ր;5"O-e,tx_w?wtA rᩰ o~x $D^Yk@\qdsY ,B)݈Us&ɦ+j4!0b_x;1ϕ˱@y"mIB$qYuyӠt?clcEk UvS]'}5iaEuLL sJTn鼀!Wv("eo߹CՐ'_XvZ,KϼcD}uc)y?"gS@X [bx3,I#+}7PpkSNIaw黂X|/ |NrCpV~|gֱd B'rv򼉗>uKϾn+@Xc:/{oc ZU@T\<<uRy xg-PSE~1W[熿z]ns;tN*뽇+p}3^jY3h*[2QrGʜEAY*mRNV+o[;OS,q^to/8YųgʚsTKCGC=~ĦVeGٞ'' N빱,OE j*(񢆅4N|R{A{_v*h[wV`(Ԗ} |u(;ňWT鼉gZD6adU>b ]+ރҰOtJw%Rcxe;\ZTKas<&y~{T 04zʕ7cZAxAf"չ\_,[P x׊'ݱZ]WRa.gl$ 4Kt+`s'pk Z@=vn*vpgYyE97P_׫k[ƿ) A6Y:?B PZV^*Sj+ ;5w"hR,o5ʠZ_JlDe},:0y+of{ʢʝo %"#z D{7UA?_{2m%_Z;QL=@NZ)Pa^RyYWCЍKy+h& DEѩ>ǟSD$ l X][K햨P$ yq=Olm&E"V?Ӝ+Vvca/IFycWofܩbvBl_"zcmT+quGuݫMZ=jhPϻih-^z0⑊ Qb`Aի炡{0jV}moυTg@t!_z)Qwhi' $xB`ce\jY D3ch ZpLxI꠲39l3 G5o+za&hΦ$'^*m >!F|3Gc1NGev|6VL'+tS׮ӈvKVܾMtQ! 27.+ܒs ]xmURD[M7!Bw@gtɰ9СO"jFq=WBGc9iGEI\ԚzD\{cadI]0.QRuzl%r0&ɹgRzVHJZ̐'N{6s7as>>U`^ Ns`UnPbƜ3׼o; _^hlRQ0dz Z\I;ꨨW>iL {J+eX,tݿG7uhO~ouDn"()o1M 03'%G!/Em7o9q)$HeHW%G` 9UJ3sdFիauMr>1N|88y^|ZFާ&L[?$8RUS'|`jVAD92;#/v/..,,dOFSQ6xA}|S`KHeTQELxj}?{Zu䐞0q GruhVZyΆ5qK4.Ojr 艑m cQE"%d"Ԋ\/CZU i>˴;n`-(C㹛v%= *tp"֬0iw%'G0BN*{ܟCⲖ?H3aSźQ?99J9!MlBlhd=$ut-*Ky&@-beg\/)w0%>TͰtmvUV o7^S-ٸlo|Pf\Y⑝ɻV %>:TXm'h˔ag{de-%> EXc+G;jegEsOkoنlm@gc,|7vTP\%O E4Xi.R.k,?ie5:k1ch3; !=]߲Pn?QGuWZ @#ЄcV cLg߹5@e\"Q咦QՒ.65 |/nbk*vyE`I!CNBJ;b#Vh-AtDeG|RF sRY(2Іy5V ȴ woH *MƎϺkd+WH2r0PmGNXӰPm.ZF $QuOqFHɅQbPaQ995‰ 亥D_hBU90Qr&%*& wauFKgk [(ٗHnP]%u`W0.]C7j'&D*MCKt ٷ]GzNE0Y`OԩKB9_9MΤ~J1K,`H51ώ'dR;m6V^w}e샸,:;er&Xn>ugM,?j:aņisE[f!86BAoBŋSYG 0,o! Ul8*5#V?AO\KCFu 0l-;~dG_Mi"=Ob5a9 As)Jh@66#s ,%, xf 0ޚ}Ur=w!~fHWr_9P|#gtBýju6*KHGZnsMn٥lkH6DeU!=݈&2V,[x%~ʯ$"Cvt燽i)_n,|SqmD?W[:(DJ~iФfe׏Ԧi %~P0 ZRg繖l =ď %UFuxP6Uߧe.x-|q=7SZew+2ێ)6oAȢd-gx;~V&];?nSO̥xb:{pQimv̓[?:Z n3BC,1l$왓8odB/53Eam%< kTRR,[0+YBY^Dv,.Ohe7l":*K|>7si\E 闈-J<o\2QYHNd)z<ďAXO[N3FZCkݬQ低-7w4ė8;HiTYţ3Ǻ6kH6[xU\~]m9 #Fkˁy/([J۞rMfчAs=dm^9#/RR67홂`&Jl:oKGC|v)h.% !ڥ!>V|4ćj[Rl,$[Rl, 5EC|M_S4 5EC|M_S4$CXS4 %dwmVn|H`S'O})c<(7MjzR5uL|2YTĩo|Mഗ2#b`5NS DDcآ)JV;C_,@1SQ62KY{!.?4gQ$cOyߐB:;SXTx8;4dR⧓@8֠Ɵ': +2Yۓ!)oNХ5 VRa<^T*;=bW ~&> T`)fqCR5L)8pj!h)k!h)k!h)k!h)k!h)眿YQ{fDC|M@Mo;"YmE\[ u'x_dbR9ZV6 +% .s~Mns4Ly.S$=}#ߴ5P{늆!h)k!h)k!h)k!h)k!tendstream endobj 326 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /Height 360 /SMask 325 0 R /Subtype /Image /Width 504 /Length 8370 /Filter /FlateDecode >> stream x߫?[]tQ7]AF!x-eaZZA]z!IHS8]q0SФehFĴמ^?fZY||Zk޳Y{绿̪s&$^ol-wD`Dz?8)?Hs^|ݿs6C9JNm/ii9gv-[lŜmNpYrfNKn/#l?gHdr:-myQ>o'Eh\jV8cWpu˻UI*sN6[x΁gw’JEGlw; _y_JBP ts6Z%\T18T>8yJ@b! (@'Sgj2?͢_h%AYBtg_ݢh|8_a ݢh 㗞aEYm\QrPs",J!- k#,Jls͢hHCjF ,JVp#͢']5ݽ1K ,J&5Q`WAYM &IǏeں!,JUGڣ͢WڝM'Q; J]c{z$ ܜ`'YrQ?9v!ߥv~J?_숴^Lne9!1i?k[Ⴅ@|m NΞ?15뎫 ͙1yce}o2sƼ˘4苫 ~Ř?̥sjj͘OoJaA4AXK ^4G|2K(+}m|locpsfR{P|՘o:.cu=5tg9o/3W5#fcc ;dn/qےeps=-\kv 9mY9_?罀p(=}W3_" ,J-Pޢ"(M(FD)*fQ 糴9?'r E)K({Mwqie“*U3p(vy'ǂ;9Q *޶&נ]zLO׀Rmˁ,gxGhoORmX%tgE_3>@ڙEnr=͢Kjjf0v=v7RҾѽ]/ݧӗvjcufQ ط?nR_>2K7R|~B~ܷ~yr1͢GcI&ym|c g(=M!m\L?y09%0סCu/=Ւ (`GW9h8N/[(Čjp($)WazαX!״gR5,F)r.WtM{UP"2%x1t*iO7,C)r~^}hD7RϓN;C=Q4һŨ#MQ?sH#筒o1'cG~!䟂VOu[i=W&/%<ݪ6ΤA{=h9Q c3m 0fbٺ^D}0k}Ì8%g\J@[!;I[/j~bU,zLXƟn%(D./M%ي.-{ ׌glj B"KE}*総MCJ};8}%w7o/1c>b<;{ngG\ki%t@Q[f5'SUn={mbB"WfB>vͨ!?gMGY!=~^WF)$\)cXq^ Nrc_7Cj;969rx_p5\9C<s>;Q(c^?Yd5+4a}!lzH{}^EÛ\O`N };YUrnG7!JE߻=@?@aO- 䨶Ğ6wxȤd:i@)|.us)1v=9̹QcQ(cСCoDj4=9|X}+͢Qs估nԾK<-.N&sKScu=*d﮿!T9oB1N,]qWbrU>CzSP}F2a^1BlrI?|`^TyG!>wVpA홟6Uo7[]Λ?r=כs'iGyUH>P#==E8)h:7`s8uQk]/^ؖwIK[ E_R7dr|a]?=z{䟍G{A1׻:w/=3c{/ݟXr#wȇu}M}fYȟmWw#P@N}ZkaM"|wdv5bƼn e}xοn1?JzPtf]/X#<@{uZBF}UBH6ZBBQ{w m;7dUF0;MzXo)s )>?x̬?9c1^D:{ nR\swhYcRݣ7晼{r??; 9*lMV 'C~yTaѻg7gna _09 Q^RDy9Jhʢ9u}G~(Ew:wvA,cvū[ :J\3Q(c^h;ꉠMsV=7k4h8 G)ﳘ?3]+ Qi":3x.\Ň'sni裡?>68k cPRH`י"#/^(uC<*%8iBSoٱ?iU|쩰vYn[8ezBvgwmIjNzU`yWgp]~{7әshyu;*_;Ox@)$^t\#gc!6vsޘW5-c86c9.̭!~YzuUͷ{ڮ]&}v%CC w4i^7u]ϽqY0]j0ڼP9O'ۋ4xDX7~ΘufU}~BgcB]]D[{1vc?, o.ᓬIf+mǙutÑg9 ?ƷHOq )jGe; y7tP5SVynx v`9,LxKytqZs_ j0ژ?痌#JŚ~}qZE)_<0cm{$zE}Ga; 92hݢ=PYtKd4lA3'tzYmU FO'qx߳,5݄f ;>WǞ^һ@`y?}$ajs>fP|7伥j0r^xlD ͒FЁy1gjW] uj0/IFOlx7rA# 3rR5Ӫ6'*yklwc7l^?r GZ/WpxgE?W}l`]j0JEr>M.wtLכNY"-UQ*t|Θk+r>q:_ͨ/>T F&Y͘UݴɺE\9oRⵙ(*.} x xZY ִ\ Jq+4髪z9{o]^FVhB-U+uF.W%oĞ ǵ>E6د^WZ/md7>r ={YB[Ϊ~c|ixsi_2cz`]|H;ì!#cǟ;=Joe{FA-)IGv XX_mmy1!_Ru3AB7t՜Yp|!Fsq9/_%Qn&7.u?ٴD>6[`r m/rG>yXinODjF(X7sffKNQ,?f6Jщ9Ni {OF1q$~0YםgSX&+E[bNVf7NA|1|٦LvFn/nΛqF73X B7i,vw";yL6y_oO ԵG7zrz~Nj7{Ӧgsԓ?r|QEl-ϚˎOaMrTf:>~I7ӝmBF庙,NR7@bv6^/M]}\p(EH9 dr 9p(ET/yH㕪B>=fB~ fQ {~.2w<}In(&.i|)c}|yL$7RiBNλOyfQUAڢۧo w~n?|AkΗc!V'qE)j~.Q9 ,JQI,p3$Mvapt5r\ vnImr ;#,JQn7RKݺoc C%qvE)EgEJov蝜n%~&no(t^tCP]9?UXjr? ٍ+nJW5E_ Cㄴ]qQ AFOQ-o%8'%Wb(8>An ,xN1Ҭ7?[B"LfC~ e˨UGdM63u||Gd1P?d㝜)01h]:l<}?w^y";P";Wz~ D΃E{+Jendstream endobj 327 0 obj << /Filter /FlateDecode /Length 5822 >> stream x\Is$u##:tqC.W:8Betآp @489ߒ24Gv0BV.oޒff۰y<77g?)&sq `M~sq}/rٍwq:m.>8qTJſëN}5 Ze+|}>&`?k.%&cT^c;TL2&vJ&)܇Sl*?h|Jw(Wc93XəL9cb\z 1"q=u,3#Y}χ42ƽ'h (Ob,Jl:5Yz hO># IjAQ9"O!Iu#c~8qWXG~BFC Qmh8/+#i|RzT$)p0e}z`SZIukU?2&y9`:%0@MAJvR]ڎf%$\K,G~rJp m$+9F҇E3oSMbu8Z ](cVG@ GO,2Wf]x98=XrU"-b{`FX%D? 1&9Aky׻d4jEo0i.? ⮄t Wy #y_a-Qg DBB'}Q8^EߜGer-.(<;LJfDNs$mj XđoQf[g $6M Iꫪ^-k1?Y\BWq`Y ym;Z?;Lq W4 =ݻw̠1m^(}5kbv!m=s7J;݁xJx}j>U[A;|+6v%Mc\%ۊ48hz<. ;ťGqe 2v] ɭ#`BO8$JeUsĀZ%t2&z~̱JE!EJEB`^i\Qw*@rwB5NZd]#HVܔ_1Na\#Way(1=eYy&Q~-H9hOyQΖlYbQ']5ųĂx !0/&qq41Y%el8Pz?-ccwclu Op! F+Wf iQ0k?*e/z:d; hٹ=ڰn#OKS;L޵1OQ>m4QxREbkILϟHOCp|+hi-KnCZ>bfEnmukQ1nʯ5mS'>#ҍaڰZUgԂX=enY_ L.ݐK/+MQi?RNduëz; |M4GTjޢA}U , fſdXޫגּIl98>4q*P;^_k7+O_ z XM/X@A+OmeJ]}BNdWs琠)TR7r0,%cZڗNJ' W"bb`6gg@Ry=ǵ4 J0OV_8 wWNp[~=_OKqb9r H"!Rm/R I)lrm`zhP}nXu .j +ݱb~2T`\a6kHwSR]\nS0!kB;5JZaa,.)bt-oJJ.˒(K\zG''Dz\Ocd3`51Sþ=ұJ!nD*yq.Mz &N}t}H[ !V¡j2['Z(kg89Z^7?M-;z2w4j˿"8-;ҵt6XDZRc4Y o}YD0J+2?Eզ Ŗ^8JD}90/r`5=fu n,U~#xa?6Z D{ a)lQ{JnK'X*+B/nmnU*x6h.`iB9Ul&!$TjfgrźQ Dkj0C10ԩn|TL|{=@)m8&ϸ84i8x)Tukdʸߥ=LYƨ`W%t,n2h질BЫONDɱI1=[7,fMbPXlp;}XXگT lyЈ+.~N+wXڻ j{ԥ\.N5`Vqy67q "PJG{AfEUSF5z7htC䃘/nMj1<XOXss'^$ *7[f$PnA3͌~W8&V(~xۥrj9V/_ssQzH9@M&?tr@΋o.~{*(D3x >/g0J\X^ ΅&6QXӬU#>ͪ9B7'5?Pi,aMfiSu Si" W\YRurә^b"ʯӯa *,Ԩ-cW=Jfqm3fZ0CgVF_08U nؾQAb0}ۓt(=Y=:՘Pά4V6*ogy*}L+@q+J ^F}"aswCw! RkPvx%KCt_?-uYroKHw egUr 덮ˆ÷X, ѨnD4hx/J$r'>=UDWiV"cTS+V?ЩoK0LAy?%M#VDA"}SwQȎ갊HJ4(VɝfL+J1ΒZ)cW)9`4`6M,vW%GD>VMw%‘;YƑOkp5V-z;rҗű`Qie˙  ZilS%v$XdQ!`qm-# B cf?܆'Iw8jߊ<"lކ@e/ N'*^8⒊#ō-yf֬>`a +>[tOPq>D4-5F)zw^C *Ȑ`nPKV> stream xy XĘq\QP;C}֥uq7D5!!!d#$$, ;(hQUow%EQ[]Ͷ^{>$A}s{{GtFx WoXqI_ba뇏1;{|/C](LFŏ.-ju\VRBj\%%j0>9!K5jNRVVsss'ĥfN>!3A?j0-+jM\jBMxBajzvV(jp( 寤m] ܶ0}Ţ%Ksrǯ޿&Ĥn<)%uR)ӦϘ9bV쿼4gQ;n&"EDk_uK z"@$6Mfb X@l#"bH,!erb*F$jb 1I $g L !">1N #p9!X'ыM!|џX<5aQú / =8BԑG{{Rou}?C}^7?k~A]yvzz mgpO$ )bGǑ["jnfu?79s1#}v g?bD͍Uyr^{㞩qi]֑(%) :>"fFP>$ pS&'t-!PZpۮzp1h(׃vu,m HPy9RDH2)q>zCix 8t-2O %*K`hwhVtQ=l)+% g>kyi sg`|# 5l1:dk*s Az" aa#Y!:?DCc` Fg‡9H?K~$ JE+_+\mG78A n۹0}܁`>G޵(]q$*} [.9ѰkG,>[0Ar^w/=9 zE:#(/ROi 8S5bB>ş a RoqhF/Vg[ﵿ ',D)3°~;M[KKC|!qUbiVt@KeV]&W1:J]&>ʗ˴@.rQ`+ͳHSB :ks(@6Mጬ02=I8߷C `р5$dEShT4 bǑ!8?$ڹ! 8!lO1#w'\,zb6oڹJ6 % 6ս$\͇wow}j2M_v2@k,x l`R֊y4卖rXůF;>1Ҧ:-f`@-.4A|5fq݄У4J ı/wtTTfK/3"ty~ٗ!IcT}\ lLǺѵAF#50**Xn7cY |$j #A4h?!C|?p2n 83nmkbvm+`4+]r@STry}U9؏g^mHfym6pi</ )RW+Z3Dً+Tb-8Ox_`5+VҲoe&7 A l6mzLpNr@T"52=8p A#oz6V Z^m@I⅃Kߦ\%ۗ}UXq$ ˗jI|NGP#g_^W)T4E@G\%hx% 97qkAt*_s @y*YK>OC4dLi^pćxC,H yk9zI fO6OC >b=y)I5 Tw das"+Qgȑ *W^W^ے@2؆PaO48 FZu YU`)XEa&p!mk \K͆v^h}RC/!>yJR.Wak1ʷ7{QL?~P f,SK63ZO(W-G?}Dx)ԫzPNY)%Qh,.ः\!w$<֌d .F zq9wOH#.Ջ4&/Y.8kd}~}?ubX]Of햀#e® \??f*U'q-\WyN=CK{I1r?Y])4)0H;S)۷NX-N`\4Ib׾&[~y@\NSQ+ٻ5{GǕ pd@kg z( H:n);~y؁OCF:c=2 U[)9Q@j3!!]Dd™hNDδu$JOj K5Ve*1/)'HS}UdsFASN#nauB . vhz~ՁXsE,sW@Ig`h^ _^ZQ`e/}P8UcnUs0lzr$)>"5ȅ79臡GK,WANXw>>ݾ[p{k]"P/"9P_]V-)d3ȋy~f;x1St'[=^wa'i꒶jv} '^` SOC@u%v9U>Hau4O!w`7|(?x5l LDb2 5_;/(Vq|w:+PsS}tEFJ zʫ&֭hϷW*+FTn0ls_7;*H_*V%(濞զ/k(K oϔs,678,M:\ki )8B!A+(5֭q/ڷ<#{W>7Dy)YBQ'Ai40 s!$߂׃m46,䓉j>szTrz oǸic szէyG{A&v\2ZO\J)1MMWmV1'?T;%5${?Mo3GYR*c#.|p&僜:|\kmh{*0F3b @m,KR S=aer}RSB4RHpWLm^ MLm7NƖDhB!&Q,><+B8+|>&o;GC߷^!6wEo|U D[pG% Wm^ X|(OO@]_5 a} thhX 3.C0]>ThQ5`85lmݩOT굸!iϗ]/n= J JF~P@raz!?wv^dI޻ ߼皸giH7Gq(0a }C/opo0kǦOFc&1^xPs85Ӑ5Re$8&F4Aʦ64BSznJ6[[/1 BI5L0׀itϗvpDҐ^quZe`2Tr$ vP%@*(k63K K)4*K_N>!;__b}ZmU9qKC/D=gH0C*fB]d_%Ǻ`ɲNP4"fu,_+lԗ0{zhN&@Vd4c juJtD+I}hR+r)U׌޳-%m4LԘiDd4v~-l] |{d%)j|SĚMNs];±|<7+ԅMQO4vӢI-e5UM:NOٛHO%jdzf#|\O1p.V ȋ@W+)$A1GDDaZ @@!X֢@6r崁\ ((Ea;XC6Y<<d5nfcΜhiTg˦c/}Jڭv<'S`K/ޅ_V܌Nߣ E8 WЋw^A=p%W r;^^@:4`8 )35 ͖$*A=Fo9uby2Yt z9t{c ю2 HTvluv\v[l2̥%n1ND*k:yq<*=g(-,c7| & XԽ8Eu2ԙn3TY!q鮅^z?>iTAf8MȪ.|Gp2tWG㹈b;R}9ŔӲn?|ktrիL.Xx #:aL'Qͻ9tu$ gג'aЅwc Ҋ U\@ bݍY< $%AơЅ(]N"+ *꬞2~yڍE>K`aqC^tsVCRrrjB7hkkVt_/>Έ`|n0&9$A,RJ\tFe1vd LJ24N?}]b/D~$fX,7;19:dB5ء7W h7Unew?\b[B"}pbFMaՅ,]i̟;z`fux?Qo:?Qq@Pb] *!y :Ӝ/LNsT^ۃ5˧%N;rHW\G(.OQ˕ <"\7TeZla#$N .qZ1g2ߟ ~j R*Rk2kpڄ]8';jڱD UB pf#g; 7YT"p3vڭ& %f8)G;;xeꅩLcF@ՕTs}huOo %RJU%* ,/ 64XeT%عXzռ,(vTpSʔZJ+j`_WBPNR3b65vْ\y-N(@NҒWcb2lDieXՑBWY,sÈV< VTW%J ;CDcQ}gh8)̨.{y:Q\9tuea&3PX2vyռF>pdHFp0XxjU椪 u!}L4BƲ8ŞfK= ~ 215;dJ,:鯧f$Ji)5 E7+-@Œ79;7ϥBa] ?&Ll~ӣW#*))lXҢ9nEaeZu ޾od포j_>hlS+36sE\TKR]U갗0}eB_pHlu7ӫXا'A?Cendstream endobj 329 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4911 >> stream xX TgR}-:EwAրZȪ" @E(1%uƓI%/Kfb4ѹAd{So[2Ʈ#ɸe3gXNFȤ@|F-`/{S#:P4 CLYdTr̮8׉\gΛ7w3. GxuSdd׉ BO8?AöϘ\tgLj~62FY J?@=hN)L@+H`q>,uRv7@pǍWL-tW`0;+Hon95a֍*-d8$SᔝW!Hm;t_5ZR4J]\b46]8u"~ LpGMZ>;K#d3_ln*B ̆P[Ɛ+ėHt.C"M8dCht dy$K{ Fq뤸m`Ll2'ф NJ 륁*>vxNV#" sW_9dzʧHA,ޏ  suNʖ~'aht XYVl50arF8|c2~8Bܛo₻q5Q2w;F+TVͰ !JdHp/S(,)Js鈱 4#)LDTA-MYG;xV5mK"L=2I?;耇b0bV~eMu-Q(Lg^y#+D?W4:T`S2 ŠOAkB{#ͥ;hFǻ(J4'UM5d%مVgp+XRv.G2k^ Uk :BOk';Tˌd쒭&ǩ9a%>}[BKߊ/E)L[X |T=l:eˍЕ3tЁ%*UqаD8+ =;ݐrʝ~$-$.5!p6xu x3 KB7XG?vQQgKxI09DD,@FKd4Ρ' ZAU,IWM؇E~K"6jإ~U8jK ^d,s`8Äӥhg`S;;sֵ.h}e>q[TO*!yD uu lR);= p[BwE|ٲ@ۋۡM1n@%:=,|yLzmXCU-:LC9H۲ -b:Dc;A~G?o|@eL5fW T Uм@4 NQ)Ж[{y_2GEHWed^c!+NMd\d7 *M]az8#)Zy+.,o!AڔՊqq  mԤsn>xs+b#7*Q"q3L>qdpj˯%IZCa5\@]zrDr*!Fz_.%{!$7:"0@ wNi0s2Ԅ'fyݭi0P5®s`!8.ePd.wjK \7BhLv:]AM 'E67E]* c\@6;bk`>NӮ@t\!(t~F?Ŭpם@flkw3lA8ViFz*ø@&m$9olJoh?T35yb.N).ב 2nJ%m| rSx6Fg5~vU^diQSyNPP$6B6òeruviNPÒx L$e_P&tZ;O_c9v ,DJl>>m]nz) mODYtEEC%y_ȅ ٔ>L-s99sݜ'!hh}Q춅} 8 )I!\h333jP_n,I`/P?B#)4l#IhNI[ ^o ~ѶT-m R< ewfA#p= Tw rMg.Pr2C>0S%yx6O'dH!JJql0HXh)e~,ciRNH73Ԅ#ZU,#lrp zc0vEF$yWn}xR-[o nY5ʱG"$'@w\J˃8 w/٠OVEّMO 8"k(4t?чt}_Rя~'  H]NOXv8bM1&"yI4rXcabp)ù g [=A0&I4ZPV@dG.PLPWdUeԌ=o~,ia2e*iu"ԉd߳8?(m<|BRu9\R $ݧyAƏ~")?3yfG\Zrf:A5ubQ=\ְzcT֜9@segvVN#+ g%C&Hddvl [E#F}I;)c{ɚփuD0YF;s˱^X,豪&T.t*R =W0YCjְ4{/,A zܾɉko56_S J{qg@Q*B/[ B^#ۻ\m S Ќ[ q*׌ul}x8)8i@ܭQ_zc*fmzrE tH_h_ShG{siuG: WNGENʛxi@nj\:_ǻ*Un,_F\mԳӪ|wnZUHL]6e>Q+G52pj5Ŗbb2'e G@ f! MUW.8**7q6 e"јI 2Wx>M 2( 6qӰ͔dE_Mc"ڌs֢5r܍ ;Ka}(=8 TruUy%sazi"dHSiTVШƦp~TJB q߰*y.r. V}YW-ݧ⭷gY%i01YKrܳdVXXj8-$鹐w(&GE6ذCEg/u59loKU;:?N!'mcgxmV%~? ao/uVH^8|^"B^To.7U@U z_j<_Xj8uZg3|YЇmIqsYޞ8ݥ޳R8K<].t(XB%Ek?ChXH>QSΖ|O Qkgt:g/CWκԗpT(cqR PkKXw6k ]q+:yoܘ?Q9sc gꎵ7k+=OKb,-n*S-ϠDBW7'%OqKp*goGtV7z6ޝf Ncz!۰ϠGG\GTY:O1^'vOVWCV?4{u(ʛ?YE7 wh EeA!iBpH,ck" t[ ?۞i&KDEk ^2H4W+VC_YX4&;دY'LJ[)2SJK"J|'(6*\q>t(uJ=/bT[[[\\{p+!}&}C-oEQ1K|9qUoͷG 7$UXendstream endobj 330 0 obj << /Filter /FlateDecode /Length 6593 >> stream x]K7r3ofCƣڛVa{4>HrDsQ$)P* zC:(</_/gjYz䟾 g7wO͓_hlٟ/gibHBx︥Qlt¶^^&ޝPӫ"?]gK_=GJ]p^L=D]yy:= )\rH-{b^m;`U}ɫٯd]h%s0.qgZsg+ڋ;xSo/^Ŋsa 8p{Ƞk.g92^G"NTd0@'%]Ռ’0ddj`+<UN~Lœ9<ocpSXiz&!4\ lpůt+p{L;´/{HduLK(hJ>&D[,]SYy4(b2pH(dHxD,,j><͆&y%Q.(x 42F^ri=N/LBIt?E .4h`^ y H|CxVWM4*3`,z4U<5$i^"_F t?%nF^Y0 8ԓ|&f\{8'uFhzC좘鐟Ӯ&?驭2ڒ U蓇r#{U+lZD\O*Wyؐ|͂+O<ߡZn6x  AqHYxEbfC'w3bH\Fr=NijO^+E7wޞgV 6@E_?#4]ěcZܝ"'˾Wԩ`g]cpCKZ@m x I;Ź3y0d*eh|T 1i0u>IYMt^/Ӂnb(_$ȋʏ@d"~Bb.۱rBS^1h[ s`KfIik)Yx:V􇋎,ЬhO38xH"R PۼDx^>x#у in3+ڈH-7vAd^cШ}ٛN-P)6dAKxQ8|[(ȾluP(3C1a dث&@T@F-*pLҊ2D-LkJ76b[,~<$"X)A+~ϱ>+9y#VT0pp*Gоѻ~!eC(gghS10,yؓlxCZ\RЃ6:CɬcnA%N D| g\b7l/5gypL㓁 lCtaCp>2g|k "3Y1ծ CͳbtKhg_>cR!n=]-TH6^01u@AhxnzUDNӤg:ϻzs&#i_3B /W*9w+*i/O>&㡅B䡯kro(yx~ͩؿ] 䉒sO6"pK[cQ8#x*Q.ŭCPˋ3t Ϙ oBV0 ,tϳLrLNI=ԑ1vQ٘-D$;VFFϳ'Q[37Xt5WOq]Xh_% 95I^??d227xbe|AdT'QlXͻOĆnˊCkkv%vBDPƜvF7"9 q;bjUpM݄`!2CvߎKg'ݻe8cr# [suJrKyjgG'vV.::]fWuľdʉQXGFRu/|-oH&7HWfYxY;z4Dk"5S@ڹF2l1 ˌ$&\Uꨌ\Q}ƣ:}’ZP.Mߌu-1,` kF ZW9)(m e۽\7;6zX5 Zo`n} xa{@_'&7:>Xy 8OO.<-Y5b>o\I xҬ6K;"eL ,k"JSV!7sټ(ޒרб;-S)IQ~&i WE&u ?"*O KA,~8 :X ӣLa5$<ͩ®=2+74AG|y*RJ7ewϰA "Lя-&,6{̉ 6(f#E2z)T`lj}틳"l P;[$e@.| 0+d¡ o'hpW>욱{1} ƛU#Nrqє)Cz)(;S(8;DP 4Hrt])BI=-0U;WMUl cGH3rF~޾-k;Z #s4nbd7%UiAF0,c]YpTaRn8@ùgE¼âTLL1|HשP/m9ֱY4̕li%d Î]'Ak㙃jBݓXt-%chK AHe>xԮDd /S\/ru X۔|U5RۑQjy*tSi$hd. fO9m?8PMZɮR!!/iN{cIh K<cT!Ӕni^u/LHqKI8JlwK+loD_ծcţpRW7.VcIN v#\.#71%Vx|É9ݟ)1Z]b"f[I Mʦ ,9f`gQ5i"[D= jQ@mBS3 HN H+ eV>qef65caa+xD,jkU, 5b^()06UP -4L4fv"*0h_OW[Gd.I:1cۓUv_9Fa`aN= zV`zSkpf)rw*aJN22'HM1y]L{FQ}Bf􌶮C^ ';"x$\}a"hdl˖p~s{t ] R/JXyz$оe4jׅt>VegO AŠjߙ. ))-V#GNJדRa]Y*$,bBPfD``~\VXqm?+%ri}#q Myآ{i/)J6gRmN&42փ<{1 Q/ʖ,X]}d"~"Ya]0{s2isqBx>(h K(`>{I OX4>2'@M)mP}<àJDnr#S9́,@Ƀ=)} M\BKOh`^/EFƸ:c䮻>zr ˵R&ҷɉutC?Kƅ+N6.3ȅpXz F-Jps幯Бf7oԭ%~I<-&S-\tlBј]hÞpAJ `maTe~K;-os+>r4ed> E*/r:J#=.Sw!LM>N]W"B x30f{ٚ# V<~4 fD\5jc|8luu[bEzΨijfn.?Sc/2s~[aFHnAZe]XCLZTanH'.u'CKPq>hyLcG%fQ$Hxh3x&e ;Z {4@!#'-W1zK-+jo' ?Htݑn~k4^hp5TԝNȥ1M&&4~s$5:w!@]0>|~6E5(n/,ׄu _b v4Qr #lZE? eUXendstream endobj 331 0 obj << /Filter /FlateDecode /Length 267 >> stream x]An E>70`flhUqE0"΢TU3A||ղT=jD5u͝*q1[(]z 󫠢\i%|5:ߒ-1/FkR ={V X 0::@:@v ZI 5J2kqA둳h=AtM4> stream x{pu qEJNL!#M!4 <4UH-Y,۠8I?XyWlOJ4PȄI&C:L2ɿݻo?~KDAH/2/|"O⧋aу 0Q O˱OF9$3QSoE㍿-5˪Yy:[1??biZU)uJCZi>5*`V`]?1r0A"'N&sa>bT޺Nry'&yMM u"~2jff~R7*U;+tjWfYCK"py$.*Ǫ/3ǀ &zu=ga`D)vVHMO҃B-Ho!n2L=\(59x zE&3U8G]k1aˠLr䆇B1O=u{2_ 3f_zTշ*@";RVm(BIco!"Cyl"sp_/Mb^dx+*\--sEmeXh rMDZ#!(T*<*AGP8ʁ^m9֢y@G? A!:aevG)6陨QD QIL8t¤3韋%ή'3ff&`/90n{;ьo :7lMJX'JN~j 1gW'Mxi" o~\B@Yw=uHd$ߑE!?uhu*րΟmym6B0h c LFh%'243[Q-U OƋs:#)޾ss~uO?m|V ϹP.Eb,_VBʆ^ M?7׋lvoϕ[pJiLkU}DH9G~%zI xix*^"G4={,gA/[\XB{OWr^8A0N(wD!ele^ao ΗȈ5bMVz7WyA@Rb~jD֑| BRɲP`T|[8^\:h|w8I'5bby-4r6mѼfe H?5݈ه.to_&JoYݞݰ pn;h-VwmVѣr}Zn*Y,[;:"UnDsR9^FwHypw{.vQn:X9iV15 gwл5$6ho)A{uu4x'5rfBz}{>G%rF % |zdqpZ> stream x3135R0P0Bc3csC.=Cɹ\ `Ac# RN\ %E\@u\@E\N \.@3c݀}o]s~Nin^1PBC/'Wual6.&.WO@.Ӷ/Sendstream endobj 334 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O10 @`@,tahU@p' aKB,N>adoᅁkCj7' @,MXcbI8rAKZGI@/iFEi3$'mi O%Fc&{&!=㬋)}F:S|endstream endobj 335 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 762 >> stream x-ILqglJQj0DHwK45hiƖ?&KbeU05QM+={$k$\̌"o&5r17r> T P)"e ۀDIڄfwf &IOc2mgvfdd1G,,Wo(aZ 03,ogRsLh=Tגo@HѦOER >R?tbN1hAP}]P7yplhXɾz+ g3_Zt(_6C5=HbKh= (,/PpI!Otlt6g[N:L_N7$ȦpʗS>|h|"̏ ބzܙ5F}6ӲFϠ|A}9/7K(V:ɭRB]Oendstream endobj 336 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5305 >> stream xXyxSUO+B5NxouED+ E MKI-{r775M7ڔ6@-;]\(>8>7~e>gȓ9{#' ^bΓ iDa$I㻧%o7;w r5Fۻ{z =q&MQ)˕)SgdL3oӳRRJK2RWg*eL%y(Hݠʓ*53ȔONޏ&$>-9 `bB/iJ.\1VމmO ‹IoBlXHN{Dm3. Ȑi̠(mEH| Ǐ23qϑpblt`]o_?ڄ3OqLQ΂Ex 9ul`v|D%`5OXIUTIn'k')x>A&h`j&) 3=$@C#3A$k5B&v@^7dވVlXaЅ+ނj$䓣lf^g,NjHtD_RhM %cq>E D6ӲjFP/ :)A1J.W6k1fR4a%N B'Vn 6#c* n%m ,?=&|sѰcxiX].4eEp9.x.S̉HsKS_ڑ9 [Kv5]nAfed*s$`1hI>:tnj{E:P=4м{o@}}~!X4+ \NWU2?w>!RL,aw&6Վi*,`|HܐIcL\wvA7`|!5Ԍ >yIpp?CbwZ;>Onp@bFJ2ȅlgh<$&73Q*͖  \vp~#gf*^pݺ̿iF|Ho;j5'aZ j'/Z&9 hzzdT$dDh8Q)n49~i6CvH??C®荛"{tFh6 Zju)QUhOSuMJ-]z@P\% 99?~s>ú98Z- fP*W]XZqB}jmij/A$iO(f5y2B(U=DÂ,=3 IV:m~B,Um/5En7ox+'H`T*g-Hj nePM)]G2Zw罤QHU EO%of0G+ )V&MG8SPEIQCe?܊&;$>EׇD|>?Y J})Jk:: ܩW3.?z4`vկb5x*@PhtFS޿POWsB)~Z}טZ7b![$4bѽ ?p 4(K+*Z[E#$.b:}w4Sm}\;&k|Ie3ƒW0UK_R+Wv[K5[n[O]E&qczxSBF)"ڐژGם%>&!!Py3X1Y cޔƟxHD)lh-ڑN-_,p0Ww Ak맛s9${ ojAuQ 7#e~/Jxi:EUޘъEx?$ۭn/a9mԕܼPu>tHC9'sC^Kj-:[vj g?-Ri‚+J!g슓&\w#[WX@-zw3sy h+XK\D_!S L=v% tGh?:w=HmM FjjokV9s}` {]k_[Ä%/CBqttGN.iG" RKtGuX)Ul92T ſE?4r6/Pp]mX|Ѯxe Z9|z,5ʲ< 5O_sb77,i8\&Kf)BMقO<_1k Ƀl^\ ))$o,K絻ݤ 4yڜud7t|&f/J:+@>Ahf]`<7Ւp~ qHk6$tɜX-Xc4 1%m}A+ƅ+4o(MXF=X3XzGfb(O]g Ec-< j-q79 ,ؼYVF cOr7&s)V8ovFb}#X!T1oWI.>L|wStĚMRi#r+@eZeׁJ:B~b/+^Tn|t.Wj# L{7p{z:;[joYHPJUz]~kG9;eʪs`脻: QDf\[Q>i@|+;LlV⺀C׉!ၿ%)hG76*EFzVYx<yCׂ?'D&v ]ؗ4Ǝ)aXCo *s,$\s<J 'գT4ݾ=Bt'H8y=zT8p^yVrUq<ޅEz+uwqϪی[f0|.C4MLmPrU<:$4CxdpDᴄ: S|HBΝ͊}TȠ;TCq=h| ?xD4Ծ7K06 _B{Hԓ|Jby~N&4ncIeŇC; ȕ}+ vma_.NB GP.8{j&spPgVY*׽8." ҷ _䰦Lw2!b}AFᮜ +dYFHڕ+ߑK@P?~w3AOWk5-Kxzuo=q&Nq އcOJTӂ0*qfġ;㟎L3i@?˰)endstream endobj 337 0 obj << /Filter /FlateDecode /Length 6726 >> stream x\Ks]7r+,ˎ)Tv2$5rLvDMҢ(K֟O?h$%{*R\<_O'^,'Փş\>YN.Dя'N>?A}\zrP(c~ '{m':=CZ~/+׻ovg>ho+_Da #]t*,{Q9] s_nؽޗgj{7;GߜAg>ڽYzYa |mbn.*DכֿPڽ/c~w8~,A3w!xAsh^)wE/[m߲(SW;\SWuYL:jarP=˭ Fv,>(O<)O4ܱSE[)a[vn'"W+FD XwTF f5[鰫j4j%Uעbpwr<)aI_^R5zr9qU+b*.6p <Ý9UZyӧ=qͯ]лUUxy,PMg>ڹh3jrV~/bm`] Uf_4 9[oy{+,0Ǜ^ҤP[[A:|Z1BtS+G[P+/x6K -N#ms0}b{X0g=&$MEm*orxe N"e^o;J1h fl:lɺdX ;Y']8UGF~Y֭]d;kxrY>\UVU?^s^2;I( [45(E%X6Fz eA"0wfXGtl4VF)KkHea_n ZIh%> (N@@Ǯ6uz]&j{.J9gQM&QܪY5khnTյN*$6!4F%6)+5U>Q],۴nA$] 2 -TN]5d&%ZC IG?9E  Tmyf80%Vv! H+_/O2ۃx: ޷}:ڂn(N$KWFȬ긄1H;頶bw{=1vH?2_l-PGICcn-^{}E"#Cr[?`K'|vS=az8 c.HUkbU}q22Vz:PكPbd8<񗢺#k7~WAһmsm/[aѽĞKfɾ+ÚٖBIMXbo$h$M `/m8 ȤnqE|f\*~Uw&*.l]u}m_>~Z||dɧkl' Ubr{Fg&!TBKYH!?9Gn719 & l90l+B)te^JKQ=ݻ'ĸYe{7Ēh=U/$&VzU3iʹF sr'zpV)T‘^K>U@ct.wh36t3S/Z\\/4UqAzd,leq aY/48r @\3@G"z7QZ&8E>%pM y+E)'$SP#n+5GҺmyբT X-(uF;%B0G];+Tܤ$TBENpbzxGB:8[`# ;8N 9䩢D|UVX)m/rL3a*=h4}`졃6F;b.ICA[?yBePL׽'EET' ]XJ7>EfdLlw)pZ6`q)P\-E2 *ki˾FUN 'E:&x-4\qo2^& !2~l7yH~}l3Ry(ERj>HC>d ~N |T2A<;bQwQ Тb,mdUzvxեYVj[z%DDrM<WiǛ2En$M G4$AZ4fIa$x|%9s3.c?ST 2#n/'7Uw@2O? bh/EP|/ .&+uå+3^A$/ꄋ-ά8IJp*D3arx,4KҍZ]s~CE]V#%? ^\@ ]UfhաKIP(!͇ZO= [̕ʪ,zw1FQ*eRLi7"lsQxo(*Ŏ ig-PޔGp],F6SӇ:^J j,,q5.zǀ#b5 "C-~nCO"I$[@2IQZѸ"=g"c5dm{Ͼp6{ʿ'& FRL2gma&G4 ;Ta XF(2Q[{}eQkC2-O0Dt3 ҞfKt .R,sKRADP!ϪsPeqW/(qwIhēT ɗiB&D.,+9&-OVB'GL@o5.M9U´Kg E'/x/}OيRPqޡK9x >V0d4~LWuLcsᅯˡ i]etsbb&+"ӟSa~%FmIhp+5``g-oJY)o;(&FS~irX[r;Q I$rxߑ'/|Kɞ/G: ÌWHijC p`btܒg-{yy| kq?"*.ݐL&q>y&4O*3p?V0gcF_'sK0@|g>Y.:׳Ʋ"Hl,V$; ]xQ(00]lu?V'oǤ/[K>V{iBw|0bsf)>jSz| y ߁NL _Lλ A[\"́UcY'D\xlI/Sws H^q:0ߛ[Nh>y[ ˼nu3FNa=9C "KIx4H[}kA^eX&}cӰF=Y֨j9mos6QƠNWb/ɍ:;w鏯S\L EUq#Ω Br sTnm'|l3h+z+藌a%{PJ.kn/Mvbͼ36,uxkgԕ^ `Z= GNv!&'dN:C^#|2qCSQ. aOXMjvh & 3|1/)zHrQL} :SA)|>S+k%P!v| _˃u -ե> stream x]Kl5idu;PW~ B#Lˋku%[m%Bs,ݲ*ey|AՉZ?'/xry}O\{uOӏ''/N>{ L8KףDDmNы{>UI1;|{z~G | !^a_m] B.=O% ZYtN@ΣsS(amn&ݎ J <ڜo=dc6*k$~IZyf6h+qoT.tR~ AuhX_pS Yka&,A'v{_ !&ŧn/E6wYrlg؅S[ )u9-lʳ zΰHD2o;a'r:``QdtL%{y忠}JYa}2XEL0 (*gu>OH?ψzF,%E=*t4U.&,!xkwP GG\;Yb٘^.Fhp2.49@_E"Z#uWzi Ŭ$^PS2 (q]GugO]:jk7s@t_kY+kZ( fEF)m+d`Ui:hoKh dqkǮ#t[* vd<-Hb'g˦Q 5"1`) >80DF7֧&8$OYAA&hRv*fk) B.n\y4:-{úcg8 LRTÄ5_ Ofh&M4l?47Sr95Q0ϙK!(FMZu?=k]" y9~]h|?Rhko pi{ ;^{BF9 DpG D1=s:mVR(bsE5Mh_9bC.tA whD)&kD#dp+`&^*6 HRs+Aׯz 4ZcJ[{ 9F_cWwӶ#UWfzTvU|Qu}2W@,7fPNWYߪq:CXQ|Ұ(A'ZVcCRӄlP!Er}&^j?~rŒ@oE\n pT;aپ"-+g|餠5lS!ty۾aB>%?9%:ԄE۬,-ɶo{C0Uu3@PMs8OuQL1Li:J$o R *(a4.A'M,1SZbrѦpG8٩2U}s.x?voyEAԈḴםUD7o_c jקx}4PYA, ם%upyK1w:{m]P};O.gM4"!3#V㮆!ccgUPs}z]36(#7_|q&+d21t0݌Tq:)EȩxͭMo#Gn152s=;&|Xi_o_uЮ% Yw1M✻^܀Wmqa8ԃw(qW)lR7R6 [V*!삗Pk%FG!젋 F͂5,z]oԶ#`mJܦyx~&mV".S] |^nU3 R5AQ$GS(rHg&5ȁj N{0ЄaKwh рΨNlsڈC-dϡ #$V6w*Wb;H6{y]=IXi zR[c傐"xGCxR(Na0@C F ${Ӧ- !/Œo wCأJ}m{>YacgOǹ ÁW3 1o H;#_e#c FWo"!(GL(TݹP zTqe=<@ -p X2AS0c#Q5򻋆$;j mHH%- ?R>ڈ=Wke_0 VwSTgl`<X/[ E'2)U54EZmާ*٫*>6:e7Vu~ ^JHLЖ) dI:V$K *oQY룅v#,U<_' /'|3wA_l:1\_`} 2~V-d>7vLJMB.EP8Z[iBl n h R"`~uZcջcAy8!7*3̄RH)xr50%((:2{J-;wed]Y iM3zcd*/" XH8T9̆ "t#F/qGB>m jS# !>*A "Lr % u%7ފ,zc--V@Xdt=h+R~mbaׇ4uJ@/1 Pa t]b :nB-Z5 KvژG 5bQ;%T*_6_1 ]8Γ"tY qCpKq|)o("&Q2͊~׈9L~3!ZX5VNL dw!/fƱiE)yT\OLuTG;$b)Ke!2O$`J"uwh}S'õM _tsWwM?''7"H5EMfZ'"~#nv"x紽]krNY( 9[ytUbV;Bd18FW/W*U*^O =|1FNM*P~X:kbIb&Enp7Mˤ x6e{Ed_=ľxzN㐚]}ޏT# z+Kմ5qMykRWL8ҒjQ,h~?; VN~'>:aSGם̯+s QuqpE}FU!?A8.gxnoX'h2؛]Ik {CmGa<~8K`\5p&wgn 2Q G~Rd:Y;IVd7LJ'  c{! 1A):-'DFL1d>XzNfƧҜaǽ&>MX_Px^a7<1TJE~RҼ<_ @.V]cm_5_%%$n >)#gWl%g4L,.mXb"؀GAi]OaJ|DZR owUm۪R7Ñ#y!u7uWp,k&KǛmXtJ"[ ,eUq5,œ}S'c}YX@eV\ KGK.7 VF$%& h@dpeJan~DŽq޺jdDuo3Կqp1w[##0EE$I JfzvP.%zC:BK^~* 'k,oB} % 9wUq,Iѣ܃,uC)W9"'jM-wD9Z>?AQ\"·Ai?dr~^r ډFK \l` !Sgvݽsk.jǧV6*%p}D -%ۋ-Dڭ{NHk NdۅKbPmi ڶfM V]UrBy?.]ge'5ݔ7˧nĴvscTostR?5qs57Zo"NG║"k4KnE XN^Xr_.+/NwgSl6a:IՖ872Xխee+vs Qz=S8xQbP\4R~V' *4=Ll?GmщCW$B{CAw??O?nA5BMiQ"úɾe\v p$$"nF %[F [ON\ RWvوV2zK1>t_t^ϮRoޢ}ԧQx^cil}B sr}li O迺hB~|ĕˣ{r-endstream endobj 339 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3087 >> stream xV pS׹0n QjrI })IK:f3X6ƫ,Y.[%]WZ,ymLٚ!BCCK:I4BtG8M7&3w˛5*$]4#=w*,3!_y# Щ(7oi Dk2^QfY'\+,~NR+o|4Ikj⥫ }TV?"="=lyAQ_VSNڢ(^/M5RLJ[k:D"&'/m u$XD-2M M??oW,\m=ī=G y.>9{> /wጤ`7yabYG]͛}n9[7yfSL𳫮"SNJcģA v|ڟdO$WPz1c:,ʏ51DwG puU5@T/s g[O'ʟ(ж77 rofSxbg(@wO<`@)XdMf+;a<ٟdnD}+r^*b8wHJp*VSc XPB{lKPE!q d| ĸUr'(\*Ah9r끲AϬ1i;vi5EϫttL*1{aN$\=4Tu2fNģtF/y3s,SwZ\F.O q)H@?]:f&{8aa qȭ7p&e CLA1쇃\aO2F "$JhD=P-$24{֕2Fw,*=֪M&O<kpu2 ɷOu竕%/VVvp^`j9s*(៸n~,@"sC pT#Q8[!mi[yVq#GWI^C3Hh7:պ ʀQ m ޷F!d1JAK)}}cɣgK55JZ{dYJW$cE9o \IƆ/Rj]-?CZ.ܞ(p4rp;b96\өZ`)k(ԒK%FQZޭ-:9'.} N;|5۶WYpg=yL]^~|\o23@ۖCJCd&\vew08MX,?$#J]6R<,uԦ.Gơ/Nmb^p Ĉ|8z ,Dǧov齮Ł`u:gб˷gWfDۓPC[՚v1Muz}>[Sj/Inю3P:{0^& \B+K>=vAw[(=3!Da4q?o~ÿvk3;{@j¯ x"O:Iɢ. D㣼+W1-袪}Wۍ$ҎõzPj{4HLh(< <Q5,݉iЃ?T @PdbvI1gQ rB^pK"b;Y >}Ѯ%ȳE]z(ڛnKh7vvNvL`Z;tZuh촱Jv;P2PAxp~L90>}YeeYn3Ik;Py[ Z\\#dTcwnjKwԹ@l q8wXm퀕ecx<e[1E ?PeFQpy =fQ]F"b.yp:Ix[{Whm;ZZGdԝ^쳂,;U.G>T4FUBG>j '|&x} g6Sfh>e/wCK%rtk P.z S;OT >S=|^vb99բvzhlސ?CsPAyS&@ܥ:NGUvSxROoe (} DA#M0nT/2T,O6 ^Iں~a,SL}<_\49LY 2y @ȡ[]W?>NFS^Rv'mT= P3-L/EOs^;>a?)Q/Kk4+-SX羼#=4j~y.hX7V1:[%ۛ /^y#y=tp&Ap* ]raaO T&wx1ț?Z8g^u={e2-eZ2d).ǹʮܶ m/-k¥dzwAglu00ㇺ7& YWfsc.='oUo}|tt> stream x][dqa ~vO Yql rz轍VڙiFZm~}Ht^^ur?pWw"2Bi/,᳋Q\ g5n\>l֘A6oqp<„>6GY9yV.SlZE9`ᓋͳ/5!x(l )6xgy,ͥA_!8屩lP^B>ϱGG^ 661;kу!K6۝npo~KɷV;\RfQ\"aa>(I|mR'v,0_JӸ|6[Fh)'Jvᘥ a#|Y8)UNKes=qZovv 8f<5R2xZ{Oe%I?.UiM_ƃůd>4 폰-U=m )DHV"Ȃ JގyTGzQ8wI" 18]Ol1xlWUt޴LhHH+|vev't 콛nO+K~³Cc(c˺2~ҔhPf7ЈJS9yPn>n2!Xw6DwIívPNZnRQqrb(n>8f󑰅UbC|ݞ}#XQQy N:3HFu)Zò.ӹ5lmZIONt!k3gD8`Me@}G&#W'w3U.ʦΌ}7 k:: &2M9N裭yƹ3y``fuLlȖ*tʽvLA Y_?_6c 3:݌'IC;ÀtY4^-Z4bJ^ˢ5!ZZ3(S,a +3 FzbDi.oWjոgE|Y}rlV{tVTYx,63{dm<ѾYaEa3 wq4@M,03J;69A8yLI mKh$s2b*qi>9sQIї95$+.4^m;[*$()]PHǧ-Z ~4 BmwʀYzOG7ON RbCH__`G3MP-(86TD>uuAo^F8R  W-Es.en&`ZxM1Q2l!sT<&t8KP | Q(8v / %V@ItȘ%(~Lr0F<\ ])!TKcT-Q'vA_x|1;jh%=4^A):7mV)[021b?_B@Yi'km]r`-Q"2 `π&pdUKT ='E3t]>*H BxRMcaS:OĎہ&zc1Kz&=ݣ."7 ap0c< jF= Gh}60%DZ/:`hm7O ׆0"XVG6p*Nl<#13UPl03tqYYE8 #Ԇ)txu5+Tǿ;L1MlEР;HgjrWapW`%l>>ľA  m,h-- f;TnrMM-\tV8fWg4z@"z* $ѸVKs+ l<U'rh0@UKm<Q9oh,Gš0FŢH,X3݌fQ'h<$y,Y0-wxΰ@œZ?hԽļb\' IQ&0d-Ež)֢@^:d|>nр! he!-)=ܯP z,1,x85蛉./} h(6gY5Ii%l H'!B]e݀9@jQu}\Yi2i0e_Q;Z07,RA; u)>H9.I8mF"kieUwkGMRQw}ӲIq,%ظ"Ί/fI_%8#B"T+OS:1|滰6ço6;O a4`\!ln~M%Q-*%]_?렣2xX>_TͽՂM" \y?nsr, ldmgX>. HBxVC]ֹAD*u;%`l&'p@EGTnf3 !%X&0[14Axjӷ^u3{]0) ۃ0arZYzⲕG`;ꍃmMŝG3ra!xOIZj[9Qf1!D 5+tG8A!OSBQ`s*jBVIY4FO) 6-Ņm^i8ɷ7 Я~h8`8#Rg@Ot#ıO![# Yy46(׋}W]na!?rc۪oY5s r#7LMޤPݞ w&fhR)wU27ʺוr0 Rw܋ږczXHMst+?)#bĉIɷ3VQm?I+B'}GHP+",G4-Qx#RyijYG  23,'x&Z4 嗤b\011:bF068l +|vXlFh/D:ZHVPhFi`-3-A \Q*!bUh֣z*,'( 4aRJE`Lg8̣!H~)U6ʻ>OG׀>sa)ާ\rAEx %߶c$/l`hS (ICw |¥eM7[v m4=A8E1SFas,NC4kNMien l?$J<:yJ5frzեROSMV%/\)|.?KKDTmI<BdF]ZfQB^]2ݲE9e"$Wڃ78c,LrŘn1KV0,_ٮ}/ثӪQ ڡ\[=FF;{3%zu+b I\xMRuJccUUc9Ǐ Q`cjD7*/B: 5F`sIXgqX vua~Od~!M|U,ʙW7.'Ex ,|zZ>.8n>D0sHkdZ#AesInO;zjbOmnJ}gḷC0>Gd;5CdB_Ve(3v"ghRPx.|ѺK4 5}W#ԧ~rL Ҝzȫ七:GqސB).9xhX5]uD1F!L|%xl _V^K)qs`E[L U旕54[1UV/֭ ɽX]s%aBV Lj/.8VuddzOb3OYaSlF+Z3 ZAzoa~~khZ`#ʦZcFe̺eVuɊ[" 9^ˁR@Eh IF# fIhhpYHz3 ./I. G݁Nr7AHnfUD?yY|վβpGY@ZϒSTH*Ɋ,BD5f#iCZSz%qoDUG$I&E|6-^/`rK"ڠmZf%X>{bM~4۠w z;]k4@E9oYGl=D^B|ܐd~Q$f") I:R`(=nq [MM5)Wi=~)}.rE+,\{'nS)W!MgPvH]DZFkQ)G눜sFb HLj:&">$UDTq4;F p.<)-&!Ы~i}tP 9FJ<b+E@>]/Θ.]x㬽dciU;~mЀ8{O`X3VEA.k4_5^"(e{ayJpetMAzz)"0RՅ#:]<@& G@8\c|_>e]f*^@.>LQZ&ASǙdT'Ϟ"91>.Ⱦ.㶹4PDx,_Lt.rTtRkBlhPm WBlHwʄmԋ5hb(_aͭ-ӭZPVO$?R$^ޔO.NC<QT*nY*,v{v3A1Ak0jnЊ9[i2]M3pЩFtOcM3b;>lDø#gkVIQܘ ANfWTISUgɹ&BD}\J^^eŒ6/T 9>^}L*u0%\[|wo}Ix%[%B2#@| `X 6bY& 8uNmq8qj62ͶϕT=5Q7dU&8 '[U1[Rn^'Ub<,< {Rе#94yNun:L-z&iżJy~AŊޥA#zMm_J(k8iIJ6wՆYW|GYL9D`*,6o О/ŚP-HI xĢJ˙f43 KԊ0B#JB5!*5+43_UN+̹&E"(٣͜}B`wMh&/9OTa7yfӫM8^$M'}^[7]~*uF"p OaŁd$9~UNس5jA" \Ȥs7u_[PjB0s-EqƳh Gv([Bυ$n+$gBP,4a]C/"܋Oڝ >Y3~ y|tI^#JA/T/ݴOcsx clmb6a^Oh_AŊb8a]=Tp0SD <3}jAI·gsBG+w5AaG}([ @b/j@ yq敇%p)BL=[ૣ>RXiPuJX/n={D&IU[0(z&:"xߘ {endstream endobj 341 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1274 >> stream x]mlSeo1.TVֈ7 ! !CD L@奌u޾ܮݺ=]lKcH!A7!!yr9ɰL&76uZ/,זUaP.ұ+G賨9L.u1Zhrc&mU͛k]zQע 5tV3Er66lZ2TEZut٤5i)]&iZriꥷ̴H6R 10[>jQXlldwɟҏĀ\=)4 BQ\H<$' f:lkʙ ĈnMJINs}N =}64AebnvwAnhz%*pAIݩ3Ue]q_? !rO%T?QHҡp$Q)DJʐAۻZ\1_bh$ C sC @?ɡEI ;K܄۲or>Pzg'Ni qCFԄVG#ˬb{'&' #M@*hK}\.ށBݶmm28'![\#I:%ݖ}Bӫ(Bu%TZz0:A8` uzñMh3!EzT$? nd6H\HP.B3RTlj+f["1t 4Dx.r.ݻ~3Iwuu͒ `_߹5:sY= ө;Sv3WmyU8՝&P4!"< A[U+ sˡU~4q0pN` 6κ0yq^'a +Yq TRrƃ0f!5AH;g0d,d, d@dL E\VԀP4@"[,R%C~z R0=KکCW__FYͧ> stream x]10 E"7hVPe)K.NI'N)B ҏemw]xq^?pƺ!ר8ZJG'X^Txd@髚UmH4FFd1F2t_ I ,$+I]U2 *2'(3Ϋ%tzݒCP:Kxcendstream endobj 343 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 688 >> stream xUPKLal-MPv@$PI  i4PXB-i(J))ByTƋ&K5bx&Eqb.B[f-U!>1Ld)S&eijqn!A4X$T'Mp|&I2r/8*߬O|r7lLf>@{eH"bȚtҲ P }$aWF!_)_~᭴l&{RNJK$m{ظ':kNSI6rbi!XRd_tm88FGPQȢQؖZ63ճղVdBGoendstream endobj 344 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1801 >> stream xmTmPT]v/6(ns0,b05( B$Pv"rWYdw,ߡQjM+@Ӥ 6S& 1\8ӳ*:q|<=M(I;g}oFxX?aoXC(@qIX&.rvSAJOUP͔NQqj/G :L'әIzXTPȩ"TMѪ j(_Sک u%bn}~3" 9n]UUU>DhLfiQ8$`b8;yC!](N1soJ:L^ٛdn>V_nl 8Ha25p[P˘څ8BesMl+DgE9%͠. qF~w"aJEJ|{?~Q x`'q͹Z־WC:!,ص+1we{+-`:t)[HL02" (wHr !=E Lxd123#4r@9Z2#W$K"ayŠO|>Η>Ec$4FQr@l/po_VB.,HXb\6͙k |<R)nKMfjM"mɀ9h^? ڕ9hoCmD2Fԑn@J5xM#5| OM=thNjkIuj W U_>;SYn`ݾOpUƼ<܈r s&`Zmf*/fǝ/aSDY661fgOݝ43Of&n{ Z/]:;w7Aeqؔ &'06&x 4V8W5f+NA== t}+䂠fdx42{hIr~T:~ U ůQZ}> :q$Z[ZD |[?v079+H_3 S.xq&0v`o8{ (rn}N;&o; Z @c@ﵹf՗)"߈2k4A2͓B1d M)Xڧnľ{Ix#J/1J1%0vVe^?Wնn耏YU<~%S,C@QKx5endstream endobj 345 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1144 >> stream xS}LSWG TfcFX 22CQ@ KJ-6YLUaQQ(>h0KP`0Po3*>8@J׬ CLX*P( nC.D7-ij%̧r |K܂BchXSJdj3 Qdv7UC]yi&~g7$L 1ʍ܌tm,(٩k PUe+j@? Ul2z?O57rwR1073hk0Q$IYUE%s3ظ쒂X$'38rW= )\$J` ~Dk]ŸzJ79fG|빐YE>(tBۛWu7 8AlGa3jo$wڭo;Q4F_gN8J yγmDY<>ih;)a?jquazbf7x_K۞m̷e0sd@_T8fWp#IU6b'v m 끴-|9Ƀw?m\0=}ˆ9`hNgB$l$Rr]uȓEٱo1RMg7*A'Ay .׎VYee\Vpp x}E&`/t5z})0ef* M|1xEo,'Ke5ƾZOAuT]Dd-}56x(XB}3C#J<> ~4.mJy0; ֢]bNr~ Q._k~pF؋={δ>=tמp^R!4d;d+Yj՞cWH XR_ע$;{ѬqԫE-endstream endobj 346 0 obj << /Filter /FlateDecode /Length 6711 >> stream x][\7r6߲$0:ok z" Nl<ОƲGYm"y*Kfc|XWRo 7W{o^g2qSstsxAM?>ʍz.lvs^ Jht4֨#\ؾU09W E&R~:/w{` BHWTRfx+Gyrb/tT`_6+Gya)qP0TF)e&Bmz"qS{ݤ v  t~nW/pmQ H~$|vN2#Do#l)܄33|bbópq]V3:c ,Va@XP'f=9hx4I ,7>,9r/3w_.9VeFNq&~6+tD'Dw9Dlu{PP3T;Bg&nd&NEDOANq;a:Gudz1n Ƭ, ܌Sx}4ä` ldғI݂OHYLmo`D݀Q{nf@|VYש( W`߬/wM0Dkq=",@C"g':Hr⒤gyj7ƁC4n٘b{dPh,2#It2~ZaV-"4厃'1'#T`KF@웉NHBE_w2{օxl6L0OH}wItDH.s۹ăbGѷ8Ǻ(꜃v&]0)b`HBuuɳdI2G78ir(0!;zW!>4j.O ^3ΎE@4Cʠgq]ܑSwZRQ S>"Pg>dLzpФLI\ #<2DQ]Y.[Q4 "ƨɞ2SEw%{.Q16?DiY~̞|D :S"+d__ŰLl|7+;Xy C,/g/8+mM`./,F49/\_ 1ʆ V!m{YmFt&P Z]AZ8ϱ N*ES4 S[D1hDiAM rVL, SdERd.@̊g0`],r]f \8 鶬Uj"o<7H($.q߲4q_vFWVaPhbR^F#:<԰.(A43"Bq\sf:Yc?_btjQ.(~Eu,Xc=Q  1h_N;) ތâWe[m%la v=ByLs(Hq#CS)>Ž!JJ=,\5FN#`K^g.) MJ򰴥AY>Z1_ftbwچcL9E0u!&io#'ɮ1&tiwb— , 4MnE=ذDg}B&W)GUi BE.L9Vi!)#*a擶?bM՚t P4_P6@2[: |b&9Y$D:<իRJrGKV=Z\RK"A~v eer' ә+v;82;̢ \)D&Q5;pZIװKUKjuJ bCIGZQ\t^4 |r|Y~>35є҈ LkL4`Piɼ^瓬T-u.)ᢽEDinx6*8JPB^\nxD7TWLL)-j s]߸GV3UUnR(4UKAxm?_ٶ *&hmQVD-9YUDkH>lvACf9 ?ɶl~zPB8Xo )L!1 ȕ[ ]" ڢ e[A,/Ժك ]XUzeiO(kIoJCAvvۇOH;wK,W͸hT~hN".ҖFN ѳʹ#1;!YnRQXѴLq#g/3@u2]m *s(*+^g#t5C)#Ww09$OKe? m"ZRZp~3ʥrVnAviҚ'Rk(NV+"N`͖zKB&$ C>D*"Lu9Lev)uM )j#Y˼#^H?jG01R܆LƁ8VFEr/ H, d^aڪ*y\5mgY~9zyէx>_2s2I6X_J_twŀS'SmKaq\ۭ4!R J]ʥIIH2l|ߠmUyT?r' csϨ/4N:7FX@%,Zd0 9(bl^a$swB@cm҅ZQcCiwR%JY__lFW]7.u1rޙtPƪ?W3u8!vcwY<c.FĹVc O4 z|{' MD'<%AjawW%N]V"_Lj:1qzIJ}dWMtI$SqrDuuĉv"L'Φ/泪_ltl>՘.e] xI ړPD&'PMp1NO-8N]f($9i-HiFI\m X:W4ync| .F?|bjj.yo6ausBm2Kr84Xδ!$R8+y |}9$q%%Xr9lHzHdX~՘ )x)5bބK®{ƄH='NtX "30[wF1֗L}R 8AdHU4i&'$)I~0w_(/5w+Ǐdi#"wqu~TpvYnw;*z;M9}Ё #e9bs(ZB(vP~'ٝ|r.Q aU6DM%ܽ*OaVMhWbK. p?pGZ= aƏ(FY!ŝEزpYCDOvg'M}H!sH7Ӝ^8U/~ k9LC nH5*DL*xrw B|c5/219Ԁ<-o|SR)ϻzWhAnD{T{D _7C;IhwD)0~1OGլ=*2b}x `R"M^ vbVHe2KhHLxBÃMYZK.r~ -?@T̃ҐM\cs0S& Mjiѷ+V,W%Ht).GEWj͒8xM jB{(Iez-E@;p{5{P(Ay*K;_сFi7?Np HOהyI'^IJx. 62~/k8]dJǝYVtCƤGc^- ^-[-"|冀T}_#lHw}}rD)Pfl gK[VRyn"n_û|oɝ2 Ox vz7Dy%ͰC}{9)vGDlxەSC~wsٱi5`<1Sjb?TՉb3Bt - ?Ml#oyifid=g-{(FgUjk>6|'}d|MD;!*".0jξˌ]Ñ~+}sݹ0~w~Sk5 utQ~I8IlM0[EFzxǐnHI U#o%pi* qˏF£x Dm2g.e>V["oZ|= wDdEy8t{%2AėG٤5ͺ<)A*xw n)C6< BS/oV-A؛;_4Ofq0՝4'.LP!qw/gBvy|endstream endobj 347 0 obj << /Filter /FlateDecode /Length 7073 >> stream x]YGrb 6` cyd@z%ٻ;@C )qf(c;"2+32nrH z`&+++22ꛍFGg;;o$qyt &?_Fj=x6Ai>|N Jh9<%Ji[)4qG/ &wM༇/.a/qJ7n^ll4G:=Tfnnv[Y~Fvs D|gLi[y +qq!ՙ(u(dsz_^)wl7K(8 E% 㚿ּJm7V;-n0^cnO4rsL{0LW6+7Q\4 +oe]YTTf{Wm.u4چXJ~?@Zr!lvr09;;x]WBQoi3 a'[KBal7?X) Q6gɗs*s`gq'4_Ařؾ}2v4(lT;!'N $+ar~Wy)ߊ(v-$F",Zq¹0C08d¡nI*3@BJeE DoEi쿅 !ͩ+#u_f&md#۾4kcah#,Wphk. ynwDAF%a7u, o6Ӫ!/ F9wJN|RQ'35gde.0o?STѠA\ӮnNuκVk$J>L׃p||THu8@v²v:{[6)DDNL[VCF}DqۋcO`SޫG>,| 3Qc~{b첈ۼvdT! qcO^􆍽JS 9ِ9kD1K@eVz?RSd8DdXPɐEb6:Da’܍쳋j|ko^e02FW\塙bp1xyք5So(SgN*ζb+Ȟ;R @XTJfEF:к/uq4׺a *luF)S꜎p2`EPFς u:pIzĜE$uǷi;`{KF߁w;-#Ps0$ʥ1\>䩜G)˴{icЅ0`VZ|\[g.P!&L1æcjE !fTd Oz`0%1H_/0383Bov|4mAHJA=˧Pٍ(s fFpv1D P8alr.dd.`hzJЗ͔L])K , ! W]D4 0I@:YԏY(^$~Cd H!7Ddɉv}O0D1:F*#&tyݘzm b#1b+rJ-KuYOR(8vhze{bztlMTP<$DYAU1)`_]:a㔧I')S$ѼYHSD40hĒJLT'f v]6 8Qʷ^#cAumIz~nj!-yZq8š줇;۠t{ t4`/Pq)VH@[[! ܍'UX3t*F N)&L5ZU1utzJ/IgC[Q1H7}U%]5M'K𙲴 |+M_>~XWޞ\q](/d'Ӛ J }{AyTJU6X)V6$܍wp!'l^@b9ˢGGD bDɆ ܲf ~9Npfsg-hPd4e$Aq.B#8(kFP uB}Z 삗.$kf (kbFkDmAv8f>8?h/3&'8A*_!cMCЪ R0Cbv&4ܐ#ՀI 2A#4lxlkq-NoB Ԇ f&~p\Pl0Y*p΍Ab'a=F +N1Fqc6"/N/^bY `~ Zu٩k\` A4 #p)@kҠjɛsE&WCwWRhf؁a M:u0ЮM1(;Vad&˥02Ld̔ln(KNR. Ά-$?utuMy[^>;C! ΎnRBJtsTUtb|v(Sb6J1xBȅqH qlK%;['|&|GƱ3G[;`9ߴQߣ=w .p|c1sc/m<rJw4fa9招A, >d`5w&JK @YRտCW9)0x7j@{0cR zU*rͺ-|A`T]%yh4 m]p\PO$/)pl⹫'*95Efk%Aw"d+j:(ѫmp?Tzw̫&N#u(q _Ę% q!K=Q*&.IKަGF^QUB˰S?RYmjgЮў-aYi"bZW"iQ}O<5=Aym޸&E!˞ly6yO[ler)4(jq8}Jd67\{p$PFR4nl%ii7bI"LB,+tYjM x`gC ߋG@Faz[Ի?{*^T{E\ωzSp_@Ø(ŀM;i" WD?SMtzbT2hcxh!$7Zqt1F0#]JĆi((\}7E4 vϞ5~$@ o%Gi@M<ﵒLb{݁2TjDܖ'PgϴCݮLzP ƂfpuΟ'-!SM"'hlBxc0Rqe>TK\;xݪz^gB/3G;ro~癑J2<,)ݹ%.ȬLa-]zCRx;\p.2>Cw(1e$O[ 5rjpeqbq=V~CHS~g|!V| * (᥵]NPN:!o/5p{I<ݬ^ is !ӿCf#VM/Š{B﭅5]@ڲ2Df_ QpX~hB6rֺi[ FolEhǕ:SׁJ~aV`g)QBU7MSF ;_{hZ2F Npp_j/*w˪%ՑoB_Nc+x<5Ꝕ4W._ ڊSRioXI]/E=NxJ8}$`ume"r'H'\"i-m,QH'~2Ú36Oc4mZ s7G)-f:D+OՓ"$:aA52olO'z i#:dK:t ɈtK PbqqΪf8|LslS^:v՘mIhri\tXF؏m6MQ:j#) ḙl't"!vˠ- IbǎLuTȮOsδMόIL<XAg!xyGmCjSn#rH]o` k=>Jm i9zv[f._ ( c.aExJP]:SShœ t3 +߶"i/ye5_7ׯʯ˯Oʯߗ_ۡd|u=mw>2;R5=};oC..) vPūMQ`ڏff%;/)t#2}{$) ^H=TE-vBË4^GIOnу,tq1RR&ru/ܤEly,VLO5FȼtҪta_=drfgE~%s!Z397,|IQ@tvA3]П!ޣ(/2ϙ8J{&Tmm̙#渳]js=]S':W$0pܭK<M""1kZ):dAa> 7~\b]6M{ ^e'qxy)|5=4uo/\|XEZ0*b^;xN(߉ [%74Z(1Fr9mr N<_Y86305s5;1$y(;T'2H+չ3#3RO:SƨCY[">vXp{o쁘>Vh&uڜڳ\o#j$Ŝ 23:dBZYf SɾJd?ҌN@4CUՁ;^pwy踎}R&c٦0MV$n*'KL_]eX"fc]Tu:PyTcDr qa "Bj_@ü}isXAG*%vڀ("l͙NO|B߶i@]biݨ>'iXR޸w@"2%~S)WS>V*=oUOv:nՄ "&_]A|XTd=Z:{PTVFTX`5> stream x%KSqƿdz,;-Kj~! sڍib54<汵DgLs%P iŹ $/{m<|^ JEQN{ݦU3%Y\XX\I[MiN)F)%GH˒ {LfM]endstream endobj 349 0 obj << /Filter /FlateDecode /Length 10507 >> stream x}ےu/o0>gR$ ɔcd"Ž  !`(rd}kgUfU@> yϝk_R[n쿯>/ܽyl{wϜۻ~! |kז?/~ݝ Zr˩\}Hw/>_ϗkh1Ep\[}>勿r*K^iݲvjT}ꉿ:\ aҐp]l6)-r:ڊwڊ֊L[V;$.֚O n]5|ҿzmͻvҿȗ%4Z4iwY}qs_wKչkr--Lj0G3.z-5^0E-^ Eb&]X}RkWWBثJAB{d@ʔ[]<ʋg UvAwkM\(`IE$"sRmުWe2J-,>Jߒw2d)9^M𜧲,5Kd2}U!yaoMM ?ŵ4=%^Q&~mJbUkV/S(c9Zn-)-y.w*Q_~"B9[f3d^(;9)u%8RtBew$ 8.GT\E|qɗߞa}5:~5PwHdH 6& QmSH I*YF_ 1ý:@RlRLM xx527Fr;EAl nЖL<EI 'UNS'}ewѬ)v9h`#яW)Eɳ~c'%UMw0;$7rR;KiG}R´>) ,򮟴 b:-'6SI-1.dSHG]l}Sfvh~MRmUn|tҳt]ƞr(J$*kΉ0&6@kcy2 (2>BSI{?ؔ>SVaZ]zbԺj\iWwUC]ZT$4N#vk (di45LdFe/d.^tcRT'"~ )׃aVM.RF9새::s2}fZѣ+׊ihu0mZњjQ?_Ppc wΔ~4mIMsLJ2v؊]wV4$)&uVWuQؤeyh]/lr6)T҆N}U^oDr?Q n+Gokk1ay͍ f/hU̥g{++1b ];{6f׺#`Vھܫr?|q40 蛴ML@rj⠋,<($>}Ytro׽-<78=MY֔`kCQݦyxCHR|-

Dj8 9B[֓Udճ|xuhXSyx%KًBn|VnEʅxk}Qykf:*l0^^gy sr?gR)9"T?(FA8tv `ѵ3:K2qYXI뮶YFۥ+ a/ibuVʟhMLݚη} 4aɟ焓44J@=‘-􋁂]5`""$v u?R].=) "d NɎvLc'<= ;țWS>tv$ MN*(jV]?͚[ۥ~ @ $hNȦJ,vqτԸWNTaݔ|fW1C fqLW4r!ܖvua8؝C\Vtpn.⢐mG&j0U"6vwH)S[rsO3Nܯy+jІLUkc7G8w:pxDgi)Ƃɓ%5#$(^C!,7&a m_ŕ}kq7't?Qs|ƷN7=H? 6Z/npE;W{͟ öVO#a2'Qg'2^t{1XgBRvYVڭz9 B ^ٟFv~5KiG'.Vsb7#͟ʙM!,Efzw zA ݫ8K3Z=Sy8!T}CFE;iHԝ:brsx4AV3d> њ]SLa0pD7,YԨ;&,)}8IGj0iL`Zy=5 \Ϝ7*߬%1fNvFj [ 4ƒ}ʹh,&6^~enc`n67k榞 2a=u'Yj8iCv&taOXw[ѼM&yQ%uoCz Mtu<8~~>96צ!D+Q~T{oBW)Nh 3Vb* Ki8kx'v >݁k-&ciL\R)g%^Ʈ)$o뭫Djacj?𽣳{&>%+-PY9tKv2)O5OS,B7,~t{͒eFgku<:D6;jh% UmŰy0n6}~0Wg cvh4pd"?iN\I[p bsPOrovWAp0,b$!6 T|jcXe1F7;2ة2C `UB{)7*X;J͓}nuS>Ф`+ ÿmx?R7X wSKטM˝]˝xw~ya_ysu3!C }w?ˋ/_gN~0J|'CdFd,%)*Gm"2NZ}W}dkҺ7?o3/ާ;滷τ/"_?I Y5]T+ .- irz cR[:}KI::ܭŮ^Cl̈^B_Gڒ|I(p'&oWDH]UERŌ{GTMׅ1!c,4ȔJN1!SS2ʈLiCa>rʶQ Iw49Y6iiRk慂ŕ$IfOD?CrX)~$FXYS #L CIb(OY"F%z & Q~cIYZ*.>EC"1q%sHV'UtBRS؜X D~q K$u=6Ώ'L#z &,D"$Kxt9S+ӈ.!Y"Dd=jepHdq[‚k(G.DnkXROD"y-_ Ǿ!|(ˈcAYT][80%4߫ В4A#`fQ`qB"腾CEDvL %DIBs^I[(QwkawY"<5plխC 54UkAGeɈgQ) }w՝FK$gZIȷeAD%\ݱMB01"B]#x[qD|1a)]-& (DmC O$kB$(4/6QdhH$G"T$6+c! ? 4T 79"ʄp $%+ nRxZ'"]KeˉҰH$<!,S#ModG4"$He.صVWc쩡0Wh ,T$&\#\ 6>)Q$06!\ $1Su,A&`H" R,SE5 vQ4 WQZkۊ@u'"-H4+nJ1hsDr _ qVsd&\b+08*[D,vEFcX{$.H#"AfH1(iF X`) apD G/VcbT"#D<ٱՖXjE{-T5VҁWd':\"A6[8#f+(Z"sHHBc&"n!ϥJQz:@L%1Y}}- I$`rqS[yC򵾆ztD$Vh% [AxP&Ņ9 l@ɏDcċJ5QހƈQE[ң \ATN\)f jɏlgj#IMxXhǖm RLC=WL$C8r ĺEUMHC2?u o",)L>MS"FbD߀;DC2$ {0diap0!@U%471je: k."hHPGHWV0={EQkH,dL\p+̦RlJ)HbdS#B8H 5TXU.5PL#n/F"=DxBCQęuE:P(Ěmѣ0dsYGP#udRo=e"bo =f*t#b E沭h[5l&HEunģlZw3w2V-*MقF&/ݣh#`qlDê ːc^ dhV>3YmAղ@ss7iQ[SuQ: z.FE"6OQ14T˕a "t(]Nʙiy0Ѭ ,eL6SbVM4e0 1Zȕlzlљ1-&t˱J\.*=6X1++CFǙ'eL'Xahj$ZM2Jb(Bt! K 'NX6@~A%E3u%V \Q A͛"-u2I*2Su - E#SH+`޴l@J~KpZ8FbÉgt4WiZuf4.+2WՄs9hp+$,rSJiDV$tA*4$%$Q8YiҰj%*/7ҰBĿZ)MVZFêUg &5u津ljit&&j}S&H6!#ЎPXh1D) +L;g\CpCւBx[SI8sӮj5qv~x.,K,l&U%[R9a%7-@%h^S "TD , "H@:e F"jV Iͪh<˒.yXt'8#@ Y*A @R>Y eM&Hg\/A,7Aث"Vs.jV LI䪾 Hj RLT51)Ã߈yMMMAoҝ԰$acx76|Y6$(9k_YԲ•NCE~hO#b.p ކ8Ef1OBWJ7 HFدTUfUm"T)*H鳏6ScW6fr#T!;?a|Vn?iVIګUW ȧbŐB@AhYLr,sPcIfΑ4ChW H"9GtD#Nϲ`Ajow\P7VH%^}&9fPllD![P!;w m%fwu5S!Vh=D"?ToZvUl= 2 ֭xjl$t9">ūؘiݴ!*vTHbJǜy$3O3Zd.)w^{yCCIu<E'_p(Xp$N8C2"ER ULNG!G:F$+RWԡW,WS-\p$#pu_`H\E jѯG&/Dԡ%=-SG^ "Ssf"i`@hItGLjxF$[ DW1#,MRt^"4Aw LԸ \ ۘDKB H4*D8Zъ4K!TKiE,Ҿr G"Ѻž,xa[jkhŐR3+ ,7o}2dIԆR$s3+EKPkD sA"R 6媜B H\j((-LMTU7gˡ^eWxfP0Y@ к8ۍ֕[l? \ 댨@)K%Z4%GEW" Zr\0}Q<su3@J# 'ɖ_ʐ#_",'8c Q+^ǒE"7D}~AqD1 E6Ŋ!AHZlfMɳh;JdhFH`l!02B3ŢhٸrŘnC1yӂȄ4ujpR@*,,5(WNVĩZG07]iHQg іІd#hx1?-y >[+b|KWGV Ri JЩ xӅ骬М g# WQ5BH~eGU1j5X6"Ԉ1vސ6Y 6d~lC~w8$B&w#QxZ"pHV1BG֣M 0)y1kfle?f69/oD0 4݂BoA-BlǏ_/_>ק 7!$<\+yק,~%nX'UDRU b96R/b%9epJSjZ_,VVCBǬ_is/^$YÌ&U'>JE[XߒZMÉ4/=$]0b^Jmzb;L< iΟYmo(iN\8oN{hϻ3{}+ۍoxߩ}'LWn,6x{SxZt|^(.6>Ag/u/>v+&VZ⠽Yzu_AOҼ*z5*SU$i|< Wl"4n+a p4vW?6z/!Eh ޓt^?J!8P1jɜMc94^53[Du\Hi2؍Բc><ס-Ai5MxL.+-^8aa<Y><ڦǎw_?m1?OKz_6v~؊fg@m&E-}Ƨ{xY 7{!֋i8?z]wG\]|A >vܾ p = ,')=c3yw3RxSZZ ܦBsZ K.|Jp\0ԗPN :q7OY'ey~|cԫ':;MxS{7F'\"܆+%Q? "37/uwhCOA+lI)֕}Ŕ<9bJ‡TBC3DfτNl-abFG 9{!_ _==zO]<-7 ͇Z9^LŁXc|LŦfA>Gb@mzCݹ]=b+h0vVnK+%qyBH *ϻ꜅W9D7fZ8@El{#ڔt IzR٤ULꆣqdhߓ>4[~{">ağ|qEߍ|w3euN?[+ {ziʵq~f3#{yYO}I xɧ^SO"Eb:@{58\:GR%-皞0κã$3ۗ`A??W۪~G~7.O`2>œ^^wo]P=f#giV9lQdƳ[6:<οs?/pqM-(cGriwR#0N[C I:V> 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 351 0 obj << /Filter /FlateDecode /Length 7541 >> stream x]ݓqxS*yJH;]N'ˎY$ROyy,4q^L6F! =W1(>b8k OHdRON:;]-Vު-ak|%xRKx%,E^(<~:Fc4)&%rw(n{! gWHaC=co޿Waη+1'CtFn0ݻ'2GSq)in^j&]{ TKH:>ؽ zeʁ_wBYB9|c3BzypZhI.t~C}I C`O;1p@* JZbHOXïxRA#9I`6"rM)aߓڨyfiאb{X tS^/^>8 vڍ jwWv6{% -qwZzB O O˄Y2ߦiy **O0嵛'ÇI߉F8tu?u4X{l!((EUkkk;$Ll|D#RTf~~ښvUɛLC@eds:b˜2twt-&MP=[J+ľ쇑Ĵa{6Dȑu_ ý`҄OBB7D͡Ci|~Q `XkѐX:>6Fuzz~c9_ޏ{LS w|" q3!>]t&IOɑ.Rh=Rf}SM\"9bLXmVfWBJ+ظ}|z> p Kᡐp&n=PKE,81>]V< z +( mc`a v-él HwV̜[0,{}OeEtݎg(hn\],%pƱH3UdYXc`ք 8?j0G3Qmi *Lw)WؿGDPJ_T}3?%IQP` dvV ǹbز#R5Pr @\_&b.7P܂>9],,bpOa>+%s;?BpwGD Xx`>MkHݰ?(whK?Ea<`w@4(4Є[uߥ>xHlR2|`ǒ ᢤ<cVP%I FI1"3Iksq{T&>D(ΆԸrH $UeS:\VǓZ>9l랶rr~ ΁#~' HnpĂ7/Ϭ^ZbK0aTyvR W  mGFņ BAەB͕ѯ"YSC~r~X./ t6/Lzypwua.wcו؀Xo$Mjw Hl~ѳϷIl(Js-R[Yqr9D6"Wz3RrF{0]n`?~>^k S >d^5T!EA*^{WCv2KUף/@ zߨW:THu1d{MŨ9yu `U<5QcU N8JB 6@?lyy|0]`v0)F{ ClZ2оbQ+bpMa}0ǪX@6c8lk D̴D-)Ak6WE$Rr+k39o&<<v!غΆuU31ő5VuSs([e+WHzڢn83Xisr/9$+r*몠EPZh: LM+EML5Α2m# b6|/U0* (2H{Z r9JI-e-OYsD$<#|xZae RřCm\6D9?ӗ1A^ ˢ[Л >c7sor^0qmvlC3/M:MEQFtmu@t }z#(yTw6gf Bge/ hYo^W禗w֦zDfǹ^RM2M ^4 cɴW!uGZ9﷾:V|Xk/4ع@uAh9y6,`}WYXc9Ŗ`҆:i4'N3oP99[ܼf}&벟D6/d[8Q!R8zSEAĢTvuX^3 =a{U}*Fh?3&b,%b L+ [S #~Б?a=5cȇLؔe&eյ,8~J J^}Dg4etv}:A ~tct]RʷE+cб*H&~V7aHɓD)^t|HR(2g9iRƞ.*!*.Qn/Vc^^f'E.wt`1V71Wub)cz斁QE_߽\ELIerPt.ކZrnբ aN J.z׿-1&قU ɋu[[W=FP*?~V~tt/hGpKǷi1q!02Ժaϖء//X/񺀙9ԛUjR<ԹR~r@P 8(i3h]z}ňPu<[+̣ "zU '}$$W~/'{~ xyաƪH/JZ^|xZ^ԊXj"G`Ϻݾ(SWi0/O!G`=XD~ -_D7Vie4k{bG}#L3#׷*ClvՏoltJKՎm#`.KV"n% :JR|XEӹxK]I<80MlyY=9H`Ze0sVȄI7DHJ8 X ˂{'&qpbM?GLz^ZX__iJ!y_X(dA4)?+͜ҨxQ>ݦd+99U\-/cҩ&#O9@\7UInK#Z\h?:KH~uf n-[KG|Q::MM-1mOiJJg*pcsclr {sxE>8(j0t:ū[2Ӗo3-6;u_; top}Sܬܩ;z]][9:L69K=,6>z2'6t(pb/oz/;0?QOȪ^* b]3jcc/1W)ͨn|ƖvƁļRjY Y6{͌ȕcЦqq8ۺMqN2q #$JK0NJ߇GAu4 T\{AHTXqHT]==)Ϯ?HtkX[.y:26H(2n;"'"VaW]T`;ֆeh {2WUlTQgۼNo5f=k2Q bQUVِU\}q@_8>2s}ΰ^ذx^اLa fxmb%ov!`tٮ n)P߂t9ĉD #/,?IA=Cb}_-H:*PM߷gT6a=%);K H2\QUy /sIb_5XB96A%O"士{㪫C# ֻ$u*g9u>xXM^N*ɲQA,}5忙nmWJt<cУZOURX BY..c 7J U\2F67fYnZE 9۸ʊkVܲ{W6఍^r_XW Yy='ao%cG'`,6]$y(W+fʗtzI !>z]\^}Ww*4"xNpr6}}O(6ۄLxF<=|'nPDݯy^s-j! %F7R"-W:@]^gA Bf n;bV\kvZ zɄ$=]|%H8DK'`1{Jѕ&|%}ڻ.>fti,Ƥޫͷ- \+ZcWh THGcO*Dj k(rNBv@C 7@SI76~_%M?Ƈ%Y?rܶ.6_ަǗcYyru pJI߻p5[p `$D!܇ГO|_!#S!2;˕.B ZbOBW8I*tέIH$_ڲ2endstream endobj 352 0 obj << /Filter /FlateDecode /Length 7523 >> stream x][su~CH{d=ؒr8*L1UK)X%ѩK鞞S҃V>\8͈_>/38ҐFi65y{*aagOx3`ټ>чݼ:Lk6.i7CT}8!QըnyڼPt=e\?淏lVm|3(Q>ztǯ϶_?fIgW=끨Ǘg_q]0vG0G._vr֓p쫒1Kh/RIIS(gUD}PF}P[tT<`3nT')]ջ+no"ڷFd$WpLƊ(|5Cw' ;j ރ}o  Mrw=nqm<ۻ\iޣ#Q wNCy`7x'a R(|'$ʓN?& Vk4?@ 0"c415lYFNs< ޾<`qg-Aܡ濚e>qm=};?}w5myj+?r=rT?<1װ.>Ɯ{ĩ%!{ kUKI(dd 38'H YLqT ȃpzLpbh5{!eKc,E8:cWzU䝏H՘]k) Ƣ9H|G urժ}Jw't<Tu_ZW z_85t2 X pQzУ"Fw}1(( G'~'qlkb@BoFd q[G5#$ hdbZyTRۏwNiRp+xG@ A[f؂'6x:x Un==N 3y\ڀ*irp̡&9>.'7N /ߟz1'\'06y:-&( כߊ`'JG8J7hH]ob\#`pf# FU^cmTLh$bęX?PFhHT9P-@Qʧˆ%}=4D FEci9:Gш@] @g|)'uBiV)h%Z2I1u@)P޲; &>7.yC\xcOA W৚K1 J>*iP1C00 &"A' f]* F81a?@v@Ld:;]ZԸښ1kmrS6 Zj?yJ<4G7r-qN7 0n`Ӟuf8:!<}+Ƣ}h"_|H'|~D܀UiȲ$ɃnTgk'7v!|Nj4cLgF+D[6Ps~VjT!VDr&~z?CY&`cF"? ^ʤy0 v0dgi1A)\ x-$-D/{^&Zx$f O1$FsinGW\hX9RugZ*(;w( ˈ.F!W S% T^w걶WF? F1ө0]+_ ؼC 3q1Q9|Xq국ԒS$g3NLZRt5*DLNi %(}F\|2goT!S.qs-9{9'' [y i| ^zzϵ%TEr}Bd6՜kZ#|CF}'Q->4l 6֪hJˤS^]d|r!xњ=Gi;`q3igUCv0c\  \;5:~c%\#n^!72rÓd *DH?yG~d^xEI l X~)9+~lbDr*v 0ziGm$}VSMA $Y,W{9|Pj6> *FdzDO,HT98Cljk X ->I)ڋm/\kk%suMnB=1PJr<ؿ5|(i/n9ݚ\@Mkvu{%}$W0~Sf x]iLttuK =:>763Q\iyMN$y?(ubSEa$(B͝),'PDnHESE2*G'aF5e[hYf0{ND*b:wXY0)FXȦRthV{HAދ94M(Bji)QyG{7#6mI0>$/jrz’\g=<1֙kOX|BSକq'n$Ti,WlZu_6*j66W#x/.w=N7>D%ߣtUD{ dV,e/Ub1`/Pᯤ(}̩ %ʯ:AsQ͆װ-Ẃ֝@):^g{4gG1=@~mmnp {1rsbDQ^j8%6o.\MiFuGX%z\)HW/򹙩qZO96li A>YRGQŅ\D0j(D#Z ~As_Va -9vWzEI!FxHx e?#Gg򝹋ͤFEj߿5WxSWlf8ݔWy :f2?}#tG\DS{ћPCΊCb|!, -'װ%#/ Z"TS܁]Lg\>Yqэ1wv6Ŋ&BG *dwߍ*ܺEjW:L_51lbLeȹ\|<]Eԧw[יjjhV]/ Wp0Lx!';v424O9}ꪋLmk譿qz^J.eȂe1uĵު{6 OYg=+]Z66b,fVS9NC1ý VI& {N**I#~*p(o⃚Mֲ[C5f?վf,`Y_+ag5JS:HaPuNA<#gf%M*'dPg+G7L <}˲rs{f#N~Zʫư훵L,ۖyLx _jxJmN[s Bi9,3hXö kD~=+Tv~*7_r SREG?-. [4;|pͅCbtAܚx~&PwMm縼G quƩXv%4rTSaa)s| #:d4[+ZnE|u+dtPDM'ך#h~}彿XE"A{,; -]^uݹz_u8;Yhxf+L2)&B} Aḣ!Ă"/> &~}m\kŅjy#DU=x6z>W(,PծĻ#Ubӯy{#LbUuST='p> iCPgP0nVh 'k ņRI) W^{ҕ<`]^PK4XXWҪ;Ʃ܅B)d;)w0|g|t}q M{7q 4{r> stream xcd`ab`dddsu0T~H3a!+k7s7˦BcG``fd+nr/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsSN%E )Ey LQ @00adkF3CD{)S{J=cq.nþҞ<;tLmIw7ֳۭCûjwE]]ŝu]ulz>cAPqas%G.dg;p~`5J|?wq8,ftwX]]&#[rKlӿ[ݘOƟcՒӻda[}. [o{jg=~̙l&.-b>sbxx{x'endstream endobj 354 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O ytKVU D 1Ig|wYudA>E0um &-m1,O\r)x@ZH>/mY%NRP<說dgSUdh*qB in X3 *S$endstream endobj 355 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 295 >> stream xcd`ab`ddds 4T~H3a!ann }O=J19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUML:)槤e2000*20v1012q/dGhOϔyݳ8g/MjȩiǵKzkcϔ '/it\/b^Jhendstream endobj 356 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1114 >> stream xMkLSw{)ו1q^?hc-x J[.-Zj":&Lfd06Yd1Fdþ;$23$J>xYLe[D ԮNXb3k/cu.$!"IMTkgT %KoA.)S@YTTBRU}.cru.zmSn]FNZewFO[A@հuj9V4-fb2SDžU?|!b?O?щFW$64൪.+P 83BW2W}z P#2L$*;4*671ͭx"ҶUhݾ D0-NomXVZO.z=as\xkP"0VG&Y(rҟMt A"\6+R|: qt"2eOu>GCXLbsRM O1zrAnιCFk~Jb~e S~ڐ'*Ξendstream endobj 357 0 obj << /Filter /FlateDecode /Length 169 >> stream x]1 EwN@H]"tЪj{bL@ }$:|K0^GgG:i[DfXӂW'.*0>TxA]-ğ]'SkZBz!dodߪ 9IV gZVek ӉH.U Vxm҂,cWkendstream endobj 358 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 685 >> stream xemHq[fжS ė>V%Y R*QyVn΍\[i۳t3|eT?ͤ>B//E߂Sf/??=(܁(j0ɽeKlHqQyQF9#nHZXb c%^W_ ?\[[HXqR`O/J$+NP,k;VSr fL'+pA2No,~]@[l},d$zI41$!9C"reҎt> stream x]M ֟6vMa!Eo_.$o&35+T,n $/2r='Y@cbY}H:1i XgQE*N(b B$XX3&l8*tEsOCcXw>M(]dPendstream endobj 360 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1052 >> stream xEmL[e塞N`/yfjXl.AcF0%/1[Z-k/C RB)Zmב(o҅IѠF% 53:Ȳ}չ/f_[̼` ysr'$$入Ugw7WIx {[@ R'E8Ä$^/8Shh0j5Qy'77'9st.sA*=S4NIE Saײ\NjooRLYccL]iro =\QXf/k/tmkdJ QZiRsZM/=ۨ-L-* ŇsW%l!$.r +y\HL|ё&> ۍ@Gɑ͠\sŜCP; ǩ|uȧlQ0v  ۞;]BN!S:WtIنa8 > :~LQ쎊5b4>ݒgJ9!S 1YUऱW1I>iQ:Wz n^QSNP ="P1{JiZ9`)V4ŭH46v-ck3X8^=?싵^l`$X %Tt̕^jPXۤu E}NM}GӯhtM!2]y?s]ɰGe}݅/FyXr ݕ~z=F]m2.>[z~ [?2Ô`uw:;mp}]7z*l[ ]ހJ:#zis epނ"8Ǘp5h0nRiʛaq5NE{\8.Vl_irC.hD`"HL/mz>xskpٟە_eהA8h뢥AeW.خC\ $ !t_CtnoH!NgJ_Z!+y;DkZa+x4ӝDAXiA?1>"T4Uendstream endobj 361 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 636 >> stream x=KSaq;9 ɕ-'ԤlYAf0fml$G14B((HEu7E]Ezњ/KS idW5h='C?l@*xƥ$ͻ=~t*ˬ֊bXiU<'KN-N%u\}.tnE*) BgŐGq)5>"^tʒ~͒6쿡Hk^ M-]e* e^=†4F =' ȳqt[P: 6B-E|;04 TR@jI!giz@&Y&Qn$ҩ(k0 j ~pAGr9@/ 5XMSfVHG}]e̬BoQ/b>q\{9hrk䝄\}%I8"!y4#,x8=4VV[!-: D"y'y 5P RMȑ=;n9BX[]086xSF"0}N{fY'׏+3"1VLc,u5 pendstream endobj 362 0 obj << /Filter /FlateDecode /Length 304 >> stream x]Mn0 9EnL%t3VU @p*,z>N]DPh X\h BNQ< fкRerǽlo]Wͅ~uY啅ႚendstream endobj 363 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3975 >> stream xWytSי(vhN{N BCa0f7YƖ-ZIOdIE- &,N$%2! II:Ӟ}dڦ49v'w3x|>-+O~\=c`Z_ݜKKW$-rŊ +V^$˗NX_-(LHP 2ˑ̼l&!qX(Z*jYF|T% <8aW<[Ji"a[FAvt˦ߒE%lYB4+[V("țh'Ir } T 8W֩Ah TAe2x;Yf,k#J! ,FS[DՍo͊]FKElIfJS Z|וufIM9S5j5l2t"o{{G}mojEcߧf6g zoEv o=F(ͤރ7Y6#X)TA9#WrR*Ĺ6Kz/&a 힆k8rzE-fQ4`~ (N3:DdWo3ej")zd% ?7m Sge{6< ǥWLau8:KXV0٫|vkn?$r.3.9UO8/\|1c-}}^,z`m* IBL7: e ^g0[ D92PkM{0[w3$b=Bp~:(;TkVJ?s6uEd/Rf!@=fsk]yT9cvʹ,\Q<R2{rZ0")t#Zl7 'Bդ;@cYฉiP ?utM蕏CD{pz7wH/"Q⍓hy7G$JG"-c/q9 ~sDT`UXV< zTsYPY\|~chpU: i\_ΖWn1f1ջǻ?^hn^!OKWVoJY: 2笭pƻIb[V?{m'j_pwڮ2.w 4P8tG@lr]IT&C 앾Hԫ[/RNQum &UrmXgWkE{]};xs'P0˪& SNauJgs1"Maqh[n<62z%~jvmk8|L`QC qp kK%%,QXPdր4m2)P*^>v6D/N w5Ѣf&ɴq.QdsZ&h Pz(\]Nrȅ,gW2YXW@a2O"O[oZRjV@>%HwȎ --\u!P"$S|N|u^#spS,H(@juGK|3W8`N_P:DT[-F+#I$'UCB ~b(gr a|Xn6t6Pӵ*>ϬWw,e _2|Ai{ÅG hS"Oõm@l{*K6f'i u u"(F־(;"?XUo * mmyX\(eJ;l,M_.[*nf.0NYxޮnhj}kaXY_Fvm genUK@қ*w) #@6ݦ/[KILf4UmU֚@O,z>r 2S2eQ|y[@ %Zm,93s z]APO|W 'VY7ljdDP똝Ckw;(ksB㼥NɄ2,iu+gc,B.*\נcH$.D ŝABbd7^T'X;VH##\>7Od@BȹZ/n$n+$%_qɓjnSR{}^#] LJ5U@=VK>X!+Q+5G4DGI~PWj֘2 iGgQj(`Ry`\vsd<sF\x /wW2z{7 12d9ж#m5eR*3K(WPRWP%>҄5=A&2g)8XMccD6' eEÖFx t{¿& *f>| M~lAU4oqH03T@ױV0V/`m> stream x]KuzJUYLyho ,d˶,S,RPCù#ФlW~{ ˡB4p=_|>l9>L>Shy'{Ε1wa;eoX&N^h<%-n wإ]_\S;.rKťE-z\  {|mR4Kk>*}阧 +"ix-$xQI)d/1,~u{밋67e67bCJsTQyp^ nlamvlU.oFə+@R䣥TRj ֣}*@S JxK jYl0W فuuGBkO1}&CwaF7`IŖ<^ †= I0-n c[=Қ"߶_&{)A[i+mfRQVf eΛO ]8? i6`j~vYT˺fNr E%ɻu`zN5.t FxJIt2~j)Վ`%JW;Zh:~Z~D~~N閰GXT@[1.qslA?Al2P(RX<7[$ <:!yk,<|a'ۣ&¦g~io]%<@&aAl&h!-Db KpkoDk W0PIZA^I|TW?8|j܁e~ūz=+]9c8c@GBavE 7cҊ"/4ÈVŊ%@jVtgp]l| po$M=5$ʵP~M2.9ԘΣ7~O3t-3qC"΢}1$[&2W6yQ<.E'n (HѰO/H4fbtL߾$LknhVӀY*j MmguDhQle5@Uؐ9Y[9IxAa e1lP8i}F6( @̃t6 |"^"S,7=%ת:x60 +)"0GpWm:epqLB6>hgVz}z5V3!bEoqmgƼuXܮQs%m2-m/Hl!'TMl4Q쁴a`S%P { k Pqt5o\I&v ,h1j$tJ{@Qg)VP"HZqh!fh%0>8wpWCM2$Q} 2ܵC@ŗCNF%wa -PQ+ktv8)m"&I"ծY0 _UJ&Gv{&A:b` aX(u=LQ9DQqӼ4M_aRs]0ru{^ Ƹ3O­O6ʩ d`iZiQd b bw)t Bĥᷔaև.!y` l`iV`,}V^cK@Cτ /0x3dUבb!ux?%}Xh\p=>R42#-Z{OB_ .lgA s`sO߉p5@ N Rɹ?C-\a=KޔWZc鼫 e: l8#z91#X/|k*bGm,J gGU+^Ab=QD3-<ˮOl\"HÛJ&7tنIc,rţyL)\ ,7k @_zFJlYk v9h> X0KB {ZU{Of\Q#{cS' RHhpuvkB05xxUup'2?.6߫@AЁ>}h2˟k"-psp/YڨttK{s6E.$ԡ2}EC0tKR)] 21!QVժK(``"vB@5r]q#H \N8 f!|c> $ct 'Bat0µ$?^d0Ω挜7 WxQ4t@G$,wQXt 5mQ &uӑa=IT}*(ˉi6ǕuBk\^6FdܵQk,1e,2 (kq6:aOd P꣙8mt=+ٌI[/IpGm[rlCjySS%ިRꢓdئN2cu&xX,OM"j=`h \wSw.!`@I%qBVެOBr<<$¨ă|Vi<8 Ҥ־;bxɯ Eց OAZ!9V8&ۚklNau¶FB&O 9AMhu \D;obZtO;oRc'jrUUbd=]KǼL^;Sca:ś {{?&_્%N2YJx<ƅ9׬]x p6{b`TdB.D+=lt=4YH'0wr`H0qMmUa Z{\N,`ԶuO^U^ӪV[t!˵\pb2&O1g;4[;ij.H86bNd?6̗#'D6^>hBg:|#sZ m dڧL{+~ /.P'Hю4G&E)9l LKʂϩD{M&8rK2Si@5gJ MsA}ZO&,!*e\/c&0myc5(ZxM0K|ev4{M8TUcX@ltq_%k`UW=Iئ9gF0co-0S= Ocx Q~l5[jG#wE ԧÒYƋnK1گJPԈ3EN|ֺ)i!k,CY$FqchaЧ(iƑ[x0|s/@nbx~XV0<9Hr=(،L~1$9UI ĽN8I}PZcy.vkב[__'ǃΌI15|pZto&p&S)eUU\ C~cI'b$9TX۾݅C[)FQK6X,&L=;t)cZrT뮏DB:T2@N3RX5&E8>6댃‹c_wu;RMֳ@$E(:):09w' 2ڙgdOEoGJaor8[,9]asTvP"F9B:IC&fbK&W0ø/LT;Ƨی)+]hakirtw*7F<<=)Oߏjjc-Z{T[I Pā͑t, T\![p csR?W (c++=&οۮɲiF 0V.ki^ ۤoVoSZK}n0EaB\l6*˹W$RoA[:RsYXCѝP=נw'pu"_lu W׳e-G"ٜ]-RgQѲax%Bƚ'!r겄W>Z1urԪ+Pܤ?0 uI̓Ml g+Pu[] avн}8/QD1a~uo9feK0ep:68u,sUR]qE=r_l8fq{MO bF1&xhxݖ@eRrKd.8CHj=>I ^Ih!R,),&3ւ}.X SKĈxPFyܲFmOkŤ4j<|h@LM|ؓN!o\۪nIZi?V<9Oz*{peۯ8$X0NM3r6x8RxEw:(hLl cLz2/xaÙߨr6K`{ Daw;]abt/wKAZ+rX} v}yƵBky~f[>L篋Q;CUۜ!GT(,% |IMM7Ln{Sm|qO~wg x<(c_A:ʋOʪsE j|3/+|$`M{*䑨*Nǝ3\Z_-nNt $2Ƙ=GZ!"ynF ڕs] ֤5"2,\ <).K"]d )s. |Mj+?'^3vKMKo&( 10KO^RZ3Sn'9J!"hףA X:Y;py^}2`F]'#~=ՁֈUIlM,!Ahaԧo$r"7)p,0[`s48C:B];*GZYVũ9 튶)?R3fLIԆ.Byŀ1-DbՏjnғolu(1@ #+7+ ֻ4xށ߈ P`1ra`X qAaۀj ܄"6uDᯢǷ!xw]'rlO0k \.Y\V3܍C05ntJ[YܢkZ`$uR\fKwk<{۷ֻ8|C,. )Aߝ%endstream endobj 365 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 761 >> stream xUIhaǿiҙƨՀ AAxԥ"(ZTP&cmt:M,5%.j]BtXl# Z)("ŀ^'Ӄ# "޻{2 X^m//=')5A'!Z!XL`1(ƍ˱s)> (*R@mFr&asYY'J^Ip8es(T]^Qn6lr`kii(*qZJRCMB+{cb(E$ >Qo}VY-JM@mD(:j@q2 G]^"Q+yE ]_^+op=@3Jx'1/Yll$>eY1SW0Q(7ObrC^m%;5қiYI[;8E鈄'[Gv#L[y`NPY]o;3ߏ&v6^_ʹC`:s:8ܗ~<#^sύ*2ANfa}|Wҋ.qy+ 9&2FTB7ݩ(\MΦ_@+r JxjrFx7 S1)({Q_1i0r&oG68OƚN& C@bީ`feAqb&yLuˆ:O Dn٬ =Jʈ0Sްh@dKJkk ]P:K?\_-2oXŒiY/8Sendstream endobj 366 0 obj << /Filter /FlateDecode /Length 7050 >> stream x]IGvs>kCz*g,Y1ư=)ffn͐^dFwk, B`*+2oo/Om8ݿ.N/}aNj| lȇௗo_8w!]9/^jws~BH0J݇˽ 9Z\A9lOZ\Çw;K:~mW;xm<{|ywľ<:nYz]޻='?)l}wo.a.ټ/!&K$qa2ݝp+<]~_^dqo.h/^^,v᜝^}/2`ݞ&x¾R?`[;MGT6e`eCo,S쾚ɵ۶#o`&N}x`f އ:w NS zFr{a`RiN>~ c':~9@ `2OoC4'#xT;L.\9Q0ϕt?{HbWD7#.!z^"g?{KLv_#Pmwd*L 9ySx܉Mv2FX<8@;ut(y q6K'W&?fn nǕҲ[x`>ޘ! =ro߷R"eA Tg5(7%7$09KQ!%g߈ 1k:X[*n?NsF BaGŘDpYRAJD?d荦]'Ab\ 7B|>{ !Z#~}*cX,:|:<ܴBgB C m23X!ufa?IB"]fa imfR(LVG惍yOw-m5˽';2Dũo@G**;Ptk~__\ o҉p9`i9]Zf)}sU1 X8{:ޯ%0d+9Ęɢsv&)ev[i7#<i!Clo^+VYԫ$gg~AtZ~; y~#~ڠ4R xhiq7 kgfoo{4(F]oNQX 0 :oQP [Ȇ{աSÄ9l}Hi@9hj$vnAw=H-@t o2V`]"B)MS7e9 P!74N愲\j3GR@s7 $x}41ظfͤ)N>%e&tpIG;Ub7[&UYV6 D}"KDF\Z)cŽcţ梉!Fq Ab-㞧"Y&5ik*(v顊p2Dw90+8ͰA 8+ytY"Z_?}Sކi`)nJ'SW`F` A rĮy 8Agq) N%:+ѠTC'b&c4#"Wq¡w6=fښPL^ڠb5Kѷآtqz-1a$:0!;jC&7-`1fHiA ;eSea 8tcVya8Jü'ud'14 FhI#34Wyч'SH} <=P(vogXJXA`D_G!(B GxmYbnFry'J XV8% Yi5 z`Hmւ䙲mc)ɀG(jS\mJh :Vm`5 Wmy>\^^&l&]&eY֢ rH25, B3EB"wͶZ췍ٿzLKux,{ȅDwF~Xd,f[Iű&[EDf6Bh8​E4 W,#6Ɔ?(-4d<?gty:́ "2ehܲga]{voė"d^TǺ,k4b.nG '`"!MLa8QJoUrda9/æx\/fB7B7*a 5A ):0m6cԤ].K28m.JzmߠgbnbᲆyEp /ExkߣlOKc UG`oF:(P+ܑY:1D)>oy?a1%yT'-r~9ȅ& -)Ge, -N(nJ1Z^i)z3H l"0< >ֶxuS/_~ ``+$[%~o!ҭ3b8+` }mQڵG/[:a]M.wMUXq΢ ChQuM"\#iҩz ;}h,QtLdsz3ZxevQs0pK<6Eb f Uuʑ_e 8Zy 6A7+%4An29@Qdc`tRߖp S:`{;1+!3tg[jq1&,׳+SɁ31O;@by (D"?=䴝<~}T |Eط@_Jg]i%GbY"! 6)vY?Qx#:ajRH,#WBs}=hNH,kn).uGJ^G pƚ8r)C4Y1lz:}l&:::ET2.NH Ϗ{ [#}!zΆgng5ODu}-G٬*ٞcQk"C\+g` ˚(Da.H%A?|6MEDxf$ ß}KAmm޸|H m'F~x>+I8c6<~/p!5S ˦J:溘ժ 18|4C*ʰq? @f{ L|,*s\3>U,}@>bᵞva/R.6 FdsJѭY0 q O֑ q%lJ /9'L#wD5\nKbN/Bԏ"x9R2KlwhHL/.ҋAٶ8dDX L DhY\6y*!pIL]Tn?Drz^)LNdyH1&[.%5OC$Qa Or%y {x;:xbBXD1E)ܔ]ÃĢ5)%aȺ`94㦈Rשe)g\!OJNK/C#cJ#k褊򫹿n-D*pJ)keE}8S"7$v.⢥ w}1W|cP'8x0B V hƀ1?Ӥ9yQ5֦v#hCǣKA]:5q)GA^O~N{<Ի/5?@T )i*14>&׃zSٶZgTj~[ˏ 7augԮRTbɄ>z$c98G8D;4y]],vLxᓑ[Z]kn@= GQ\Klಪѧz|I;TB<pqPﱪ#dT]-Fwu1 j5g?f 3'A_lA0n<(2oX0 {LQYp0S*XG|.9\f6z%*G_(Zey.;(`5;Ba"VcWm>W6v|z)~҈i>Bsq_wbP9>PI T ,;0Z o*I^>V:p8"j5tMDɹ>}OPNݖ끑ԣQUt[O"{n7s@ߧ|dUu)D-xr-0}&LW7~T,]m*&;qYW'{ 1iSpPxԺ>zqMWSy܃K@{XMa$Kf4GU:D밎@-KiA9BGo\Ēpb` s2y"2?SXlWRcU_3')] -:j׻Kz4&|H2RMP%ȫAhahlV:n7oiPƘB\۲{L oC.4^9A+eu/wqmN!l#u!L6]oۅ]{ya+ڸ{*ގZ:׌PYݎ1:xI%Asc Hp#bfFՔuP[T-&$14o( UTt,S)b5ϣ}h;h baϞ!G,"~VZJX,r >g$u B5b1claP 837"\-~S kMO Z\%ot JMB;qyuTW W1a!N!ߝB^*9gfOOWIo %RWܷ;!oAZu - SYZѠ"3YǿmjwӔf}f@Ugi֘ըߺeH_$ ~W##FY#LSs~k}YmnËO7MՍ⛼A#W.VwuC sqR\pY~1zq]a*1AM"U JxҤekXcGv%rY7 @nnMڹtaVisC' Ւ£H ^\_ycP3ђ$T\ q̱N:+C}y-nW5fMT+H-7NtԼJo_RGCކUrupGS*H`Y㳮H+h( Wm:l1/H5Йc}q֧zW_m||'L =lZ6~(b]v/ 5f76Aov/֧ݦo߈ ۚ}}^:#J%=NTy*[yﰴo58>)~#u]ڎ>rI)@vHYO!CY.Hl @ɂ-s6X)A5Ghϙ&>xePfDQreBh;| Nm*[ RDɇKS 3Y`sϯc6d 3/?* Tf`E<`B w@i53N\o鼥_hMB:dgT@'ypZȬ!ҧ[֨r?@75ZѹT\hp=M|uc̈ /x`zˡ*lkX-s]E7]]fuˡeK۾=]?]2Wچ2Nu*`oRa ͌g~K6tendstream endobj 367 0 obj << /Filter /FlateDecode /Length 5583 >> stream x\[\q~_kˌ9EXc(XBFrwIߞTEPz`l_Uu^I=:jw&Vg2q9Z}:Stʭ8r% +g]=:{I`ym]֡t|W[7hJM1hqW[}jEg_im}mF yɿ Cg' j ҮlbR0ˍt4֨+hʠ}V5+t1g[N2z;;!t٢Ʈne\ĭoqh`F瞖QA \@ʌCm:>zwOےf0x2D/qE8ݛMm߱>?.3RNZI 48Xk7LD8P,!G"i(}$C H#,{`iiEuKm/]3|zg )JVpC6_[JMJ"w̫a<{:hw9[L=Y"p;ȡ_P=msԯ.F^Y|32N NѝtCW`#q028%}U1@s=$=ISaq& ֘_6Չ6BvA*\\PwMv`'i1AcCF6v a7sڎl ҃UP u2= G:09yN>. Bw2O' 9 *)<_$NOAsZY$똬g "YϺs&t"%gomղFHKGB4˝tM^= e\FE5;7q 3ݵNѴⒼsˠd{>p(5JօyHQD*QA)͆Pq,DM W/-N{Pv{-N"B #\Lxho~IvظK 2tASsԞf8OAf,-jo];* {]&eDQ8-vB/?%U9w4-!@̳=0fRpFV#L.I u῏TyP -@P ȕYZxţN=Ӿz$;cV'BEZf` NZ)vf0ҋֽ.0 %Ȑ12tblaLK.q܃E]hd ̿"yQJ@FS%2/i\fe|KvfHwҝ&ifZ6Rgu ٱ&ϗsy, 3g[f^e0P)N:j1q][( Ov5(9Y B"2 LLOWɔ>S,j?}NF +ieG<(& JtFz.ZN398žѷ&l&fv4yyK1'Bh"e' *h8rU8{g/xS& A ;pq}{hOMs%ޠuhkXWeZۙe~1́3M g<G G.$($"RaۊERv{ǷdU;lBl)}DR1چETqxhi/O A܌d}<'1퉓ylElMYk'u|Y?Af+ƼmA/_ *Z6]?ѷ=$eA 5;nףYdKKۇQCxm /v\( ~61UgG*Xk|,rvuL3WSg%[T믎O]z@\ը駜+m8ciWT4iZjf 2l4vv$_1iiy{tA (zںҀMY#tJ[KҠF?QXS> t,(6%dzϱ.eRfR3tvo~l.=5L,ǬGʔ.U8ɕڻ=7tf~!faUi?ڈXihɰCj|íHK>׸nGxOgXwUW ~6mm}_P}qdzX#ʼn9vBX}BMWF LrK[Qme ty?wYU[,6?g7,Ma>0ͳ4XXٹO752+_*̲se{FΟKf/p,sH {Y@!^1dx.(&2S*]yr䁐zqdTLpVzgpV[00A78AQ>w(sll|;Qt=K@Tc5h@{Yk1=#rqQޫp:/~?zOQ YChV[rR}U8Yu1Q6J&ОUgarbvA,>UEc0!K|\auқ״}E5*q][F@W,xjRqP *'"ȚeSn-TzyP \'D[⩙qOC/mlًzrGYZj8UYxn$ klO#Ӌ܁Uv !MݽUt~F՜5(RC9`]X~|׬kZ9 D NJ2q0']Gd~aQfՅ_۱TTzھfƇY\W޸Wӵ. ap2۲ Wkf;))]D5sQoF-.hCm i3~N#c *fCUnqk1π~K|fv%M#,wAy4l6A&$޳Gn" 28r ]ؖĥږp kJZ\`hTk31f5{l?MQ9 g;]nS*,q@2vg޵?ת,F$s| ǰ+1> p?C4NG"AAyѻ0`gqOg aÙX ^'V`Q[]P./+;Es2f v9Ks \nj BIeU}Y@N2 |Ku$9p{W%/Uq]bi&Ȍ0ҳ\- Mqn oI :du5-΅P|{9."#2R9ʓw6Ց h&|uC7*b%. 'slO&\5Cg_7l,RS]n; ;QfeILҔ b[s|$@X5 | T()۞C6@F+ȉ0_yxvOɾ;"m x"5J@@!T}An.a}o"@ L0,V} )/vDgG[9f {u74.>d|Iw 63 pNN EAvve7f@^3ω&u^*}3+)qpozkx`;ef&T>ݧD/,mS`s_y2x"7Ek$Y^n۩({Ov)psTs,ed2',{w^esj _۸ }rN90)p tRendstream endobj 368 0 obj << /Filter /FlateDecode /Length 7409 >> stream x\k\qɏ4x'~8Qprl҇C$eѿ>Q={ ;}Q]uT;s;C̻fk<{c4HyW5{ͅhwCNe9v\~~uU/ /6vN7Cx7o|ֹ5%̹T'u1z7CBǮ|7x;ÙC)c+c쿺W.iwehe|e-|ev\d\ ͆N++_=أ쌅Lyܢۘ_>¡! `Z ٽ}tyGV~o| 0kfمXjCEWdB5֭fzP&s%vѻC,=Cj#c=K`g,st$pو!1βpWs=K 0t,Z9:K.ǎ.yDwc18,c`yzr]fg "`J`ϥ^Hk` 2FIEplţVSbNZ!9ԥՐVjHf+g)Q![ lu"J)Jɮ㚑Bp)#(TG?a#I( {Gd i &э]ЍD7dFM@JQF}'*}E" voRו>G?޵'R4TQC$ Hw,.̫6R Jwp~ oϻ7/o"y6ǧ:$&vj4Ĉ3GW参 {ÚЙ3E[{d e$شJ00JE!p:@Kc;$TpFZHHJdàw` <L!=]@յL3:&9 VK8pt b6iM#Ǧ|Lo֍Ǡ@Q˫P>kolJl'@\f%q?GrCZ$^ >hL9DERx\1#ed jC}ⴀ`@4(HL t \*C "$0ŭ&U&0*$u<$m6F8Z*r=K`F4r3#2&q S3"LoJED (1=ޙ*haק8FenĤ$CǬt"*8#X x K Jd;c;d/ yQB J%T{".D/h…V pI@ TyE<{*oRѾbi47OJVx)jJRAXK0Ndu)x `>TX!>4JO&U P{J̃[+a~אDi%jV;Ibd" ),Z;ص \Jm S4H$(A!b#q2TcI'ƻF:}4 KٯG'⎰ W l FibCA `@J(!]AºHr$sJCPH LaJ"֘F\:؛f~ScN!-pX$0"JSŝB@ޫ-ҹ )eZ:!)Ji-vUHȔj% ?3B !VQ:;mё-URtFn $6D8ƔwJI$$H|3)ikPJ's vHHwNm{M!=tvgB9NiIOXA+-;B:v@?6F1}h82%4sdF $K5)NID:y԰V`؅NR!aGK$ "__k;ڢF4" -!qǑHLA\Lh$iЩNqPc ,̋Xha#AbF@$I f\s .70%AQgNq8(4idLydY$3N&)8#eǒV$HᎉU:t2IMF8*IJ0OsDv8b3 ܑSMReK<wSU5:IO U1A.IR7d<ʧN(FMA!i-~MIx:ЅDԍ32CN"$̰(쯑HJ9*92c9N //캤,IHR6)AA-sI$ !W]$T-KW`+vH{["c6lⓠPu#MY%ft8aJIgeP+w5J %(Ig)IRz0W- tIc8NG4E`[ mt2w Ք""Ch9ʔd Gzl2R)u6IMRֹc@p-t؟T*i$LGGQ´:Gd#kHRBmtԶGj=%@źT(Z;Ro+!&gNc5%VD]QRX@l+%()?h!BL<*IDtdZQG?#mf$b#p$"&GdQ]M(3Fl1-~{%׬-6H[rL(<1JP(g( l2:)iu(3YT @2!@0Jq?{.1EA)δRjZ"QJ*=ՅR[wHAv6JY Hhg#<[%S) h gjHTdN*_Bb5q[Ie H| R$B"+uvVYaB$R#hHv.T@wPȚF:v(dk&8EcTVk2Izc\"됸2)Rո0dBSZB8e2 цúv9%hzl'fv9T&BYUɈ.HvR n)V|B*5-:L֙'qD]LTSRS,zoIXg)u|)I-tF(i:Lt-tH1J[AHgMZ Xt:cG4$_Sr<s"牠 `g^&2HxݞH+Z"~ J/Aѹ?|͋+Ag? t.Kʓ{wOM# um-&U{A ]l.sդXsiLu6y0fX{Ww^ .l=9V!ӛozk1-7ު{m[e40w[O\otQ<^S]܊Do/i&:y+ mm5|RQϚ͢zK^W{ٚN5f+PDW?|̽ "oUC>+:[o0%WJ&Pu d_7l[o5#0,7N\ג)f[ xB`R ( !T6Eky7z]SDo[VS6y)*NvtmVܺM-Ͻx?Mʜ\YsQF%5x\cEN5Ekt7ϧ z5書WmW_jCV$ۀP8(uql!*"J@I[alگ$yPMĸ 8TyMUrʻEeLw/IoDgF e+]S^MEKO7^6*`@nPM8 0wsL(H ]Aw>RVlA,$pq{PQ:t12+m+?ɣ{=Y>|uMi35.ٺ[t!f =걤 Z;tfk kg5НIa:3Ki&b[ LVa_6&a-:P>]m;vCd[T2ߦ2g3<-PYezv;g5; m۔Mpjo濞pjrг 'r.m:!vJgÚ}\=eثjp͆C#GR7cX1FZߓstE12zJ¿a1 [C(c?)S۶%ݘ;ZlV30?ͯC;Agߖ4ګ 3I0KXbEQ>Bgԋ8f>wYKx5|o%&8>sߊ6qU#dV 9뉅F3JQBW}5gB_-$W[b֟N]^MRj¥mL>͛k)o+D3)[顭-`N8|fj|'|=a|xtPE+5u,F惦s|i {|S6M\ە e4/U}ŞV[":6SQO %>:ۨh'v JG%`C6),n'7|y+x'ŧ):0FVFhng Y}.endstream endobj 369 0 obj << /Filter /FlateDecode /Length 156 >> stream x313T0P02Q02W06U05RH1230!U`h`T025`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmߚYK\=6s+fendstream endobj 370 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 *b C 8QC_Bg|wYu`A>E0uŭ F,m1' ߔOK^{+x"VU b'h9w fh*q\C in X3 C+Snendstream endobj 371 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 N. 2D! }I:gׁm_Xց$i,Ÿ`kSendstream endobj 372 0 obj << /Filter /FlateDecode /Length 7380 >> stream x][qv^A gcI/@vld8&$WrI%K߆+>apNmOuuu]}u0'{0?}><}saO/ǃ1 C=r=XO9CJJ8<|q?/sZե=S=>W/~qg~uۯNiNRS^\v"^g_}x`,wd2.ixrzםwduo^N1T&|g~{s@ϥ% r!|+kO5F+OVy {͞~Ar;;:nn ;{{vcnsݘ_>o /S>Dɤ ƃ1[/\Hz^S!7>tgd1r<`'~x kdg%ѻS,)bC= zB A,2:Jddl8 rr6bc 9b?`{Vw*ƘY8{*0)h1 L,#\]<1坉,,cۢ㸳0cD</G !2grgl1 ,@c\qpyK:˾TEspcxA>S{ʂ?s0(#0OI!OgXa0N6#xJzx[lDEԵ,&XRa ?#0Xޙz@sIlE]UMxlA. SD)9{B>Z#M΂3ds-EM)/-w2 ȩ.:eUm>Q:ejziT16Q2FmW4q<~yJɮQBp,G?a#?{,P,һX 2S`,[2(N%$,LSl2LY)0Tfa#2$K`}7s"ʳLΰdKoX[!QZ'`Yi&h x`_AX[/X`T {D)&X, 5 3HaC!LOjO./ʩ0BօxY|C埨9"])^ f58-zCF:6X)^lX"K+c`7ܥj_(~,S`Iܿ2e-R'(As٠Ō)q'jF)y`ENIm$?aC9dz d!YNҹwtĐ*C4ST4 l"FLq4Q ,'wHb0̥r&Jz5j JҬ|R$@ae?$ISlh + B+e %S$ 9}2gZd %<,-@/h'IM`XikS<~XiVFhW a” 4QLiT=LLv*ԧ $E SZ8>&iU4LiA 7i{fDy*ȴpb RTt (@F)`7Q2Z$4H uz:Ŗ;dRNt J t&^ *t]=BG dӂ(];( ~t0&OA~("S( T (() E1:LP"J` Ba[EŘ6Z.5D (nP"1XAiO@BiLQ)=ducrZ'Ju;I,pS1<2F%bBN!<3 5Ae94П16BQDI8QDbcyIm )e&@Ah(b Ej˜2e4Q!ܠͼ cFzL((WoT!&R#J(k"Db2c Pdw* :#iu fP"=*oÄ/dd26BT &'o}PfCԖһO&L)QClGdJii%r7x(\< LRxI. Ee*EPD E8Ba]6xI$I%ػS\+1̶ Mf YU×raۢ:2VY&3-w:pKfTu!$Iˌ&Qd (J;,FwGŨ?ulI"5u:LHRD4hZ*nM+˚Aދw(}.PixG:zVxHoF!%(p @E: 25?)Ni-(~b6"g^ч-%/mKJJ | I AZt@I=i7,=T<\a@Pu|rBtxaV  OFTHŕb1xkku6:% Gj N(PZ P1$2WY(YVHπ2R-JJUTi4 &`pAa#Pu#PQd"4(S)A}Ʉ"[6?F;&+t,;E2AdDMRW+UlA̤dc5&Th2ߴ')oٕZR9ionYɜRǎҰ!$+۠#WW@d15#;J_+IGG;Qͩ^~% . BF)k %Hdz\ӱcIA}uk,H:v,8 4^h1P u@G`NJm])AL5i𑜨ԕRN k" AʚXȚMRAJjp4YJ)Z6H nǪRK[^ynP% kR&Cam”QG'Ɋ)LLc%Kd!\WJU S UfiCT&K'W!$- chҹ3VcWB[1eydCjFAz[қIe$.>wd q=sɅS??AK?==<HCkRT<CmC +*yM];H73jM!vswEJAS^u|ZYfty,mwU-TB C"/'&(^C]ΐU(DUv  C㿂=ƋOt])j{왿x裭]ƥy'SNi ǩ!DD ΅Y֝.FDa=j*mYu;-fFN\hAfoKWd wYgIXf7j.ﺵΕ}*1P{\b4M=ːIWմ'8ඨm:NۼWmIW}/zl$'jy& !l3E #S).pEY8g-ǹ64Z(RS\ٺ(DDTSKĹ:0̯J0Н#ؘEdz_b+6:Av( /hui_(4YĨl*NPLOXKaԋxzч|-˚ .y\\TPYC_qW0mv5ɔ9nq|4Q>zz㋇|ozbE;?SՕΗX>dߠ?|Gwd|ӯN*82>sӯwW꣝%=W-4=s/4CHw$2^?:Ol|wc`eGZnێ+xifϻQ;k[[NmWN ڡGw}+><ȭR2rErҬyGvG@v]0lT՝sO}Fa])c>yb&,No2>ziyNM 1 YL3ȧYi@\8ʝ~Mœ傋^U4N r)"W0zwmsSj\"IF@y"|zQ< NG@j k&zGȂ1Al knCc*TNozOdp]bq\y L{qMPuwI m#ΨYqyOd)LC2 9dnw|Do.14yYlYgC)k[呞2=t)ag aPMgD.VGh c  OR,"˿: eh1G.*^U1F^$ߩz'$^TJ""]ч~\Qu#=ҭGH#ߛ/Sr%}5X_J"pY+:m8!qoŝ5$CUNACviz90;'=:?G | 'g{N0F2xn#7k$LaDG#;.Ab;O5:2>ˏ,e}0jG4[7`P4AW/ZGtD/ltʎw1?bWXAq V{YbA .} >OVOmך)oNdNZ1Ttΰs1AzGEϚw{6U]1o%DDECU?ܵLћ"z/;B{+k<wLSMUR3zGkuD<^A2W=RMMnmѵu;}zN@D`J2W^y_h8endstream endobj 373 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 *b C 8QC_Bg|wYu`A>E0uŭ F,m1' ߔO%=NRP> stream x}[Gr?_ܣi [aYZ=HMrjeן⒙,l|`MvVVfdܾ?şO_o;ÍOW}BB9K/ߓoF]%|z;w TܺK)p~\)'H#Fh'hߠss |p{ꅮݪx4L]+\rkU&{O)_R_Jˇ[Лk+t.~~>Z}t~=8ٷvq+{׽Idg&/ZozΝٽO#F:wZ??]u|>[[_+W/qz\Wo762) zY˝5LG֙mO3&|@&ݐǟ.w< WTAv\pn󲖽>/UڻΆss?|н7Az'R)$p4a[?y~kj$~w!.ZN?ӿ7l;K䥬+n$O^OOВlz?oD8F5zȈ2 YrȈ 7KHR1_9dtIFl}:dBK9!1nDG/1"i=_ZdD%͓i|Τ|!túcHR#k\f2Y*u&(J< (ts%2Ҁ!0$KٗB#tKi >vKƄDzS}V2W#9S3"OhccܲJsaL 'g9K,du9%i#6[eLcͭ o;su={8D;8ik:ʀs'CH~no̱I8C!9" 1H  sxc<{1!'8's= '< !؄!ǀHL']vraOɭ8cj~^\#F$ Ѥ.T>U-ؐL6z$UCpu$y! E/6J>]rM85~QPCel4K0ODsLyWyLrƛ0i&D@&EK$Ĥ04r^$3-/o~kO-WlYzRp1^e:KQTi\OOTUa&}ۻ8Ι.=TϞK# gf"D%Мobyr*O.v4]b D>ڲv*vҖS#S6OӖMrvZ ށǛ={!ۻ@Y32K/ 2W~?p5M95Zl ,Vj'@ }B+@._z^F<zӫ-!iB>#W" :sxhI$s?~RQv$-jA\ëfZ*[Rp7 --HR[B-G-$O5-5NK.!sh!߼4iء d#Ϸdm! "\;+ @mG~ 3 i!['U`D5]FF#F;Ju@hlq-h!Z+ruqKtr~h!AY.f4$: \SjF~$:#dSFn 'OMh#I|W斚1`98@wzcVa[.,wh>Dvb#  `('&78-`㆒BۆC$-Z\Y0j씽HP%`9,3wrXzN"%}:Bk/ f*1R H)IfhV@0A Hq!HQ.gDFvq |_^!Ix(inPi[Y*ᕴ0Q=huҧ!Y"%]h{\JJ#8 PA|A6.!i~LPf"`EZ2z[b?<$*SCcTq;t1hiGʆP #wuS%ij1m9 .( ŁUS0w{cC4URC0TvՒ#8?~-db-'a;1hwuJi <ҧ] 9 Ҁl.jdu*;`D;3vYtW(1j,8jKKϘA$1>S%Ý+Z``vMb6V`bx m$X /{L =I lt0w`VuX#,(b)^8%>/TkwU PS W !U=-XairC,8`&r$#˱ sL9~`9 1>M  ̀Ю-4m|K༉SԐMErn Av'V(ǠLfrCr PZ5Z/\ :-8"Z`0Q K.}4()*C";qؾW2\kqw FSWrSyE 2)}8 ǹhp\C((Cꭀ6q!آ dG S&0! RӄqG(\UG-Ia8$P ƑS LCr,sɹ@r.weXH!9CoyH;;G2$?ˆ"ɑQMʱ2usD6`G%PTs=>ZisB9jIzJP@ _hpf KP 5r>>hI\CsS !G.s229|qLes.*8tcO\ lp.z28[Mp}*4*N]esy8fܥp.=pDv\&o\.QU:Y>M6Ҡ0sqvl:5au^i8)`G|w3(󏈜GpYEWm(.=_(.YDO#}9䅧 wS6@o0go@$Nrx=L29@9%D4&磅,&5&GQU$G-19>88A% CHÖ)0 A xE"9ŶAr} 1Kȍ!V4$ȏJ\+N"#"g*ܠl`2C 9K̐Q0+AR S(?"#"mHK +ӈ:& 4"A(9YvvcA9rmPBȠ\QIhP.pirZրA9~nkb{Ḛ\Hr PQrv6rN,*s3P[ri"9&@;GGa!{Zpp#Sp\g+ORp|GPq\MvqŲ2ǕBFX[Xp\!B68jXOq\- -~q }87o ÁS $S J\-8B8 & UpUaQȵk_ !T69o١@pHO\33v)g^79?MDB/t6נZ@uwaLD6 G\0NP!QA h` C7)CN0A8yWu[@#&G}Db,(g3(fA9 ⠺QVXCf7rPr8&8(UKa$8Sj 9%602 D8r~[kN'#0!2'$0(Xs`+jӖI+P- \i`"eqGLF\IZ4.|#0>es/q.q~)q{)-@.lbseru+G>7F$X.MlX«0,WKMk|c8Zq@/NI<˓;=ᷭI&I !^M UF$bvuVF.$y XlW,d4 Yc#ΙWpXbil `ύdC1ZH*qZfi vk$ 7rIfƉ4yuÊ#O|9 "KC1,|ZXs;0iqL+r:ms4jxOR5W]%Y du`8a>rz&yq@GZG\2>Kncjˑ]>LVkn-: 6na8>e[FV$6{uh70ْ2|kzpv:2̖͎-9 o 6[-i å;\ PRV/K~sSظ9nൾz:0}kp6^Ly'n}06OkĠy(S` =nu$ǧ/nJ0`븢#9ǏtK a,3ͫ)AP̢g-I3YsPf |16I#m61qyoV8*!v*6G]ھ]x1>тyIvoi y9[V?.㬳w|,:[:&iͼ0Pe_{LZ# [.:":?yno.K|-ɒ<f'#Dk+$1ǼJk >>ƕ-"! +Yzu^yɆqb|͍?:Ć/O!zm;?7X %7 Y)RW}*-^dPs>g%0ym{l۽[ȬGP//ܬX{ N gI]EAw6>xAkgsJRt0GGC+]_J<;^g 1ކM&y"o$iXț!JX?/iڶ}7\CIdpV~kUjʝ/7[MaA)e> y}JX`C6P%elJ1߰5O{y?f}@gcTu 5\ot/Nw3 ?ҋK3;Ͷ/2j-9yxrGqэ׼m\_f23wɛ% pSKAWN".;[q}xbs8C}yKF WpZpN;.?R*:Jb%\%-EBeSy1 -yOY뢃KuF)^E& Ce_ sIܴ!ul~)7"&cS1٭~|ߩ| bZ~]-I+$ū[Px5&=QV O"f[[/_ԋ|)-y#__zk =R/^\Xv)tzwTI!sDkk~sߠ#dFX^~ {UiJ2Q-RLZ\w-2bYAįR7)d3V `qT/}bIa[oc9TMQexs[ tK1X̌bý_!aA4p)%eU]6vX52T({x}%(X@^Z#%`)F*ŰoMT@촾MD)Z7|QoxWVd\Z]cܞA I?ڼ܆Jҫx?7yAʍ W1YDzQki^e[ox[rѿSҚfUW?۝G07@e,xT Zf2:蛅{^9Oqqտ|ߌg;EfN5_Y/~,:kYq5K֝Yc kYI;#h)J*:_olHξ/_Wrendstream endobj 375 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 vA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3>UiZB 'mUu1 R 8KW`JM5☛&e=O) @Siendstream endobj 376 0 obj << /Filter /FlateDecode /Length 5012 >> stream x\[o\Gr͏f l/8lb3\ކPHY"?>U}sDZ0 =uOwu]?W OGy룓~ 'II$Pi&_?" {KexePE2bQa++3?ѯ^' zEG?sI=BN39ma϶ `1z9M=4*7ṕxlD#IKV. eC'_#EいS ̪\UMҘVk']֎ϷuE* |ǤIȰ06)PIި@tǖ@qKHd}wKI4VpU>gג KY"ȍx3/j@~#,<ȯc:l/P @31Eq8/j3xUkxVNu !ނ謁3B!q(]Vˡdͼ~k:%yѢHѹ}ҫbFz쮣IDXFF]fR`'+ ~\4*%a 9GA&ִzpo6Hsq =WҒTt2V۬O+]+H-JWvtT=~Z+u^B5[3q11θx?)ؗ(!fb w_CY$%Q]p5@|=,S*@av=zbڈTcZKV*%Vp?Ze<Ղݻut_^0WX=']-y&89g36J\ Yy*hU6qhƌQ{׳zyCd%{ki+ Uy> 5@궫(!poaⲦ_.܉&dl6dʵ4т*d- Mx#J|Km+<2R~ e&T{8 &4c!.all9.Njjmu:1E})Z 8!EiA \ =F새$i > @.So\(P1sd6%̒& h f2Ȕƙjm).)HIsƠ |8TovYU 'FUCդRQC+)-< 3.Mm}cncb4CM0nMa<m䫍#=HLRI&M\ex*qsv6&qrI+ܡuF勥do dxWPaX!"D'nA 8R5H_UEdcnޜ=RYuŸ9I I&TǞ5z4ذPxH6B>Y:hP6J"UJT?'JgnGmq$L϶brj#tFjhWFwu-Z|4js45D5~?pokO-uL{DdEBɹ80*9%IŒ3eS!.0c$kğ+氇 _4[%|1tOT9IUqGp^ g pm8 if uȷl#`]88yӣL6v] 5QS[c5!<1[ͬp)6i =qCT˂)9_ijuіy&n]K>.DAJVcPRrE3S!]1݀#YƟ ̢:zdHy>40cLC>5 F(U@m)$tވr! y] ϳ{\#xq:ĶklGBT;fS^$8uV)k7g>>E9}owۜ2IG0DSsUBį1<^~)-kkA{Hv3ezNV]-]W Fo7I@4JnUZ,kia}? ͜> u &?X->ć߷eerI(»rHD9L6(a$/uމ@A0ۄ6Ai}$0Iu @͖TH!:%Io5/bX8f@^b 0S XR%.K8oY$ZA@p\^2]¯O3X4z&iV+-O&u):3n*F\ݬaSj໸YySL(x-\ 1:Ѐ0yAT?^ ΁/¡-X'OwG4[|چS >C#M*vGhӞ0ƷI#Q2*qTBAz¦$_)`C*B0ۤa1LJDb)5Gq9(R7^81~vMo" <9lx;ݓj8/eόjQq)$ +p՘a}݇-=<3`lHfa\TVR4 J.xAu`H|j]fI ᵬ*5me_/=]\WLɏ}K"~>OgW>M6B Q"A| 8{{Q]M}rNjx [况cjD "$D&"g} oN ?xeendstream endobj 377 0 obj << /Filter /FlateDecode /Length 9087 >> stream x][q~'/A:_@$81l(J6/2D}gH@`S]]f'w'ٿ_?'˓gO1SOB1^jiR%tz'.w\Kj~z;?}3?}zO_Ooٍi&飱O_Oo槟ϱʺg.-uO{\ɗzغ8ōOo+$~ljR!wu?V >q~z;?wFVb߸Ƥ/n#KkߵmwqO_z^oHG \d槏`Dcx0|J.~ux.`1_>wZ륞R)$..Bvi?Oopd>?_=qS-oaU~~A;KpKi`K6cWO9K %eXvȌdw\h[.!{{.xȹē.8rȌ1_Z9f֖[|*8q[vČ|L1*2c@!&3K GL ClW%c1&1r#f8fl ИvqupČl!!NДdw(6uRC&ßV/+Cf\ELcIA|r,c&8/qpD/8XV:jJ]?FTG2ޏqkXaǎC&p6Kˇw#.<{ |LL8!f;Ýz|Ch#?&`7b9{3;Q9k6BR9kq挵kذF|Hx*>d|g+eP /#;7D' J؎E0K*0M!|@1P眠2DW!r0(&`A#J6KphL0/ik8@9c#1Q#"=dafb$eL y,c\s 917] s Cc#"ܰF$ʑFkGPzR\> [Fp:_|h0!cCd^ KɁ1c7Ա@dz5|?茤X! f|5VdXB4uc<YJ鐣MB vrilslĦ!YآXLL 1=El7awtacfΠ咫?&~0BvH#VIrHL62qt'&9`:wWX!9DڼQ +㹔 p.Th3c{Ycq,!?$J!YvI$WMK:V8PDw ]n4XlCx$ʫ'1jRjJ:*eTeԤ D s5(˨._F鶟mh ǙߵmcbT>9猏!egrip}ύCۚ?FG}6^.ᘆCeRADy :(RQ:{̬c %S]Y$qn>iN{`E9;@`EX FLwZzPω5aU$LDY Wx P^o޽xtgo[i= c?x hwClG|:_p̒j ^E '| |8ەVR"E v JgvrgQ)iI[xb+U0BI`$JՌ;)p 0oRD_B`ayE 8΄)̩ cQNv0JdL#OCx 8$tgKE$J3cP+׉!HC`\LsHWzP̋(@Y)I40F)ҌԿGaBbT3RY2kw]B2l@)n#F$037zm㐂LĆUVѕ$P$vNvK Փt@@X18U/[82 QH/eIgW6gZ*LIDIAq#l^ 1rN:MI(^ؘX/^"P󤎐d+BpRM̀%ّ,4G;vÝ;bJű)AR ̤@Ad5Dyd4aWMPD PpdUsqVqN _|r,\ 0Q"NRDHk Bvj;MAU޼H,ے[#1: ,r2CC):sSЭ"ӁR46 :QIj l+E)t^ ,+]SJJBd%^E6͓nfCiÞ) d3իV9M^Dcѳ~M_̄EO`FKѪ/hE;>RԢϒK !ִ^(5I%3'" {я G<##rGB "{JqTq:TjRJ{D+BE-! 8jntyQMtfT=bM$EcҊA= ]7N3u Z++ O=EbYg-ݫ)|dRG2&D'hr3d'iřD6}7|: ,P<=4 S$.xJR1i@ 8u4Y!=ZSbF{/QD.3RX3+X{)^M$7tB:ފ:SU>W4m4m* ^s/OD܄P]Սx `YJ%]õL8\S=I{+I"֨QGL2M52ͩCIqw9UP = 5-pӍ&)%Kt\S[ QI3v6Xn(zU):6*2TJ-s>EО4(ؽיo'%9tNmoP]`- tJ ?9u"V7JǜR_'iw`у&"3ġŝsw:m *=.^JQuL'''$wQK-+&I4.n*YP6EC`}WJM`m'*qPCg)w,BPJӫ4!CS<=.YqtoeH41]z⹤9I!ӦY:6&b3t$(P)Z3@ 7~S@G1@t9 &Plt̒#!L\1(`-h6Pi U2TLeR Z. ] eZ6pΆy ҁ e  5>Dy70]%whB20]َr`:N +i61]tbtn4o;T~ZP]<SXNb@O;uqY|M\GrvhAvq00XnAuЁI񙢺P(j.56եQ: ՁRPiT a E:}f;EPIiCuI0q9ԑ:@=@ *ԵL ky@uA6Cu2FFrZP"XYY0\ I)8F*ZdR fU_Zt \b@b-u,<Q,>BSvI;"=:vL*3\Ǯšў`"Jic#]cNj‡b7;PuOTEyqº$-ֱlu)1:NKeuD= %ӂĐP4xKzF%>'+.5"щTdhXEo": fѱPCtC@t|4p!e2ׄd :󞈎u/D>Ekt<E5Ct̋+Ovn6DG?` eL>'YцRk^d F DG@ +j&DWA+VTDGpv+it>ɐA:fX52 Q/2HGt[PV;ұ`Cc3tr`Dt2t dQ6t2Kc ՉZb:YjtUJ1tTs98NŎ*)`2DˆDt,ȶ&XDGoc 5l';FQHcXbEt(2D0:R1Ph#ՍN\7g:wǁ*6\ܷ0p]fVh 2ݽQvo^0/^[幍{cwp6u9ꋢx: Jxds]9wa z,Vp"k%3^W4JsBcxzD%h~,]p80jt :Fе[|[oF}"Zc+nc4YwhOf4G5`v.EDv9fTU=\# hM; *;xwU:ZCsch(*44GdtZy(coOޕ䖧 !%QKejtTʁV,E2t* ρGΪt"U:OsbYPpM*}*JGWhxT}srbRtL e#C Ё2r%4䪴:P,WetB0.=Qh=6 pEeRt貘R-)1FQ@'|` :aitBIkNfHwꨥq-eg~L]0T@!rV<3@x^,.fb :֫1WT2 <1H˨:-#9!]nJ+R b웕:V5bn ϱ}@:LP_ԱH@ueW'} בຒ+ْmua⨁ Hp]AyUB|v9Y*OKww&<U < XG/Uv)`S մtgFbUO!]-qLt̝ HGJA:EƭgΚ]旉d@tZ!!MD7hnk[| :Ct}1A+#RU񙈮Ձ[ѵfVkuF utJ8@Gv>B zt=Xt=Q~3@ד'PB]U Q`hN(ߌҚnk+ѵiCs.%9LhNZ hxR{9L J0& bd3e'sE(hNe7ych0PU|cUF w((Q'6PA=ޚ hSg5u?Zԃ3\; 3f@>[SA9 eW7GߛуIԖѕ}^qǠudגFu3FejcQ]+VM޺(u,5U-.f4(8XrkO#vrhFK3gy$gY)elD6R3u&)[Mv0h5/;K[h hm\kvk>23sZlWnd2@RTΩܮB0&-?ۢfF܍t.A&( _>Y`cKf=,5l ukt壡'l3X_iK$YGy4E N V^B[/>:3 >ۭMivr ,|)G_1-ٶbz{i{/ݿ;^{R/g7{WΕjGKb%A8zv@sc_| oԤ瓸U}?=s5l-e"%*k% i(zF|gD?E.,!sqǸ/ 4]ѶQ@iSƷ"7yaHfc= IqFL?|^i`N0o|2XKInAFau~߳z-@]+.me5m5<]?kp\K7 %츖pDq=Tz?v;5-l5| j=ڎv{EFm;Ϗ8Qv54?ցO!^[WmC5p?i-1\Ropmtv\gs8M|Ǚ{Wz/jXCg|W/'ӫ/?=Oww|ccCXc2f+"ܵ7(WmLrZQ!^Qs.+폩m0s`K X䚶ZϾ$VU^|=@;c ؑ1A F;ڻƢY |΃WQ5fLb'{}5*ueڞ2G,ag*yas[4>16mu_,Ukl![):)Jܺ-~5[# "{z[er)rʭ}3лgU 'C}l受#̑9/c^f|\E/ն*)j9byr0V_/9KBM>ְ7R5G Ϸ|Bo6{߮b $^3Ӳ߉:w)Tre7C. X/}+ժ PIҷ27pcoJ]E_=%]ylw֖URI}#0 V%a[^inw}8c8%@1 5pU8^=\SxRzK8/Z'u Zw!Մ{H"]6t{;'eۂ_R 96-wFH_c׬Cަ{ݼN!t ]uCxEe_ e2+":x.oXWb=X,"zP7D ^U{JQ`_R}\3׺ ~1|NuȵUs.{jM.Vf]? e˹\WZ2%A4F@T*Y{~}lAr;vL*izK'6bmHH ya:??{C*;<PI ݚ ;g%ԃmI,78no2uMk:nNs5VNF_iwBs/\6:cg "ooX d(yDߍ0%whWyaX`§v*˄f ڑ‡ܶw7LkL'u_o3<:/ Y{tSL7M &+Bbdb2Vz&o >[V|Dx{1MWwJ/, z(3aֽeJ5 endstream endobj 378 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 thU@p' aKB,N>z ":ր#ME݀ gnʿ?`3]$ͫzӴxO$;czAMq6羠?M%k17MR{;RA|ASlendstream endobj 379 0 obj << /Filter /FlateDecode /Length 10465 >> stream x}m\qw!?|=$ 7ALְh4{%]yr ɥ'}=vc׿|!˜~SLe;?=;.my?^N/t;\OVO/o^~߽//,͟A+saR!+R\S8dvnaE+p!G6;bĊ];b!|b9CVcŠ8t;fŌ X1;q;|#fKQ๲|Ȋt`9 #h78!{ą+Nb\)[Hyr:fz%MaJ!qK[!+&KH99rC`nV ͟7c.fqiCL8Dv.x+xpOVyC !@Ǭ$HVgB``cs" Їwi㆛_C–RFG;bty)wB?fE`PD`s#/Lr-B[C jDʾ1F e95V4CJt17 m6#PYt1{J~"z-$sĊrP= `!G]Cxn"=3n+6qY-+(oZ 9f#0!+1IBel!x,XdӹGL$q:Ů2:xǸp'f?wAL;|pDvv.x @=&!("(l@$EX uaE|HLh -HV=휋1gF$@Aqɱ 9u! X1Q\P%r-0c80=u:V'cmeL0Z4%IμzءV, P~HJ&S{ayD1f)8peM_Tc@h @{A:_t \i)^hFx"Ai#o_ʬ}7ۖY$1ϊ>2'6GYk41Ϻ}G;WoK3%MlM,7w֍~C/w@,,+w/^7b {~qT\:Ӟ62Op$')yLZ*bGIiҴ)ZPE$@l8tO`so|虐wՈ -OGLۆ~ˁ~:YZ8R]vO߾~_{Y\N^?#=m |W/'vтI8xZՓVHV[]DT@Zr>ZhJ:\LK9ϊxi^h#4MGvbdc#s>^0Yq;eP+:Y!tŦ1Sq-bnO~iLLqdc 3,217eT!sN6HəohЕM^DA *C^Vv8u$˹(3=803Tj>ٓua-FdmȈdSL\|ӑzFΝSl7V|VC%29#dҽ WLOL"Ȁ~YבrBvv/ߴB؁Hf=[&Fdm:iM͙7dG)" U, FSP'֗Yl:'DԁAPS!DFSp\S6 ]XSFA^ 9 >]Ցz*-o\֩4% HdZǏ9kb 2rڡxIRS4=\ b`sO]7**G GbTҗSCZ6On'u':B=ՕLΑS4a\+آn1 H8S$d;d_iTXVkcG"T,ɚsvR] qaE6ȫXKǑ-ۈGx]ȴ>*C* f"#yʀW#jl`rrF X>/hH '#΁%]?¹%n8qDF.=Em6䍠)So*JME#spٜhR 4]DIg@xFG9clO(5:f)cBR6t3kJFQ\vI s 3a1̸JǶJǕ7ct.ҩ9OI09 Lsq;iw>sdoZpV^*l+y/hS;teZ 2]T7 uXFUiꚵOt>'45|Nf>'N[YDw>(\|ZhsDZ1|J<\Έ=:ccDb 6M\t:`:~sT 5NثBb;13sTsTְ9)+)> ustN4zj#h2;Kgո,6ǖ ]9BhVB땺ꭈ[":c/tֈ:A݁rN$o6:A-RFel2cs4E\ͱOiMgs4IzҶUoh Aj:bBN*1+Tt(:tnm K[EJu]9NIV(3&'M}ȨIZTNcT9(-4v&bUyw*tĨkUyҵkŨSgr,UYٮ QzՋtzsHۀ"sNW*crH:H4ZkTn#T`TNzPr*ԩh9è%8r2;46'* cs:W6'ɜ-㕽L7/LW{YqZL^kGv^#Ptr2GtJìJGF֫toԊU$WNI"<6|؜/Hҍ:19T;esy3؝Ֆ*d6GSWlP ej9egsOgsaH90%sLEeggsR:#%P;t2ޣHG=Ml Fqm~*46 49F e1α^!>91:ǑsŜۍjc#X̠sqs5#oO*]s *\Ftp%A1j:c.Tt$.ɝlW|^su_bވ{O\b6O]V;Wך6*4>M^3?:٣JlیEoVs*=QscIXd|%&F[d+֋t6弱NpJiG?#UzUUWpme8 BX$̚vSF0v1J04{{`̀6mm# l-ZM|ԡޡg½jEϨ~َFQ^t9K)[k4ťމ8u7Dfo%lh`b_ +zi[# IzFhϚ.^=cgG;~l% ^U׫d 1n7][{\v#+ X۩* hڲ5T95NI_wpp4x$KyOra 綴f*,$.- A0銶WӁ~;yPNZ63OU뉙z\;]en їu__|7m^Tn&:!]diváx[nQ@垦߫E}鞇g1 S";yw ioI핾_^*O74P|{wf{dӏG۠f@w8>c*ֻU+o^F>^σ'fC~`%˱6RG,O 5닂&/R !p;@} t=L tq˚՚@ώ_تVJ憞l?y~\{DoZ AB9~ι DmjeKb a/;VV}>Czhaqha~<򙟙"bv_mO>ݝalcݼK4>y>,ek[ v6ήcNLc~ L:j-(NAS ( 8e3툾xAfm6oqվVTNoկ衦~+$2|o4J?xWD2˄wY $S{ CDffnw˸-ǃ Nڸ|{#)67uN6C.azXJlrn{L*ΐ+>N@D `$҂Nn4AV-p ZT'9~P3 hzvpx66MIJ˧?+>fti78hE 7FUz+3㊛xү$ 32ϰnMneA"+<0 * ,ŜU&qQbMxNr`AMybv] Ne Nv2q~ůQ_F<^,+ "~#*w_xO:-Nb}jيaa%%l87?/ j9d]_OqLXD4i͏Ve6tf0Q>[@.U3BԋEQ86+d"] ;oR ]8ogBdZ3h+y7d ^=9]ŤO'<-49dg3+RތW-+Q3WKE{Tl9Rl#xـiӽ\\oz c/ߒ"2Y@ny*3]fRun򯋈iUj(ea| Wi/b7sӇ)O_Oq|z x/:%V g`jį.C<)uEӷk3)3{$K# 7?Vs?C,VG\/QG N^hv*]}?þ!<_D 5Q+5Y_=}V?AYNYd_,Je_2~O:  BiMܯw/gc"! ,|u\M@vpИV)LUЛX~~c_B~s~ی [1,W ΫtK9| c Qo]O  Ⱦh!ølynJyV-␕ؘh؜"slB7lGw qsgVޤwf HEi0"%tK VRc4NfKlϿ$҅IɛMxgLn Y tN>u\4hy 4y洹YK׽ݯIsܙ<'OO@xw{ҭ}c Te-ni=/Ą$KM;lip{EQ&Z\<:ejF"M?NXX3{5?!v͖-"Ldng2"-f{YI"{f+׈)AbHo~\ P@u5].ߜޮǘ^1i̜Z qIM[56@9Ƅ$ wD)I6N,zow4WFe\M"?}Yq/SVlWLlqJNiIӚf%ҩ%r|z3<]]ٜdx>&G}-ӕηWi<+s ;^R;, 4h,EkjPr6 hXe۟} a 2&aswя{_W03ZYp4{^a9ɶrM>V)!lAB֍B"h<;&F/~5-0ЧO>:$R֢?>+xzֻu ΠoeÏ|O%86CSh%}ql~k=6ikЋmT &s륎2wjhz5#߮3{~%%{eT@h?p[h=آ72}869|9v`btY]4pӼjC.ÿXgLuڷ46%Sm'խʞ};b kWٶW=qf(ς#ћ[鄒gd}?l,t}7^ۮVkօaHku ?0[~2vM0vii>;V.4Gop4#I6=EQiϥnGkcJ C7!a71Nsi5٩챢m./>.Uِ Ns*Y(>~2@ڭޖwzV-lZ(/32i<bK7eꉺAn24cEbhB[zm\)_ 5_ھl&^tiÙUϔvSJ_, ԾZrx#.#"Im W\_?ڃ,;qAqi`s0,HB6_ kjI iC F8ƭ=shNai]ԍr5.oWcL뤎Kq@ >Hvnk> stream xM~KԹ⿛*NbfA !US3:{z$~"|"Z4*i9pY{5}Ϳ?}O?oӯmn_ǟ?_8_},ǯ?oy]urm__u__tm_ۏooi~O0x~WA|:<o~}۷u9:~mgЇ>ߚ2Z_|_?Ҿ޿vZL5{r??80k/RF{:2/{w^fyRY>o;QCc2J.>2_gɶ=_WW5_x\_;m[^ߵ\,?'7~k_QG-S5qyq/ myO!/}ԷP~Cn1/u!{ǿ7_gk/s{->xb~G%S<̮~c*_*?{(ӂ;nqAsm.<թԨ+?ן_~RxNiuL?rTzkWkuT(u'ׄjΑ }kcop {*Cȿ+W=L򓥎|O|OQ}:7=xυK(Y2ĞRW6Yan&\Bfe]o?9Ja@c|aS+)u|I'?ѱ ߀z3J,|sāai$9,-?~ؔ ֚͟X륽K|{j Eؔ' vg[̗xP5}B+4'uA}w<5Z)t6F}OʯL?_{]~Z8ۍ]6%Du~A%fy + L~s[E SiχfM)r&<[F及;盳!/?ƪ"5CxM]#hWw Yf)*cjZs(HLesQUYWݙYf p Z˞k$R3GKؔ/Zq)ƒ%\B "5CxMgigc%lJS-ouMH͑e)o!lJ B^I#1Gx IY%YrB*_C8\B`sfjһrxw^0-)$5VGpؔ@y[Ǝ6続<æ1<3s!ӬqPŸWKh<<֚]er*t\VII{,r⠊q<æ?zVrE.!9w-ƺ`U6% cp" ʍyyȬ* \DrAP8V2qqz>dz*lJu]("ܲJ%8> Ǔ=lJp~s͎9BQPE8aSz|~7 q<%*c!U6UWfhX(qw? 3>lJX!~3B,B/Op W('cYE^aS']z *tRe/Op WT]c22#$@y-_*r 8O*r [1 gxyK{}e,~SlVqg{ؔt>E+Ь.05 C`VQg{ؔfr&!2˳=lJpX7!4˳=lJօ3'MU.J76k}lVqՒQv#ꠖOQfw)K{+ROU6|SӳOO8,[͐C ֜OJ%Cq&F.T*.!'u{B?ayx' *P ʽYr}¦ݙ3;?g*p gi.YL'lJeTCBee>܉6d,Boٌ~efH~%z6>tB?aSƂXo*P V78RkrK* p лct6>*T.!CPOؔ_tdܘv<.D*.˾ -}POؔ#dZSJ}#u53Y/Y. 8M)Kq6g1$ Q/_jH*_rR}'pH*crV),}ZU9uؔz7:2_ yULaS9[m@70}^U9uؔy+!\0lJX{CBUْaؔN~VT)UKaSzԏ;gz^xSUx6WDɐSU,UT?ly!Z*%p 'lTXE3ʖæ/s~UeKaSŠbBSȅ>lIa:\BpW-}D!\:lJ_& }ICaQ/ C|"H"sV:VI\ytR9W-5e}SWIctxdP q\,oæ͵ִϚZ}Wctؔz ' Y^epaSUr0>$yyj \?l9dօ>ūI#lJI3&s 7g)5?++>rߜ5¦v+tI^$pBƆ % 9^!HG^nt ]enaSškko U86%_8*ys[qa ^CWtؔrTq.ѫ$q:<2Xorӫ*sV\r*s[929 ,28G)O5Us(d CU/ӘgIk38*sjY9uo*sր'y9M)Lyap(SrHz;<͎:Pd#lJXZo}+c:!Tmuẞ>Y #<2ӵ[T9sE9¦vyġhEؔT50"e*̸lPt}m|0%uv&e{>4! B ު)C)ǧG8%U6w^OA&(qK5HgQ9#" aSZ7xTp{.R=}'[ ԡGؔuءGؔc=WpJiOu\ȃsFtJfC=w(6%mݺ>NC1g)PLY#lJ[ m-up;7l6% u ^q ))a5 ܤ|6]zRù,\BpWF= Bsd@n8M u[XXTFpNvSO@ o8K[3\ϡN)\6%*oB 7¦u;gdࠑq8Etsz9a` 7¦S R),,*Ә1sCIzRx+\B[[7q{pH g)eD'v_7¦|؂sq YLS=<.NbB.c!05䱰`Djw~HprXtrQwmq R]zl)*Cy5),.!<GU)g0`Os%غ6=*2|6%jr|Ir <4%Utʉ>,*2m-8Ы"SaSBv^r7j;cU))agsNU2U)p \>Wؔ}ؔ9? ؔ}ؔg'X%u 3beB*>6%m{5\Bɾ5/EidXovG`uk [;Up9?\B]_jUd]V)p auJ*s~PgG׼˴=*@8D' Ȕs~ؔPNz3H.vS~P~^Z!wI;|Uh ?\Bo2OO)KU[v=Ϭ)VQ*)aus)*J|6%컢xΩHVQ*%p a=nV Gv}ؔP3JJUU ?lJX;srO=*H.!*'\R7`BTNzYKg(V!*0d䬻@h?5$ȠDU,VL)?\B^@/#eaS9W@V\|C$)]tyQ D¤Uh_iZ3Hؔrmg<{jE "a:ݎ4H aQAwujEaSUs׀Պ@¦i1W+ffvܴ:*23|KktE3zV.!ᴼ~`jLaSz{rZ3G{'0 9߇K{Ӹ2XeaSJ*AaQ+ZtL/9;pZ2%0`uΝڨ`Z2'`Gz!ybs'SV}VL.=mh;c->Y$<2X-vcCU ޙD%}9ŁcW .!5vki zg V ?xF_;3HDz}a 6MA¤+hz:?A_p<Hxd2g:6,8(#lJػ1wW.q-rE|OV$[dPIwylM=+~g .1Ȟ{N,THyVW6Ԕ+x' :j O tȝA(lJAn&W(6%TL E+^;GPCMieh^;GؔrydMTZ:|/#L: 9W0@wp =5LS^;GtPAT=m8c]DaQA7͊|Mh#lJ訹 c]=+pgV0Q[ȯYՑ3M }>k؋3M kw]İ1xƐp `oux⎩3Iw($\B$|_;3HtrUʫn}әTܟޣٛ3bw桰)h9  ~+sy*ٳv)aEZwE= tg Vĭ^;Pؔ~  tȝY(lJSӑ9\-/k:W$:QؔxM0 EB g=x'%.\=0DBnxP(lJxFs; " 1axpX0KgcF!`=`" .pt C p 弫y(7T \޹~q(7L6%tgmUr(?1QtPkdoqFz)Z n(L::sRO]i8`, PoHa%mpTb_yGmP^8f0P0G>܀;` *>LB=w(O(6%͉5pr]o<` wqIњQ9*¦}&Py(lJXssj'\#Qؔ{姯auC )_{bW7X0K(g` #{GQؔP gC9 )gțVVC ƣp sf{Qt16g}Q>[g?`> *A a-¤==FW- oAhm9#~0T0K+ E*/(!+ GǡCQз$O{e(%%Oʩ18e'#><Gá\ K}/Gw">I|e(#k΅jx@p ooxߟK{#|YؔPS/ީ2x!s¦U Ae )l6%_2 )h.ïVh NHF)Nf#⮋ )x6%t-=Oi!@ e6j)Ä6%>?dkF'\Z:X|8LkaSB̜˃R.-lJY\}>-L:{i9mBߑ[*pOg煄at ֡η;GC$ [9jkD tu,_uVQxdP3T퐲:EQI)e`a& zts,!Rf(<2?s>[C9 桰)RfAFo[0M }8[{\zQؔyxy;LDaSZE1?`$ e&D Fp p}7RCy &)bx|O1Q|>+!3QP1SĊԙ'C9 )a5lCX p rfA~xSV> 6 :O7y+¦N}(oA.!H_޸/ؿ쇰IB̂,=b[ t,%[9oWiY hTQй9gݮ, 2 GB&lqA_oA`4 PK:;,cQxd }'oO`B`$ ۳9ad%A`" RF= = FaSB:0z/¦;`==/|=LFaSʹ`@ߓ{zQؔPA3'ۗQ(lJ\2΃Q(lJrO<QXTÉ#m _0M 3sPmV D )a=S(1.=c9!trfsWu.DX ƶp %m) G\fKv¦x꽑=nB!l LfNGg\πmAu3r#E0M-17l&蝑r=LmaSBfq+Ooah :Kq̶Hf)g>x0G0M {oS$¦RQM6&I9 f)tNZu~$倘¦['k&I¢U#C1-HFp t^l)6%Ixzo|![eq_^;g\#[ؔgzdv%)x6%_ʫ{sRt2}OspG0$M gz;WH9椰)}JΊ(6%՜OE P ֧O8VMVD Ƥp 7oOV!)\BX.ĕ71~QXTy­Q>(lJXn_x6^D f)wnO`F`@ ֧/3Z͈2 IBwC;OE`F V|齈 IaS,(.!Mߘ;*='\3RؔPWjmk7BN)"Xow=ӈ(p.!c5!c0M wrr=.@{#"LƸuijj犅(6Z)u\S/0w.!LYa` j}yݑ>Ll {Nܑr>maSBϒuS7#|¦gP3#|¦-~'=և-\BB<"cG0M u?ap zPqLDGR-\BY:gywI1M = bOh璔bn $)D&twyIp u:| Hy椰)[|?x$#%uIR)lJ?=rp}璔bF =qOY=86¦)ڼ$n0#K}[^UpaMH`F :?ѫ:(6%. xV9D 0yG`F :!oQ^)lJsN'r`H`L z@dŢ˽!Qf@)L:Pare#j0&K(g^-;v:`G`J ?q W3W-~Dy ¤p qF`J lwtMV1)<29.zrTLZ~1¦+V%ι1\(a TV2¦3jMlj{9WjsmYwֻ#|¦5'Iʝ &->HyF)gƜн2#}¦o&{#[PsO[)6%Puut)6%TlT5GK+{VtVO$3[tPSfA{+npG0M ?Sخ&s#[PsfIy9o|Q[>eTtHF0gw( H&)a}zGH&)gM]qhap ~&DgerF0#M =WLyybPo!H V1bIȠ#(lQ>LGaSBAc=5މ(|6%T,ڟފx.!tNyκ={Q.(lJD5κl"i0M k'f{FF B :A{ҘΊ(.!/0(Ze3% kŃQ.)lJ-o2HaA}͔TZb:",R2L)F\QؔFr HaSB(f1¢ʚ-wdB 4 ?ٵ{08 j 0-¦u+ktKdie-%h,K;*~(o6+hxkd<r=mh~MOeaj :R+!*蝑p= naYWF82/ H&)uhy0茔av j}˼囜r=naS_>tG0$Gu>rӆw$RГPb]ƕa: Q T 'tH0頢fM`o _0M魨Y(\6%H˰! Q(\Bm#sQؔf90¦O=jA)>}< kaSB}Ϝ1E+oK||- GaSB n87ozQؔ"}yHar N .!1CbCtni:w#[tP޻x4#|¦3{v7#}¦h<3?Rއ-lJ9 ʝ?RgȠgJ"+Ϙg H)G>K9x#{¤-W?H;#z¦U#H)7tH)a]E Hƶ)g92ߨ}%*z/|aRު"f0$K}sƑ2qsD`F j֌e՘e5LD`F R:^|2HA;5󖻕6)\BY<8xe4%Vմeݜފ(.!txNKkyQ. )lJYRȅ(.u>9{!pwm"e Q(\Bog;^v>D Fp 4XQ}LGaSst!c0M u5K1¦3o-{b`Csy;t[(6\YpYbI9jyp t7:72? mBq~*z#[2}9)6%IR7#}¦>5iݣA-L:o3gQs#}¦T7; Hy&) ~#쑲>n4(21H0G?m`)6|I.2?naA{ͧ=Rև-\B>]s%m^z;#|¦ G0K(g]kS6=I)amN6G C[P3~3Lr@HB RЇJ3;$~¦>g? I棰)>w}"g0!M魰SE`B V,ފ(|6%/Ocu7#i0!M w7IAI|z\|LHaSz>sM9Txp"f0#K譱yR{͇Q&)L:X>W՜- Q )lJِԟjކ(A&M!]2GB疙q:qLC < ~>Dx 0頺f͜8?=" Q(lJPubH+Q(lJY3jMv*#\Qؔ:p7:2ƕhN[4Z3¦dW+OLFۈ<[̟.!t^74vIp gw .!;$)6%TIWu&/g>maSBvVAMHy)!).!Be!)6%L@VMIp /un-k#wH~¢)sÞ H9)=Rއ-\B|G0Iyti0G0KMupG0Kk7(q˺).!t޹^t4#a}%+^o=#~¦n)e8ɷwH0M guUg6 I棰)'yzQQؔyE_E`> *ln̈0GaAἳ{"g0M 6VygtfD9 ƣ)+缧(6%=(6%t2(iл4¦:3Af55%>Э%ʺ ԛe4%s7fD fp %QןVΏ(A&tnS05¦vPk5a6%:#t>˽#Q~I)lJ27zS RPgӳ?8¦.Щ-=N+Qc\FCu6+&C D$mK.,9$a%+O(y==Qbn j|ӌV%)6%Q ] ~\r@nBIP#)6?5q:#)6%TYFQʝ# &N9y[$e¤ꟹ~/ r?maSʙYfܾY$¤+#>If)CwރER9)lJ8x$¦>ai0I1)M =w\r@LJaSB7݅pOS cRxdPi"]C3R&ۼTe6%lx~Dy 0 }U*;+lQxdyB%Q(lJrgkyo}LFaSz+l,o2)c0"e0M =sۃ?E(Q.(\B9p{Eކ(x.!N_mWG v6DX p t5iIb Q(lJohes Q(\B9 e<[c Q(\BXԁl!d0K6y{YdO1¦kK)2hM2Yزyz]rG&ys'yz@9(ry@p a]!'R~P-\B9`CZt2ԛY4qUa^ *~sWRNy-lJr=5 ;kaSz+~gZs7E0Kyy?x0E0M 5?ל7Um|#Rn@-\BF]ZuyY!f9-\B)>)Ô&DAbCK`<#spC0M ݨ[ޕ8X=!eu%*f4vHy)ujy1fwH)'=IdpD0M GFZUuh !hOQ(L:lԾ4悡(\BY0 z"AQxd zcZłC>(<2ZBs5Cy )s;`* O͑5K\cQؔ -g"3z\QؔPG3ӘG[+#t-U#+;sQz*~cQ}ĺxMC 0鼵3`4Xa+%NϽ:S6Y+¦snsv֒uCY p 3WԞbXmFA3ϮÄP!-lJ[=VFycfqXPH-\B?=fHF)gBYkY79"v%Ӽm\X:laSBE~.@aj ֢?鹓zpD0K깐Χ t[RhncpD0K=LHaSBWQ=N{3¦N ʌvD Fp a]zowGBvDYq !TӬy|ԓɍ(6.>%Džby)tC?%)6%T 㺝')6%N_$jI1M)$塲')6%ޭ}`V6IY "0zcj &I 0tƛ[q!l | - g r?maSʙ5qUat j~VdowH0MhER-lJ9V~:cmpI1K}S $偘¦pڭߣSR6-\Bɜ}m+$lcRP =]SR.))lJ<2ƞ'6\SRؔPa|>{UR>))lJ!z C[Ѝ}Y{$%*Ip aw= I) (+-r?LnaSBoꔳ|Vs[ؔP"`bB :Ttǁ>$倘¦J#lY .I9 )#l*:zKSRPuڒ6欕rIB?SeG`J jn_fƝk˽Q^))lJ9Z,~BYF`B jmfdyJoE`8 *m:5yFKD`4 *mnPIe2%NV׳CQ1%Q:d ބ(`.!U65\(d6%^-WQbģ0U:D p U6{Fod&Mu 5DPނ(lJJzZCy 械)amzGݪQb\ڴC(s˵~vA V NLwW1ϒjy@)CuJڞ;g\ZؔP3 |8zg\ZؔХhzlU;1R-L:A9}KtH9p ҒT).!T\[{n .!tv)<;laSBΜ'R~-lJX[)ዔad LR]=8\[<[ؔЙ{=P~;#e{%V\W\}Z#e{%T^=-,O9쭑= mBO 5R-\BMώ)C.!,y?4!b :S3SQ۽3R(\BX2Q2a4 RλQ\~ܜ68#z¦>Ь|Z^Va2%ʚ (x6%t8W!c0M 5GǟϭQ(lJ]2+Vz'"\HAE͖-¦Y^r\ rLGaSzki5{D £p Ȋuª`A`: R2~;f0!a0M)g>!aF",Ƹ"#ok+ 7qz"\[tVUW7nX.6%J߉%;9RƇq-\BٳxVsZؔ&}.:#|%<ˤXzo|[ؔPӮ~͑r>DoBϖ<|F0M G.ż܃7R-lJbh|7R.lJE][5::H;D-<2Bü.7H0IkߨDĽE-L:9pxDĬ 0?LlAi;e?CaN玔a^ j|X8G0K+Gy\Y^9#|¦5Sg*|;R·-lJOj+`a8 Oϑພc$LQ2z׳\(#Hy)gnXvppE0Iwu]eQ(\B sv@`* :=3j͊?- EB5MnWQ"o#rDaSBVņ΂{T.wS=Q(\B95)~:"Qt2K>,¦yns{0X0K4{VO=`< Rμ lUl+rGaSBM͌բN `0K=i}]HaSBM~묈HaABq?̃Q. )lJ$ފ(6%K/[lG.'w^Dq %ymZND(A.!t{mӂO31RXTޚ[}[ C`< PFW` Q(\BI86!b0G4hg Q(lJ^)ee LgB`8 ;<%xNLrLGaSB- Nܟ Qؔ9!S Q(lJ hF#"LQt{L7!a0E55;V`ށ(w1RQtΣv >|g?`$ i؞2P΂(lJM)'{Qrճ.IwS{(c<.<17g C#+|rDaSBrQn靇rLEaSB%V{ 1N 읇r#I+sLꙎ_;cQޞv`I2# x0鼵!]=??#\BX_rܗԘX1w&0[В&9>_G$&_dH-p8$L:k-ƚkgjĀ!A?[: ?Z33Hxdޮ{ozw? eB=Q+Z|6Y礟/SPogA0s:ەy,c5!3Ƞz̓y3eaSzjQ< j̜%0ܞ>1sV #saI8:|Z 3G>$?Dh#,* [s˿iaAXapDҊ:¦ʁ%|'sHZQ2G2~VlJ7k2' <-X3}tu=̵%0%qZ2) j5Ǽ> Hs~ؔcΫ,tU+b62t8֮jE̜ä%#|1ysԊ9M [Wݏ#SNaSBՎ]p*DwwmS1SaAQWZl _Ut ?lJ߳VvGN9IGJqπ#vq U)p %Tk!ƅ*6\6%洵4=8bW%E0 +UxJy5L:ؕ^]c/WŦUæSV{l*<pCk;yQ*:L6%`Z_p дOK{mOG)χK19GfU@i>\B؇޳}Yrzh7<0QNaS>OXfGHуSNz-Eu>Д}Gu1syOL9߇M)G|ǟ}Msg }ؔ/=OBOP9I+gU|>lJ\YrTʥbR}ar:Wڝs=<*c@X%^{{;i +lxd{ϻ&}wؔ3lؔr<-mj]/83lؔЕq:dqrk >k\+TI5\Bh\'"YrsҀhƥ,X2'ܾp^\h 8ņKZ4ݳע4`c%%dyZTh 8ɆK{x|y,h8džM {xs*5'FSEI6\Bl(M!'p V{k ѡ4E`¦ g4E`¦ẙn0M1g)al < W(|rb0hٚw7)6%h\|>4E`¦Q=گ<4`%ݳ55 )6%l'm໣غ4Ea¦41kn) .!UMyuɋG9uPsZP}K:(RY-lJoe+7-{*R9-L:د:YHg)刚؟( -\BJ~.}HpwjX'( ,8Fؔr,oUk6NaSR[gg!97¦_dV|8$XFt/t9~@Ct(iK}k68|@!92BkPHq%p aW'w@HAp lہ* 8¤#|V5),6% WeAq8M {Bs{uv͜P> n3\:iA r8Kݹ]oAq8M U[ wg 9%]e+0W?aHeph'$sFؔ2n\sbNaSYBz)6%Զfz]5= )6%L 3 ),$83GtϱfCC Hi#\BS6u*[ )8kKg;/+C0%`cnq,˼n`1¦:=۞P<9#lJ$礆:P y#,*ל b aSFz7L%8kM y\<[`FP=/8乇2%عu22pb!5-|At :Qpi[59@ aAuY{=4Ce0`aEqx &8iK aS.Wc ȡxFؔPW<` N>–};pb aSBudшiC!e05FxduQQ" NaSNNm :QpB||v(6%T!m>SGqܡsGp>{ېU0.!֧Z!/70鼵ub+]sxd>~4jw* GCWٛsؔPWwk{~H*ys|%jd˽!!:lJpΧ>A:\BX?,V{*ws򜈫,]ٛ#ttPSRq_U6%λ&X7p,2h2a<-J87O7АU6%T}׶⢓!˫ N#\B?5l[-1eʜ%y)}Ibg:7p T%wGj*sj 瀃ֻD8p +s^4نL8)ZBس.ի4N:L:k'u!܇ѫ$a:\B8Gj.6fWU .!TmZvT y^eqaSz+kf5dz)NKPWi}n3ʖ%Z5ΧrH"Yrj>tIQ:L::DPUx.!WbtTJaSB?b }]BUْb:!Y|r%Gİ)ʡpV)t1\BoQ7UJ7 %İ)Aoʨ*]m [M&RU(.!}>dQ:\Bɒct9I+!d0\Bil\ʕ æpc)\0L:X\+?e!LLUX&\mН}gLIUP.!_ْSIUP6%!.yCR9aؔPv=)-GTR.!ԯiQ_sTRx.!"S<03JK%ZҺ{}Ria1.~!u1lJXymNL¦(U?}}R#PؔN{]RipoŸw$u:%rG0.̣U_K&aAMF4yGӐT^x6%ֵY^kܥp *c=raH]*/Q@ 2eUe#]Ria^dTK%aSBDf}RaؔP}{ewKe&X;[s]*/Q ǻ[+ĥp |K)O,'lJG'xyCO?#rX$r%n=OkyK*D.!ou?{4!Rpr{ok۽ZCPcNӵE>ӎ!CA'lJAZ%}CPџNؔjƋ:Ĺ>E?[, an5 B}៣Nw;rv4)B:BFub3v¦\R¦V&HZpd$D.Ct9B%@Žu~-siH* p [[c־*p oڭ~3?)hm%7r?ŝ0`nGm%L,샱<æ¬A~}vXZNݺ=j;EciyM {;Uv9YGciYT.m=>O+QXXa.^Ok,zBoU .!rV٘ӷ*j4W'P;$j4BXZ 1Dci9M G[̫{]<Nt{~;U96%nmoTPXZݝ.'4%=7?/lux<âv*S}h,"-M`no85bgyvM {v! K;,*pͺCS'vj3ow*|ڊ]OmT,y6%Pӝ VG.hF)\BovN2Mayw|ڹstTD)6%PS_[a'w㞈j#  :ٿeK+n{*4{,ٷ"EAOD5aQZQ\hN.ꩈƳ;L:tzzjM'p ahaa 񆐧Op (s!gy"L v1oQ<x*K{l30#Ьpo3%ͦ0u2SV<袢O)aMn7>}t t1FNBz0sdT6w{k<{OQ!GoP'Wc(OÌ!CGCWz r.^wQFTaΛQX EOaQAھv|\@h.I,p5@0*zL ֙zSNbT.!4mK>¨S)lJXR5ُ߰)a%l1h1[yIWs`E7Ռ&Z,\ZXanv7Mi5]yKGb vW6=Y1b٢¥˝pj m`^f^h40VH%\BXo-3F:_IAhUcKؔ0?/U F,:]xUc)mmHV Fb%;?XcC}̈́M >j:d TC}ńKe 3 !zv~t 6%<޳#vcC}ńKO{kwf¦k^t;6%Pps=l%K]18qXT=w_.9O+jU=OKɌ~[ʈz[Wyu.zޟ|Y??o/}Ozg>uin彯er/QOʿl{-+1?}_`2F&8v&m%ˑIA~U\Ul]ed>͵En>bW©]v*Vt7l^ooR/RFT˱P 9Jz(u8ku~ֈn!Xz@Zsylfs?s4W1+w/?^7߼ 3ORc']F7xcoݖ5>ErE576e}бB/?wvG|™8}e0H0BsBCp p6.VYBm-gY܆6.q(~iwǯ[ Ghym\"լ!FX\KJ6KZUh-RƧ@ /M7h(ǵ(CtpKߨ rg.ӶgcI<˲x߼ 6~#wnO 0h]lyK; C_.C2͛_0S%$ݖp=5x`Gk{)\T=L񋬥@ZOw2?!ݙ ۗދ&SM[5sܸdbvho۬,I1GdC h;Rk>C -IL%b\)CŨ_(Ɲ%"E^E0I9p,S ,oP﵁2!`nPYKf w?nh]2I8謥ReR]j@W&كJic!/Nٞ-8t!A64C (2ʈ=g *0yn*(D-őjJ12AM' S +@QfoǞc@ai5M{5à"8#8\b B1n*CAqx<GS$6FkA[0I\0@ Uu1nh6>ŃL) %E3lwb2a)cS:)% fxR"|"Hļ=(R)ؓ&<'8gۉ N1R,"8QLaugA-r5v]M<.#bA!&R⩖6(|Z)Ġ8z5ŸM`1kf-gu ZYBuoïL HNo)bN,KwP1J 1R/H״yz =.ͼ8 bN7 )g馐1BHĔj綶P_ΤI6ڶ,h&.Zij)sJq? )9Pərr!E LK" QA!iA!e;ݡBbR!6$e8jЊ Z1zA+Fo$$1_҄d[xMbW&qCzS`ѳ$RHt@lKa4xѧlDWVSG<)Y )B;IZ,sd)%ed2MxK0$t=ͱXoΎ y}&0s()Ж -A̡D_$b%zb%B1J () IM+)bp@:XKsEPbJJ\5QV3U/4J*Dqe(P?P׽#j1D]1I[1WqL>Fc=/XDr P 1 *@U<#u}^f71?SFkVs<Ĝ{ D\?'r9#aH!=(CG UaYr."QW FmQs)deH08?A!⛳B"ٞbnEFAbN7qjŔn}D[boDor!1(dSRZ=[$b>w֠DLie_屵U+(c¬c9)b$=ZLB{Q-Đ1V3 ULq$3*$(Ę$LBuL5eTI c`Ҩ 5gF$ܪYRR7%sAD[Y.`:}[s3,XD~-}rE\;izlf^an^;vx q!O*Skbg l`aͥ0F#5pCӺ?J6qHCsgaM$D EB\jyG扴&#`/1kƒuU{牺j?_釬od3`Je80&&ypzq]uQo<(bqԃz["MoE[,9oaS*R 漥NoULOib[?Al/.VUgEi0CMiK 4_n* -)B!:KC* 5O U ꊹ3rvgDL٩b$)<r"Kh9*$JiĆ5,bOhߪ5JSY" WVdAH꺈2o¸-R b3*R@̱_1+=C`q|Qa!DU yKTAM,d2 :&KjdEp(+% Pw^ss(+ELBQ'I/B>b*+٩y{cɾyi{ h(yXPF z* T0 @A]U22; _%+dX\}aP7xYM,*<,c/ [!i[[! b#)qv #WaSB!\Kڪ .E̙K_J&b.ȥn! t烹ei3W| UNĜ 䋘2Wa٬caZb=pEpI!\q23Way)s(89sV52W3!g&1ۊA@5ԥz@_%RlIlPxVi$Hbbre)}VT,8ida9 0eT&GҀ=7 (1A4\x5<9C J5 ,)| W .*9\t]/t!C~ U)w[s{ /QW!'Jb+,1{8t BW BLK\%R" *<$1h R) 1߱Gm 66,d 5g.k> sQ= $\5oc^]l@Whc@oTҤ 1v*l -gRVDKщ|JSX*\lR!@RqELa-sX*1ťì.Z(4qN(xP.bPSTawS*VS* ĜhyBKO7o[:Wm:*b}:k0:h:F1Y 1ë\bqzFz0DHYsm)}II!FR}?IxvcH׋y>)m zPJGCX2q\JRk9HEq&0i`]H/ƄHEwiL-.&GZN\؟J"i)oԮU IiKÖ>1lr!/I9i][>h9g]k ǔ cH9f/I˓XVaKZ^l豸KOQB˱zHZN]QХg3Ǖ(ƺAbr9j$4i9ҢR +lڱ.Ak~4AL911+iL88<8Ńe`{G< :c_g'xXvZ BkŃ"&LH)z5Ĝ $氦OXӚ>{(N!6>ȣ bd&5 bl&Hbc걐N=o".~TP}g_LJC.Vb̫ ,fNRJhq뤌o$! Os+<@%)ÕM,̄[s-(ϱW}:9xPǒLÀ>ق3Lr€:bPǾ}=B9PÂ2'g 񋇁tؗ]SӇ{SgZBTC:i)$\W|0:yN]ؠ:,~z2ߋVdڊlqi>$k/I)`bNAcEYߕTXO_}bS=EkL ;;5yا0}(ߵ0"p 8كG&xPc_O Fw榻?1J~ay>{\)q1g}CL S鳘^)hCLOO^)AK!~5PY(`) q4 6\<kahQpl%E/Ww!S6j.dF.kW.PMXﳌf6Ц.kWZmF+Ǐkf_ @ƲǵYq;xu̅8q:%xX@G!= #e2VNڌxwg|uSxX/% ci0 ces+uR@b r:QS3A&SӖڋf ,[m3'Y\نk>՝{ٕzuWY1>b~`< =CUx\6{L KI<י<8sf=7ÄNsF .^Gl&w=1ۦM'+9BP1,~a lx8ka8<87\ﮜРx<N< $mWT2ل,RS?牘P`.Di^e=)&!W`.l#W|K@ɦQ&hf$٠> )ܳ>)dPy0='w>h V<8XP/0JЗ Brb1 ' 1jNc x\2c%Y:=r ]2ee.#ٯJŃsȁDz`1űBIDl&EV$' ˀDLIM-cZ !C-ҌxƟ[aKÂ56"S+.1={3Wibف!VϝL0޶q]9|.%&L0@J@ʘfda]9%<}GWpqNF4FCd~a:OxHYyZ1K:<8Ef,.51x\E{4 c&@7-#+E98rE/IyO}=k EBK s! V2&"T\JKc1y<;P1tc [RR_iBEV!5 }ɥ/Rh8\ )Z~U<}SX~5yxa,㣘 cKl; -Dx*:J>PK(?VU-y\e@aHYk.ĿFJ'bA)9jEyD&~~j(ŵia 7E\~s+蒘y,f/J/Wf7wӫ_&v#֟uaaMr'alzBx[%ޚAx|j=`)Tj=mfR<֣{qU]˫JGouŜ56h9i)1: DgS<9*li:,%xj1yUUI%mlAKlqo3:AJ^Z En&4p+PrBJS(C` EW(UMh/~1 kvq 0WЉMÂnE&gmx),8T]!_5UAEB6!B 5J pǬZG|5{5{\[-9՗}"hkS%06&ؘkElj"~A ?iz.P.R\rփBW*ĩ (vB|0 bd(CLZBˉDsS$+,{ŏkO.hk7 D2Junn*͍2]9׫[|:ڐ |uֆ 39JG!"Yk&*,KbeYs,+eBbA̿P $Bt:8=@C!l(Á sb+C,̉I%xL<ѭCZUŏni>>nŵnfA@lgeD̷ O|R=53dD̳g:iAlLYY)K=RPҘb3%hƌT"8>ɵiMuNR&dWNڗԄX\\BL=l ևi6+b`mE2//W?L_/6_ˋv?|򿿉ڥyمPz7h2/PM>o O_z?h; ñc/Б1@m qԦm":ܚe[\~0Ǚ1!HDlsu#˽c7_[<@IO>ǩX! .Wq[1Z˽n$E.[11:l 5GǀM|4K498ָ(=)ح1p9:jsĭsDs0?1::@({u8ǥd= n%.#Qcn((%P9ʳ_##1uBGaGԭ[9[;:nn踧A~=/IsijcB ?G?GG{%9"8:b#b#bc:s9SVQ£G7G\9"<9JxsDxt7k=(Q£GhG)3?G<:N{#?G3G%9"8:B#B#B_{H m*DsĬ#h蘞\ecB37G~~=~=~=~:a#q9:"9J0sL (o]£J3?G n̼s0ss``舀(׭`L?G\e)/|sDsDsӵc ~QG%9";:爀u{[ FsD'ttLQ#cj~`Ge(~~y(ttL(9(An(Q_tDus爀(Q[I )B%i?GPc1(9"::爀#gSxtc ~~`ɼ ne벿X?3Vs rnQ C8{mߚqp QhI1ent-h9Ë_wT~FփN@֩Bc nuW~aV-15nwan5p@gSA?@dk~W:fpii}Pk뇾n:N,>}&8#Nw)ܢ5 7.WzqYn*={gB8:aL>b{L 'F-֍q9"8F2\ߍ Ur'Xo/Bo2ob]_L\_zKVyPzny}0HWO0" 'Wc >͚ۼ:?}楛ieݭum%9/kn'5wO}{<~{ȶ ?R30"қe:*߅K;/H]ӵlGW:ڥO݅Wд+]BYާ{<aX\l[c Ϩߞt~y=։rBnŇ;鿽85h3w|LbͧTOit?`l?˭oQ7q6I`eM{j"mi>/ w[Pmy?m i^R:4힭q+ΧVU0 ptKuРYڗe>{S׬fe/ݺLSBF_s]Ǟ54n~r n_e Gmֻ[Cϗo4qCWqisM6͸&wl^})Gro~"}(|nShNjyC~y107Nd3麵-w~4%`umV:?)<@¿~:L9O~j6ҽ4UҺD=m YBcl2UІtkP]sm^Li`3_I˷f?~a(i^3]z0ŏnF6cw*r 7 ?8^u%<}&>Lś?c؁& 8CJ]xi#~}C6ðDPO6粟-&Oq]AQ(zr%Oy|c<znqP+.܃XeC0<~=͵ 7Pt!n2kM=DqU]eHşp5\ . [ 6 5ZԻ4,+nK!ܦFjˌ8w>Bkَ1x xz 9%<]~ qlO`t +Z'Shi=TDЇ&<|;Qxw\n@>+0h}cv8~:.oEOIh9ppS#+/U_5@3ɴ}ʨۣ\՟D>ۧηpn3\"zM]m)ACmxoi}xi\gj+0(Zky:Vw9CCv.<~7g n>Mޓ>]Y){ rjcl@}l߶ʆ 6=>7?U+>ɈxRKeg u۸uzh$qHΡZ bllK-"lH|CC>h9nCzL>M|0L)uoja-UX?i~wi޹0P [hGr;xJm}nrz;D{|%lxf^F(oNšħI $c y/E?S;́J5&7B@;]nM3&iY~[i;&s-F9ĭsUԔqs[6Ӻ܀+y(Cq~y /3I^?9t_m61G[t[aLCۆ`7tyW^k'ApMѦdބǷ9|wL%{&8ԣnoἻ Tˑǧ<~k /^_ej'A[sw}?wq큫!ԧƤ6,αctoP2,CxcUAwpnqibKI3v{өa14yfÁ \Ϯ0m>Ը/X il|mIzk?.hp#RN3aF"} i$ rkpE/b}܆#Sv⸐"go阸{үn J&~+_+/__PsQe+'/8NjQ>?~_(ɯwJv_(]W!%.dz#?ȯo|?8~@ȯ_ȯ%|&T~ƜdnRU+c{Vʒo^V:)w9,T?W˯_5{?lsKʯF%"o߲LoJ[rv+1v ]?>B8yh.]/ocCo>?6]^)OWza%7s$4Q9{ >_D-Fi=wpY=+Gg!:C}gҢm<>> stream x]O10 mT]Se!ipw'e?\=8|RcYZ`ɲcay⬼U| d6~S3tȫz ӴxO$ڪZc:AMq6箠ߕM%k17MR{;R@Sjendstream endobj 382 0 obj << /Filter /FlateDecode /Length 43326 >> stream xM~;rܹ⿛n.‚a@ öBҌ$6d95PvuU眇Ik5oߟ6/os?_qc9~!~?uׯ㘾kw,_5M6o?߽O?2_?B濴 Q=f߼?#/a?y޾.w_Ƿ-}7 OW?_?>v/>u+ 5/i=<]s-ݟ~_۱_1/?rlş{{[_9_ YeʸY1oVkghBT׾׺]~w6CGo[_|_?Ҿ޿vZL5{r??8u0k7RF{:埿o^fvyR|2?w 2Qp:OZ_<.ur}]gÖ=ly}rg?_ǯ}sG]~̎cOquOU(|=(گV4_QBkQ=ļ5ׇe_mώ^Z}:jhS{ᅫyO/_y$n_[~Ew5qlU~oyr.훾(wڿw~GGӿv-ğ|G_sƴ^]e8߷MJS ߫_ŜOX{jg}aSwUH Uozf<*4ī囚~%_k.lJνɦ^Gj 7e7OhW}D44W.!̾kn~9:oAa~aSOU2 DkPѲd} 3=J W w ە3P/_B֯5rw_z#g,?7n !G(7W۲hʧWpTsR%ْzaVݰP93aSBܜ քp34_KxdHq+DՏ ZΔ@`B/xwtf톅+ \mUjQK ] + R~s2E8V:a慚×6|W˙nyqb ?r#\WRևF")!:|ǖ4yG&?v4'MUDR¦l75}ydXGM)ռUu<:]u i-Q&%ͫæ5/gj,p [,j,!F$)ڧEkI?h8RkIQp1aS!lu5CkKj һ~pY\RGLؔ]~͵q.y,w.V%x#h\Rqؔ@0HO%5OxĄM <ϒZs~.y#&lJ ƳJj л.u'f )O:֙Ij,K;Vuj÷:#w 3IaSBk>*?-ﶽs+]*m 8\B nC5)c?Q6we1a~vˣ8lJ h"@7A.!\H1!. Y3Q:0ռ-5ͽ3)A~p-)Q-0 uI0լ.w"~^9#8lJ}gsf~bY#8lJn3[Zatl9T0՜]MY7): .^,y{Wi.!dgʜ()֨8*lJ`=wk.ڨP*\B *7" л6KFAmT$i.{זN<^VFUaSOYnɊ]QpMs"BlT Y4Z`ncvQ\kD)Mxs-mSQ1'TؔBN]QQTؔ6U˚ZXP" #<%0k}jD&xalqFQaSu9үWaR LBso ~* R~%_}SтzVHb.S=lJ` \7@xM)ԵW+ 3 2C0%2g֔B\U6 ߴ:Ud "d/H-,.Op .uIaW*dR~{^q*.:i[ZVLJ`ӻ1Ѕfv9Kwe|,.p a|#IMoGdVQzؔrΰ$uY]7^++g ~*d񒟾h/*lqILY]aSe_Jc 4äkPvaY\ig~fxbV~Y2)@G6ͦ*r v+rp*r P{@8|?-U xOؔ/KȽ.U4'\BXEXVy) ,LG0` aBTٟ>O'lJoN ӎRy!O%唺_nRzk&oX>O'lJXX2;5P(T&h,淋o*p 4򴌪u33M'\BPϗ9* p v%5OkkCRb:*1i0L:XwߤNlPviKe%aS?8K{Y);.8 M)Bݓ-e Lxx&͎4c3TI0L:> Ui'S))K(GS=qkd220_vpg='웲ʔæ]xU -}>Uْtؔ]SU06%mtQO*aRVWTPgT-9NM l[Uk}6?2ȖäSW޾g'Ϩ*]RH k?JC>UCbؔ{C>\11lJX0;dT/9&M {RȘä*%°XcȦ*SZkdwTeS)9@M=d·ʔæ/v;Ȧ*Srw|OE(8ބ\$)a?E_MU.eFn;2j̕7 9"oĴGOn#s&*os*Vƹ!:lJxȶMvk]maSšvfC1珰)MW>!|C1%p _5ܦC!p UGZꄍPh#<29vN:{(6%O >hE<%5yHզc=¦/bW3 zP\#lJcl,c&z"rGxdD빽!:6`.yuܨbfaSG2j-Nf~JeECu8M cg.^צ=)d6%(LVA DhYؔ木Z[z"R3Ƞnl"tb'c!9¦=xaHp jlou7NgO?[^²mCv8M ; SFzrEDhGPVm8!:;¤~'l]spOCt(uKulXzo`!99¦J}%8PFxdr|yMCt 0x#w9=Jop4H3YؔPer#:R,lJX98Wq~Bs8M sVQÐ"NgaSBj8!E:¦Y6_9K&9I|d+yzq: _6LXi™"/daQA ⁀2cm@3]%g-)6%켜?؆g8M)GxIfv> |ثՆ v&%c\Og8M ;B~og8M KV\3jw>SY6lJ:#yG>S96L:Z߻{< 6\B~ԫq~ 24ׄq> # `4_%ȳ9g4_%Ռsxg8M 7~oBh_# 5/gaSzh|>}RB0NfnВ輱5@"0daSB&j(z7A0NdnЖ%EjM3/Je1lkTʞ}-|U@+&%Ԑy45/NaSzHsFZ) 6%zBSE)6\B' zBS6\BXa[zDS96lJo=醑Fq RFcPq>e{GәC!sZ,lؔP:.訸3mؔs&󽫩GC ֬;Ҹr j\7Ԩlؔwya`GŅhæc|%_8W|@Gh%۳5ϑ\;*44.!\R7PȐlؔr%I'%r NR N)zw 쨸ՊLJϛ{;vT\ș?lJ; ~vT\ș?lJH;Gb%}gGEeæ=sO-ʦR _{סBNž^B~ӓBγaS P̡=7*&<& =9r VwXN8GEaæ՟;9**.!mϧTvFb%՟;بSlanlXQ!!'p 'ptO9M kߛ֑'=6*&6%T(__֑BNic\w GE]T(RBM䨨~ؔ|O@ 9M)g+s@V6%H @hؔ d/AylV*@ؔ:#X V*#@:gi};U&쁞6U6%uO957:UJ?,*50qV*%p {sA*V6%Ts?8UN.(Np*Ryai V9K(\\jiegr@'|+*Z6¼9sZ@V9M Q8m!nSV*gذ)% xi?s߷-B؛-ԓ{UY?\B}_0gYŪ%} <䆁frvtzU:&0=()&Uʹ?\B?1&dr\+ZMXV*p agv4TJBE*.{ʹ?L:ؕ]}> T.!ȕ.hV*)a׊D¦0;V$6%y`xά[3HtgDpP$,*}oDZ\=W+ff Nz'1 /Ď3M {sޤq<+g /V?y`{!{kC%:KR)G}L!B˕ǎzW.!)83Krڞ3I'g܂BkJ =q?&!Tmi+g$ 30ځ3Kusc+g zr@}LDaSBWΙE<ӬY_qփr<7Q $\B0XGW ($\BY@y+' :p"^Kk +' :ZU~{$\BXɼkWJe0_!<#HP[7`bx&)ᤚ=9KW6%Tvs.j@$\B9)+ԝ~}E=_H k1 _ {2eިU`_7N0K hS>ǡQؔ?iVv0C &p IḎO0M d8oa;ס,QP2!=/TI+;|2LCB_.,O EP(lJXr><)wU Tt]yFF%B9&¦~%<!{ǡqQPHONo8`4 R:\lM΃P~bn%~G ]v`6R0G&Wk9 Ug@laSBߜo<G{7$[P%KH?6!u¦ܲ^-%|z"ax#=,7hzCsZXTގ֐o  r; iaSBTz)p9"v¤~'mto!> cwf!: VYt6Hy³p յ5֣sA0M 52sk,#ZP#i8\r8LiaSB_U0f\8LiBߑE+ׯ$LCZ|O29FHf)aHX{'\΀iA!N/؟ra cv肔a V<܁V 3PXTo}ʼn0Qކi(lJ?}o2K0 M 2Dx_7 z1 vCy Ƣ)A FaSYr}vQ0M 2S.\sQXT{}~P(\B912|лe)%UqyߟC 桰:fO<a)%;K9QR0 K2 u(G06%t|BP(L:;7&ϡ3Qؔ|a=%C p >fӌTR C9 &)[)a]?8(5t+2sS-52 kI{˳e;~I-lJX}͐2:jaAR6A-\BΜ2;Rn@-\Bܓ[T!ev%3o¨7|!Rn)-lJ<32#RnA-lJX|[b{O$ CQPó#?NqD0M =s>v H9p GM'R~(lJof;yx/¦#K^(6%kΈ0'*`Rؔб?K;.¢N Cs({.!AߕjVBFtTى[t4WvD bp e?e۞"QХ2QXT}MoEaSٶbO7e-%9v}(gT6%tj.Qs\0K538v{Q{CQЧX.ODaǍh?` V| ݇rj3V-JOfF}(g6d t{jqL޴zHiaSB)RdaJ jzڞ6)C.1(k{:S$ ZP׳nö?H浰)= FBN).!Tnԍb)6%tV0r{G[ؔP׳e`銔at VwYKL2< nB?K$wH涰)tQt4G0Ku=2[ܛ#|%Ul۳#~¤^8׻)C.!I% ).!tY=Ẽ;R·-lJ&=򢲢Ƚ;Rև(\BA-`D)x6%HH OPa> J4TDI棰)X߻4¦j3a{r܈rLHaSŠ4V?96w#i0!M }WqVc``E}2GaA[;:\rLGaSºɂ΅(p&tq+Qؔ.}=ǹD p o[}&Dy )auziFD Bp auwlm}Q )lJXsFl3n}rHaSB]͌51Xa3%.bIνQF)L:CGx782¤imrJ4V-J򨓭TMND &)%UtМOM >laAϚw7no|[ؔoS+k:w[Ps|us0G0K+S >#a|¤zft7Rr=laSB)ga{k$l#[u^/C28#z¦g_`pFK(gzf7t H&)tɿ|pF0 K}Fܹ#e}%=zb}!c0M 5S^S'|1¦.ϼҡ<`.q>D ƣp Ί(tw.އ(A|.!x=hB`< At&Q(\ByQPOMYӹe.#3nyu$C )NOMD &)xj QؔPSX/xބ(h.y랕S .DX &p f*Q("}KW^>,ƕ\(a5H'܇riaSRoDZqמkrU㴰)a5 G3"S;"v¦&n#Rni-lJAbylr;LlaSz4nXr;LlaAuvh;KS[ؔ"M+-L:Y2OS [P3!lX\Qf0 ~\p9:G3{;r5O 6%nyn:lA0M u<{LawvHYp E.ht;DAL'ϊ`<` [':` V:` *e sո]rLCaS~9Wu(G86%toS8e)%n.dzջ(%Z盳׹OKϘ׳7Q0I23фt(CL.w̯|5jz! sQлy6Lsǽ7Q0M WsS0M 2/Mko;`, ֟l,)ϖ]P(L:3SowC Ƣ)+y-Yq9gA]G2LlaSʼRf1S{/=iL&w6%ΙnJ)øzoaV ֟̒oB0K;s#f0D0K}8<՜>)ÜT̙+?O͇'R~1-lJ Y 䉔!R *x[{))C.!=9MysaT x漱`ٟr:CZGX.C$ZPG="av%NR<#R~h-\B$=2//}%R~i-lJ9ޏ<"x¦)Â).!tHS{"w¦z%ym·-R(<2XQHXp 'u)dTLy2#uCy#< &\sQؔбGOSQxdP1o2T0K+;r錇2DB&ny ꍇrDB̔UXvC9 F)Zںg C fp Ws婡̇0DB̒q&LNƂ(\BX>*`dr=`" 5wp3,¦Uh)UkCa[0M U3g:`@(<2}%˄Ғ|cL.!T_LFaS:QbF9=mQBw'L͇2Llj׼gr{Uy^S-lJXS18"vl LF+B5/Y!v¦^9Q:%R~-\BKaX)tn.b%"ðTlY`5?Zؔ 7SkrXaV Pθt! Hfp ;W.H9f)g.~OPl?-R(lJ*=2]%;/Rg`%'dT|(gx6&}pY0!M }k7GaQA̚5[3ζFa}o4w0T0KG?`Z0KkW+ EaSz+hރ(A`.!mPD 0zfmGV\e.%n_r˓{QйYx܇Cz;73Cm3P΂(lJu@Pނ(lJXnV(o\6%T, O8-¦NN :Pb\yF3E 1w?a.%󕬱̨< HL6ѫM =GC\hHYp N?1;).!G1Z 3R-lJsaq戌[XTcf.P_<S[ؔPs֌a_<c[ؔiٝ7Rև-L:2(:w$s[t&{D+{oc[P3ȃr>maS0muGws[ؔPs&>mE;·-L:0]c Z.zw#[cz}agla^ Nλڞw:sZ}P4G0K=Sy3?w H¢p yz^,38#z¦ӹvT̚)X.!tgsna2 :쳬)+z QؔPIN0x/¦5 <6!1 &D9 p kDeYdٙe0¤rLHaSB_g.a (L:oW照w!a0M魪Y(6%Mb!d!I55[fYsTΗއ(A.!MYVVnÚQ&)L:27fk70%vuFRؔPOXB`@ PRԁsH 6Dy &)fmuzq덈rGauj}Q.c\ƚE ]+"g0M)n4+ĊrlaSBkЪ2X$a%|wIp tm6}>laAϒl57H9)gd~$)6JM䎔aj :Oak4 .!L*P .!tέ\xBah!p }\/e).tyriwG0M >Sv<2m"snd:=;և-\B=sHp;·-<2X3M8iF0K]wR҃9Ƈ-\BXhqzVo|Qؔr%%fd͑r> GaS48fznܑr>HB<=wG0KڳS{!c0M U5w~P8&D FȠ 4喽Q(lJ9O`B`2 Pλ"fG,Qg(Ap.!y70OXA`6 [UCޣMD )s LrGaSBé)S1¦,U~5!'"\CRteP7e2%v{f~&C`F *k0=&)\BsIdD`D k=S8͈pHA'βޛv{+|Ƹ>Ok{'l#[xd#;R L";&İ Q[ؔy:ϙLwG0M ?[f˚ ͑2>LmºO*u0GI>K}mO[#{¦j)/OS]Msm\oad ۇ|+>,'H9F)e4ыYo8i7G0K>3*)C&yV)|=laSB/ s-H0N)|6%9C̩)Ä6%t-Hf)wŃ=!)\BJwoF`@ jp_082@ 0%{Q(lJ96ֳ:x/¦YZ{n&D Fp s+A #Rnp-\BW-: laSBd*{C[ؔP3,\MLlBv)6%؉|=laSzk}Z}B\Maa` OZ0UY?x#{%3lEEkw#^ClD0M ݧw1dD&S$ Zt{zwG!;"v¦ꞽ` gs8>` 9Q?7,¦#y> ( ::g)y Co>`$ [;$oˇP(\B< qzlcQP=,c3mFo<`: ֠q-W]yso< )L:"y¦(6%yrUkp"e$Kݜ{̝!c0%M 4K\9"#\SRؔry rO8乷"f0$K4KӴG/QRtPK3pv3ڛ+"|#RtPMs+k4Q> )lJ\r!qdoF B NkWl3霈r HaSB]'.2 HBU7EΉ(.ƇD5o魈Hy[D`D ֦dCHaSB5͖yDğދ(.!OytWu"gkX(e) Vs/jF`l PN/Ki m$\%?=U¦n)E,9)I7I1K>sVmIR-lJ7ݿcIR-\BZlYU1x$%z,Ż!1hr?naSBO^KN" .!t67I88$~%tIw?Rއ-lJX> )6dB4 ~7I 0۴n{$e%LtX0$e% fy`"t N;dI$K0m㒔bF ֩DɊ%)Ĕ6}a}gbJ z=$cl6¦:L], 2LIBgV7$I0$m0&M U6e4jD 椰)sBz5?-IBM^[K.D Ƥp ҦEVeH P jm<۪gtD 椰)fʓ(M8Xa7%j%=;86¦#s=86%ZdB9a7%Y~Z([7¦oiI~n$o0)M ̘OLrLJaSJ* uN3%p)I'ގ_ȑG@Dq]:'G ={lR)-\BIxL{xW'}8lpJ1Ky&X* .3z))6%8sALoaSB=ѮuYy%¦vn[Q؛%a%z5׽< ͽYRN.lJOj!sEao bR [ %G<sRؔ2XW[y<$¦j UNI &0+Yi;,IaSB͖>l<JBOha%Α(.!Tuuޑ(6%N1sm, IX~%-%Qv!)\B95qup$m0$M)5g`G`B XڬLGaSBugTɦ(p.u;'\QؔPo3'YYe3%ЭNc*:"LHaSB͞^eRË(6%􅶣 ZnΊ(.!Lu=9{'\RN}`yhDפNmQB_hƎ8OLD`n zC϶GR}D}e4#VܴMND 棰)e<{*&Ή(6%T Ӄ?QN)\BYZ ]4dz/|Rؔj]%\d`F`P BޘEތ(.!FE`N Bi!IfQN9)lJn>(A.!t}LV74¦=}?pӑ(+.t nD9 &)f:B[DoG`B Prԕe<w#i0!M)]!vi̩55¦Nw/egG )<2oMF}Q. )lJ m̘ytVD p fKٟ|.!ԴyWy_![4HP!؊D¦ /2>3KFG^#gaSBVxS2 9K(y=޺ / 虳ؔ2zܟV?lJFKneNO؊9M GvhnNJ1[a4'p hE==j+fPFٽ䧬*P[q4@ؔxf7a+!T >끲A3EpЀ E#ʃ9t"l@$\B@;ڗ_/R?pș $"7]Z13Gؔ2vQV7F+d@GՊ?¤/T50e)`1 \Z3Gؔr|[7abf揰)`ϖ+=W+ff:G4{V.!ϭ:FVL>\B9җmE_OՊ9χI'Y<2n/1eNaSBWՍ96gj˜æc.%yS+^6%鷷'jE̜æW&͊sV:n*=*8t-]5`]7*2wiU`)'p cht6t*3}ts]2)P4bSaSBR; dlWà~vqȓ*$.dwZ{hU@J=L:8jsB3e@F9M @WVՌgĪh{ؔ t֟ssVȪx{ؔ\ U)gp awzɖzcO I9K0DVE2a(awz͊F>UiâEWq 0taxw[5t {ؔ~LR @)E;{W -*6%dgTc DܟSrлY RU9>\BɓҦD9LJM)|Ys@D9LJM ]6w%7&dVAâ疔w\ĪhS{tayùQJAR+[5r.-Hzؔdޮ)&ZU$ʙ=lJdig4|8hU()g$O/G:E9M {G}smxVE[æ~^0pd?JA_Na(?]EsJ׳ 8K{foHPp n PA`]rԸ{z0dh8DgTXo: =JzO1!BE{D#΋Z<.cAEzCæ9 Q9"{T94lJh/@F&"T94lJvs oPAp a0綿 q \O)3dFBdžƵ#t;X{I"&6Tǩ=lJvh;?G= *4`m#BP'հ)e:<76￉ qn )F=rԆAO8IyiPoh'D`äX9Dbä~D m$* 6%Y.Ik=Dŀ]âvh 'P$ XzXDR#+cIgDNäOg&JT4lJحlu-^ⳣDEMæJY{JT 5lJ?<}==&*6%WNی(* 6%ʷƕ)6%_-Ի)qJGeD\VâVױG Dh3Xؔ3 bȎm i,<2ؓӫkEӘB-bB=eN-"Hc 8Kݗk-JfaA%ܮ=JҺ1Z¦]-h-caQn\ \8wt@2E\¦Go~N3A]¤]~}xwq QN̕?Mlk\3:E)soic}Lqgհ) j#>Lqְ)lؑg3]]æ-Igv-llؔ77'S)$.!M_Sz8SE)6<2]{`3]¦ErAw`g^¢9^R hYؔCVzf+j=)t&쏭8ߨLp0` zs d3Yؔ2.g)Qstnk"/baQ\=>2S,lJhz4S ,\B3Ϲ)6%Bp vKuNB=)¡,.̠ Xu}uM/zRty,lJ9\?b{xé,\B- .#w#;xy,"ߝwks}G?l8cM)reafMG@p+ROX-/G g)~ѿD+X`aN-0}X? n8]Kw(? Ql3 [ݢ)˴֭>@ q8K;?Sp *x @-sXtrOWv׺=) 6%kR|),lJq.  H0z63P[@ o8Kgy:[;eaSB mu?ˢ)t.!L,dļP2 G-= Fؔ2eeeo aQ9?K;H 狰)Zh8^o]OAq(eK,SEmK)6%h?Myo'8cM ;yUD6 ̡xsFؔPzֽ,5¤݌g!V9OpjCv͵MO]I'8kM [NDC Ő8¢J |E5¦ tN:P4#lJiwmS#E;¤̭EzGK !3G:~N4CzjQڨ朏N<XpNl~/9A +8mKg |<UP v C猰)\vLw/C猰)audu*'qO(8oM 5!D!SGSJfu;Sp [{=#C!0z:5.FxdпgGM3P" aS.BvyjE6¦í˒C100-=u(.!r5uƯ>1:lJ8bnU.n.n>[E&gQŠn.ǫ9lJ;ە77Gp nk\cێC 7){fZs)^oaS*`q%x9HGtG~ #*Q}zWٛ#tؔ:ǹdܐU &LC:J*]naSBZ}ՙރU&ʵnRU&TyB]enaS9-v4~r7)Fݡܶn ^oaSʹWYp83*s5yϱ]W ttP#vW ^%oBWn%F% ]naShV˟^eoaQAؑ.Hä։SC%'tȒ~Ϥ*Kr*9o\ T$JB+^UgC6sPktMQTeJB:z/Zû\$°)'jw5Vrʓ æUֹ9Q˕)<9ȠaPMi}IaJUT+pYgU9atn\0$Q unn O쳨J%zS3C"YstPk ;҆D*$p auuBuאGU6%T_k.흹]Q$98K5=K{7K*Krl2'0\BX\[J<)%IaQAFY^6*$2$ð)~]V2}UIajj}R)aP⨟>o0\BT'{׹?-8Ks4OD}R9CaؔP8Zw>qı0\B8kiyK$aS\NZ26>q'lJn 27q%ş0 oYĥ`~VֆZ#3HL% }z]. K% B ƒqpߧ.8"M t,n.y1\Bjw(lJ }[+%2ǟ0-LE0`'?+krB$=^q)O@'\B-XjN҄{¦Gy>C9#OtPŎjO*p T9_4Rp ah~Y;d 8M魎uw>ΤЧ FBاng5,2)JV<ǟp Cf9I" p s88$ 8MCѴc% B?zqWi2¦W 8K7bsҐ+T6%t,(~d^J~%:ۼ易O* P <{Gb<æ#<äݼ=dlyKm(cⱊ<æݼ=o}doyEx#π!@K;,*ͣV9<xjK`;ㆲ!xFS;\B:~v=D<x"M ԢV5卶# g<%Vkg !Oųa&Ci'"ϼK v*d nNEL% NB"h<æ݄wDT)8߼󔻰BOp iz9f{"4Z^O<!ꩈ3*lJ5Z[fiTH .!jyW_YՅ>k<¢ OuTLRxdP-%udy[Tܠ.rfjCtQуRؔFn,s`CCQRؔP~d~wgmPdT.w5E}z)rH)q# "ȘQ:nQz:EX#$<¦ԝh#" ϩ0`wKXc#<|æUsx#f<æUz8T^Ak5myKY9I  3[M[~ _T~fYC8lJXYVna 1l9ƒs< 5;hK;A{ !>0.!Lu9$0`(/ 5 RJؔ~Y!~C%lJo?I{2\B` ȐiX,/ \Kި]?xq8@;^a.!Ӎ.rW9E~5e]ǯTNlDjxz+~V~1Ի|f(8R^hy[v歼sm__/M?M/?~hxھjۜ9ۯc_ݟWLg?ßP>]-5~Ĵ/?/_/o벵_zljV]oOkIyk⵺Z,[O>~Z$z[ۜ7;|'5|O[uem彯ez/}k$7 r?l= {zwj` Hc@XJ}y0 fXvDTy"d2o&2xn:ϝwNpE;e:l:OGx$yX( 5/Gt>rBPتE߄hݤ\v'Vshyn-C8/>"_^g~/>}_ˉZ'Q6Um_ˡ~{R.@b[ C_^Ƕ-ESZv[e)7n{H)a@[MDea bcNd)kohå8#l'>wnجY6n7?!\}[+RUپ' ޛ#O*)1UFu{.Gؾ2;>,rȶj729322?#ChF\$GqYޤM\jvB'7|wc ezr^jx:wOCRf>V=m-9ԭ,CL-}A.uzhn&kiu#\iY9"œe$NQ*S A/¯»Ws1$mcjtauY8S'e-k\ >+^4 {NXW2uO7 Ý[1ԸsE̷eP'Ac\;SM뚝zO6 ?rV 1lp_fm687\XQ.dE'+Z2?4ȴE ~L`i?vuԝ\㜡*qTy/6u W1oCvV1lCvpU uZ0!g CT1LK}` >{M :rp*o€}9mR_T'rgny+ccǎԛ lj,Fv[u~gs:4@ԢKt FOsjQKxrQ-PF5BK;Ѹ &}`s 6ܮ벑ǥkGݐdbof]jQSAW:@č 1kW vD b.^ Jt0b5V#sOqg3<ʥiȕKcD3V SkM"Aqd9~*s_:bo_hNj336s"Fn*6r_ #j15_q5_1گ/0~ @~hոlu]6mr%eV+fsljdfع6Yq7ޚ.Tfn q jPf1ӌ 9gxD-PAurL-PAT@D-PA@p Z @- \ml362M0gD.`@,4,4D-MAҀ4{^Sii`SKS4)@4)[@ 4)[@bniQKZTaiCۇ=,2c+csKN )/斖M, jibf >ZʭLM@U`:uGK6MEKAZnO*-\Sh2Z#D@h ČVAh Č@hFk f"F 5Z153Zh>[sт\g`+:Nf.wnS;3@uάJgϸ%M`-i2v͒&#ɻR#>W P_(u+[eP`EBdPWP݂&cH;  #@4"bx$Fh$PլK>TB& Bu@مP`PfAfoTz?~e?`s/z]ᡣ˝?P[a3_PxĈ6] '`SBwe;ށ >xr{A{;@ j1{W wD]Am3aln{ލ]cF&Lٻ캡G=\ٻa; {mWx8 ͽPf!6v]eF&nfQs7PD@ Djbn fQs77r>uv+v+P+ޞ5vf!=eAޞܭʸ|6Y Skoޞ3C.ċWJj,dfPW|,lj;`QZD- f|+[>@U6?.?@|,_ٕv,_16|,_uƮ|gA.x>;3 27ƚ S~&UM?g[L`{~&\eJ.~nR :WvLj PMML jQW7}L_15}qfN ~Sn+wr+~T+j%WZfb̍>=ܩUnJ[sgέ3xVr'wvj+wr+9B늩u%SW0SW tPK1C ]1wsP7W 5ý\1ʓ}z5jځ]U M6*1v]+u#\a\*W7r|05n䚗n\ ּtnw#7 3x<^A \@>o f"N z173{}&O%OϜjcWvn-Ʈڭ+z ^8G_Odpy W:5/2r|*_:Ur/u|}||_>^uD}}Q_x}=s/}hg/5;j'Rv"5vNƮىd~^v!dݍ] J7r䚻 ( [mo*Wr[e Xr+-:Wv,j PM-, jQW|,_1|q[~r1-/KJ#W˸kI3fl2u{ѽ~7B<==cSftoO7r<0 T sOLԍ\a֙L*S721u0SLM@ L jbn bPS73u1SKէלn깫dꙫdndmuCd f7@銨܂u+X7ms^Q֬7rs+8woۜ:;w&ރ̝u2u֭7hnf}p+{:@u6TtD=]AtpOz:@= K8 ᒘ\N>W@+" Wpj 2oCs/ ϸ<dTɅ Y } >Jr{p WDPK T W .Gtؕ. 6aS"m56w@ԥwP. uiq4@̥] QVwiK]t Wcjfi\|av77:mtqܥc~#ӑw .&#S.4uofqfܛ5wL32™I;FcA  n߅ã/1ijFem >gaT>9n}f  ]#Q9@tTn fb nbn fQ[7u[ں:@ m}n$"|@&AԾIti {\L{f B{K;6[U\ޅ/-u ڭw{ͻ淋6r;>M=@LOgry,pVe%e5s W+Ud@4D*h8p p @4 >z nr~R`F69/s.2 47Vi02O $ޖ{0 Himf[9K9L^3$XAa?6 /摡yff+Ʒ0>tƶcgB♡pQ̐Xʥ!t!U@ J<3dl=[g`@06` ij@4D*dh6fll ij@4 ޡD]L8 4j4LG<`am I7tX\Տ2}=5@5`hpG!0AaXڵ.Cfn\2% ׬ 9/,36okwC 1 1ab@4&DcxLXLP ј 1 Rtk'+3K#Ә1k#Ә2wfEZq4&[/ t'BԲ1zy׳OQo07]{QbGq ZBO(֦xY4xtQ/3hQ䣑i{f_sǥ"9RiH4r!\$ψ]1ca)&@5#+G$a >"" >""@,}DIOa#H > G<p)}D0″O׎hZݧ.,g?kK( ^],@f0:s`#.e }ZK_SW4{a@m]zrK!v6Cpg/7LEbF0j ^@/jӠ)#P)# 5iH?es[*̟H̀D.O*ƮYU|Ef. / WihƏJhhŏJhx`4Bu Tht + Paqm?5x0 *ҳF>`0ua߃It٧yABaMQZI絠QXbA qqE6i\[d/tԭ޵F!_Q~O"LSFa#^6ZS} ?(,2(<eF4.>YGaӸSPIi#̢ #_{6} "yICӨYjdn$IrHI'FH'֥cW-I≱*q 4x O ≁X<xb O@,h<1еI35lPx@<&R، !Q 4A)n׶#M-HS-/̧@yh`J.w"]JE.KSE0SoBHG5Z\+[+XVMb= +vP!VDc@4V( h XX +"sú[T|IJj\y$`sy:@~q1_YTE/и/Xs.Tq3Fz\1{G2Z傑LGnfF|ϰL~f7#ly{U= c䚥FYrBcץe`&}KӇ*4}D*hM> >@<}3[ag"?p_2U:CFF$o*|p8 @ TJ\\{zII,'=V%pk*ɴTz:8CGz\Xzr [{+$\87nͳ.ʭ ׬P *,j(%|c0,eBbhE `HP | wLKY2^ &qqAGꮿi`A4./x|GԸ#Ш~I|*[Ө[Ը`n6Q2O,Dj\|I$W[>yd%w/.upGƌ\ kf>@.$dQ$?U9J"L̀]WXe" @4DCxjXnQ .. jT:EC^2|h(<ψ=P>S&QymGn`J^8ԋʎQM5Vи[Yxɞ!)<ad4=nJ&c[H/tIȅ^a䪉i@J4o֭ dP2[< $`̚[\'T'Ŗ)hp .\ \ă @z thD|klfa vtOnf7;4^Ǫi tm3vw;-Lz5.v4 ưZ]M\!$:327zgVs: d\\қϬ4󺿉Nw9 e=-%{G Z32.ĊnxrKzV4m/ۏgr!d^lcbܪ6--F-@,hl1-"[ bXlN]K៶+W_>y)eof4ZrWK/ =\VR{i(9JA|%öMҥ%%5!Gj@#K.><+c CxYøqa3j ~aZ(-)jTÞ"OѢ۹c\zϬgMʣBᦈd樈hK1 7E+~(nV(mw]oBᧈ㧈QQ/B^nvY)vTO>}䨈Dᧈ_)&)1pTHᧈ㧈㨨Mj"j?EGE=~=~=ә{q ;*ZytSh3~(nVQqYyk}Qʣ"ʣG7E+~l/~P1*tQ))ZSDqT㧈㨨OOǯ?"H mUJᧈf~f~f:rSD5S$~>)>)))k=~pQMъ)?E+~PW)ZytSb3?E {~{(nVpzG{z~g):.SԂOOOkGE-~ȣZ);*j SDSDu{[⧈QQ/B7E~QSDFSEqz=T`BGE(~"""ʣG?EG7EdGE(x*)ZSDuSh׭h{B L?E 3a j ~0?EpGE-~(ᎊZTp?E"LQQMO%ܿ=nOOQQ'Q);*j SDQQ룟"꣣G3Qqzf)ZuS마hM " (>8*"4;*{)ma nf ~07E37E3z?E،"lQQgRa\j\~0.?E"lQQmO6㨨6㷧lO6㨨6qTTmαoq sTGp OPo?AݎOPOP ^Qߡn&5Q[z OP-bxmV+l?El7E Vl)n)ZvSo?ETo7E+nVn޺-n[SD SD wTIOSpTTSS~0]QQL]~(~(w/~):*jSDuTԂE" \?EpGE-~(nVQ));V\-noYhM " \7E+~(TDuS맨)n)[a nf ~07E3pPٴ"R"LOQQ " \?E\׬<)<:*jytG?EG?Ed^ʴ2_?X?mJQ*CqsmKc -rnY<ѯجbezf Ы]~Ey㌓"A|^Dvۋ_сj781;Z% Em̭4jpk]rA늸\_ApkF\-Q;wpSw !\~aѯ;Tj'fpb&KQrAOuDZW1+rg ]1ͷ y%et۔|_~SXI~ F9̧?~Ỿ%',%~<si6{[oK3L"_3O|2S|iNFZ+yZnm=u߿~^@.ϯ[ ">m~O7q?ڧ/~O>': %>>lN0>}Oohx۲>Iq)>ӿ= Z~?]qحҔc'vlʰG:wX3@߇.IKcHbѯաt]'5)XP?EH;S}ꖵ{nzqKPI}i%{HZQ\ >jOo.z_z?m*5hshDflhmv:_f4,LJV3sɶ m!۫Y{u^ۅ.%S;RFZq]u!,r9IAr R}/wO_]hq=d/-跾Z{yX. Cꗡ?%tP!`vÆ_1s;ɕR_ǟaԋmE"ʻ㰍=Ir2͆Fq(6[Dݗ:rFC?Yfo6u|ؚ;7ں5ڲw5%h0Jӥpp)?&/U6b64:c7!ɱcDW |tE_i%/4ҳkH֮0>fſ7[%&V-e8o=IiC ގ~inڵiwn-6q[P?ZAF_Clf=2_rw#oØ̬߇F:hK;/8nz:Іz?s۷i>gS?AԑŮj?pT: @E;7/O+DK{ۏ_-bXs/:5/;Q;"=mjO]c2 UJ/ڟ5|5p38?`ۊMh?\L??ml7afrѮ?nf&:\|}¿s*N߿^3tS7'th 54by`e8^_̆93X WZ;< mǺ Ѕ[K$ChaJE!wܟkt"';}9^N/H;UoOCVg;Zbpw]Y: 9>ֵa?u yw?ELH.(ϙsw@tEڧqHXЖfT[:z*F yIkKɖ[ GɭJtSXUbh_۹dL0I9^4XW?qJn`oJ09c_9m(@=28,χF EҠHSQ3bP[ǻ4or:.>K-k&qx'u]owbۧw61W Ž4㫷$ydۧow gw:ȾO?cc~U9(&~Itm?15q]>Qmg?ӿ%_M:ԱqIG[w)R->0wǻqO]1,庝wWI{osO #endstream endobj 383 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 ZuA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3\UiZB 'mUu1 R 8KW`JM5☛&e=O) >Sgendstream endobj 384 0 obj << /Filter /FlateDecode /Length 45125 >> stream x]uKry~{cQf~eBH:-. aӪU6.=#Z1T5M Pmwq+35?__|?~r}c9}o/u:۱_˺ݟ~wk?W|oߗ?}竿~/~7?}<_j>_ߞo&ͿO7ϳ|5ѯS_;*~=_>Qr/_z0OKM~(EbϞϟ38?_|<<_O?|_|w{e鏟޹~W1Kտ뷙3_Ds.G[>%B4߯쇣L+Q<ۍ;kGzx\ܦvz -_w0t& 68-=D~~0pXY/ pZ{)8#`cv q>بep!K-}$W/sM]wB/B?C9~|ꯊ>Lg"͆!-{>_{q=_dw>l?ۈ{?|%=<>2D>?#__?[5/kXDK󩰥~|WoM}w|w{~OY/~?[3[Oca8OO*|Pa|{GWY}O` uJY}Q-_r=ܿX17|xo=ίخ_^<wn+5/i;<}~]oϿ[u;o__r~R?|O{u{n٦2oUg8}2]׷m_セl;5Oдo {nT~_w>y\_S}߫?>޿[QovL_m>{#/'?sޯOt1G5|۲_gykymKY}:no/f_?2*џZλ ܹu~n?myrՇ|^K<]u.g-ccoQ|k[B_~hę#tZ=ļWyLe~|c^?G>O1_e=^|-״~ۦ2ϱ {#TN_^ty\w]yQvoƥ}wWg:w;Ig,~q)e}ú:Y_Ib8?kߴWUOӞŏi'=)*ãӪ>>2{KF|(#{v!J˞%L%ok+,%a[.&o_G{۟w[|a߀0|9~ y Jc-~wOJ{ZA͒UX)!.u^q~B,X[2R 1w߁ɔ*Snss`xY'v>4J Zv'ʿ_k<?S !r^99&>ɘL s0ߴ6`|dLUƻ\_`|.)AL?7ezt NljdJ^y©by4ߙ|}R Fc-&SB}Q!X6h1U% ϴhGaIJј?)!MN׽ΌWl4dJ_ 'e#rY6ӋF =v==jو#dJ`.(4G8jو#dJ>9{߾v9FÀ18a){Lb$)=k ZLb$)*FhIl,KUkJWs8<0$ɃTB aDyH/&SB\<9bHlb*!RgˇTGlb2gו>& yF==}?lAlv,K۵z)D328TB1w}&Esm3g<[TBnaT)aJ隇idEaBٚGɔw2v 3Z~kj;{M R\7hlk2%2\ 3h2[5r]7U5Ni6]5̳F}.̦j&QA;=/)r3TBȻ}5R|a#L&Ȁ@~ b !i:J`uW2,d2%Q; ^Vjg)d*!ʝ}zz!ɔ+U$T6eBcqւ)=kdlyHig~-Ǣ[&Szv;>m-tC oyJNjFh!n,n2%UWf[θ]k@(Lx)awP3yƛL?8Y3dJpgq$n" x:#+9L"|sL$c-^?s1b0B!?؟㍉t1֤فEoLUvO}XOTBS!*;Z e;<;C"Wӊxҷ#y#1J=sj[ ++r4M qLW,(h"0][SH* a$*Oϩ}JXadJ^^*Zw>2C9L +<f|Q&SŦEkgb))BS agҥ+>I9H!m] YevL%H#I$vL%~͏sG&P"%9;_4SB" )DS 1r!kCr O%Hm2%$Q״V*˘9VL i!7!cɔ'=h1MV%1m83w_QV|04kS =|ry֦E+NBgL%R?#DLuM˝H .r1sNtnA .r1Ukqр /r1PTOaSid|DMD60TBXMoMOeENZ^m~Iq F9wL |hatɔfᶭJ̙dJXy&s5fT/1Z)HD6< ~H ;~s;>a(b&)axkd dJ^<^f@s5vZJ s5jwaSH7R$#ĔpM%gJ 0[)aon#^aη&SªPڷJr!k*缒C;Gd"t?ó1[)aE޵<1[)ao8ǀ s5VV #F2DTBېډܯ s5SȹH"!Lk2%4/jyqtHF9ӚL 5 w 1ZS տi= 5)o|aLPe}!lA2:dJOu鸡b$HF9LczF6Vl))a0nˑkf0vH{p]+"L[F L%]}ɉl f0vIVZG>p-c֜M]ҳY.#2f`2%ԀO>PťOe̚427[Z [#2bMTBnMjNB巟%TB3-՜MQ? j]io*!Ge3:ooWs7S qȴWs7֦.Ķց2^YdJ~Xs5p=seZ~gV`v³MZ9JU #A2VydJةdCꀳ Us7jvu}íHTS7*o~eY9J3 Wݎ0@5'}S aLzdYƩ9L O 0H5'})a sKGHTS7 {e Rs7Sy#esɔ#a3z,b2%鹧e?y@lϙEL%U9 >'1w:{jlFGL]W>ΫC9QVp׌3L {س7#_v4b"]ݦ{ Hv:/:|9㈩n،3L ~'sNy s7AF<5M}ŽkBGftVw{>O\ȚQs&SžuP|S>5M?sNB?y/O Hp9zS |+oY]T|8nz U)cA^s)cigU-0R5#L &S.Voh#A,`5c !&SzNF@kB͉BL#]7깐s)=F&Ȝ!TB7? =R5#L!&SBW_\͠9c]|~~O k͉DLk%AsBEiGR5#L"&SY Od>tF[u +FL doa|S aWn7oFg qTBX=A Oh>tvsÝT g1z`/( g 1:`.ⳟ<? &Aap8 3J;ff|S [֚t?>c[Pg7z3L g g?6>CFBR#>DF&A?ro(a|"BBzYq|"#S 'e\ 0>LF&SBA 0>1tPcnEJkG: '1 * fŭ8ՏO >󇩄Rp= 3J " >\'1o!L'13/ŏَ>ɔݹ0>L &Sz qN 3J{u9H>Cɔpr'&q̀J3ތ3L_Z>"3}7~[x'Ni|#)_in+>CGB-f Gm>aG&5{~}L%km gB2ө䯳x|f$)꘎'wGzi$) wfw!cdH2*1f̗ ;TBXe\w#B\F&$w]F322L 9qBЧa6#t9u3!&#ÑG3BLtH|jGsDOf5S frF^3X#f{2J݁ |PoΈjB5L]}/b'ɔ"} ep5"y2L -Z+|<L#J5. ٝjB% J k&SB_ԟ0X"w2L ݁Fs艘ɼf2%J_xS O6S aUXX+b'0ITЫNpDd22jhq`TdE3DN&"S Ku6ǂIPd*wE")~f{r+sL>>%LNkeZd02V/?@ j[d.2h&_;0{TBV\)/KLG&SB%͉L3L%sv0!`d42ji&|<L&ݹ[у0TBY* I#idЫט!4Zf/2Jh:z[Xp ]dF2V/Y0w!dJ_L4с0w1dJ\JpkMدdAn]4JO/e; ɟ>$yLn&QqGTAh#,j3VO;%5b'CP3^#|2D+>5b'ӚɔPZc‚m0G$Z3:;#)J/!Έj&SBBًZcLOb5`-ɗ)b'P۳"M1ÓATBg^ea j&SBgwGSO5)a=g▶1ǓTBY|<3<L%ɓTy<2"x2L m 9Lk&S7-ݢubyEdX3:;O$1b'񚩄&}{͘1ۓD:ٟ3"yF:2 ::g\?ļN&#)~lCd62٪^ E#)d@Ȁd2%tuHUVa"3ɔ,W| L%sF#LFF$S aM)`TBOggk{)cp"ed@2GS1^ы D:\Fĝa6#㑩"}7H|^xp"fd82ϻZbڴoTN G&SB-n?q|Dp"ed<2z<^hL%k\ʌYPiEȐd*!x/I4"ddL2if?9!Ç0)dJXޜvT1E#\F\ƚDwyz*Df"IZ~.ط*Ѧ dJ>]3#}2Hu>X3.Rt?L⹥c]ܣ;b'ɔP~K莘f2--p3#|2L >Sۋ;b'1y{7b'APf/q=L#kWO5t}ypDdP3:Mwg2}m;8"v2L =>1ǓPTBX>ZMyjB))b'}Y%x19dJ4ù1QdJ7=Ls>-b'㑩qztd2sP{ca"ÑPQsbn}5yt ]d82֥O?+y0dJ0G64'œFF$)aebAy4#h$R2z"bx2J=]<^DdJ3:O'L\Z38"fw2F>\-1dJZO!bn'sɔPოgpGN5)tsꍿޥ=:"v2L >[4/8"vJ}.GGDN6SgEs9 L%nSWus9L D}39L%NS\m,!rJu=W+W)9L.S׏3ļN4)tsm1QdJ6zMh\d*!y1D:4]q3:"bw2J}O"1dJ쳸?>Td"TL~]W`"3ɔչ }0kTB꼞EF")siӡ|_N?HPd teJh0Td&2չV̷`"BidP53ֻ-`n"3ɔӹ\`f"3P73߾OY 1 Ls}7)ydPd 2 z9' ̨x,L%NoBߎ~b94d2%T,}XM`"id|oy<ADf!S jf㓯9B&S Q&H9k%=^uPFŠ{5Eb4S yfK0~Q?]ED:X{>}Ejef b'Pdz:Tq>g9}_ns9L# wdJh&SzzK/`ɘf*!T- .9i&Sº3KyBl 6Y jBΆ{%N&5)a;/` NjAր6tŌNj&A΄] e1429Ld;{ Y DB&z^Kl L%9p?UDf"kZ5zf(2J]lƵyv0WdJL~k;ntVd(2d:Lz0_dJX}>qhmU3z+J3V%JkSr _d62z7Bz `$>2ط4Zb/2J3wwx֌G&Sªq Mс0{TBu5CH&yWQ[l98b/!H}Ω~dAxd*!m{F#)u-L#hlh _d22gfv+Zf/2Jg\q/-Rϔт0ם}iзy8=Xa"ɔ<4?FgELnO{CpFdb3zD^ߓyD:Xqae0FdX3*{fߩ] 8茈ɰf":"y2L =Lbp0FdZ3I'?qg\O5)zBMIf*!G>I:"y2L 5>7w}pFdh3Jw߀ڄW2Fdf3|۾n8 8#z2L ݥ 't.= L@ ΈٞDn&y`{}茈f*!L̎ύ=L)f]x=L*Ż^hi|dJyG&SBigW2H$B2iz4"dd@2SK30^|L~ͫ$~o{!cd>2iD\D|d*!J_Vk?7u"fd<2:'ZP3x4J4=÷)3Zf32J4X}_0dJ\1fDH|d*!N`DHd"JmSgpt!ad@2:;v0 dJXFOSyBANLH&SBe hDdtvƒJGBUYpB,F#S ampv_pd!cuhMK )>Liy1dJ>0Ab'ɔ{]n&SBms}4Iet3ӅN*/& nB<_U=?L C"'ÛITЁzz\1df"M_D3>L%jVqO7b'SɔЁJֈٞGB˅%$*>*d~dFd02O_C[P3>L%u~7c>0J]W7|<0LF&SBʪ E#S fޫ!"c8d2%HӥC L%kj<sVd2 z;''e&w0OdJY-; y E&S9WO]-E˸?K1x+3<:~1:*2LWk73eA|Qy@5S teÂhɨf*!ޏB#b'ɔYil4Edb3j|pүM3<L%nhɼf*!'Nw Lm&SB)kFS O6S t3"x2L +ѸWtYjapFd`3 {&_ 6$Y HA NLG BE&#S` '{#AEXp@+Q?L5x+2Lin]kVyZ8RL3LWψe@臈ɐf",~onQB 臘Ɍf2%m.a!bf'atP˳s? ,!bu2J<3ltCdN3Sӥ(s:L.SLйJvX kB56w^ 1YdJ2-2L }SQ98f/2J3'~qrvp ]d.2ϽiW>oуD:-4=yE"#頇[JyE&Sz*gv`/yF&SB'W sLڙcGH&Sr*vAȐd*!pnNi ?12%L9pG!cdJ2*h_YdEȘd2%q|Kk>L%Z5}H?u#jJ28'lq] !tu<~f12Jȹn;~yLXkUlY9ɔY:˩wb!yF$d3z6E =أ5b'ɔ"}Ck>`F$f3*{*RN?1dJ홾PA1등TB4N 9Lm&Sšu7b'#idPճ9uh茘ɼf2%GsRk\|Œވ9Ll&SBu{7菈ɼf"s>Ld^᎘ɴf2%n7wĜO5S gug1ߓTB>6<=|Z#f{H==]If*!t!G'9 H&SB]3t^\sxLG&AG'<] a#ёѹѣПf & Gzi?Y mBD>mf"T~hf*!t]OAjwtEd`3SBQpEd^3:NW'iytFd^3j|E ވLl&SŠ)L~wDOF6״SFp!x#{2L h,=L {Ʉd2%tNӊ)9b'ɔP~MK?h}pGd<2 <:U;Ecʼna.#ÑɔPWs_8/X32L }3P^W/|F$)fXܰ18f4#Hҧ2_)82$Jp~j+12$L 9`4"ddL2SUG6 >yLI&SU b=3Zd3#D55hW/L%ZE{^>L%髭֑{DO7g(67b'sɔ>Զ'9b'jiX ވm&SBfyw{?L%/=[!1dJ>Jh98+ mBcw0x$2L =^_V<3@L%o:ޕ:Gb'ɔ>s,wLH&SB>u,<?L6Jݱ;Zf32$J6 +$ъ0dJXL%i<ֻ;b'3ɔBL 7"YlW"kA 9Ll&SBWj;|wi1듑TB5;b'#ɔPfW {ļOB$S =?ZFF{ĬO$S 'O9wĜO&$)g𜼷<#f|2"J=G[d/^3b12$F5'"& .yH&SBk]FJF I&SWw^nt"edJ2֧ŏ~lhEȐd*!TLH0!TB}B\HL F GBߧK]KCld" ~}p!ad22SM0TB<~OhB`d*!tUO a#ɔP_ I;FB#S sj?v!& FBuw=51a"ɔ9X-AhePY:M--2LUuf/]8HkˑLnԥwX#"n'tPs6'S3|CN4)9ջ/TpD$P3P4"fv2J8u:Z"wFU>mͬ=ק?ļNf5)aEEtG1qdJYQF?ļN5)uj;up ߆Ll&SB֨e}D$b3ӇZ]'"'㚩:kq'qYLkBېG_LO5ߪ)hɨf*!Eﭟp{L0E$X3{!bn't zkAF~y F&Sz{Z*Qq5"bv2J=zϕ1dJiD&cs; L%^ӱ~NI[D82hٴ}0odJ 'L%J-0wdJ>Ia4؋ FB%͂4؏8 DFB-\] ȣ!#tPMsSqAH`d*!tzNJ12a"]sL+g_`k~0o5k&SBWm?b ^d@2*i/$_ ًGB%M; {=f1H4"WM3L%Jvh[A,<LJ[F^ a#ӑid}`\} y ^$82gp`@td2]^`AȄd2%wua+FF&$)t͈+0 dJQ׎&TB> {Za>#>(hZ3FF68UqV2qdJX܃鏘f"55WS8#f|2Jѷo~F$\3{ <:#z2L =s[5g\O"6S §G_1ǓTBOe|YDd22^u]<'b~'ɔP3|8LsΩzwX<3L%D㋴ "stŹUj叏`:Td2%TGg;Td2w/g GwsLڙə8p2h0[02oM pqL㳮EH5a=DdmZ Y DzjfZı1(2L 49z{h:Xd*!T̴|<`"cP2%λ #Xd*7kuf g1S >F3t!|'ZƠg'0:4)1mř#3xa*!T~/ O={Xg0Ϸ2-[my<ܵ2> &SBgԮ};KtЏ=ɔP һ d#3bt%n2yC{&)۱_#3zb23qg1@68: ?|Fȸ38f*9|XAugA_b;];Gg$2zۧ?ٍ 3Jinx'*2[m:FgD:> H[kCUY|F L%tXu>r|FAL䤲~b*!`^Դ=_9@|S ڢ{mCs}B@L>6](>ɔPo1;KM|vD}@L֣gg1*.62q3L OJ=sO 3F\+GgTB@>Cɔ޿2FN#3Ob*!hl'1j+_T3`b l/g 1S>@{F&Ĝ!D:g;;=X8mj̙AL%k\@sS WaV:5 !z&ZՌS7 61s&Sº,TkGfМՌs7O:p/B!B+kZ3r4b2%tռPG&ܜI$*O]]3'1ǎ6]%&Ȝ9TB*=yNssx'⳿OfȜ42Z:Ԍ3L Wtf̜dJ>1z/`ͨ9SɔP[{WfМ$*jv uJ1g1vޚ> 2do*!_@sU3bιdJN7j~# s7:?f̜sɔ lQQR_ 4g{)aNs7zLV=#2BdJ9j3|=` kk#2@TBϞy ۳62,ӜMs|fq:OS7~n[?(j&QAOW{v 4zS fm^cÆNsV5P/Rʷ`j*!ԖoMNS`_z %oWF9ћL ]65/7ؕi&x[1b\GheDɔޚz1X ʈ4gz)aWkSf@HS7k[O|p, ؚ4'z`WzYksYכ[4o*gO35+ҜMyؕqiN&S1>_zH MC7 k'z&JVƤ9ћL s2&yD:ؓ^ZiNzNj'Bk췚h%@#媽:?r+ҜMng~zW9ߛJ]#{ NȮKsn5Q]Z~~G#'20͹TB>ի'='RdӫɔЧq3~޲.&L~c^-8fD9J202"㿜QM#:YRqD)H{S4*Hd ɔС78gۣ'2LyD:.D)`Ϋ&SBA[@sb5vY_H1a`NAF,ϖsR5:!|:"TM%}ό_^/5"SM.m3(2 W!緂%29dJhs@doߠVٻGBd3ɔ<2;g~_N>~c32ˉ42ǜ؟>OF$Ӫt6ʏ: sR5 6ώۆS'29dJ q#) YTB͜V;qHs^5v3o*WdE)F;Nd SJZ*oM$2iTBU/v0Q`Ϋ&SBA;oRdSɔP4kOn 80gW)aGsjwQE/ HP0WS L~19dJzO}I4YBbMԬ׽z<*F2cԕsɔ[S^ьaWen]6>~1y$*ZL=#G0cؕt<":<.cЕP>[ߧ.c̕ɔO{@'q#1ydJد[[dƨ+1)noٜ_ z4f*!->Ejz,f*!75C|%z _%#YM֍[i_ t+gW)Flu,<#aM=#EI +:-T?60=w>c3ɔPQ[ i^Wd&SN%Zd@4_9L {SST5cL:薨֫^,[bɔWs@f*!O~WQ@sCurJ3^X|fTEj@!9)BSWXOt3 bɔ| Սu 'g )yn)tm€Aqr0j|v`Gbt_ a2%+w&(AB^wvkx"9L%:Bsr3|۩|nlSbɔ|Om XqNNd&S^ڎ7y\`!99L {A3βQXqNlB;}_:ÜL%Sne$xc@!99L U][J0OJiAǴ/Gz%"bɔ2{/ Dh')Ԡq}31ɹdJf=ZhݕXN&SuUo4&bsɔ۱~.C -r0 96+㊜6L V3|`\1;gx%'#y0ydJI8>k_ɃQEN&SBVZ^̀+B0 5f;(r0v:?ẃ:Qa2%TlzKs1E&SBV>\a*!t샩ݾJ"Z`J/"S ė>m5 Ya2%TIMW]dG@,r0\xckX>FIxidṷS")aamEN&SB]b8w0dJKkeatɔpF ɞ$M#1zf+.=K9LJ]iWn̸bl,0m2%>cj!ͳôPiwa!ϳ,ɔPo_ӂYρdJpN8tH,Xm2%㤍cgyK9\Jd~e[CgdJ}rA2g&SBN;Ϝ^I!TB:ݯ?ٕeMۏ-ט_YdJQZo7] ˲g&SBN!ò왣ɔ&;7>o-X?st4|骳—sg&Sz*E]cYdJO_Qe^h4X>z~s!N-% eM%^f4$Xzq߃J9L 5<{IL^,7h*!>XfdJ`w6_){̔ɔIw((dA?B siw,H"TB[ n\\@@&SBwMH+X1dJ7 Lo:|9i)ct->棯yyL}Z%c`) S =5k;kI\ٷլn8YexL[|؞;B` G)jՙ!M#ɔkub7$ r1S\d==}C`Y )=E/1S,ɔa,0d*zǺ=1_tɳ`529 L U^oPq4g` !S a' chfa7OuȀ7߻k= q{9esD7NVSC 2iJ;G~Xc2yL ;~>=YMTB\ilsp,FDuD =KPY1dJl(mVY!TBkz=+z/JƇ[&Qyۮ58b{,)n*! ^X&X|,d2%]ˋ?ѨbkyBLޫ<#0?2г34U7XddJ%o-[`B[%Ԓ)3[EX`3TB2*4M |1yLmݱ~Lg6]5 vLE(?ylk*!dvz~+P7h6[5Vمkޓ8|̓D:%~CF'&Q VQ_U=mؔHcD:؝[٪oӆ͊g3(MEUqw΅oAl?>nlwm{MuǦH?:sMǖI0F瑜{G[[$O51to{GW uxrv\"err;N#--aƨaSHc|tkQc2o}~l^ 7=pvHc|tnO͐:h_?г^= :kϏ^/3ʍw퐪ZIkk\ZXc;>:Qn/S˒w} 3%<4Rt<:.}vBa<\SRv,8/:ϡ Q+'7OSxeIwQ6R]/;A5M ]sE~ zz"ֿWu 'Bv&ӗW o|<~Kƿ~~P.+d;~U1OR+Qj%/~?WyO?^[)Yl}[{?˵~)hi?!~4|v/ Cv߄ yDco`QjMvfG m7m~s@ݕXFb#f:6R>1KEO7ࡑ~{fݦq}A^/cpG~Mzem˭ߜPsX(54WoNXh/* &k>l=(LN)< U:}kU8?6Pk/T|aa}Oo?ku?VtLԎL5Q_= #4tp߇VhЉePmq} jѯͤ7ő97RQj_DYH nyyO=pIk} 9M6Pg.cE>$a^ AӷЭ@rxl!HTr#r8o`͒ǵ ^zw0=wƕn苙[AӺѭ*]8 gKiҮV{ >)2Qm:LX{rb;e봟eny">{di64ۭ.}^WmgfN b#KRw>M[oWnex^g.;s7=\vimA.Cn: Yirk/=鱺ycϡ-Os쵍>vt@S|z%>PiV|C> \HCtkmPCAaMap2If4̸x}U4DsNR0!W!R[H-LR.4$Ss%%厠ݲm#P 5lk+6y.xOen ϛru2#X V^w%k [ǃL.Ld.91T2W G2z7L^RlPV QRe\1TCuFi-5.525e\nZnӞH=rO9?3쟗9w;H NN Ĕ ;(;+1yĥQ⌠ ٠8&ZD%@Lr D$W1\r $@Lrk 66SV{\1J$7lFXJQMpfTd.iS.Wt n&C)+n6CM$wm5D 6YK"@L &;j@Tĵ }P qv^BQ)e`S)JD &eS2DLA\R2Ib;VAĥ .e o,edei9KYZK,( S1˦e35AT .Z*W3q50T fX9dr5RWʟDoUZ)`SʟD &S?DOA\?qNx*@53c5pKƌ/hd2L02LM@L DWDKwA@Uh%Q KƸY)WT`k &bEL ST rRJrN`@L`k &".bk &Q5X1 J`k .DK6CUFDD Xʮ{il*ɼM F%9Xa\*ȼv/WX@B jP+ 5@tF(l:_}q | 6Uoz+7@Tb17@T QVWoz*!湾RQ cwn)NASoesNSoeg!5 .tWnAy?|XoTQfmIɅ7t^2_3J?Z2n{F>?\i/zVJ=TúnOJe\@nb b j@AD@(9<@/rF -6F`sF 3.x*\]77v;0n;3l#W~l\n\쁁=N DmE. -[±_@f>@U>l`SDM|b0b>  |1` >@d1Xe@2 s#SDe대+uF:#J#vcHK@Z@> }ȅCǡPPa }L?XpA_ 8}y$V;(DLD@(;qwuQw rS}\@sʮs w` D@uZv+Rzp^Ʌ#HkFbϻzA3Jڧ42U{+phtL>vjkp(o*BZ`SN:} QW{D^A\z{qJVT@Ujܺg\ʥR1\S'JHz.RrӮRrk$^U u\1u\* ڞY܂Ӗ.({F*B#RؕLu]1u\S'JfA 芡1\C\1T#b+Jyp%WLO]kbq-~FvaUpmj*724ɸ5'\FbV֨=Urodb}o +0n7B@w#ר7B8;-UJo*76p711` f@ 0P/LMx#׼ r՛Ffz@T⪞n]sqgr(\ՓY-zzkD*QLE *cYԳ3rŞW^A˵>3Z?,NT`3h=@TZ?^zD~QjxE״'竎 72̵>c\qQkN0;PAy)=Uw%W=77+= M~$7)4#JTA;PC@ 6%Jv( 5_UrDA|ˠ fw@K({ S4n2B.L\]rV1HO@MFZ{A&@$y2P{[(x^y5 V=:0˭QkUzz뱎z<(14 Ӽv-,I , lnI _)ӥƮ2%Ʈ2%`SSb*SbSdnJ Ė+ ļ@t@bY 0b'X50 92Yٗ9ͨt5 \um>Ȭ\i.n(I+d*ȅ'|xL$"qױ]c ={a"}?S1vZHZ:w:rȔFOdad&;#*j䪏`( U#  j0CA`D @`(  ѥ q~Wr" D$2TFpۅ dr 2 i_Y$ZENAF"[/29+.sL}uڌVH\FLF}H|R#Q07925<QYG]#}@u>*PcS n0 b0@yD:a+巐'n@_x{fddɫF$3Zq֠{.q%[d7*5$ㆤܐqH'#x;#c@.intFclEn҇2 ;<(a ̜-qvmǸsqtxhdj; Æ;C[e;]e;@Udצb0[03Qa f" V)^@U563Qa n"ҦX_JCN@&"R !9p6o@bpLUg#X<׎SO"3329QzqU2+% so2ȩ(t#2Ll f.r\.xY.ݖ7̭ ޶|Dw;nݥf* ^]wq ](jUU/]g/@ulf/"`/ j/@^D텂-EquQ6QMf&0?\fQ2.5H v-s# i~la(BpÐIL Ca)RL,hx(65NH P0d& C T^yG\x1 u37Hj焑u@T f b @AD@({7zqo h.LANA DĖV*uk' }5踋ADo\RQH;NAJf9 q:lm8\HJB=~T! .{,W.׭ڟp/trt{{HƒHW$rI`F)_>+jæK!gBһ@.ފcTwB{'x;qP) qQ / /@_ s. <ޓ̑LŮ2ېs Jg0E5s]) C:{.I/z`0|x*tB~GfŘ n0ª;BaX&Ny Jٌ,qdV@#cWGzijzϲ+>We܊Z[\UZL G8c%SnP6v06Qa j͚N0b 9 <z1a 9@sKh@ KQ0"B+VO15Nnd9/P9d `n!Cb -P"Pj{&P N#bP \] }#C_umzbp Nt:tQ0tm9&ܼͧޘEݑIDIucI>~t$s+__v/;)V]c`v6߈VGc3gAy 50;D &fc f`v#50bf  )L4%1c8v970dn!Иiw~J9E(dOt~݋=K(Y+5Zz}c7 ]XɿqҗŸnrMsLbArq$?Ynb2#C/sI0vy=Ún_PH 45`יLpDM @ WL @DMP65;zwxwAԢ W, @ܢi䘱Q ;1,5&S @K 9w =yp ,1mwK+$ʩ&/oDqqgk ŸU ɈnWG9$/&= 5،-FꔒJ7&ݹ|IS@F.{*;M;glZ @ aqP3מ$VqL sӵw1 ܐgRo~(*BsQ3(9lAރLmA g,۹[/\-Fyf'sYa16Ts&f@Sy O) <z 1Oa )@Sy 0ХՌԔWFm/;ҾŸڑv6qT*jGҗ 5 j*XY>RIYVS1tZc1 ƂM-BҚAJ"&ᚳH8Ǹ5-gY !Ez5΂S2]IJ{T "\|&{'Q2$PN/KO9k±eQxA݂W_IKa! lQzzA(¶ZRWGrލ Ay%sx)vgCSy\~n*ji )ٞa!.H?B$A OYoK9$u@# IL[G#J-1vQΨ(Q)Qq5*Q nTF jTč @cH2^YѧEuqLb\1+VL[cP@.Nr(~CΡʡʡMC1q(@̡9C1s(b P C:QYA4Eo^7V9.^G' ! ǭ2g!JǾZ,FP;ܒЅ5ĸjIf1.Z RJZv]YL]I%TWbi!/%lL GfY/Odj8ǬܚG4 ׬o_@-kF` es11Q n7v j7@nD톂ۍLZإA32ȤuG\LUG qS2qS<91~W=4ƂTx kܚO#]p _MoF;>;L;G*Mp\/r̺' Wy-/v6afC1kì0i( ` P̥ V_fd!.nH=C1G?i1^c[NA+12qܴ ^02}ޙ`\nCK% |HLHԉm[_f#Kz 3vn$Z3{r*o䗯%Zw Ԓ({b*rD} @Ԙ(;5zqsu'Q{ Oi 2QџХzQx'*!bމa/ C[۸bĠG;/;nsʻ ]5 wt{c1..\>Ak%mxݲڏwQ292rg\urHo5nbvۏalCj}4:6s> VR(`___Q+Q+ ~ W~EAܯT8(ewWiegzZevR9x2~!g|bm,F0k1.ўzO1.|^d1g<5.&’IzgInTX\p,sL\`b\X縃\p,\nXҋ-F~U0 %s򪱫 ԰ʰư(1b fX@̰a13,b jX D k+Uo$o~ۈ!UK^6秿{Kԉ~KzU1ېI,Wϟ^ë_^qj-N"vkC/u(2_8<v%KǦ̒eۈ£+;Tr{ӡ0['\\ϛOq}(۶:IGwR~;} {q\n-|/.Ow7!2L+/en2dz )wm[$3"HY[/$&>G{㸆p9Fz􋈶2QU/GLjBLj)"I3b4{\~aZ(&G/"RD1Hn-QEDp/"_DL>ǵ& )% p=~mE t ;Fİk6"bXEa1.9Fz3* _D=#1{""8F1=~{3q{`/. ;FDz1GH 񩙦Gp#jz1izt{`-"f=_DKf~"Z2󊸧z""E-z#ߦv~/"_DX3Lj:sl1Z3""?EDǯ>#."ToK&F=fn"y/<_-XȰnm_D+"Zۗ/eYf"b6-m`qOn-{EDvh-"c~ o-_D BLj:"ZQ;_DLj:d"¢E :"YcD(~Q"ڛn(#jzQӣ_DxLjQ߼ /"cDM~p""$\W0i_D& n-ED wh)/"RKHE4D/"D-_D[DKmu˸~q""?:Fԅ=~#jQs_Dd\#j~QI~qzf7-E_D$\p"Zw a#"{E܏qhD/"D-[DvؑzLjQ/"/"/"d1ʌ_DȌcDC 3~!3Uf"Bf#/7Q?)1"N󋨢1cDM5;F1=#(8F1pHqڡcD=h/pψ8-#(xpjR_Dp#Z wh)/"R[DKn-ED >1pHn-E[фv丹pH~#j Q}_D_DcD8/"DpH'ЄH~3nL~#EDu /"cDM;FDu /"\cDM~"Z )1pH~3p/X wh -%\Hn-E ;=p"Z )nѾD/"D-_ƍ)CT.1_D_D$\Ljp"":FԄ SkH~#jztgDM~"3#83,4p._o~{AiS%Sm$GiӇ2#{KYFzD6|}(=s<83nzGti Ql[׬.7ˠZ1`sk,~<ӄߠ֛Qv Wh.bf3η֧w:v ~w Y~F+#Ơ_AsP5_ni¯c<Ⴔͅ!_ѮW-m G etwd~QD?1g&l~wpo7Gnu M?\ز}w֮@ouFtmTvZJ{^)ͽ5k3N]C mr}KhԹiS'jj 8t̠'\6 :Qd$_?ҿ!ˀgےV-|jS+̭2o_&yu&fhE' KۧzyTQiZk{iOGZhOO- 4]>b!-/D\tjūAl8] '?e-AZTbof:un7(ۛ.PP_âEX6~2TԪˬa.[qk(IXH~-m[ex9F)4_74ڻ0VLveYF~4EXy.eiCАy9i4tqmEf϶l߇fK8μ Я~O*2hMC5K-mAu{j?O$hE+y`2UJΉdT\SM-2y䭫8p˲(nZ((w;S#i'Yޯ#mɥśFoivKd܅0P eXL4!eY@MɈ/6ǻucinzns[89 CzH&(#:jab]IM c3t&L=]ԇqPIP{e|ڇ!ipN+HU9ZpSiX/K4twpDT| ~+Xox#ԭPGl1:i2lt;^/ fޚueˍ޻d3Hҹ iUf=\ {y=&AER aq= @,ɴ6Wo f]8JYeB˽_f@Cn_E>evx'Rc1u)wAˡL"u5r*Mdԝ;OZ1p8Tk>]u vVzrʔ2rs~>۟Ĵ$J E;߅EB՟ crj.g-ۺPek#3Íھb;F̞ۢmô*!uXZb+Hab{[lՏeKo2D}n~3efn<@܆2t<Ն&^2m?NL1Tn4sjFk1K6 9ؽNvt,?o&5';#-ed Mo#C1^&&=KSW u4-D_Aw6f]xthkY"|6;CR}֕?%{%~Wa׆2\I,O4+Z{iG4p/vjc.Ii 8&i+KFb ryG"ne¯?K:$jݿO{O~K0>%~m4ڻCx.žu̶չsyAej,~Ƅ7ǻnUx[?$ǧ0#kj0P}wlZ@IK|D%>+R9 vOGSCP xuSX2Lŝ5 3軡.ZA~[Lm0 S_/JX|]^Lzqb{Ӎ`t> stream x]O10 @+uA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3:UiZB 'mUu1 R 8KW`JM5☛&e=O) =Seendstream endobj 386 0 obj << /Filter /FlateDecode /Length 22728 >> stream x}ۏ_Ǒ$-3yK8C^8?~IʖW$mR^ku3$~xahSS/U_]O7ux}OOw}E! o#t A&Wᄒϼ1GNP*9}ӯǏO?M6l~W~'Z4>?};~z3~/4!)9#V^|?<|}aLin⧗?_/⑂KkʺwV/v1K㧶G3ґ=pډX7[L沲ԝQ9QWR{u \xw?9낿@sK$1:޼'wᒄMVs:,iw4ovG>Bp$)$>|ؐU I% u(nl5Х񈤖ASW*xgVea(h" :C=8!Ãq]f#` 50wь$rjcFy+@ɹPp7$[T߹K-M: Ge $ n^6 IRR9 V!w!CmSh<` j%HJ"%@>!$@V6 w4d{>ÂAeP@ Y\*b¼ m 32"YF Jd)8(QNJ Ş94`#7 (1S)ár,&k'q = C˰a\<C#!1vkJa7lǂizJ7u@܃H/|-YzC,h | [&pM,:,8! d+A ,+ @'<5E&06D&2$P60~6 7APMԪL'Q1ʹPBEFL%ź neJ>i v:@B)j b;m|U$]g|\JT%a <wFbF̂ԣT*Qp lS#谉,kBQ&BQ2*+RxPjhcW'?=}%.0'wd5d,e5z>q" ϱQ#dZz 0JըyHcyvPaR>y T(b[YQ]Qٹcp,"EEx5 j[GX+--97 ;`/F&8 ĖmAC \s1cQyV9{ ʶHD%$P\"%HΥ/ b)_}iЙt|Q%G !=~S[/% QR)3#T7y ᗾ4h#bqA;FAشsFIZ?je3K9Pz_V,íZQZ1ͱs怢ois@p.cбƥ0 'it@Q4:2itPk9!&,M0G =eJ$DPRf@AsNù%?e de d!$z)Ky&P5:h O":G8<7lQ~tPn.R]!ox:/ _/B,b)tVsLH9TQ^ 7xJKk;m @b%X.ؑF4nk5dhP,A&!:CP*A^0I'QLD@tE`C9O3$3$L :iAt4 ENEeU(I˖(m+- e_.R!UP4+Ӏ_ 2E0FC%H3}Q>y^Ӣo紴gKP ,fr{|kbac{Ḽ}Ig~o[Zf)ImNķ)bRA-y_?ŧ9GtGy1UFꓶn;R_y.3eڸU'CR'"_Vh qq]c즃 ./e\u0Q̺UV?=h5aEV_-%V;Ռ2ݩL["4ttA1>÷OxLSOO2L+jK'JTVY}hjdBe(fZ'w* 3r̺zqb9}z ljfӋN|& 1%;a8$VT M VzKp*M*^Ri\Xd*@N ;i6ѳk)zǰPIxT n9_sʴcGK q)ː2Li`TuBYz5\Eq[cb$SfIgkL "{E&"EVC"Uùmz f6U>YSj69 u:/aU oG6ůJ NCMYy$!kH@C*j 4Nq>5Uf!(yYCaApW-l3]g%wfewش&lFsӽ5jH@3 Q Ɯf= d̩5-MpIaBwBayG̀u!+lY^cjnDhȐ2?3dgbҬ4mAJD|5sw#% M\ZCz^dپM:gqT )| ͜Qj$2jFK4cƌO5(fѱ@3Ͻ^1̎Om7$p5ɣ0iܑq"qitewRK1NXj=t=Z$W>ܹJ63L͓~:wn)Fq5{Z q9ʩr@u|؂Tr46%U,٦QF"w>-2wpFڲj7`cQ"t`Ū6[%yIeG.!0/7'Kncj>i,oQ)ʗ]fE\s.RF{mw䶂2*khZ DR>=6?slOT.c>K֚&TRﴗdt+Wҧ.}zQ'2JjV 'gtzx!~@*;!v❕?w&gDE.~+%o ]|QxN~JtK^]IHQ~e΢ODY.DOKeWQs h5]jPN[SũZĽ .,.T|"c^Rtn wbQ qn/=糼۴{>)6,v6e-~Qd{ņ/~" E9^s(o!مtȻR}:msJnOl&JZ"Ek* )5')= > ^2YI!B. Xn)^QNX){zD'AvRj.nOHiwdi-9R7v$r*L;9!ϭ{!$=o$tՐ!C]`iRJOWPjvN<|DJP RJݺ%:Y KOЋ>kv=o!^%Qev{PU)@!`p{ HANW|Bۋ@ͺ]՞%x!Lg! $g$a%A2P${ԧ]X)=h4 ,~w%ٺB 㴱~KfzxV?yH*G\O5YBIBWf}2ڍ87yQIҫh.ɧSdzh͆cȋ h91њP)7k߀F/8w*Rqz]woɏeʿި7xwBYMZW7|}OSWk~N~ݾwg͛,I>Q~?2+q usAʮpt!81]"hQGKVar Gk"xIGK\Vq\W8Q;hOP? X r#X>Ʊ03dBO2K#Gae0ZȧrDN{| ЦUc !*a4[n8N(|K(XOBlu 1cO0c K-b[4 F$La"Xa6&:wj):bbd1`ǃ/j| ^9x璾(Ԙ(5.Wp|%Bȕ#%~|FrCdh"c=I#&4Zͷ`XAۦԮba˺xNC֥V #_0p;T z,ئx\G4DxMu xw2lrSKXփ;AC| bϐuGY!@@Gzm. }tsPvcI2@&c@_`B1)n gdnO[ <*ƗElP]PP-Tn_`xFqGxMbaGp @$ont6&Ӧv+ 2WA`T)ĘjM2fvv ȀnqsD-KEKMp]eE&Бᅢ$i?Xzd]= _@ q:Pkҥ |@ N8B .eFn^pc:"&L:!ul4 ʐ2ktcԎkq:K UjF F|ROw':B|&'QBqM:Fazԡ9&bg($ntT.1[U.AQIz"֗G0At !BN6`!hXdatd %} o9hBT snbdB,an°bW6*J.Oon$2S\1FbYoƌqێt$#c0ՍɼFd}nq&(A?!F,7`"<{@ϊ݅Ҥ(0LfF}쒑RcʵFA8a2o}_A^PCn rR|&zҝ2*xK+ =jO&xD@8g4=?j[7ahe|YUr ^&wHaq-0({b//cQ4 +0I&4*(hHC%FϹc|ySPd1-7;gD B;ۑkFO-W؍c 2ӽ /1!p?J냱Y"䪥5އ2`yaa@ǪEx"`ZXLaӆi@#^wXl Zrp0h3r"` Ŭc@֒!f~˻ Qk>+ zQQ0bz Iȳb O Lf# 4lW%8ZϘK8m’/%?څ;L6馣7pwn3|b3?ww3_ɚouY}}lGݗT%EJWDX+zJj,zr/_ERm}Tu/޷au1f='ޥ"$S63!9R8ځ. !2P@.2Z9.le,@T )VHㄞxUV!:_v8;Bi}ÅbaJ͂lFwh_EIKK!NِFAIG)Aı;Aly@F~575=(6ĘE7Bd;΂șH@Ltx4讴LҐ F.^2Kjc>\  ~C"-y7> Ex gx!e^Ca` /UN]X *;2lNSF'ÅmdJ Θm 'sHkYյ91 r~a ̨%C._3AeewgH)5HQp GfrS̾xm !?׉˥YΐnQV:S͎s݂5_~vWoT6#H i5a!-j軠sZ-Z+?̱{nw\*ϗ-ιBL *A- ЗֲP)zTER90Tej}T?vg\[G{M03<ׅhj}$"o*W7n ߕvÍ7V0ׯaU>M)pHz6~խmύm7y0aQ/G6?!/Yp)mkYLR\HR]:YRs ̲ß2r"}H!u*KLFɖ^/C3]9Er\CQ:i"f&MP&SmJ@zC+8  Nr}n*0-y{s fI΄`%%Hȥ re2(׀;64>p*1p9@Rq5k@9j 5Ġ@2rud 3"@`+^P^"$ jP4w'b1hrԠqB>9\!H Q-JO4f&G:DFƒt:NXHgp=0?.$$1 ř,f e L^˂<5x<\匽yxUe0GC|*Gg1`iT/I;~)njd$&K9zAe X/8,-&[@,vu0Ηm $KK*1<$l (˓5P%z[Rہ2n%Knd h̾JWfz jtw1rY dcY60K@Y*rAl% @,O;1d *LYz گ_^XYb2r]-w#F#t u39NT[ _LNe9Y`*@x!hSⲓTN%#*"w e m,fPq@Yre$eΥȒ/MeX#BB%N03YF,x1FXF WZT=svi9j􀲩X=L -` *,=za2_%*"SRDqZUSm%^ԟ%:ye+,m`ҁG%*"D:3O +9gexoMgKɻ^zꁃ$KMŧ,-,PDa`T%{ 'R2%#ȩ,A,Ad ב,Wҡehv$KKe1 /DOK%7*奿(T,1-,Q,o;ew2KyDJ$KPRP|ċp| zqc0]޺g %K%XvIe/AL%$K'(YO!hm$GP<(Y$KPDJ+Xd/ OCTsJPiǍi,Oڋgh`YR<2%hIHE.,o8XO_NJ"T~ >_BmL3!BtdpШ\d4B9h A_j:>\s ˦tӥƯgKVm(ho -&ѨGy6#Wb]?ZNy֗Gگ|s>V"[>f9QO7W̯,ӹk/8~~G{K6|׏:Q>Zhb,H'{ţ%Cu&X^]hL9:t ;Z4e=/X=i]bcd37[ޠ.-4& F9~4~/Z-ݭS>:lj4ʅҩ@dآ)xmR.u5MxϞ/:-$@nsXrZ{}<Sߚ-uJE>&礤~s7tkdVjo܄3>飅مS+X* 16c͖Om+xrc3)U~/{-Zߣg٭/} ܢ~l-ܡٲ$RTt- I(gXȣ=CyO_ERh*Y!YV&!Y!{>hyb^"Eחzt…tĥ[.i[ڑ;9ԑh>zhe uuiriިHJ܊v|WO/*I T'&/'+EMZ/t T*-|ys] HiKZ!IQZDWC\gʫBT~~[n4i44M̜xfx[~*'bRF j(4͘Ӡf\Xh:nS-&4 6Ʃc>yaEKH,pҹ_D71-/ ͲЎa$nR="R9-bu7\uD~fSiuZH*c~uRSgH+wBnki )2VhmUuCL1*_NPcIH_]RN\Šx*p~nFb^ys% =AzK,15ElV6|hBww&f;,˄ wg44q^3EZQ$1fw%bR=ji+9NW,fb%ԍg*'1#%Q ȱhxQA_^[YhMڤ˜K|;8# k1?h҆hҴǕ>blT$*F :3Zއ=X@#M8ґ%?iT:_}HMt۳E.PD];w[y]]Il&=ҩpgcNԌu(;+Z=Y޺o8+' ^EIebĒ0J;S~:'u&S4[՛tc_ay( [SLGC7?&]"96 \35LdZ4?,JC^^if1z|~N z8`%UN59Bmjrf-TXNf2b)A w.=mz؆cӐD.4To|  s!iV:Uw,ZIB|ޘȃ$4&' a_SN!5CV:<6DLM؏1ø fFC<,6qB Q=M`8-;w3hǮ$>%I޷Voߚ;s3wRǟa*5!T{](Q!|l#?R4D݌loᢚS|I*FKl:8gzڶ׵HLDe^{;b*)T܋=w*s s*`/>dDU8JZ͈%U;U8UezYB~Q(yuTүXJ .Vx v!3;U|U#T{AX!^;mTrӞ=PFeV؇>h.~feNխ'n2%UPU[ ZR sQTIUKRӤ2י"ꃟDeOJ_܇G͊RΏI5Tc!nR ^J_QOIԉ#ꤚ.?Wku1x:lI5YOy~R1@gNTB/XUsau)T!Q5D |JZӳ C)pR)Iu|⥯v"u*9}͞J%ͩTrJZ8.K&Txs!$jrN3 *}exx'az8kt ~fި]+PU#(9ҧ/Sitec7<4D}1q'2߳:σ-Iut)I ;séWW'^bJө_-5OR%sK֩SO{Kͫߩ҉hP]2#'=*sB+^Kϳu{e=e糤d􄰠鞦(_(_O'.l43mJ>cѧozl g8:h ӜNr6B|&[;vm43:i!(!}!)HBYq]Y{ClX`0J(8:G.2흰^phVW:H]#{"qLh 30$ ZAAWn &2j<^GmnQ &cVBPBDxDM([| ; qhL: 1fKk3y@(ѱ^g_G5CGce΀D$ ]L t'\(o0mBݑ/qɖ󖯩  Ǩ (ȶ\9b(s)bJ`PB#8AтE80,|luKJa2#@ȇUpÎGn1dxP͡/0fWcnaPu$&*ir2$w!]eYd\ "4HZ4 ;Qy#!6#b*۪1;y#  3皱c{H6fG Cq/DJY$U!X#] ˒yOЅ&. 4gt|4ȠmQSxITw@1ЕoB.3U9QDe\ < 6B#pcg$Ӈحtd4A' =]d5v1u}d GҘư\.FW,4t0W4%}o f/1t|*pN z \d64/4DG5(N%"0l(8Cu} R<@~gHQj4%׏ӤϘXs,!%J(Ȗ>[ fȅy$c 7S $i;C˷Afp׉}!u_K.L(+wP}hmvEcd!{VG/e֘ u{>"EC؃Y|?je}E l3?1QƑḶsPq% I|Yj:G~#c}J#:QGi`ja"GuXlC@U4\PEr@9Qg9=8*T*s~p3JSeD+6;#eP~+:G~K#?х-0ټ1#c1 GIVw|&Qs|sqdXߨ*Mcyl 3!J9GI"A9z~. 1y}4&N7x;req5X ֡=,j1f#_s17>%\q#ZKc:88FRHp 3 =Pǟ0q[ÒBѐEĞK+:EJ &9CqNI#j Ѝ9#& 9b(ĭlK[T@ǀI # S b&Ì@z?smdAtidk—aPcN 0-{`Icn76a|c6m_c#!z#薪Qc.a &-&(9b ԄxLōڹ-? < T %8ZL-ԓ#sa䈺&`13k}lrwȖsM)+ [#,+A-A ĕ1~G" W`z^ΓQ+"Wts"FE!5Rvh4\!ט{%G G&\}߻P(MG$njK'e;(9Bjn`$G OY8B\̖!yj4CHR]%9b6y%p3T+= ^,!-F %GHQrsxJC1y_?3ςP^яNýi?p7_.5.!uLfmq*)?Ssn,T.E~BP*:TER9ߟ=zBeu y*+,:ƿyǬb0Rh[dų92]S$?Ҭr3m_,-}ݝ6Q+}]VoY;d`VweMwbZWXtg9/kG< 1/B7kQ)>&ϧ|'ׇ!.LIo5g"!4$0-j~ {bt^`K1 f%$J/X>H6Cyr1I%aDJmy]Mq!EW*9yn.<:&1d|v](33E/Q].֗Ǖɿb׼R˱e0ƻ*yC@~`bϺxe=Ⱦ6~> B͗d񶑪*j.G"3%ȋKE)?i_5/ ?\\iċf-BFU&>&ogfȉy|Բ[&[IBv*tK|꘍H#MnH"x趨%M?juEx'-2%E~[CJ{pXdŷ yP4WŤV/HL^`N&3$r[WW3E:"mV؄[ B/_W#).UٵX}ӺNC#RM iq䊾}WBR3=/ߕBQ=ޥ\P$$_vYT_fzdPhr}@:M2sv!erJ V"u}v"WKd~/?Z7EI1߾}_Xi硍aJvo{^&D_g}eDPK׆(#EuFb9Ҏp R^ /1%h^eQYUY=O;>wED=&6Uz|[1Qрl" al(Ơ.!~Ra2bV%̤ r5 )|H.]DU 4)1g\s)p߿rk 3qE:TMDIS.\f|K<M/b踐* 4~$r,\hhX xTmX%vn@[b8;uH.`Z_e[VmwWZ tr䖧]u[ВgEA@WΖ} )/@NeΘuh>S[AHl퐑o|j1F/ p+%ګf&H|583RLTJ7>ulq(5hWX1j)Ut3&wˉW\ؘ.T1s˙oO0Wg{-oGBҪ9dwiԄ[۰*զfR؟KCCV)=n ŐMh'`<_[kh+?Nϻb<{$XN?O.Vwb\Iy9Ax =,aLٚJM@wc*l99IƦA5ںJ1X|3K,?JLk!}_[3uum%%(w*H&H.x=ߟ`mHD!.o_CĖbk.]k3!yl=Ґ<6eVk{)[(4Xus'duL6_Ylke=^FU \3;|qv0|^R\o.W-ZEҞ:ܩ? gzGjjܿ#CrH>/ݷۢ:1^ݔ5y5g5 ZlŻrVO lniUav/[arc38;û[b4R1T{x/ljS\>h"</㟅3V`+nsxx$r9wڠXbZJxR8=$t"O$">.1٣.zʏB7$`z&C %m4^lsx~H,(}Yf2j8> stream x]O10 mAR | u*C(M~ISt;,2 ":ր#ME݀ gʿޞk I>s^[+x"VU b'h9u fh*\C in X3/BSmendstream endobj 388 0 obj << /Filter /FlateDecode /Length 7340 >> stream x]kq@wGX!%H %\R+:]KJ`:Տ%E$ k{qoj_^|u<<\ş.4Pw'C^r=ڥ%js>.Ó\^(]Cvv߷WI?lo 3Wnh q듫-ut!Ka3_<=ľ`my&FZB@{Eo ^I kS?ϑ|Wb_OdE>TQ[czdx9{7)gF }U䅶!Id?rA Cx{ 8WP{#6yBaqJlT4@bM'gEc<~; _k3V$u@*a$š7\uW >e*4,:ɐ:)M Y"JEFxvd0zgc ..QkϧW+zxz k^auȡN ȬHo0F6#Mon v -.Y\]+c$#w$Y!m?ԬE$C^5dOMEǃ<:acxd51mmT=}((^:rT"%.C!v5}o@wI=w@bńwOAQ@ [I۝P:g䂂y\':oxA>-7Pe;P~J8?`ycMz5فP9jH7^wŊQWJmAj!2<>4\pVЀ6фPNZfФ& ~ zGǴll?؝4Uע*Ham`QJf SX9pgr$nR7Ň(6%9n$(NE)qj?u3 =U+D (Z4k3 E ;1)&+B 9œM4k X:ѬP+CzHgrA{Ȝ(=z!)DM0`Jw _fgp$@2v@x"ҍc 3qޱrtOґ(dԎˈc&ܬ0PԏHϰAPD2gvƬ;GmGΚ5sN ;c2Q0#?ghUHiex3 nEΑDP(\EW)&\48VSȮ]$'bȃ[qu=/ws.癪c< ZKf0@ˉHL8)낯ot<1nfg-є)ra@  hr$h;'<9:lb1̴ƑTH)kB):<LVUϟE~,˴ϢVl/~Z;G4L1B1a{0Kz9%D )6nx/,!r1!dLW [mpD*tIK,5^-CN f3wufM%CCd45rE=[Q“F@Jʊ}yöj b_^uV+2M*Rl)k+J$SD+OFi٪SDXVeuwׅ^ ~؍~օۣVW.$єgZx+̫"hiܕ|0o2RN2k٨RD#g8)5lTG 1LAfWNvAܕV$cHy;^\ŕWveY腆6 ;~F6-Aj'E:$$5l?@v5~kTWZ=p~~{xtW7o$Ek$mo^|_HIŴˑY~gpYnA!sP%#MPL~xIL!ఈ]7S2.P[ Ԓ u^2wΟ`3%s((!Jsh[U2 l`C"ЊĩB"aMKǁbU UIg*Hq 92|/m2<(ŀ5(S! uE˳ 67z0\(8CY]n[T"ᶒUKIAW X6R%bH)+(@ ٱd/'(5 [v8HU(fF&\}R'h6)#fd:8F  n]~ǎ&ȝ#=jI[G@?QrTg^0[L±= n{f Ta堷ٌl(4X(^)X- % qEvR57^^B   !"\f@ʴ 8k-!rvmҀ-sq+Æqw B )ZRZ;Rɗd joH)Nb uX@p%TB9UP [ېoX!51R TOPr:+%% A FQ  =@1 -V DmtdSH*0Yl,W`Dvր#.D+.r1Vp'%9PV-`QjcYN1TJAQꂠغ E_oE6:\)oEE$TP ֘X@XT'`"(I`;JRCRD@ *HҶAGIFZIGI&JQÎ( 7$%u A*HB l(wJ¯Ҧ$MR)qI@7UBD@6[,"8iJBA*Fʨ*LR4_0 Bi:LBX BI+ 49*B镒 z8Ia p`FI* s)4LLɞGoI"|IJ,$XWFBzjq%|c$XF%X+2re"#$ z@F.*2B2(HCq~"CU@!i(\l]7XhP*r)TShSa1 9Lq yRd_TXc5ʤ,b=Ԇ<~(ȵ8PPpYc9 jVh`# ecՇ o!QY=)ơV:ŠO[Ko(Nyv)h R,le7ҾR*v;X)ZJh V*OdEVVWVN :jr1Rk%$K5!%, :IJ@/E4 $i#KVR :(:NX!C' V`AM VVZ;6dUk-.M# eViZա? ܫ:[ ktC8P-oYxd9f%4% B&f`na!$d%^VW %,ea2s0ܽ = Lp_ b A/f-aQe=KT<Ů18VmXBV9un%SC7_ZP8Vh)#,vHtɛ2sSb?^°v:~#w1i(B(~ ;<&"DOwY ŋ\rvfo!OahU>=>2 .!vh5g -|6A哀G7g-[ęD(8{lhIoSxԉkIԳa6 dqF6V.gqn1Fg QVZ>~'@y&/@ sdř+~>Ci%ZB􉧞GbA?:&s7{+*մseBf)Gcs330\ 5% I9J\k1ɷbHUB_\jgqcnqb?e&prq=rck1Cd]C&3uTԲq+jo֓}]_]V9Ow`1k[q|\ {12ybtc;Zp.6G8 zF1Vt=`㶽EȤ/A\ڣTskcXV*u w' Nd-,23c_g_Gi=W|fqrז~,q`q yJ,6  3qxoԾO.Z6,vI)1QwH,[l[.F{+xU 2ˠp *$*_)Ԭ 9pVz›;̪6uUz1K6w:d]չgk#eZYhzieVF" dL((XkʆQ }6BE FSUQnl?~ 'LY+KFxBdz^ 9iԨ_|eGTa 4bUi$O>gg߁c3ˋb,8th#D{)X݄Dиp}-KíEWR qXj`I ]ze3OwB`s;7 VA~D_lQ$mpYcbj|..沽:;gU7DwP*VUL+ش =~ݎt▪^7?T7,34SFͅR5ÿR%Je^g 2]Qug1) }2+P8m}|~<ϛPAћ:N@$ѓoaP~ bs7wIW9gQ`kTbMu\&;: s}s[Vu|SZ/ZNeK(:vnpjd97Q,endstream endobj 389 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 * 0~ 8ʀ0%!tpw'0^G#8|QcYZ`ٲcay⢼M2RyU!tVDWU}gL/T)Φ SIT @s$Lg);@Siendstream endobj 390 0 obj << /Filter /FlateDecode /Length 8851 >> stream x}koIr?Ӄ 6 _.5~, 4 - mh"54cD"u%fa4*"_8A-_Ͽ u_?ׯxA B<%/^^A[Đ!$wx\^ycͥ^JNczן~}쏯?pЖê]v6.-?=//?wrF-*8߮/d[|FgmzI N?}۟^ o>E%?1uXN?O>.cymzmWJ~K"T[M6dxpٻ8IuZR>=i_wQ滯B-κ$mGgUK'upAi\F%t1.:Bo/h~CMaXޅ[t/g~99爹8B#IRؕcZ2;n4.!Kr $aI7 LN{rz j1ZC!;./]͎vǹ0)ٛc&ߜ=AJOb.8B]mu1]%HiOiv;r,.qt~jUޅ! Fb>#Wٟ#W2G$@(ov4y}T&8E}$j+GKf2cpb4,a'O D*Gc)Gzg,= HquHaprʓ<꼘Ϭǰx W`{8ٓ~, nu&gwʑlvcT=2E# Lw]D l\NK[ .12IkLD"1̮:.ҢHe 3HOHuPd}L;n׍{alɄ=c5}lw2G&̈#^pX&Gr2FҜ]V!ˀawq[#.NsLwQKG$L=*1 = ULztBkBzf>{H@.n4QԚ`5p`H.wsݰfWX>:=`/.@PB><2O8'ppc_082x|)ϲ jqe]!b+E6((4Mmf75Fcm|#J9^(⃚. =|H 5u8 HZrL))$8T@u /虂Bf,ǽ۔ :>Za )[ܗ#ux1<vE;(~acCkd?cߴv"_!1F1?ƙjul.?kJ`_ih8L J{sLm" (~i଩4(h+JcbFXMIU":Ó X1L!YCU8Bj[SM'IpX4XSYA (HFcpȇ) !L A2F M(Ry&]ΕuI!1Nt ^гc 9AKQg%P^, *Z fڲ:R2&#+mb}v͔XgcȒCî(J0Ur`¹B~$M= M%A"j ȅP°"98slG&DiK&@`YPLLl |2'f@8-% 4*ՐPRUDr]):PL55 Obx|hRl -Nn6gQEfeYrX# CNUG#  Ke0VA!sȦ4Sg& ܅XkšU[͘OD°b`& /](R)$$LۨApC1b ("KH%t*]E3 K}*# jRjG@3B3! pB@NR]G@4 &g@TKɺ_cex! kI\R!cIXOX.:vh%W<s~&WK$ӛ>nW(5_1qq㷃_OmVtCnr/7@  q$Dc qw1ԿAt_ߴQǖ0%H xU+;L9UifMctӟ^ Y6hre7fqd%F\h#(e3:%"kr-Zy=8,#|6J6[k6JH xp06O87"陂xn AXL) -ND[1n@k'7}qrq 7;wCF"Oh2k&wk}'z_&$1@"ïMDWlw^OJG)uB\ޙhq*Bb k ͎ Oir;~ koR_KX聝3萛ȄHd``IH}5Z<Kpn( >w#`?'O]+-COŘ)pCC>d!*e)ȩjHva 3 )t-V1IͲiK/֖UvoGX bo9 P={ɐ!o-ژmk?uhL^v(YzG ^ )Q&PH+RM: W#|sE ^оoٌ2q'Ԏ?0tFG`hz1l-9EjC!!>L*f|u?-FI9M z}F~>._&LQ4=oݔ o.6dz܉UrǣL-NY@6lˢuNfH=LfC^PT(sF1D\(L3KqU( +'Jya1 VX  i U& P(vZci>> نEd_P۔) @`ZnF{]RE -O>~ BR/&7WǰJ}~#-tbVzBS: 0k&0K!jcz`SMiV6_FW8~'G7r'ׁ)(t+Qr0Řqt#}P_4w]yaڒxJd8֕94S};t+y࿯~ެv)7U E+Y*Pdsvf;egaQ^X%$vsH^[G.:j[ @*_?Z^}( xm7r cҗm*bŅrOI2G3':bl(U!;q}Fԗ0_ u. U$fp\1Ba1u9 P6VXBy&_<[!}[F׫WcS4^Tyʐu~OmpFʸhU|6/c6 x_yeҝ(.mV$O[{EQۥW=N oFq_8240p-0(!f-۰zt"| yYZ}%$tPgd[[bͼ\iʁQ2(YnmdUdE7 2yQ!ΒMǯZ/ZN Ie'?ѕ<43UVkuaoě I)i|ɒ>j4h|;mi̯A j݊PcOS sr0biŋ"q- .n7oZ;%Z \ yƨfq \COȃ,wuVISq0Ve'DG,/V4k2ggz4YX JµmCB|%wJ +`*+}ghV)ҝrxv ,P"\<+^Nz;6B6t9PTȟj>H̀>Ꭓ, %߁ .{T"Z&[}~MXopwdП=g[o< 7kDՓ= i]Aߝwak'HunU{e|h1xq>r7>=Ⱪp9\d T{X"ro] jDݽa~> stream x]O1 y@vX%C1C2 tpw'y?\gG:ikD&X+@[L 7ޟ@fϓ8UkZBMĺ1R :EV,C\ H.I.` >l`_@Sjendstream endobj 392 0 obj << /Filter /FlateDecode /Length 10661 >> stream x}[Gr;wbۘ5vXH>H~H I0?8YQ_WS0ޅT}_T^"#ON6qO_^^./ǔKz GC1nK)n -]~?~s%d>O黓oӏ7^ҍOOa>}skzs_|4g wlO^C^̧ӫצko'|z3~åC}cjD+?~oo۵-5&g{;ܟ4;l[+jjI-y>O?̧?Qs>HM=r%{~w|")]a]?{?/L>=7'l?\t[J?n>=3<~Jv䴗"u~FӖc{~?7dЇz?GTE?ҰEoq 1Kś 0ѿ{D`s-5TX[^ UOPp^+[l+u[ى G&u:u]W^coM–Biq),W3ڗظ 2u0{e /o0=D2ZWOj_^n4VJ{͗'syEcLs4-1m״4+%"~Eyy)/p>A){es/?^$Jc {b޺جB^KDhҊCsĪ Q{!n~^2QϷGQ ͈Wԟ eKn+;GvnK+6&ӟk,8(< +-Tb-eY^H԰Ksm+ "sp4B՗b .o5|~߀5E780{ k8vh@[ib ϭ(/*xLv=~Gt_e9r) >5G[US]Gӎܖ@Qu4|i´h{})/m!-["ӢH4wB:+.~E{ШCݸ/g""4ʭVd[}oثܒ[ A5ş]\aYVVW=' ٫X&)=&/̅}m(IjB u J[KK. ^m1-Z D"M:ЂPSRD1 y^W4o:6M{zA&GԼ{4 UR_\ҽ[!%u!e>Ijo1Μ‚H2MWY= 1qA`8ε̴dɀF%2p qa%>,*d!GsRmeʶb CPúSS+ֵ.P׵FTܼ!*n!gN/ $l1I)7bK^FW<^pX{uXtFW@0GbE^=$@Ro8QpaM)b͸b$?}%~-B_p. %_ucƻ;_(GyO9;> 8O_7T)qKTBȎR% nS)rHUdS)rH0L>PqwAOG=;yc˨@n189W֭RK'{؈Zu1}֣FOQ?˛څLPh 0_Ow|xow/uyWϟAW fwP#^Td7lG> ő)c\f/pD h^va @i@5n|8rZ 4qL} "HAR|-ԏ)8HW"fAP.fh^%Wpv1Mgf;z5WGc,dGYɯhzzD*"=MsPk@~7EH)[QPF~*?(@@\J; ^{bƖ BM]! X*! ,+\BdpG/at4MPưZy9@P@}#=B{C 2Ln~ ȼipLrq/Hp826?pB1~L#|x+='>2tj"03c"Xⷄ}< 2y'Qdu\i4tBrZ,2BU*H`D%8tF.mWBK` H> $D8k.4!c߮,?"Bn 劻1ҿfE$Yk ݱѳtS;O8zN_#*ص"gF0GٚZKh)j "rFx|.u ;5WwK~Eŗh(Vh)7N rƐ%M5̵jgŅ:V'3umD&9ܑ{EHّUE vkIj5,0;G0K][0O h8J@ԩùFN]B%˕EFRi 1r,eؑҜNRnL%k} 3CݍcyOfBP-7=J/84~=biPiiow){|8lG{gGUN|`L3Ǭ2L#r&$cG$Dj&J_>XM6d xN:M$5x&Z.?yv@z`>X `J{fGDId>]Jt0(rDvAb0#'B4Q\HyiEg;x&$m|CT7H8 ! B~REBx0 a@%'u2ye?crC"x"~:F xEOH#eN8ˑyph/؁;%"|v{kN˼o>"DL g~g 5u_~8S֩N{uL P}5OYehIh[#<"%D&(<%>pQM֢[=5eO"ͣiEEO&;14-+o xJ%Xx)dLu*|p=t-*J8HK 75[T}.>El"h:5*{ΗՉ,x:5biIAX|BZ#Mś,˒A2+,ȽxP7-vϐ*:rfm,OB.RBgHvB\C [@=br7a {t1 S9," .8*Og@[Bb0hkʟ.vJ$%QU- +ز,y43PNu&@eMOqWa0c@~{n}<%M3$Ì-'zt4ܼ CN~ (IgҵΐėZq;o^-)J88wN|4mرw1S,!K8Un>% _q :eKhd#6es1 +(ILpavث-L#U 8i$dؙ&4d)hL# j$/*F;H4ErBi$ڙFRݫiLcLc(jLnL#E_=*D,@9j`2BM bSj!)VP V  J-?AlPjAfОR a"=( |p Bߨs\YFD6YForL;ˀ]:t`8Y#LAZ`Ѳ ?[fxiX2,gYg$ë*N2\PU`{g)p;G&' \8tlձFpVTw^JXLJ!X1R ?(^cN |(pcFv \)x}AIFBr*ɠd$ /p Vr/@8:y&m,pXkáE(\wcA(|c(('HU2y+7 '! +^`j. AcND XD**{*b`diwC0xXp`@7' Zg2 Ce)0pNGke8o$+a@^`9X>1>saG"4# @0XЉ)6AN|4hvU+5ge:߿hA.ް^yph7=OwB[%d>O黓oӏ7A7~>j>ͭ}Ď">žS<{ N29Kc|*rb>}?^<6E\{>O/ӛ.;ŧ0#ۊ+ >Z_\OO9_LpҔ, ?9^ҟ|5RsGn?o hqSh)4:;vl ?z;iD['ùi"vB"? ?'bT虩/F  '"@Q "0yixF>Tَ(Ѫj0#E?l'/FqvD.VUa%*`'LT5xy9Q &DՆjptCvT.`&M30i,S,V[8!=t# im0GR`Vh6U~h #RZKv ["-,S~@Y*a^v!a(ϺH*SX3$- CpU#ak; 1{maĎ80'o)D|i)U!7LyNC'X ۻ0J<zÄtTanz Ҳ sSכDoӈ uZ<䅥iQNi ,/%aۉdYPyar@'7,7LirIzWى:Ep|(L9hW; %̭*jMP}aV= U%uUqBԆc]m8`jK񩁴Um8B^9xb#`Pa^/S OROClSa*f䴯=b lGrb?ﻧ}T9_j"&:I5*6{?=0Q~oQ=;R]bkɧrHeؤcؤW>6L*E$&ў{||7R/!VHRGxNIpnI}֯n:ؽ~hbKr]p=ͯ>˳}ww<.aݫol8 b_ߜrhiӺ-zŠsetdd_n~Ƣ9b:6Ǭؖݧcu 󊱫i< L-? I FiªwD6 "; 4 Ed+"e٠l52X$<`Gd"]GaT{"Hg8,")@Wg8 Athp0FbaJPasDXN #QbaDN ##[,?KfS>ct+X8%qS>7j"{qͼq"&:I5*6+YވRą~8\Q3I@L"&I>DamWm"El"lj;{#n 6~$_|(&^f]DъGbcJTD7SUD@!s&UZ/NX@T[uř3͓w >z] ~QӜ6t~/ʡvf$AZ5F@"cLPM"tΟ$>]U?o精hp)ܼľc_Bw&lw|:B)&I/~@uzcm!?nbu&sup(Ypqn([6eٞh|xb0T| TJֻTw켓%;EqhN?Eav]EEZήB*T/^B*[ڠ@ܓ]T+(~'Mca QLs0gٞ Ǘ{g*Y̏gǍyJa(xwq _lNG9jq $kѐMDP7":6$-[LxRgY[OGmCc yD/彍4u33vc[1PC E1ox 4շJ>A~J.½QpUrt{#ă5);{IqB#jΓ[G/q.aJ>1BpsNsɦ hk٢&oGt"_+(F& :uDt_uȦjh&\oث3aܴTS@<ϔ1saj9H+W{r ׼-ԙ^> stream x]O1 y? AD,钡UĘ!2 tpw'0^GrGĭ#q[ΎX+q*+n:?n@{^P<;ٕU{\fd}ӨZŐ̟TNyQTr48orbDJii 83;?uShendstream endobj 394 0 obj << /Filter /FlateDecode /Length 5142 >> stream x<[\y}@@δS/r.dl$>v`ZYkW~C~Ւ8?W K^ܜǟ~8Ꮻs Ԋk-VJRָvRoξzF͘b8RA7 5ᳵR`s>\gr݄FH;lgL[?ܮ7Ҫ;70yvC8(Ka+F\?;;os,+"TIv_o7prV9=̄ \pp=7zX.976f)p[3F V+W 3Sp p& 8c~ / f@GQopZ .LۀPL WMl sM9$s42a֩b/wŒ 9l'W3(])>m"3Cz2pV;` ޒ. \~6Dq/O 8cz#_!ŕ |ׄ ;Fq5PD7ۊ"A>JnP."eu P V 쐿R)c8ed 4wWdD"4z_qg) 9AP5 ;:P[ *^'[ jhn"Cx>E(RHl xfs5!#W>~bx[#`Y+RqIlw|,hBYNh8C1[)S۠'p (3Jx|OJ{j>)DmȭK^Ͽ\K2 :[q~t@GՀ7(kxo=AJ| vXPqȑ)o84#rk~\&B VrRT(USEL Ylj#VM`g 8%j7fzA82zSgP p`_Pw}A| dpgHwPNTdpGvn0|LimLkO:#v\8?GpO ~//Y(n7 Nk5a.H}[,HR7ER N@>|ySN$^OwtԜ#PrϊkzLtmѐN+>RiWL£E.1mP68FKX7W>ЪAt0ϭN >#6CFkĞ!dt P 3&%"JeQ(o/5(G-8_,56sL x$Ђ~t?O-f'Z>j\e-y/e|pN5HuG7:[)  W TkwqWG׸`AsKq vIN0}릡(Dfc]CNpQ]RR5/zC%, bǒbT!к(uK xƔT"щ.BE\hh* $BR_d葛|%7Zƍ&m$uA\e1 ZL/gw4.7?ۻ']xO[Q'>Šf|.̞)gpVdBE~Z疓2|c(!86nL3<9 _4q`]AD f!-WSǧsE4eF׵ L[}gI ឰJ!0X*86 YFyw@$6)aUZ4BLi[ S6H@c!oX{!:e7]f㕀U%"xtyohRSHs6Od,^$sPK2$YaʹWYЛp%@wI!"]cf#A1X?])BXxE~0WR{O&yBX1RFn&A db9N&WvbCk+$q7FMf.[xk i -呪pVp,9laN  ʑ=nuey$@mbΆi'i M1|ն)̫a؛} qx/SBS n= 8)*q}iH;B`+nlS)مYEj`mxS&P\ Cr; 5vfP3{W5j U3\4 7_EþjX1zre-, w}lX l0a;lLØjs,95KypWJ3+}\5תʧMxJ7WII9!c8*6 I1 Cu|BF11e.5Aljtxܕ -t{1\B S҈kzv5ǻ\(J5sO{s -?wȮq#^Ǿ zYj+BE=*&L}aaQnx$ѐ{Yt%a~lRez{'6՚'ăgSRj%OCtUIc#j[fjҲCp;Tmt$ڿ,!b;3svc`}>)n}D.PurكH*nѤ“>'rTp—D ܄*zoKC ]V4M>4:̶adp6$.zIvXпO_wytG<ɣmmy;vyT>tAH: E`&!{P!11IN7y(x=|+gȣ9MoW]ʇ~w_,Hxwx6#4ҨC̟ X6D ^MY@/j v 7|6wooϹVJ])N H>>{ :'>znIx L%%XgX)ťiJҠg8gؘu_ r+NRK鴪vfH™"tp[ו ՓMyTm*]i^…5_xq}Xg·Yj̸v|`V!x LI׎{jJMZg\ݒ.1>AщTL3+,5L;eBWWŷy& \I*ak^jm Lv ]'VÉOaMa{(dn5Ht&ͦWnG&_%81CywYJDe/_U5c]|pHF!^t4`Ӹs-8ZO!LmAf R-.[Thڤy|gA.:Efu8`\1^C]G ^QqU=|{Dį{:q)yt /z*^d|ir< `yX/V./>$MluBub|EtafV(N':myc'&+WmU^T}(}(͈N0BO?3k鵼mT*ݖǵV`LH)4YwQ\B I-mw=Og b7fendstream endobj 395 0 obj << /Filter /FlateDecode /Length 3648 >> stream xZ[o\~}ê͞~ ) 0ad7VJw!g笤h ?si!=>_\#~\?g׋qNQ(RpJOWV!|y,!d$U:u&3_e::z$daV.o:>fhW' d.\lhui}UGgw) PNSf]GgM:zQG߲j䷪l~zK( 15v F4E ח+1! @X *J'ÒN 7.iJ0畤Cbq~ό_ :xXTBV 61a,`:ɋmt:iEpVV+ 70-S0|<6@D h`-LBpRw0-bJEq]˷Yj!N)TT.F `W'jm4VG㾗O9BFKM1P16 (5 =!L$e4mTHQrn]5:00kN2h B>jp$Lͪ i:SC=*pvаM-$xc{1ZR=lvHib=oK&rJp(6 ~9fQnV1B0 _0I!~yճdMGgr}0L%e#wqV٭IuyըҰ-biN비|BCVfpD4B.iނ{8Y"w6B~/AJ9-Jჲ4sno.i/&#A*j`2uF@>i;trhrn@Mw,K)* VE|Ѓ#F厁g=ar{f԰+2:\S5k2V+ZGvCy&l.U:t9F=7y, )Sdk~2ǀ`YHxȤ&tynrd&#WҚU]ejrQE_mbg^Wq6@҂Bg?X&xM0])_m>  H#㕑n *u gH;l0J+q(n ㄙ-P(MD3b!(FEmY}D#PjJl] {lizַMz7K s˧ KгVJ܄`SN4Aa pG=ĬgxC-dc2n7lp 2=Lcn\ ub’TY k0Ii"Cn#o% ֌"?NH.GX{(-̔ȴFIɁaP}=F~}XoA@IТaw]|!-!a,dL+2 . -,% u^gY,Vn u_w!`צ-tZ ,6Kik,Њf;Iq0jӆ $qy3_2GuoI>'/ضXI'Ij={Rkc;]eA7`/:mM7 `;e~'|j~L\%)d! )3H!d+deZxvra$" P[K!] ,g-iHk$_uMM2Hҕj Ȧ~r&I m}LjAz>צv'ݪ֮i!4x@L}A0y,)ֻܕS. 9AWږg~=k-\is⇮iݡB ~~d6bq>3n栦J俴B[ +Sȝ`_z_i<N^T @撢QBct\]pɑ^d5wyA^ŷ X Pu5>fIPв[,CpbrK b]5n76תL8CCkxdSF;QR@ bZx2'+QA1nmMn'`oXMýoX>\WBaUd)=m ]Ze쉄o}RɶI'oi9h8psH?}KxHhZ-ӷh+&ypFESvs93jHWII+&qگ-ZW0cw#qLRU<4~JA3d##Hjҋ|q TWG~po{c`B:3(z,v'&F/<AZ8CZɛ3\UۮUĒ15Y\z8xx(ץφW@oq*oq/e:=HCB2S Uo):PopaڠmH;uZf]Q]f/^B)m2.?kK8?~댨&]sl)OD3;&d a!Ԕ w6"4"λ_:Fdzj0AvAuC̍酱:td-<!ڗzrGG` )Ⓣ*|7"9Ǘ"|9'A|^fkO'яqF콲J83 <@Dan`r+4A4>M͘^F nݙVf<`71 #G;!k)+BQ{s^vf;?V-Ϝ@ɜqx%LQ#w7<o:K +p;bi 1"eu A)ar׽Kw<ڋ<9 }D LNd #-$=2l&-b|‚!7]qj V^ p ]X VgCG\ň&r/TtJN^LqiD GLжrO^ CrF@$ -<>WFQϏ endstream endobj 396 0 obj << /Filter /FlateDecode /Length 3816 >> stream x[[oGr~'2Xagfn67Ɋ@Y1pDJC%-oW3>lklTWWu g}vuD Odz8̿ή=2SV oNrZOޅY?)mӫGي  6ztLv|w1 xsϞr|rR1f4&7e6WśKZT* þ?NrC/Stz8}zr?x=6[c74k:x2hxI4A '5f\4E$Np(SQ͚1qwIR iAI1 m IdBY36MfiVPŻl!AfA+[5B]aKfxMu)PLUՠ(+fLh09cHz1b? }tF/{"8 @o2q* _ALȬˌl"Oŏ :J7ffVU֧-C,Z0lm3)j!dd"Vgt^Z' 5 ic5pe %? DHtQ|T\E<`UuoX; Y$k[g+HaaٶfxO+"y)Ŭt~`2q%} 8w ߞ  |_|l<#k\I mV)#q覌Tԙە=+6M¢2)iCݔ*2趌vetr,2(HgU#}0|ٔS$'E~#juߙ2z^u#WҾt,[]]ɋ2ވUXX&3ǟc;厍OZN&cxFBa-'丣ƶYi",G6Nux$vAn|@2\XA4 E4 h"*ۑ h l7!_V:i6@ͮ9I8,xL&lրx^E~i$(XG"$$"Fs~HO)ضYB UN{wXNI2GF9ʼn)a P޻NIT>XH 1/m~ҙEd>w4\rJ/=pkA WZ3|=(ÿ'bAvS&I琳嵜C6(S0Wa,%sȓy3ҋL34jtl uC9wLMA69vB5J9v Sok"7Kcy~@.i䵁pƋs޴]?\ Qk^yTya:J;(Oźl+2tȐj=;@=)ʾ>:5d'YپqrUCY}6);B6BWl;^鹤hK^ҭاW Ncesĉ$9H!\M $gUGH ו+ⱏ-sG#4=ױ})դJwxtKt68,/̞%JZ"@/Xs>OeѦ)&yҔrP59vm[$La[ VzHF'K'+y١OHwZrqQe{Lcc2ll'7;ż-bǴCD%8wΖ֓;w{^g ʶYq{lã$U*r ۈ&,/k߻b kG-bKIc5T)[: 0OQ4}O"urM&w¯]rQ: ryH#$?#ܐl665+:԰TcɗSe>UA-ЌƋ^ّ^YV=P:9INA}qD9n̆ӯ?-s}GjBLfc+1; s;>\"5{Æa{VaAH`:Q e"d$ʜz1JuC8ϦۺMQۅ׶WtЃ4XMYްޙ`R^(OW*F$Kio'T~[G:e:Oۏ^y5JEE Q[o7:PFOi=+/{"&uGrk_: -#Lz'ư]g^C}ۅY!ԎCm W2zݕ qO_r-*.*jsaetZF*/2Mx2zQj$W#z}eX {Uɋ;o2 V^)u7Mvq~ ֘fqz'!cA&0E= pz@}HB?wgHEYUF9IT0.?hY}N2~Po7PCMA&d));ǻmoſx6/?(,AKjTDzCkQO^FH aw{EjY*^ol٫QBM8*TsJy$8/6S~,e.;a`$jQ}b).E#>RL.Ό@N΂l=ǨV..Eڏs)=}=4c 6fT ,Մ8D/>S˘.Qᥧun(S2x`=6rBy`zBF"%v#hҙ]ؗkE]Å.~ 5Z,Lsn&J7Ӕ;c&q,m\2g如hfYڍsX^屌Q^UQfMCc$gҗVay{?A'%m9Pڧ&LꌧV ,)?q+UvY9j Q7Ü]!;eruȗiuXg#a٘j6Io*aJqWϑ }, 5~RwNYQf]ONB&eH6ۜ[t$]P+}Iޅl!pQ5,)l>m%_-#G%{PnWxZRZ.-wfC+|%XE^X!r*BR\Brv8( ]XaijO ;v)ǦT]~5n#?K\B) ]5fQW4mvlcطi{*ǂwxs̆[ 7F :ˡ!IMGHN|^~vun,)[g?+b]ko]ޛ$&Ⱦ7UodBD6oj#aw'p7opfIZTQ%5#ݚ7Qki[rϮO[˻ oRL7,BUV;edF.,;kDFz^DQ:=7NW 1ҍG ?=yCJbdNxendstream endobj 397 0 obj << /Filter /FlateDecode /Length 6785 >> stream x]kuȏA0p~qE "[D,#.ܥ%>GLCbMu}{O;3؝ߧ//~Ǽ}0ۋ.n?]jŸ/z?Tv)~y Θ| 1+oLܿA5٘W?&c0X-HxN`Rgapy|<Lk vXС}Gw>U0ܷ$J/gPRϮo7vROa~OӋQ/ǷBuZ:Si-P[l..T|yzr8Ե"fwn6L|yW)z6iU<-L̢ e0uYa9'ObR-$+tMX?-WG6Z"&"w*px3Z\_~hR3;i,! DfB@j~z=?=O20>֧<4+/nZo5ŀ} gh+{]$/SǮ.GZ݈?,8"*c nxXAB( c%Й6+,rCc¯dYݒhlgy9buIT/lF7sB`zMn~2OOyql|:?6ƾ2_6]&v8,]qqߍ\VΧ槷z??-] a~b B?;/j~.o -C#0pF4eF;f"7髇4,M4v6uQp" :~!`֗&>:uvcZ@(da_VO*5iadCɡQi5~D&UnkAc$!#ǂ Y諀ؘ}$O,ޛzYbgiWV8DGy&Ɍe.9 O߽zx}6$֙,]w) vnM3A'|R$:uQF̄odɣض3#:{"0 )Vپ.DcjQ C5ͦxOs}Z?mL%g9upƋQ}HFJK"i?t>v832ky9AO}u Xt{-md{JgY5sG+H OU4\2":ŵ&+q]"]o7ՖT])˱N[˺ٗ"oȋZЁ39Q_'iE֥E.~$|/+еn'Yޗ~8怼Y6O̗2u,R}pvyQHʉŒ1QZ8ƐCue;uܐRt}Hezy wǂs \:]d-G6Aagh ?+6oɧ?XQ+{8S/{SOz|H׻R _rHԟGaݢRŌq%0!$ƼWxsY~Ȇ韻d+ŵdwOw,;8POȃڠVvkxZn{:lcxdy˒hxZy=?q~c~~}񇋟.є;ZF0wq{l?{:NwOy=>>flӯ.2%a/ [E0 gyBJh?N8;@q$i a|jx@a@j΀6K^cYγu< :(f2j V sxڅ.'=*ur$ f ZFQVT!5lÒk|pR+06imFe6%f9 CV!'S0pQ2 ?dƦ=)bYXb s3te,ohJJ* 3 D뼆σ{GLј!B2+6`i<,?}^Q1)11!z BD;vCD- *ƺ2[B4Z¬}cVY0CUf  pA6$t2 " " əF X1Uz|:ũ}{z̫h`NH@|"PfaMհQbaBC 57/1&bL+a?m .dYAcḒ&B̏Ѷ?~TF(M,19/)UFg~#?3e^eՈ9^{)"x!ݪ"N'Z!aLDmcGd8D~4JɗjŲY0Gwn@cGUp&eE#NbPxjIGϹMtTQYtu< b%\@I IxTEPcK 'S6zW#ܪ}6t'YL"SPn;=֫1UD7 h,$e2b`i'yf&ʈpr*ʂJ%m%^8Y3 rs3QD b+:UthyR\2G; OXQ2"M+b-斛kjנcLș/Pu,8NØ3 VbPxfWӖёFmE['۠b'_cv;IЪO t:Ff zQj S Cu?=m cp00&ضiTHHF8¬PGn$B'׶2"o"T/s-[hBf}lǩ2Zp@9 Tc#E'd䌊qI_#j{oEEx2bLq%e }s0Q0#gl彵bʬNYP| 't >NK #卑P fF_Έh>U'uT%P&e䷤ഓP Htd+r6lU3Ic| *:#g(:epI̪a3JxIeb4wUyxgQ$h1FL"!EVq׾a`'Q%Goy2Y >QR}`f+Pq$!#D_V%uċ RwȨSѴ/AWY\ѾUGӐkCUgsT ΤƈC|T2Z&eb'vz8"eΔ$<+(δ:P5"SYD@*Y|G~%TT-ӍζبxjZJOub# ":P|{b:~6ȷ#{CT< P^`tSULV #6:9\TNx0ax$(QGPd$z9KgVOQe0l7Vbzr;!kU63aDc nYc(|g^ NH(͑E nCΩQu*\"e;C3QFԁC/J~0Q2"nռM' J5U*0Tcu-d`c&x ^rJOe~pe|Lypb儰J> V'rDw$ny%]~,Xp047c",au0nU٢wY6ʦ(KĨdT sZX( |XEMbl)5)5˲R4`_uN&{n.sDeC#Ve7a K7N'>N˙- ^!A%!9t[2"yF8}.(KMe[m_|Fݬ@ut$ti&b๨d%$ڧ'Jgy=%+B'# t*;ƶ+(\'7(qDIHP0fE*'-? &x?-W9˫_,/* 1q (q^nkj%uݻN[_fd|kҡ~җT̫Zwb߼ke^Lz/q'x!oYYE?sIV7+UXqM ۱XR,:P/y d "U#xkvOji/KJqraK )4Y?sn)n]2єǢdcZSIc>R+n$TZ~yαJ} kotPfÙtԾ~.{ֻ+S1ƻXe<ͽ@v\p68aEtˤ6!p6;)Sj15Aگ_koE` $X]cF/of^ +OՄsL?HPt~ѽ(ΚC4_ oJ|{E鑺7 %dҳ$/BF@dMNۛ`ڪ!c+B^2})Uwb*vTK@Fk03}& wYQ(BoFd j_*7]~qX竱'הbU/Im#qH)ֽuͲr1Pƾc;Mk,ot~dWu'Tzi/^'^IE s3)fGo16ɥOY顯U[WMC_dlռjA\qEvTuk,تAjܪI-)Vv˗[V\I-cNq1yHs!Y/Vľzg&jQg5D;`j'&nciUqƬzxxӞzx\wvoޮsٺ}ԴJu>t'E܍h.Tt.X-x\k EojX~x]t]'6y]xު'ui~Ɠzw;8v٥3x;yJwK!bb_mj:oy@"UUłߊOkjpG<|=W\}_n_.~2NО2W'F 47$7ʯ(~y*endstream endobj 398 0 obj << /Filter /FlateDecode /Length 39158 >> stream x[-u~~FZ hhA jvHElznj1s3X'vM}jXycyn[g>O׷_{K,~ۗayO.2a߾>|;mϿu6_?~}?=QK np9仇g7N|[-|g=q{^nq9Z@]Mphy5Iku94͗~Vʹw&LՏ\?|]_}pKزMGGܸ#&~vozo՗Og06 !Cַq8'_o>.x폟''?tT~ԇ8AOςcF{ F6ao݁kt?~l11\}o .~{Z;q( 9jyGGu/޼15<y,@ڽϻ{TLO^Oh-dvτmW@ç?{7ۏ~<7 iƟzݿ%qkx:zpp%eߩeS~ ŴuӚ;Ќ7!ܬ]v>Smdˤߑ;y!ޑ=\5!aCo_qU~Wٷ)$y*_Udqk8Ar[2"j~yK~a `P/¼5Kj3<`֮m_׺ _bXXEږ ac eW-||}憊j __m^U߂߆/~L7U=|SDŽwC܅or\ \Ϲ ^aϡݖ}2?VIl) -89}y^X$O)p-n!v ρax\qwCd=ǝm_b@7HSދ=[;ݾ _v3d"w{΃d; buX aPBN z!AOP&.@[(0w27@'uX z+P&.@Uz+20 zH?,<3EY=A,3'|f7Y>3+.g_\.Kg\΄<,-3Q[\J'W4'²@Pv 23?{2'W ŎKlAUA\}'Aa59 L'AXByX ( WqA@ua_!Ws+.VsXI\s?r:T9ׁԹTvVuB(w@٧@}:}bR JJDI@:A|eŎ[J/s9)NdJJ*0Yua aɪjU'CJVDjT9uP>CΥڰ@Ğ]R{0W^U3 .2w.窙@8nj@ጾK^a7"SA( b+z*@ Ī*z- T%\'"׈,6=b@#*kDX\@$ΥlI.^J⺳x<_֣@PA\`J}bXW@6/m)ԑO֋3_\(Yd(# _X}: #:,֑DudUԑKud ufuY\.#gDQd#U,՗W C"C=P&C;Lv.UkPATN ^OzvCk|*_;'J FUY۲VEFh"c@ @  rqޜ@1ua \[xb JxY\w^b u u2%^1 Z%Nk&|̥Y\`:fE'cEV Ȋ\S*TUdEƊ*TdŠ@T*ŅZaP+jB04H SQOqkmo)cj*REV;H;NajNq)RNa(L4_H lf ]*q9ټDĭYd#nq)M6,b}5kĥ\5ap00EH;p) %@) C p Kaa*dpIMzu k)@Tu*@ΥJXJ Sj Ϟ0R HP#D.uhU2a2yɨc߅fyܻw2 JɗWʌZ x"Z,f6k֨: kQѱ "+0( :+ @9 S#4^*UmҮ uA:vKY-d*:J@XuuPjQB 7\(f\HXe'#ܿl,fu2ͪg.k97 2/#%y)Og%3qD|h*q./uP͡:̵`Q-AP v x{Dyu H,MuLU1xoTnV nSl2@䚊pr+oka1aY88[x>ֺ7 Yo&ꉌioNnDƴ7'"sk^i|٘&7u9D49Yɿ\=f&'㌦zexiFr!a(y058P':S 5YQ[#Z)9N&w鼃X :1 ";bb2Ip2鿃HBwPDd֜yd |k|k|k|qϸ?c̭ N N NfpvZDF |yT'w _n^ؗya/x%߁/}c> \pL͂H|>6\s흌SSqΟ7<"LvrŦΥaѰ@8, ]O.(wD\t"N$gDF'Rev"Pى̄D'2:;7`CG3~h@GtNg-ؕqp)숑#2ahqy:Βc& C 3ʼشSV^E *֫]U&" $X3"WtYahw z*[k0t%!Ak;8rN2\ךO2h6M= *u?0xr`|y8xRxz飧ҷ)$ u ZmOmp{B{5뒗r={y˵1'g\B5C4惴R%6TPNJrR%2JNJB z ʗ=NLrbqqhia=AP91XCP̆!#"W0!x\p6cOQh2ΗFBCz6'7#\uk\?l6rvAl6>,ù:ٕfCl4ƉAO!zT<0)Au(oN :B :d0:+#9GG2 -2 I 9A8QQ^*rmD1)E zmaI((r8[ 桍(Q?xJ(m(ǡFc 8q%TX7[6uo%m_6xȣkyzaI$GC9ؕCbÐ ʏl0PaC 8A4N! S$S'#GuH u818s?Nu2X2|NEL8',_B}P_B9sqA#O?׌}X\Ыv_xl AJmBq!Iy֏-pia*yl+ {k ,'0j 8M`uzI8$su!B=db=pv]uT]pTCQu! .8 @T]p UDAu1T] )T軛S~T\χF\\.;h.r'2܊2.VL vxe!N{xe:j%ic+Kmf ҪL]c /?(82!j FY6 HFB`Y@t2zaO2ou$Y.XPBDB<05dFoq B E@-"o! zBo! {b\Z~pSqPP8A#(c&"*ת-YD9k#2\˴8r Ą*,Wxו>d3Wy&xj06 Ch4}8U) <8m&p<~o@rEq $3ɼ3"֓[5"va$g4ĦchAx֍lq 8FCC#ЈchhA44 q DC#f^I!?͡|26vS! wA3/vS< HU4uᱍ!񵛇vSC^y/qWXa(SO<</;ӎOd?Y#vaH(KMK~rHlDٝH`w%htI]J ]G%htI]J ]G2Sn 9'5'1'_pr͘0mV{jڈ66p鵏GOq.6e82#U"Vlky q)g|D汦OW5%vXiA0kƚCcM&XchI kr 5O3g?[?~:/㿧bܭ{n! V˯>n xЭ𼖷/?>͗W_>Wh,jjmKIc0k6$xIpB .sx1qJ? skr!uqmiVeLocW%v࿚=f1m^bk?XMރױO:6zč̽h1ySj2M C07ip3gK!hgzo`>KobBcI|%x`&ȸuF{sǸكlmxڦj&q_J2Mv|ԳUOu4&nmn' pn1oɄk<&,qoc8uME<)]5CԿ$Syk@a>-ro܂jU9⌠ب~HѦ0(f;?9ZFhwlTQv",m-ˍ[̎-[l㭟۷Q&.1Cp*^Q=wMndGeMZ { צAexy-khQB&fQ׷y1U6a"ب9ZUOm>Kt{=jvO?N1qM8fԶl|m3|GƖMe'5+ymh2<h'&M(tkZ⮇Kz}Gw#])(v6^=4b:!Q1֍Y&nۀ^m<`p;1( | esD?-S\ॽqz+mֺ5a Au:żmjR0f)-ƺ9cwٱ\:\nb-v~mIx;5-wYcѶo27*̑P!!޴y6KP}d84C1K+ G˗d2>mmxێɤɡ ozmfkVV>M2%ۀm٢j3`cL"t˩ qa]D[;-Xvڌƙ_Ssi˦Ӹ&M& ÒF9E.[t;V4ZխХ}cGATlJ1=MxeOOM[ho&k=Jc6iQ{,iMfbccL eUK [ȼͥo07&J%vǥ"!mh?i3lr5s<-&BoK5Zjn}!Mlxqy9 KюmAmqp?osc3|^58ĕZ楎l/Da?֔ǔ6hsdlFK+Wަ=wAQۏ%)g~K!cZ4!c[游Ϻa5y˫I+3wrtuJkd)umѫ3}n1L7h*1[^8Ӫc"Zo;!Cnmsq[[D7H#% t[ZtɲXY36QOqqrgmcoaj%. fj"'mYٷuo Xא}wpz ޲M_tnlMw ǽh$6W rm"Alar?Rc4x.i`!Z!1ZZHԶ53 2?ڢc/ֶ&"jcOoĩ ^^; CbR[8u(8;7gp̎HTH([=H6ĵ+!〈p-^MZO 7\EMuk\k}$eشX}>ک,9&.3[.-PlC?]l"ckRznQ)Q8WK>N+&z,0I] Wߴ(Zā8AjkR[̇F$[Qm_XX;1|u8g1nM&MUێ]oƹIh8Գ_gqwfB3/jOoX>_6[8g&bo.Bmv~/Lnz/'~{mIx:v)nӭ5lnCrc/#[Wz)sqxmۖiz/7f~Kacƶ:ֵ';øof 4vVqאݯ݁W*v,}c#`oŶY<ĿlGe2~ Pd?>6yxm(=H;^qo ߃2vƭK ,ԥԕWpζ{x3{6L9?{7?y?ÏQ޿-n!f~zÞ?r>xcf? }о1 m N ̻̝dl:LAtP: ,=:#!';Ax_)~';Ap D 80xI 8A|N/b}>̮;ȻLa8|'.f9|]?\>.}CDNP:?2"QyFƎ&. |KQ "c^cN!l@FA"ˆJg!4 a$aP筴fV"$.{ L4݁@h! (뾓r2"$2 WRM' >l 9%%VߑĶj-d\x.r1bIFk x}r}A8A|B2 V"u+ +ϢfgٓL@޶Wk+ˢx Kfu8U;BƠ;܂-Tp /͹dDfA4 4`.r\ d򜌮 #NFWz~LfWwYxGWpH/D* 8::4Гk:'/| "wn(d@ z;1$Qt|%A'Y9SYQ2 :K2?b*S$zdY3Fd\\6Qupy, U @F @NEfp:B]rn|Gf_nm_Y"?$g=/pd伍U 8}AFEF_Ktːn۴+b"IYv{>rp%D!ZDfO?2#G\5_Cɭbו8F@?btqT$g^DFc"TkLFc"P1IaC}D]l `)4ؘ^طDɵ}I$cDr@h@r ml|m ǜBxlMym^6s0m8Kz <4"=ḐF ~Kj'|(*c &LE[eBtg`?1G1GPc'ܓ2=v"g3EF?SḒ˙oe3tDbD.̈́@X( e]@2A@2A! e.#eS2~粄hAĮz6dJ"lȅkl6\|՟Nf0ijgg\UpG7s(oU*!lF9f{ǁ[40c a`_w3 5`𾸳~[-@ylDwRP/o7ox70˾507`,؆Mǜˮ-yVu{:M@52nB HҲ݄@&A7@&A7! Mn"Mnz>ĸw*UvB*;!rrl'B;!W(2F*!rHԂԖEfq/NZm|`xmIo%צKhKᱍyOܭQO A9gp2FpJLJ!6: 'ט'<ֹU](\q2@N96gWĮt+& p+!"ǐ[q[q ȭ8yk,lIzOd+"9{'vd>>`W+=N9'Iqg8Dμ̧g̈(2R$kqC_< Aoj#Ad 9CNEFكEsde7' 8:[gddA s"nu:Z 6Z:!:A uCußYO~f'kr-6S=w?nbg$˯>m؆EDŽ|?՗O A,MU{[Ojm&-6|xHעŊSmZg2֌UK܃b^PK\L~KccY6QmqK-yjsAﻸMpZ-؅o9mm|Uצ>eiMcsYbmc%3Ԩ/5&1h_axܢn&M0d618(cug{كfk3`hsQ7nn[MMO{bơs ئ[tgf_l&w#x0[踭]: hbP!&ۭp`LP0c֭isc̬C$(L96t{S4s`|0fkXi]d'm4ĭnK# 5KmDaއ>Jl%2c@~l`l!mz5a6mz )T۾Kч9l76q3%dmr6),s (ڌXat۷Q}Koq[8Q5LϸUY#;z(nҢվC[mdWX2M,CL,keMf6'c)v@^fB6(QXV965+8)mҭioS~ۏh]l|m\Yxz{!IMi`l16CFmv HhnM21uי 8I!Wm3fd!|AB[cۼ.\Z65)S5f֥M߱s"ɲm:d"}0F+b6==[פxWHtFNkmF/ptr)Mo[+mb/jclۤY9F?1L3c T֦рZ-}m2er| mlyXt1N2374QDqCFdX_ۘ&}oSCrJڦAiۏzoVO6`K1юImV^P&Zc;z[hecHV-ڨj\K'Scÿ6X۵J?l4w&G\6/B6cS0ۄ1,n["YP s˦6C&M&ӔV9_iiU;YCoZ [_թQ!\-D Bra?&OM&[pvMRqeCF=lq$toNz(:㤥6`0`$aE^-nf0L;d}8K̝5sDå.MYEK-^9YkC>D Y]dof,sb? OFP:v0%XdC4+..VK&>^;ٜ*R=&iM {{捪~ $K ?`N8a|4ģKÕ nK;^[7a$>JBg܋v G/qĜ} 9~6~m~T- ՆS>՛!>sOw*ؤ.PN}ퟬ.o b-&c^ТW\b1xqA4`i&G`׳٨D8a3.$؅1ĭg[mͶlkjHpB\cKNi"/eǾ3DNnktt]~)604ۄxY(|ZvlXԏ-ݶP;.NcgcoBO-vLR%=K2Z-d;51Bm4ɥ[})Ql&2ζ7qK /y5v}РΡ: m*h1.-HǝbqmFIǶ:Clk2؄84_P:w,{[~[dٯwobwo5l/9d?;Z8w|߇p~˷'lݸCoQ&\d&ގ|?>|9@ flw =_Wݏ ;b{w]u]X5 =>w|,y0Ge32~ P,]llxJrR'_woVɐAy eݽ[[,xRozU_vߏUS\ ѦOq?{~M+ƿ֥oo??/&^g`~l6}w ŧ->gs,uǬ<'w=i[ ]E݃ȝ>{xyyGdys2s}xng|xDwq|0NLgA~29O[t2~dy$i,";sP,!3Oɜd=\8}M[|+"DIdpSSRFPPrن=I m>cABaYBaY fHAaN faXrU*kJNfeu'4;ұ[}QjƋ|cOxƧ& <)bP95&^e,W{&XC_ؿUZ55k',.FL,ʲHD e, e,;dA$ IJ e,;dY eǐ,;dA ˎ!Yd1,׉>MD:YJEY>A(oI_+RoX 나詑*46-?b:UJmɴM~ljjmpzeX}=ɬ%qWd*k\%"&@( +o +0( +0( + @( @(TbgԊ,:9q&h,PMZdV̘yWe1^C印+L"t ǧ&XI[Ojj8'" XyWFUDfd\'"WɰU2,r 2@, 2,ʰ@( 2,ʰ@$  2| 2,ʰ@$  'ʰ0( D2, p S%pK"W"WEFfȅԙ(9 5]/_s2ofQxsD.,$dܜ2%2/lU)U*rʚ@ **@ **@  z **@ &*0 D* *k S! A|+$Wlqqe!:`o` z=O$^ '^;N2} IzaunM*{YpIۓ z z{@oO u =Ay=1'V z{z{b@oz{b@oO u퉩۩+V*JoE=A^-e}yGzo˨{&=A'N:UlMu+X2̷THqp0 !\ !\ aC@C@..p0 !\ !\ aC@C@. p0BC@…@….p( !<0 !<ءTHqp0 !\ !\ aC@Cڙȑy]t~z`kɀ@y$XcoD0ŬaL_L&1"dHETHE8tHETHETHGTHETHE8tHE4FET#pipppѨgpѨMHETHETHGTHETHE8tHETHE8tHETHETHGTHETHE8tHE4FET#pipppѨgpѨu{ g p֨fo֨ެQݬQCs5*YR5*Fg6kTdF%6kT`FfJk֨fj֨ԬQA,Q1ҤyҬQ ,Q =4*Y5*Yљ%*Fe3K44gg|)E§HCi" "R>E§HCi" "R>E§HAh" ,>E§HAh>E§HAhQޢQ߬QCÛ5*Y5*Y{htnF6kTjFfl֨f l֨׬Qi֬QYC5*Yq%*YR4@5*Y!%*F4KT>F3k4:DШlf撷XdT8HT^kN1 t)Qn*Mjq!Mҡ`8uL=ރj3eWcH&qaS۬#.]FɓukjuyT`2v?B$=Ef_Áj61e&&d^.I@7>oݦ_<>CNYY05FZPNIMw| lz)1b{ n338e$|ޑIE3&Y)IS%_"xцpi!2m#uҊJpl6p%8ޱAmj= Alc9eZIE<6["3Uä%hG:m`pm46'FӸy0TxFBB)-h7G:1nGڸd3ig&l XfÉ .Cc#O7*{FIl<3ux̏,[|gI.OK6CA~JOQ[`A }3*0 qcE۩ dkGCO1|xX5k6yϵ4)c2&} = q-Ey:Gja'8=[Ɖk]n`}u>n60>VpnЀzlGbiݥNC N0+.LOP?܅Kk٤G>2բK``Q1elxx& DD"DR3QǢq5zqiVa1"6D OFU<"G=\q}9 /bA&.q ouйvd4Wi 4[HCbÍm6J!qgQ")dsdD2xJc]6B8y#\@.Lxz&@<|ٌ;0?2wO_=+E}|p%z7+(2}Z3גO`7pzWxuw hq]* u˟*\?ކ|r =l '<$>ቧ2,dnJs{7 GZk`ZIA[/~bevt!T/>+Z$ fWˇۣy 2M$->Vr<#ZURrC&:j֎הg7J9CZnyw oWÛ65 >&vSDɔ*ư\,Tv\lV5c-ղ. ex,j ׎DNMN= vqj6]h]LMlaeZ~07RaqLKyhZlD_u=eh /XW'͢\,ďls0 y +&WǕw׻bG-FFcd9Nݥzc b(@} exRϾ\SBh1hoKI!k%.)7=,ř!Am]_ycOcC> sHJn:XDDŽ,oqIv!'Ҙ,ļ7tT]cLҽaO.j?<ȡ5 - 5y.t~/ 4J]A6BkzG\9Al XWȥל8Qf0aQ ;Bǽ~]nbgHg5¸~;^#xNs\pkAp jɩ!b{C}0:p5Yzv,kYh=:d}Tp180o s?aš=81_cc[1A6(W͇УVv%%S>|zϳ'/'45my9:J1`ߡ/kBxZttl< ytX~}5JFz;vQ٠luVZ$@k#~0셕G {հz҂`i}nTJs. ƅ!n~{tA nۆi[̓y pod&, yYBdP/eUW[vqY1P >/Qe`>k5i ܙ5gz]fq#FzVa [L 2LOnit]an*rW,Fh.糑KBL@'ˀ@'έ]%A3y<3m -kh>Rex?TK1Qχ^1Upy7|ABEx2Ir\t#~Y|f/ t#}:XyH ^wG\/ tܟq|+uv v4b!e} #.!ӕ{|0{92L/,q/ZNw\o V ' /CI}u:pDiɁraMvQ#f&_9HMǷjΟyu H%mIwYORviYB_y]nP˜Ogz ف&3vOHE,\؛Әq[> stream x]O10 *uA,tah~ 8ʀ0%!tpw'e?(n H0lY h> stream x\IsGro9a,j_aod#箿㣃.%5ZEXO3V[b2l6WD<ݿdbأϹ̀ߧ S':EN'&otیqÃ؋Akoh ~,π@zQno@d}E.VE5X3:xFRg8-$3C'] -Ra5؄ң S5cfKJK5l7WHjcbKF=^ hq.*K٢Ϳs{әo&|ee5ٛQ/iE>Q4H-@y{uyu5oе!MY27n6>DLgDw;䶊e8ԡ޲ )⤀@:{FvŔ6s Iwn1"2IB.&>{hлk'Tc׵-l $䃅16-- g~YY RX6A[N 몀;>YrM<0d% =;>,Bu1\fdK$<"ETiǀb&$e& )},#L>*\b~ ->=i\`JE e'nz* o&V=H^Vaa>dxD[Eg t53RڈVAh>F&P[j`Xni{JmZ y* ]g̸f5u ǺFţ`%?uH[A>ҩdGjN./5SzFdFEO汹cu[Xh > G= (GrkGs2*idY~ ݚc;,2{+SgØ:W# $į⓷h؀Ŭ0/LoFHW88$%T+V3SN{-iN5|THÆ\G) fXyW8"")gBzru<*s u''r=Qϓ ^+ܜ|kp45 Tv \ܞ.ct]l9=uIJ%%pw* j9EUp`ϩPs2P vɨe%QÄ^H3Zsyj#cr2NA$CIǔ8dždC5VU`Ɩ^a5A#м0T@֮`9 "1z D4Lŷ Ȋ=h +etX@E6>9~H d1VCj(xԐa1#90a?]H|$9V2N- ;gBޥ,b)91m!y.i ![[|x)$Z~F={ 5`#dkxx vʹT k|]76PGR|a2 >Zaak|15F'G|HcX7ԉyg^쾳=N,,.\ SR\Xy*m)2}I]HsaZy$.yވ>8 F&X"Nm#3 gcݾ5w%kO  I,|4 kbb~C@-dNO~ֆ]}^q.ًX.1)a%b'Ev,rR@sAN-y>йW "}ӥF:R T_B&yMIRE)UE45k)tr(jXJ\e꫙(HќO @9BT*DZNOyhIpU '% mڤJ)VahLG%qDWnfioDQLcc067%MeGBl"R]^ ͟(o]VSmWV" 2T3YoK`ekm)XϏJ'ӄSC@*v/,Ǝ/h <"@.ooYO@XoF^"|2_tj {F|p}%k6N6Х1~Av)9_SPSb9|=\X/[ N8(+e9Ll0ÆNcː:ߪ1t8ƀ{ D=K Q(%*x"~ʔ8`is/م9{OGnᆗ]i⻎rjV6Fe{zҞ~۞.ӗ铵T8y쎙#P!5qدW9 Yi3~awpZk4SHvSيh>M߇*C6#d;K`(ldnT/Y_XVۨgJ<@P+TYRjfH7M67r| l1u8HVq6¡빱+_u'X}M_u7 $)\EIr*Y,ή`3 Ssљ~_?Q=H -|RfKtɺD( oa€QݩB;itkD3qᘿ(\` y#ECSb53n#w/<?ua*`D;G{0ǩE(x6v{/m-FnU 0]cbϧK0PC*佧.P^4,R Ml.uޤ!"]P?t+:hAIdl[ήhۀ`a<P .z@[kf4 p16mF+CҐ~\*nM_HK 1D6n3N< &#ce͘<X6H/:rf:E{^ia4yXvTGa8 .{]p37`iIV&q_Su9^(s94>]iQDuz+@j#qw4L—?Tz^ϨEji}Ny[3(p@3K 䀸Me]qS!:yb z ՟Zw9=`>l2@\lbdem6r$,J1(VUM N* {+o.tp^mYIJ12AH+G ;G!<8req3v#l M]O7ɴ{WzX9?~ZjW&F#h/fF/n@6"\;-m g(*=ɋrT`V%DNՈXBX$$1ⲸIyg*aw!#vxE~|Y 6/u`i1W0tCߋ(^}vqCY,wv[cpz{Pc[<(3\TV@pC_9<4]>iOY2-0> stream x\sg`9~M7W8UtUÔUvɕKs)K*珿n40=KRV pF??8_Ͼqx;DėO= CIP g5nʜ>~uW8qBnZZzx4Ũ}mtnp^]*L!nu-ԫ>rvk^+a+6/Ҕۼ8˲g8j@X?zA9)]=Р گ7 c\5DRc!VF#uTM9X-`8‹H 9zLHj{8P1\.BS)Vq5|%us"-Z@VlӍC0F$ AAPię^xӮn3~wI|Gq}AX[(%+A1 OIfZw ֶ^H9`yVSZ-[؏a\c"o_Rz`ʉ+"m9 rQ`T|#i6_vAF/R I8mj=|0Q`e~v<ҐPx8CDbT't]Y#=(\0)V_e{ 'JjXu}Uw^S%$ aZIJ&.;Žg-y)Wyu7h@%1^{ uFޖXI,ɐ/FV7Jaԥ> 4!&VLѣ`qʌ|EF`ݤyV3<Ǔ#DP/[(`^)Y2ͩkVaQm섖4H#aTUDI p<}[#:ގ3W5 0, in2p^;iW`)9*>#$%Exp N~Lm+Lu' ): 0j[-TJ~Cآ]v(j]p3؊pTvIJ" 0*OeU"wk|uDJt?^.[`!mKIn=ׂ8;2ZF"ŒiS si Ȏ6,؂)LOai@ODĈt귴x 6 2fG _$$ ޫ9MBGB鈢W6]>[P;i4~p+e Ni/e_M=#%Ig*iKdC@aٓ <cmMƤQdYd%[Gjn#4N r}j:/y-;Lr 7^ K뼴n5:%J0I]Uy.gljpXE<=9Ug= w̳O;[wgey[>/Wu,Hc1TzXfǑLGhɲGPX9k@A#qD(HM;!oS3xGX4mHmhЂ[_c>K`GFukWA8}yq]R 6a.V qFT\i=KtvS QrA.9*4AٌFb,uh:G}] &) zUb?3˜;ifPO-6aQ۬g(t|z@)rcc7%ȍ{ mZ+uUּ>"/ۨIx~MS @.zVl”Y^&Ŵ{ܵHKؒmQGe'ˮc# eh]s eϫ6珢Ӳz(^V !h-GK!5e*Dx/ʫR5 )?i=+wת< ^2[;80 eǀS]ȇv1UF8n8V7D  rA szs5zZFaDd4#5^Wq?ND3 ԖUC.<փz_rF)QJ21?}W䇍"|{+6?:ա%)#]$5H7=6vTn/ήzCi =%nIGS$gt)yaE v "^$g ,r<.vzc"J5W= 6^XW&b0QIf ·q]A]_LR 0Fx薔0bjѨ@wvw`n $r1U P t.ttd$/mAT} g Ď/ rƬu^:}(Ƌo Wz1ܬ0 j׼ z;ٿ}!WZHa@$(p]20T~~}SسJ]{/6jte]AJSC6;"|(KBșfNCb:qY{8rTI }U@WE^5Zf OL*|hYЕfB=R6rkf.կ_1o[)ytq0p[cyX+MiҒ3<3l->H~8$9G`Tq֥&Ɔ)X\4^'_46qnX WJC)i4mw5RpWTec A.!/15m S g'\~Tu5~}YU^LyɊl d%j|1A '$YVڣ4"@f)[ ut!c>%z]WTNj^6.<Β+ò`Qs)A!=F#t!I})%"@oq([ *.>I*5J4?M|1]݈N#ogc >k; DX;Ձ 9-#ibk2%Qۇ|3`>484^A</frq0uI吝x-K=?bikByOWRѧPX_&[؅ݮn8WyKxta)kN5ްF#{Ts4YNDLFF0&@YH,؋][@5ESPǟH4rdEMIt cCCbtmcDˤBu1wɻ%&{U~t$,rg Oqaźuk#6e'b~{;?+dn#L˅\(|N8S|qs)h:P,֟@}Kq;r}gc")첽~۵tq<-߅[^BwT}̽U/RիGW/tpwU,s,[q#C4t@eAUy)VcyXt]LXbAO9}x﫳?ÿĿMendstream endobj 402 0 obj << /Filter /FlateDecode /Length 2011 >> stream x[mo6_f5GR% mݰu04NwqNa~!E (+6~*$Q;FDJy%h.bI&x$AK>>.7K%"U(rR}'GBr?L-ʞGn B@ux])wmZ_6 搐?$Ek9P&ǑMpsͷ B%EPi.bZ0ی{S*C*ӝl۶WE4,AI𢢵ӟA~fn]9e8ђ&P@&^c֕#:j) i(9׃0C;"#?1|rNC=B5\{=sL"O|a[ρW@;}:|wS5s0oo꒩Z؈4à-]B Vu\񾛨xt& X Fq[VKm%0% ]1yJ nP$5;`p ~ Ls1Պ+f &:/ni ĽZ"pt"i`]+7.:_/.wh(~ /~! FS2b+CpdʀŻ u7_@rp&?G6 xJPP :Z~VrCпO.k>KǮ8* 4 u$5up#Fƛw B A8)Pr]ogc0e#RsNX DٽؠqO ~g~1 Ewi? 6!1 LB|N4J6W!P_ i;KU=^A=M%Q,7o%rO8ʄͤ*S3ĝ t]Fc)uh'c1䱴֍R*[Vi)T27E1Dh=Tdܠ&PN2.HIYl-s)\C -tke9n3q j`vRu95625$f\UǩYY.'d:no+yϊ]=cfW:sI-S&R~)% lʔMw Jk=HHS[7c_̲̌jzJ <2-c8JYkdf v-D%>T'j4NS+UmY7/0Lendstream endobj 403 0 obj << /Filter /FlateDecode /Length 150 >> stream x313T0P04W0#S#C.=C(ɹ\ `1#S a"rN\ %E\ \@U\N \.@3c݀}o]s~Nin^ڎzqu ,#endstream endobj 404 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 @+uA,tahU@p' aKB,N>~l#GpƲ5 HeQ7-Yy!' dv~W3TUiZB 'mUu1 R 8KW`JM5☛&e=O) =Seendstream endobj 405 0 obj << /Filter /FlateDecode /Length 315887 >> stream xԽMu;r7?⅐Aw~]X$nl}t%Y "~}hy"bJ?7Oi~{@?K{?~?ӏT+K~J?2}=jÿu_K{ן_s7 {or+:Ko_/~S~񧔾OË?Ћ__ɿ|~_o x_slKA;?7#g?o~z@wO݁tC?7ǽ}!#믿a|7D}g :ZӾ~sʷx$X2R)|o_]_Wfrf__W%d:7wcA0:B~OKon ]?}+6ֿԠ~ng_~s5h.ï_lJs*Gi}|$_-HǏTiOߖ)_?Q5Ko}/ZtǤ<3BRK{_m5+1d"_Չح;K&1v/_O#)&uKJ"WˌAV?Fc;Ddwbi_Or/H[F"rW_W}e{K%(&눓o ?5Q$C/d>fOmd"-IYwɰgkx ڬlouj#I#IWnRd5.$d̖HV9+w َJ2+ԏ ~l_DoOck}'7v1`$pAz7/rItli)I^fGz!AiP> |׼f9^IV6fC#dē̖A)L3Hl/ wN%Rcyl?fЇ%jMd9h2/&ojiQ ᵼ lMuRj^)a_2`{%Lۧʑw]ISqUM}_2{/ր@|5UHVm>k=$Ek2q fs$hc9il%ebz>֗vѸ,C|I.Kt46!i {ޘVkPXb#BFx'2A|ud t|զ39 Msq0}%#:~/m6MɅd@mϚ3YV\e{f6wg$=d=4V%s dQۭ{FG=fG8ɰ7N^RK#XR*;;~5:Zےal^? :a.Q%s>h/4J[:}d62"y-o0N1p:m4*7YNtD%.~ٶ_!,;YLȦV&#L^ eu}E1}9Zd! | 0/Y~IVU:l/6Y.7xi(߳9|2΂] d:;8o29-_ sjMlN:*Cw5qVůP_#X` 5|.'>មIjK^R:A% $Y`pҲ5,G'H#dN/=E&议5ٔ~F@n2DZp4P$}ƆM h6L#c/ ٗVwBsTR-#FH$(1  qDl|l:mq=D2Äd6@f}G$/Qd,$IA kzgI8&!o9}0JHXFs(^2jUHfc;1aDkw^N Gs"m#c;YޙL%7,Ko -I$ 7wakzih/e<[ V$S/}ne{|I^cE@rs*Bx,IQ1esAV,LڽdyN'az .KShtk(N nS-~.0`{żt9Z;IV09z)_ d:)7Ypd54 io_@dDRVy>(-J$G%-W/!eAv/{]v+:w0IikA[(ӯ~O4\J0= 3ln5# >} /zIO7e7,A(4`Z5@*ւxm\6r8%v''\dq2+7{k[C^2\Iĺ- ~Ih˘:F /~eln" Q|eY}fr(X[k Bf܇j ';t;*GvrVz?XS kE U \`0-kьA}ė6I5I2cBRM57܌̦ӹ.dD1 d#W:IKkN"'a#DXqq[x=Fr XFRkc5? RDz {"BJ:A ,gsY- <8:IdkBR\NadR/0+%J+` M*֠ndԛ^SٓAh s o9%wcHC#m?e|8} אtulѥdx_R ܄'):'A`yki#|$ QDj/S1RqI0ʂyxԛb4/0qfF:ުNO_sfٻ" ߜ;$+~߾<@ \! /-/i&k+/F(ݺwbQ-v쁀IJq6|K('q_F!(RHi$?dMOXG`_U y.KJ5QK|4܋WY(Y'm1LI! \nRԷO`q~9F`С_%Vɸ"7ip#t F>@o%t3&J`Wf)33tjcهt '[Hp7Y &h~Jn&ʎZІ]:IGRu[ V A̡TE玄, w$ d  9B7+}<Os{ Yxx9<b MK{aM<ͺXķׯ胑 77Ypߧ<](1JB${Y%v1KE$' A 22Sg0JDM o^웗ಃ4tDᐔ 7reBJEIbwR}1%MQ*+Mk'bU?MRlle&@f[ό` g_F>"k&t@e#4c(9 SW#cb+@xǕ6b_*We,'gBn2dnO"=]Z#HFKw'x~r 05,Mty9$ է$'CyQxB+*b _Y&.\:t~J:W#f:ne|$!RMz> s^n2۩/,1x5檪 rDNҐܜtDt1c#56U|# Y$εkEk;IBB3j[?b8ciȸ6NB>amY|HCba$sP՘ )/WܗЌ0&%e+,g YV5hdR̞+>pGg-vl)XA= jԁjQ2!9 ~OS$*x}'Qe0U@*"@床pN XWCt0y*ܓ +>՛ d%+6o+ 0Ӟ_5?@ @DKHc:I ~FKX?IG(WN6Ė\6"5nwв=PW7A+o^ FctVH- 5FT#(hlm:Y.Zt|F0G rToӆ*0NO;@pgzioB?HA(-H!ctIX wqw;+Vm $4ǁY-q Sޱ`rN;_ @Q`HǼ`Ǟ"au^ƹD<.97"I3 z/1RMZ\(d ܵ568wAzX{v+ZIB17v8sNb@IF_".s2c&&i&|PQ3CHWCLǴIw' F&e 6zT\Eh+Sw)^ ?|"׷, 82< ^g(xJ$A&Ѓj56Q6R1{*8#cNd?fA 0S PpPXՀM cݗ:Ma7lS:d:I0gMxBV'#$ #]S KfOz5Óz5^`%W?Uȵ [8$LC9"7A~K>KR"a%5 jھjCjR@3Zh 7@F|80`2(6I$8XU82(-DPy%N q= Pm|t{ZQ=|myT*x^'۪hM jBfTux:aj"LtQ2Pd:Z=A7\Zd6Z9H[%6G 03 y@ 4L,o(kBZ !d{^& @0b.&NokRn'RQu&ڂRhv]e38Ԣq3:;0 ӸGPIfc{&gSg*Wů=U,`ݬPg$7]JiLg`WȈ`] 4_IGYH)E*}P~[FrIR$ oW'~aj%$q1HT@Z(5YoaV6ljpD3j$jIЪ񙮑nRQrKuFB2GU|sH7Y>o 8%T'MC:L <MpP[!.# jM !FZI:_ \@5h nO)FT0&6&MΠ1n$ٸ5i*7 Ϩeh>}%M IAY/ЛB ww泟T!&AMƓ Ɋ0i28I XyY!x&,YTL F"1|1TfU?Q EˁP `£P`U%zzr+*A}`1dIrL X;'Q5wМ q(Hl44P_sFVS:F$0lqǼ5]c0s^$aXHv n0h`#ҕl@B*ZꩁIF:JlT$MwґGR@h  1Pq7.S!}L$KhxK Ed%$&1Y*bdM1 5BGLQ2te"ePCY/J<Ɋ=m*9S?E%`=(H ͐ $cCdYEá{sF u+XR,TtV؟1b6B'_]ܤuBŘM$Dp(p0['HlHZKJF( ?8·I%ߤaA(PgQ&xVtT('hdU!7YMK#W&kǵ#~pEHr4&]H}R.[G,.'62Pr|d0)[I*sXP [(_B tKxezHhX$IV:)ΌtL20]+|P0{Q7M:vs%X VBʂ+`F&sT h@afղ6i NVI\?FH@Sܚ=lН|J,Ic|s5Z@$dZ œ^>H1"X`~em+g08F^мNdӫTO9G?l5vaZ[C:4T a$XܩvWKNr 0ϭ==/s2RS|4FK4"& RDFr 'I +ƀ*j|DT*`zq`?q.B &e,P 7w* &T0jNBq&kمڐ;CB&ݠ"2F&I''ٲl4s[}Hj7XoPNTPܖKgZY5$j\@, mrULUcN* mYx[60O걹njA$V]ښ˥o|FB S:s2 d#bX j$4>J&C,̶Q0]A%֝4 d$9 FҸ )D A*&l$Q>x4V9n̳A)&NA pI*B'QַDCNjf0qOХ}b־AP6/-@;c|'_٤,_h]OsNw+h NJv:W={&d5~n(%32H~'Ib2w QO;duB8\0-xFuujWWz߁@KgqG; I;C;xͣ[)g&%&D1dmÛ5Y Clʀ PN`F4IVGk?'h(YL&—Ce x<G6~}ԧI$oܾQsHЧ1RnPA Pj6cP$AXj lpFD$1F|_]M34 f,,nk #=.0(ق8t&@ NBph02*b&ja]%IlJxub')XF-|5#o `,h s|Q%7Az&W~T +]EK:(#Ԡs%ZA t" } (ʾ=;'X;tTt-7(ºq_ 5`3̯uǎXǢjו$T l 'g-QNYɫtL= '6fwm:AA 2|C2\@9TTTT$L JJ<.0e;KEPL0Zٹ.H|ouN+;"PVMJQeݶw#kyE&!)L¤I 4ĔOұvV|#KW$yxB*JM$F #`?)NZmv9 p e.xN&[XD } ي)~Ȁ(v9@쥷~J"f )dHS6QTac}RQ&_&ߢ DJD5}e4y& a%^S JZw(DI-LѺTT BR /WTLp_|46YA7{%F3Tc L<)I :z~7ᶴ8ymĄ_%&ArƔR&'iF& tJvHoIf"^BҙF@6?[sPHZI?˦ p-@\< l5nWJ~Le'Coz/tŒ)*)%& ~I<3uIfNS7?yL)x'aƄ|diNP?N&HZ"h@Y$Io϶6I|4dsF2M$:V>1AN(pg$a5kqa cZz=K^@"ڄ:ZHj~#MDŽdLmBRJM:B-mtRH(FNa:A.LpGŘ~yp$KN@Χn@es(ޗ}HA\/f7Ł't9SO Xk~÷x O;A7ѳ$ޞuտbt1)5Icg'zIOzL=IfOH 2j%>,>K$AUF!A8bVnQ *I\o8&ڎ#g'7(g|ln2WkˉqIK'~AI^*€$qW,rJ*'>a@$"J$R>ˈWmBIAPG;'o +{ɛpAmT}rJ)A')mv8p^_~\̜].C#d:8*&<ʌZ>D,B><,޿Rou椵PԿHb$#6v͓̊ lݖnQhWfqv(*JB MuɄAf\R z;wxEy7}@F2lI…pnAG)~eEN ,IG&Yϕ^QF& &iX~Lä]u'57EeXȑQyX~Pَ||HBYI7=4g~qAU'Z&`tC(I,) It"³G*"$2BamG[~ LR}K2 CaV 7a=:U:5gc2Fia*& { 7&BFヰnٯ`&vA`dFIwZo+n[rdEao>\bjiؓT*!Dݭ19 Nϊx<&KY$IoR%EPP4,c٫QWL&^5sr#Sx/lǵ bPiBOZ~1#=Nw׃ Ǐ~0x(;&ٗK :9s&-NwS;Kh}:QBY=Ab*J TEס Xpv=?^pm#Tdj$HT/< ܉xwl wT/!#gt)p(LswiX< 9?2|MR&-w͈!CjD8fu(pL.3Sp&cD"P@2IM+xKd H6qϩ c `P;J1 VN()uavRFgI2:™,jkΓ(xa4J3n1Od%BoZi:`"qtSBٓd. oR!V<*˾5p'e nJIޤb Ġ@Ѐ^KĆQ os >\癤N6nܓ ?h@1mVc:E2pb4PMlKYd6H.=%8C+֣HGbz.rZLB^ɌCQL;N&kIe K0ed:CMf0pPju8QS-}`@ ].1#WT| dS`7!` WnNN-į+ 0&zX+995&(& A*[uDWu@%'aٱy\OVDPuK I9K^0s=IrTI~IG@ce>[_=T 0 Jj*ԓj_~HCh &LPSmS&Y{=ta-?7)Q5w\oR+"G_(FE +xǓz(% Td)vzPe A[*wJdy5ZSIG!fDŒ|˜kWb>h{& FA2 ԓ$N$u_ $1$ u]I,D%tOmT9P$]wesi$JxBTF ) `I%Dfg$K 7ۤ?k` >"!fMSRltU+].2*(=Zād$' 5|_ҌƓ4 f {°{mjpZ֤"rz2Z08@EZ”|-CbB |]DM'ixS UPVtm{vl)8Iiu4. æTb?J, %@Ω()V*4VNlWCb%tFCrj჈d`#؄JlPX 6|+7'7ĘnAvVT!&%rV4%;a9zyM$LؤI&cr%Bd`'lZ[/?X;I>n&)萏=6e9F('98 $l f&1>'٤cٷoeH'nHQ|ahq9s'k*3pyqM2y=?Y}dNN .Ù1؝ip2gJF07RtE,:2^]$$ӅK$ ŗpss nO7J[u?7|1*Owv VBXi蚹{&ߍ;qb%q7&-'ޙe2oiQ(ajBo.C%Cq3TIrI( =J; eHW"`#偼$}㮶1+Npx0 & oJ,MF;Ԍh2 JI)7Mz:&X! Uh`T 6@x7Jޖ7Ϟ/B4ja$M>: 'qaҪk@@ 2HR<ٔPuu`#n ; 쳹l"N2~?P$#Vbwۀ{aP#BIO}|0$%NuLkz55Mz#ADpA@W(UCtof)=qTQH2v-ѨhO1Mm*P'+kj i Dߤc:#E'BIdk6a BK V_m%X!7CVX2|@ h9K&V&n#>W!`ĪlxQEr H8ka8T!Pᢻ~VUxn`LOVn Ϊd`?`pU7򤆪=4x U1@EkFFtF06Ԓo!^eH#Mf@_!\foi!0IP-F!\A7/0J1y@F;7扣]&A?x&f:@&Q`çT}ӏM8_GK$1pq* R#Ip,;nPAaTtBǁ}\815alXRx]pYgU,p GI1)TБPP<"iM*\pD$b+ڑttK)^&R=+pMԖ7O٤_}hT~D8P3y(*Ԑ۠\D}UM&z i :)JNC`e EwW_55ʶL?㧒Pt~ Fad`h9#F/ KF2Ҹr!a&+\bb+I rwXj#NWN}泫aRP64?H5BM N6hP$8~#LTt:>@a0eQ}W@*x7Gg \_A}Dmm*=H;[Jz<O sggq8F_""4TW(%!r.4 5dŦ@>ñ/m)7#EwN( D0*Pe9&-ImOj.IbrwR)JM:r?kT#ݍh.o$aZF 'CNG ;>V*u Ҁc„$#3Pag/D֋a){ }rR}:I7}IX\oғpkHE*PVB!P3lI7Ȉ^d:qLE>qc X0߈ْ$dRNHқdj&Y3c=ӘdO2m[ll.AyInR0FZ1B5B0``Ю3<'Ȭ`ĸQ4FZ ='H1&0e&%nLcz M+GVpIȓ7Rq1 tl1{~|JnwuRðfַg!vdW?>7{+I{ӡʣޛ~Hҡ,B YDi؛ ˗ X: AdViNDq[lݭypȲ"{8$?k )@ $?Zz(+{{#ޤé,GH &0NXg kuVhdS,2[[Lu~ 9&K<Ȕ0vw]mp$sT 42רXw}mDG-kB<-B$5LԲ<J7pӃxԒY:I+B"jEs70θ uB0UꄰÈַWyC`B$k՛tLTWޟDBž+S\־>;}{MרXlDFNh0tۂV8l$3?be0Э~rjZtP@Zu ro.ƣT U't0n"q) V? eMr ]C$ָnK I#:Tkғ+Cl;I\hHvOV]:ۀ> }Ѕ1g|Ygdt"3#ڗ]LG[̄_xyh$kw` ~]Mt<4}s,d$g_;ۍ`~QHcvIi8z&*3 ٔ|Z4'Y!KJFo)=\4W/zI JNev*b[g'}sk XOf (Ek dΆ$_La.T`j [&/OЛt `t@5ƥzX0< ڀI  FxF{i#00PH$uK`YI>̏€:.3zm,#oWgB"l[UJ`^~T%Qc,'5'(T(7f_Yy3,SJl$qkd7hp4ĹN\%0:h"b Hdx 1|Mbh CjNRCtk֛EC|`I2FZoz͏媓 Ƃ=1 0Yh$wfZ_6)_fuWSLoZ9& g5hC I_($CY , &w= &+ ^0=H$# @zap 1^ $AFuPj&-HRǼG.#/`!9Ht#zAb@戣 (Y̞AgI4{gQR $:?U|r;gV\4>ːAdpujJd`qQbhqMY4-"}/rZ}'8,ƛa8*AQ\gFF*zJ % 87T qIv e@ :>Sb0<}ovܓxtcz%(U6WFlQkahVl]sHx͉HB\k ,e 5~nA$f^Yjb.ʋZQkLG, k% tGDŽ]{M:}TEQN`T؋rxbWPXnɎ"6^ƠJ]WZrǎ̼/GeP.;# ma"#EnBre-d`JH9|ʦ濡&1Ah3pVvuM2IAtv:AR3dti<&)T!Mq|5xr&)b,8dIexܤܤ'V'Ag}{~DZi\UM<\H܄[q6z#Ǫ^Y#JIY~sd*#3̚PŘXg?#w7Q^/$I*:lc6ɠ%|8s,KqM#\N~ w+NdPЯCGae(~0S6ASƬ|K0oP;$+\v F1@Ȕ PԎ`a,F8]ݤs= 'E EN^n$ce( %6_ïf?FuBT?S< !3D~.ji7&*$ಕF%N ޤJK[$D}\S\[ N be7ea*MG +V_6Mz(l22#jdwZ=yo;9x65͏v, ;B'ї͛R͉2nҖQPT!ٯFz-3 Cl 4F 3Io7v Vnȹ =9@/͓@$V@ |ش AU<GރڟuFiBEVqYMV;U<ρ #'(b}-0U0w{ky6vn-m6R@ƈWAğz0ɞ06n,E#}ebbaiY7 t{x4 %GJZG"IDk(/\}# ?3$vKORh8_P)wA͑TrnFV : #%RN"qm&܌/iU07'i'ܷꂘ6ʨDcD7 $yWڶ{i"E2MzQ lq 6=vJ&b*>\e.Et7'#<-_+QtꤜH:UɎzz(=@2g4HNْp)m~qn]լ߳tDmM=5SN r*aы+T׎Dd6DZWm1=WIwB5M O$cN)Xv&xO r/L`Kl]@yE.V @P71Tzj~R: b}%Od J$̲Tz!uFf a+,$]cgG펫tTz)zt}lB/xZ&@+p]w@'.w X`I."TF(mjMI&k+3( gvv]F&Qt75`3b@9n 9r|@D?)$7N쀸I W櫀k&W\ ]Q[ʨ|mzp0Q$2 כP^:m_jx4R>5NH'Bdp wz$~ o"p4 OV ȸYJ2710TLHp+[=$PP~%'ͯcrb"m= BǝMʚ#I=cTJ̕ `ľ Mqr"ײ|_Xv7!Cqk"6,K$a"`S%l@FVm7D`eS XUEˑz}'/)l@d{;U3i"ްC,MDgZ'o"ȄGHRJ)PQ@I %t蕥u8Š-k\x 7Pfd,.,nxW_;-cVKP^'6 7',)=PQw ˒q ."܇$#LVЏ¥ֲf&ch }n%mhnSYF|vnE )M O* XOb51c+)@J )C(SnIf՛YIX yZ}MSW@􈁎~o"1U8Dȏ3Zp)X ;cV󩊢 کaCGAW$&s- a6nؤEGuI&m !>^*V sN!SP8R.lO0Y9(62IJޗ"U{QQƺT]x T9!"aJb}L7(o1ROf y5P$gmR@$'y&փ,gHߝL*R I-ݤc=f5l#J@M W$"ZrFV)k#Uב~̼,lmKFr(7>Nґ@Ms \pL;%iA}P( (f+:B1u8 к7- vR&Y.'\#e·?몜[qHFjZnH600%&YPIhڨ?P]&=T&Be{kvI2Vܥ2Vw0R.WTce Pm"ы$ϲ= +r6Y;6čpM(|w52}2TT?#x[ Pue ~&$GN>Ny$!^H2ku5jl< @hBHJP? $ 0j0TSN6eFǟ h>aͧ:!Ϡm޵Z sҢ$To~t;\`*?LGIVRG*$e' ?<Mt(4]!.e$#ޤ"G a"upWIM@)A5J!r$"g;k~줓0!zfdz6YL $![N0l:oQ Eˁ=fl2] $#\ X 87M+ZYE#TXaDH7]A^#*2b䫙enY$dELPOg@O5/"o9#EoP17Ob> |jbZDUF'Ih5@E8/4o]D[q#Kkлgoc fpbqM5 ݄[6T=Ct7m5IIkx5Y> Zy|c$=q^xy|gك(%y:oB9IE5%c: %؎ u_, Yh$$a2Rga"}@%J$ U=bRjF۞ (p%7 OU.Б3` &+KF+ASj+ApR3b$U4Ed!)7u_GJl 6Y1 _N&0L5LF+?[R$wH5] i3"jdfKX - $v\_RE&|ΛLGgJ?Һ=@I:7}.2&#;H@ǛS$o ;sՠ"M~B no6:B'(/E+w9&QO(1#v-#&Q]Rz`>GI}h{(`ejSYnOVΉ濓kc7DI a8~B*~+▓C298ʊ35({0A_RN{d\nNԠyTI ;Fi"kU$Aa~d?0e)Jwq8I//ɰnV̋D$)B"7NZ9IUԤH?{sz>MӕƃdӬla'mɠo{ 7)}5'i˓Poy5eT.Q('$ܢ@1ƂEK2}_M'`s| >2H]!OQ;j|%?IF}3]-{}j9|k  ~I[l{M2 iu/}K(9tQ<'L ?>jPKi"e&ٻ >I HGzl GUXC9PcGѡ"x 6{.͵WݺIbZ&˿f'IB#0[E|KVS1^&41H|' %jReW#IXy08D6l7Y&!A >xJdD5Etp1T\z46YW*j >rd aBʌ|"UCwfIйC$jef:MdʝW1q'$ktjJh}ZIF 2>]yY7t/2ȦUTqFD'\GE$MK]Xl*Ur3ϭ˂(MVU/qʻw  R b. I6Il΄TO "ץLUmA}IA.뮚@CFIOsPu%y6ćlElN<=YA1lv@.%Rբ|@<'fk-N 5w˸gU}%p9;I/R{m6gJ@$M Y6DldmK"b"5P&Ir}C3!RU"&QcJXwNM&V^Er?#IdIGJ"s $&3QXdƣp- qnSnAKp,9X?}$WgyL>L2"E=o'QrF-ʒ2뎐 T,EDdvMMbKIb&\k+דشhU&gvNKW殎?d4uL׏>,tJ 't\gEM'V,K&Qa7K;'5DH'RM#J)Os6/ˏ ȽH$@׷H>l:#.ܖ(gī]d_<TnMv$3]?*|Aj,6RǪTԙ/|N"]v޺Mˇ*@LGֱwkd\>@ϥ<+gu}i$);a.jنﺆ* N'LB4'd|O:Y&O9@'U%\IGy?M@d2*k" E">!d_3 YwJyI)&|j$[yGp)H&Ƌ8%ͅ-YD/J~\6)ZP u=J0 >g}H&)I ?PGM4omOO$їōĺ; kO(bJ8I1I|j#ȖI׌+>6Q:uUV[l&^7ɗw^ҸŸSCR2#ݤQ/JcwyE.5 &qۤ@d\٤ jͺE6+$IV/eECʵK'w˝ꝙ@LSSzNʌTd`l7~Πc%K :Ę*lI2-aCԃ]RD'{ 'TC~~#:b$j$C/MՏ=Kzo:9I$_={ G4LRK0i}eLY?CF /,9UN¬ V1uɔ.PIR2E~Qm 3__K2^ҐKJ˺\9s$m5wrl u9<5&/ji4liYYߠcaNM2I /*=5,%8IV'^4C*%Tpl9AKW T^DGEBtpI&wȜTgq$rۤ3AX\D~# BuHL0b 'm]Vf6Jij5oJt٦VDGE&ER`7#kl5{%m(*<0)/tuU/oT)r'EVujJ7GAzMY.NԂ-LdȎf?zx*#)SAA(I /3lh97ė$.7$cX1.A)Λa4 4d׸ JE-S .KʵHp<:/U( i.%@-E_H!_ei&)5?G*57HPQFle`~D$' *L`j^R4$~mp; q&] ɊdoE.2_E,&q4^SW g:7h׉wzI;:ޤbn?zO];#-%,mj,x_6LH*AӲSy^udIr@Er}'fKPdj-P V$0! (0e#?Ie ox|\S՗=["k" w}沣:m* $2l2/Rqq5Ŗ&ALb'Q& 9q `DE l{_HAAMu+(6Q  fRKЖMs;QMÀçLR~U%H@4eip)ėD?U/ xM;]M(Knc:v^{CI 9Ӄɪ~MH~!`;\#ӓvX=IW@#ͅ.HԳLW4x!D y.6w3vlnF=%_n5=:Ù.I9ߪ{B =LrM$ᛏEl䠎Ǐ&mJ@ĪA3Fk+9#{}i)6D#ZjI[o͛IDPH9]-; !2BbgmJ[4DCݟ _u d]W12ڸg]mH%R~zvKy'M>FWU#UkLI[F9Yyg H7 qhqT !|{3pk,㍛5lH=$mT0S_QKZoa`Dr2y"%]w^Lc zTV(d i!HS.P"-g+mf3C? _]YMɑ$b9La|mE-"ջ|93r nN6>IuK8\$~+e~d܄%doTiաG3~Ie?I[9:9_$H9~UX&I/Peq vg8` Zi'/[?ȭCI ѤsE$j]DBM^K$ITp$|;|JiMVHNnĠ' t~I| UR e `~T&DNoK‚.P8&K+Ek=ի#^f%˓o:@K k!G"ʜ؝D Y$vgaYz8o[C'Uyq‘&!m}Ng(q0ʂOƈ-ϋ:Yf!gk$ "`F ԗk:I)/rxQb^&YX*MKRbYE*I]n㉲IV(·n M4QH/lQ?jfOC/HE$ȟ_r&#۾b QYDA_AUt:=&I%K]$r~NC-љb:ObxAͺ jDM*} sO >oK R@F*q\ ߱Sdee{E0 _j285mHyHy,nII_dd^{ZSD*dNwIQ$cA8$rvoOҚ/0ԀDI7b$#`%}hH*v?fl&}d潛9e6OQifI)S5:%dYxc|'WGM$]ϓ,o}OxR'$NB 5˓V̟I%=):=Nm&:wF*^e:&"gcaETd2VbN2C3 yhDj{"6Y mBƇ c^Bȟ#!InI,``Ѯ:P,ENF#' /EI}e%EQ݋rE2ڤgY9X*zWT]v R1,5zs^XFשQV KqėHV-WSeXr'BsB Pc̴ULM$DM'U{jBLs67BmR ]w֨bsrN:v9Uwzk4U#&,I+V'u^N[. S5:+aFnUtN\w]`Ib?-0PNB!⽀N 0OaRoIr}zꎊ"ZED2Ӡsa&qZh3[x<ܱtT71M$ŗ fcZHfђæML4ؒ[7IY5[$d5[ro`7H[b5j&lwg"ĿI [_1^1^Wy7Kl[qEL&iUyW/7F[iJ4T _X޲5Kl3I/p]4Qs=lilL:?3QOkom ffp/9W$HNmpiwSbU+uafP̈́ 4x~jL:&nʞ$hFe(u,MLw]&v4 &]__ضqXQG'_F^ `_Iue"IM܇6UeG5&d4rU%ޛ"X wmN& hNf'S2go\< >v0^fJ$60kvUė$xVQ譿y)pN%T\Uw>WcxCV1?Ksn/)WD5d h>yg` sK%};ہ&"j&D qvey3TĐ'클>'i|Cx_RMKɓ!R$Hq3ID$rgXIrxIa&ey7iWNr_:_t,LSImUY$J˿t4ī3I8ϕH/h5Y7DN~/9"(&щ0M, r3OK"N2XE YEH魭Jm)5/ϠD~!|KRȉb$[x.[a$9&)ꨩ-$rO AKJ,$NuY"j2737!k=I& \QWqTI:[al!`I@k_7IT B4 RKu. :_& E x>1S3M 31AHĈzG F'ɴVOu^mP1ɸ692ܚ@yLR;A` I՝;I"S ZEq'Q՞(5GM2Mqc$1D#|TqRqݤY֯a׬k$/QƗ4Ȫ_EE>09h&/,h{uN t𯊔n#-E:!B+0DG2eMڢJEM$4d6r`Aڵ S︵֛Ȋqa/P,X TO~/DO2M8mb"e"ڞo´=4ʰ6m{tM1 @&bS_mNoo2MFS:_hkU$_I V#&"7-Vd ":',sڒ3rM>Q|p2W0$Ǘ<'Y'iʗHE)vKc9ěuv8۞9_Ե;&&H_ 4HW tZ:/"~(0IM/iҏ]MH-aFIVwB0 (߀&*nDV656%$գjeI /it\HX7H7I$7I/Q 04hmr6u`I T挛dBv2&2C}>> 6H+ FLKL"K~t E+Rq H2ݛPmWT5ɚNd*Or!NmSC+)4q#C4 Qgc q vI3 }|I'z%-VLK: $6 M/M@o/M$~?Fjvzܲr񴙃m) B͌EfIDL9X<&KI=dyU$_IJ~}tbzg;&R'g/eƽFgGOX׽+ +'%]Id+Bt#o񌛎(~v'Q! 4X\$ޓm^$+iWmZh}Ua#70DڿcwNR5{gegokd58wD~UF3 {&,,Yd:j5+ b"4Il/I&!ù2yXe¸ "=,?P˘L3S2LPh0%B)%9akAd68%UtJnYs%ߩDjC8E5%~d_]~6Q8> nƙʚ(*9vEt\Z8+Rh;)Yx)htf ?]&m-D MڥD͍Z?ZLtDN+*"F=Q ' dXcR-! W,&7!MYqd̓jiS,&R[;lIW7nq^bUaf9ʞC!p?6AIG⻬ ɮv_3:b|2s&Ȱm5 O+qܾIJ<{~[#Ȯtư:].![ 6S6P0)a$ jV*;pI^sH S+;;Ws'#OS;tNRt~3kޝU&྘er}s^[-Zf7n2.D'1EVi;-TWAuV;C] ~.fW:=U2D+.<頿~*cŧ YM@ԳAA|2^(Z0׫ծ7XSȨwZ)Y?\N\(':@@G#mwIەíhtrαZk8{ymD>tmӖ]EK["ɿDj{wa7-n@['? UjkQ9b~& j,% ']i8=;9҇ J҇_wXy65I.~~E6Y vMV"k"lq-W嗰!h\D,ZXW4bDɱ3_k\Ī!RK*vܭZ+]rsx]|E /I1\7"7Y.uw5nm S^کۄ t ')arʱ6,aopE&]6κj >dHPM"9k nȶT-D&}/*M@g@&!d8֑QmUt$&vMv4,^{m&pABמ)^$^bX_p:wl."V^SZ/i@ud'T5b뭅mÙXNKt2|z(8T^Ya_&`RC}EtkV&_$f\Rjw'4Q R敪Cޱ!mY>DU`m|V_ҹ0ٹr@zW$mU6pÃ_KFƁr:2gi9WHtLC'; l)+Ag-=K?֖uYCA}'I,"DE;}3kL D돕 3 !:{ $y]% ¨ ؎mxe8Vg9'6jDfw H-Fݭs zTF>kTE7f:tfFM^i`s|+$;E;,ec].s\$_O>!hL;DzItcK/lU~GpCA,GB^ƎBQSSEtJE_& +MwEĹiv6'M"kD,I"EUKqlW:ZK޷uU+Vɞ|?~LacXyz5Ύ(2S$WY_It,Sr!h>I' nRb6F!"^9J,TF%V&Jw_DZ}*_#ux%o\߄Rki# Jp@)D䱋 ֏,Y]}Nb.O("͖g;|_S5s3wkn{ 'Q¸Y '>IyAe*رJ.9IGIO/-m$!bɛJHj-A]$\Id T_ylK־Ʊ2yɏk397 S/tMV gL$kTQKVఘ!ʲ VkbQ$$+7! @:i!NV8X5I "EUwMR\ G5Ie)Z̙QW9 JyI%àY68|΢*C$aT RåEr X\fz~Ozd*&q$kɎmu?ח Ry3CFM^t8N|&_7:66G":N(de~~]i%"E[+whW(5=OdùCϱz%9\2rӮIOs+J釒$2䬇HO-v$^ ⩁i/P +5Ij=J$0]'')%s)[ҧ(HgyNr[+jz=RrE2%H9NoC mϽIPAƕ٭L1 #]' &]M 1[*&M[("9mId܇ N"[`BHf]O\d\=a& Tx IU_F. INc$ɃRN]n kf@&^;;|I=39vLM886Hér}m蜤*=^ٞO$a{N'$-*)J :[7d^`ﮃPJr$sV"#zNnNNI9REI"$dZ2<=@'{A,3'o3yJOI "k_2+.e9d\XsusdI_~LӰS3nR9I,8j+zpp$Lib2I"fb ;> lXxm7imXD!ɜetYybvM-^Y穡>D\s6):yo8LKNaI&&Rdmģ!L\8V AyXdlQ$k/1(HJ9L+ Rq/~"%39r.*mLt\*M6 uN5}GQM$lkG?+`,Daԓ+ Oy$l>I PK3$U@'[ɶ$+F*c~N H,C +H| UKq=e@ROC¿XN?W>xq^ c LRKj&)/ H8*Tԗ6dۋ44QMj>gҭ#)/"}6ۻ2nRٌ8I/wYBLKҝ^*.?;TqZȯlfҺ]j13I$2^a\&7]Ϯ}I 9$j&)"ykmMJ^5'&nɢMԊ3I"O`M3B`\VZfo,A5s&s~m$^9&̑ CwotRvUf JTŋ,s2]l2V>{KF$➘Rd'zo^٤D _ $݄%sGsi.Kc't2A$@YNRBɮJ~ɐVoID|&%}np@Eˋ)nm=I8v-=iMSOQ`eb69Q^roN&íd?1w>y8^/w$)3S2{e'IIr?xX25Duш9̏ Nm&o2]t W?C{) a뎱E*h9{Ivmůzz4p^?V?,LKTe"?LC*qgVoe묎LLNAcT~u=M*IttB,۩! ( _ &q8fQEUz Dg$K1I7:*OsY#[n`d z60oHZ~͆(ndޚ Пǫ3>d";l5fZ?;uAD6Uz =GM37JLU:mhi Kq{%z; AED]ct1t/ ]]mMĐ_G4Hbј@18Ȫ1\b6~/Z&IJ~Ie^>Io݉6I')tI6]dSެn{YrDi= 2&:oI"ZTDTܤbؠ8)g}*?~N$:QpYGe|sRG++eɓ0=J;rR)a-iX38M5ő_Z ,q-tihD2ϮyX.]d+aҘ͑oDgWJ$TE}y+]YXy2J.Ɏ,뎓g0 dtaBνe$O.I:+~+mXrv3MMtMgS 6R܇Y&))ig٪HYp'iW$LH֑CˬcgosuE3)hnpQyeʈrCiA$\2I_˵ s_D<&t` r{^,Ĺ;qS_ :s\N?>rܵ{& dFOQӣ(?_Yb|![QR ܽc*\EG~07$PvqWCW)4ۤS8gJuyL VP_$ᆟC!R^ {5Zbǂ!uH`tpC2%ۧ`a3HUEԝHRt>%. $\+⾈%,rIdjBRm~@3#K['ё֘]_gM.fw4Bo$+D7X?4cD6oHYS;gݎ4*v×s_ !:Sq"'#Ge.IW2\dY 3O$7pMi"F];⯊۽DR.9ʬI ƝdD&uסkt=1ժbh5UCYUY 9ri9dB8,^H4sMnߤ3y0T4;x/IlUqAI/W$菊]>rPGB'?,CEmIm5*kn,EBIPv/2edXN t-~f2ָڬe.M^Ok}LmOh"ҡ8 tDT;IBˠzϊIQy65~ASZ2HSLQi%Vm`M6 S_k`^icL4Մ9IK/Ѧhx8.6)(7_ 1Q5E\sjyISS|y~gY'Z49o|Ac3۴"^6Nzl FDVl Z $}> h{5ϋ-4gGK6q޶{ebi֥5'i: ?f%ӟ$Ɨ$uopB^CpJD:a^ӆga7MH'QCƛm@_=w#D tn8P 7\rò`%nEѫ->z'W]~&+娢Ksz%{1YL!k0]QhMt}%2dJ+j~#/щvyK,|"MxIӲ/"rTӘn.m"ez}5O{N~sJv95EK|i11;exkj6:hN74(GISP4aLa0ʝYP/qW7)w/А$ؤ#F ujmv)&3a'FtbyzDZ3|& \XG'H"Cu&(7I%f33Eo0u9(xo Ga.d"_UlV(`L0bR1#Β(o\&PxZr> &2QdT̟ݥ25Ln a.SHq\ Gu(m? slN"Je0?rGSB3xOlv" gMYF&2Hz oHM|撅yIH bEL" r}?O_h)2/&Hv@?7/|D~ݯ-GQ@- LFI_O iGVMwG9C$r}b5vL%4Kz/(Ƞ}d H// ].FFiG r\Edݤ߄޹:ѫHDLC[ GRa~( z_g}E#:;@#jv+~H*adY ^0H\kHtmS:ĭQV_#5K Փc-#$!I 0,]<[tЎ䏤d~aiToLWA..'錑R NBZ4gz|d 4AyD}E)\~Q>\dKå&16Lx-ANM!RK.C\&u[>r>x4|Dt"YYR|ȏtw`IjH/iό_E]<(k%5-jSCQ?|pU/Y.ry@@sToBIHo&Q3_O_2 G$QdI"jڞyVxA߯ 4>K$ϹM*SEVI+ɗJ!ȗH!eckt*!|'ɲx*AD"P fٍRĞfBKȶ!&24P'U>6VXe9&4#l=%EGd~L\KZ@!Et&K4DZR|b!ꆍbu'=jă"CM]ӲY@℟l]0@ ꖕ_);Ҏ L|~+Ĉu,SD=IndeigOM֒2>NbK?7Gr94Ȫz?~>;!RbVMI1,)aMġy $O"KE* Ҙ;:g$"MъOA>|!EuN"s|շ)ogp)3mP_bՋ%YvD' |.7HtLcdY鱏3NR QүM,\8Ĝ\]_U @%Sƿ*MŪ=xJ`NGJ$gvvaWcS&͇'ydٟ!ܶe*IdMгE nJn&:"Dbܢ~#T:$|ހjL"2$=I)aȨh~wYV,2ͣ/H΋MS^V,5o5EMJt s$Z,r$$ҿY\Z .P)mbTV$j1dϘ\$]q\$:&~v-@7gW5nBw"R]jP_f-Ia;I(Z#9g@qv&*򄸹xoLk>neWhDOHaK˦#Iz$iv:I{-NI\oUyx>L2E_@eG2oV;YfQ#]_0!,g/ [gKw5^s$@ДIADoW_5 bǏux,茝WGIq;B)罏xT + 6{pH?I~*V. Н$k},̗)ʙ%D !g^Ƒ"ΓDGd'#QdR*&H`MTW K%eV#yZE W,]Oa-M4j􌚾 3hMK\Ť4_0D?@"#NA;|.} L[H[*twòMVA>.9=Rr^0jU]9 ?7O0wԟ14U^$3cfMV^F*_.3iÏj&~Ugw¨(slR- +0;P#WĺQMMM:0.m@)W^,e?I?GcIzv84h%M?VEls7D  (0uyT^^2ȒW:3U&֋h箁]/5L*XM|DW^ ,l"*K=e sW]G|<|[Ke+17[@n7iRUeȠF7uL©\HBd^L$fQMtB{cqDt&+. י Р؂}=6 GֆQNn59ќĦ,Aw=jSiy aWZSZfꥬE'@C}PR z-b4.4LI~If=HNXHADM4R߀ bɓ(fD:pA۴V|L&RO"_ gT aôj%)YEG>Y :n0MKd&[&Za,#OTn^f͆E:+)ܦtזM"*Wƴy|I7t:%OMJ`'`pD|OƟSWJ[tamS̪UtW\a?;3)/ :utǑF`I}qGurqvD?rH.޸ˢ&H!Mzz@ +' X{ˑ~Η KD4߫3@` _ ti.ie5זաHSr *z&XG̬V8^kUKbGs%!z!L;.Ө0q[8JUi@=K{e)f{uVP 1ȑg){{$gr>BRKuzrD NK{ e]f@8n c.~~vߙ?oY&:DnYt0{ b=l",a:0s;;n H\INH20{mcQjW!ʫ#xJhq=< ;hvrqHo~ =3T׎DfC-7Q"}–{T6Il4iwИ : lgVGm5\wXv+y%/j%:nVE1HpkNT|o|Eu]+')LmX9u}*믛d^&)% &i/Hk_4NχDzqK "9\ٛIc I*#jxV{HE7 $"M;~crSyU8r8lBI%ˋ\%ITlAI&3U ,D]X窟$'>qLso>/@[<jm3IW;S)%lȕUݴL }?ncrRi9Vo~DMHԏ"R=r]#?No(Lt&4'H/iod`MՅDxI>!Q?f,`q$]-;D !|&a\c?1HQ@ K7tq"+B$|DTBhg)vn!eq?@4|#NKM7pr&z"5D&U`\]sV'I%T.fI!+"|\d%D)S_(ʙʟ56|2{9zK?$ >7Q#UyasnI|eUD0qh"_wI":bk&%&e"d+U$(C"䳑07|!]DIӡhm8|">a}@}O0pޟUm$>oP5zy˄3ŹQ~^RdEjh/ U,PQkMtY2☓ȱDz}XgW ړ*I΂H6C#JI}[tvEeK$S$=__2hnv$~M$Ǘ)b^Ҩ-1E] 񪏇ˠW?$~ԨkjDȚ(ME;iQ@C-Dz{ 9.Y$ψEVJ!|&`_#eV.;O/%ix\ Ũ >ljeIMKt0?z>U/'+1I/Dͯ" .9Dmߍ+eؽT)&FmqkIb"\1D2D*"MLm)q 0R*Oo"I+["eŇ]+( հ'QL;IfWr 6HPYPR5J/)]f19&i "[, imjncrKLVtMHnl*7hs^dJDIx\$]3| lufS־mU}1"Iq4馒IIR>&cF/,p?ck̘ئcH# K5cӃyEduzxɐE|XzGt&/&,g 3%tT~JWʞ<$CVquI*o6>9*#ԕ$R/SX_RHeɖe0'H MuLQ$C 4H "lcAh@H-r|nB(2#N$UȌ8YL L bw"'svpZ&C?(<s8&~y};oB' J[Ie4Ia1٥  [Q*\Iz~2Q~dN;di&&مLV2#;}^P_$ߨVA) Ȇ/ٍEd.iOUyZ0:s eI]N;E: )NN7]bI:5Ք^4iTJ&.w!#*h$*9*{L,Nhe,ZRXO?6ORCޜ=hٶ |3U)U>%NҜiiN5oJ}<˴qde1ǺΎ"T.#AN(_uK 7K'V]?~'sPTE&?%|ǠNIV+2|&KP(u鎬: AmbfN*; ƶ9㗉&>MepC!2!>Y3N!>]9s;>RQv.1Hi>03",19G& EOC7wK;IzH-r @ #,J~(>.ew~ usA!$N48`ϩ1z1r5rLڨɞT܎2!lQp7uM.!`::ۧn[D`9_M&$d_^M"~}`]o\?d%i 6Gi-H{Ë2es" uw&=c7 [|UrD"Ug# Y59UEM !i%^5q5nV:đqL}0`|͟vCpvDŜ?L&XfEaS%x 6iI*!(ΖV|[pjU8;A;v-TWنRJ']O&G{TeܯRwH fE_KIXv. jɲw0nևB-Cؚ*GvM콱3{muG% .3%7nSK-xuȖ*dU!a2(kz1;И?TtyLOhBQG&h,Zxu`pj,utpjATZT ڛ,- &EI9UvCb1 ÜD6h?^cE0b0ic?1hc)cl sH1hc/$o8@r0g) 1؜ۡ'b4v"D |wabfCP{ 5HmQ: sٚ4?Ŷ)g>* qÖ%T4b t{LMI%Q+7 7>! aӫ &nXxVW߮4tM>R$zgꪚP-K&"{{>wO[9 La%]W*`"A?>xʐbҸtYӫ2(|"sV2+ѫBŧҋ|w>\Kn 2>v8$Z0@rX*>! !`M$g̜.(7?&3ѷ;FygR$+Putf/4;7XYAx?jFv0ػ~ڻu^2QfA Moe۟~e 2WTބQ ޺Gg/HFCkK񪆈=A :AEr^^2VD&Ԃk,,|{;VzIXu:27)M(1yXAv+Åt qۛX/}o]b H?Y)70#}HK m:8J#CO1+~pH6oU tfyaG;Mfu7[&'p'|j8:?A): tt/P`K&fN`~ޅD?VbQ =ChX`z K_4 (`B R%,S*@+0DK&ԲυAvdyi$d"$ +{M--yx< n, QzH5 <됅E$"L Q< /BS ֝%bpsBPI_;wk!Є3æ86H:uoPq흄lēV^$S k5n}cEHඬ8DJ4/Ω3pBAԅ m|zߪk!35f$Mj!@vqo3]Mñ6CU>3 ͂py f|tۯA$n:"Qd N.\gM$ait,`Ґ[Vԗ~wop"q SHC &[3혚ZiU9e4^~,LLH:m)Hwa1l`*H/\ݴqr]_+JpjpP!aˉU28阝-m28`2VI|SY5wىr6~2nґs]fKgKkh~u%7+'ehlQmCODfZCAe2 R斡$;1Fh`w*Yn]Cnb6 ~C:L#T"!sMt& ̗Ttc4v v!8a0]-$ XlHKFAdU#2A$f*)10 I Bت]Ŧ"؝^NGDJV^Pnфf)_&=0IДalCVԋxpch:`a&oC&d?]y>3q̖FK8͎mPCgsXRaDEϡ"r쳼)/ $<ⷉ0,!RLX٢@ MZ W90qtkXTz>I闙$48"ΓCX֐$Ow<^#צH/%'Yh f&]:?,U&* ̎,va\tR 8 3;,J Ky#g[q2HM,mCvL03̡ܩLk8  <+Z%OLW^%fIC;} V1 Ml]/^zo _#˼P#hHJ2,>tHA֌ߖPC\*!NO!!3tLJ~pA$I2)vً`XdFq_'R/CFS']|Od1MgTR Lanႁ ;k`VHS:ԢQvo^4%3 E'0KP y.ٺFL_L ե GQIj{ICBe͈8%޷]nBËIXoa^1wÇpLkЊ [:4HX|FpBq&g'iXްoXo`4O`7uTP(iED=~PoLAIn/3w˵+9>>w{,1 MC C|`^#adcCxP&4qB/nG 5MB|܌FːӦWq",7\`z/#Q_{X0$oMm }:FUk:+usvTB-D($)H(>r؛%>U2Sy>|zD?ڐ! EX}[aJMg4_ˤ̹){(mKQP/ّ m}HI`d`Ol:_l83unbiOfnZ0CM:(#a6sa_$5X"aC&Ta rhzLZ .!^w7)qĄ'$ ^ԓ 脋9 艭zKH&5lPn$ /^'|>_Lwzt H:zC#M B f4kuxzR͟Qg0Hǐ.3K((Le#X-=4 ױy\/9/P0+r#cNlɡ-=и i4H4r4cy>` E{eu{؊$b9\rS>hsXwY-:Mab d"e6uee| D;!BC}pxυ# Kj%h-PϭX?`{ i_s+2_՚lA.B[Rzvf0~nU-a44N]Uw~T>^20*/1vRN lT-JY V>^^޿JDC^ժy}Ӗ^EE!kOv~@2 kE}OIwor5mB@ڄdSD N8dyXϟ,asmy~%x r-)N4l![ac<~Rٴ?A[i*{y5)<;Z[n_c=j$DxJ!xOk:Ms 9ũ7Y)/qTH >VMH2$]d`/7$>9bn"Of=_ı尙I3 KvAz RՅ>w̳e lj&[{!`"N3hVp#Id^/:&Pw(0Y"!  9A* qOW(­DI22b\&ZބSdYs{ ɢpnX4W`Ư+X%BP$  V܊5~]Aq|]+@IX^Jsş?Ԅwȗ  [ !`՗5I2n_SA v Į P},9 }M(ut[Ea;blgS;&{?(a/'oNC9XI5]$u1ٶkb18?zPWA *Ezӫ[ɖO'-!c4̇ &\R <8%.C^3qxZO]y$PI0HIƙAZ^Nh"߹KADs3-g&]s<]yiJ"? C.ROoNS0&"5|gH :5ģ:R)j/AEiCsRl&򂻐ɥ{2R?lC͆2҇p9`:D9(c?il B-C/e# 4qSI|8JH4SHMjAzy@Zdvg΀ _sڸ]0d:0'aw"]D&!0P:Nn;rWMSb!16H%nX9{y>H?y[,X܋_I(l'̄6?) r@?@b%MwM*Dy>^-5[drm}_dR9GcC#la7aP{5Eo+srߛT$8ၒ) q=uj-&þ e46=g SWɶ҅,sw9 A VK3VGEz _&@TdE7 DVh'C(oX?$nQ5~w=gH#O6MdM d׍YK:~;~NHpu> ZAx $6\d V"ܫc7wo<I"JV)6kFSAԃyHgI0 wdo½.AqMx?hQ^M[jKL`ĶXǞJ9dћGo{ qnPTjp'!쪟/l/AyA5ۨ=f.'#a2AEi.C d}ր Yϰ# `1b48*ұ<-JH6 Ch_b &}4DnB9/b{ ac2=IPk"⵹a2ΉAH2IMK1ٔB:=d%{H߭f&, Y02R$LƉI.<N} !ͮә,o N]&_NVTTr%-j8%庅MpGk6r_K: "7ut{2{ {Y:vA:bH8/|bH]/iN`ޜC C0+M8 )xh!/(@=?NAОŻ mGBr$#d_ k79ዛٝYJ&5/l!r؂ w #\ðXU!䋂ٛ&OC?@N0>`),{@>dR xzfZHT' 5xKn)'Mʯs]ԛ[!`bDEAoJKvMtwS>p^IDdLLa}Iẍ́+*.Nt9.9|բ '2UjjYO6k-!0^f9f sc"H7]8vsDFDx ^Fћ$K @#Ȥ{ERKj4f F}α+$2_+-A{PŻ[̴[!2B Kƺk!A#G M]>Zlkʼn KΖ"C ډؼ n Aͯ. >ĝ*⌀ǖDtdq^G be =w ^R(Hc AVP:bK O!yN^b \^W44N ХZT HIA_j/.:vd"Rʿ?ءz 0GV_TT"v$utK_{oAV>IElr4pʖ: V^Au=e:d͗; MnKxH_$ 86 tÉ f`))p9aE`" ;gIؿd+/q3# a@3q̷gc,2C ֩Aj?g$l#y"@h0TՋ|L^4Nbx8zarA*k LdnC;XI bL <@m/akފam.{8'$;{oЁ"vI^)&|u_ts2;AM_5l| (\kC' A&nq]אwhM6XkP-A jڍPO-1]W"f'C kʍHG9 $bp^A;#I7 h8Do?$c00%H}IAJGIb, -:ڄAUmU;":B¬T$Rn5rCP T?#L[I4V8jmzrşӶL&_>]b}ڸ#'mQ)HEgwHaBL #jȝQdUNe.3a#bjI\Օw =AsFbvW{8&,5^ҙpv:j}Љk E@m 6tOSޔɘUJ p=7!J߄-PKRQk"sXCJaV` ڶTՅaH]̙p&HqyͰDtAMF/2_.FtIRG/{-Mz 2'N]$, 8n^eWJz=Fdae[QbGhO,h*ԛ6|/Xkih^o$z)9奼76#iBmDcc99ԟdAUDXc61OיwB%ᭊ{&4aG0K=N5RdY_Tz9 T =$Azvև,ԣyC,}2ȞTwZװbT*IG=sUn8&|BCjNݨx]_838n0 @ ИAaMx$nӫ vGb$pp@}W(^!'¶7JMH꯸W=p4$|ѫxʟ7ojs!;x}(3[t4uI K~}t9Rо|M!9+htN*,Ҷ8F As" <=ȶ:e& c7=Mc9t/QXٕ_З_DYH; &B;S$~9v}03)-n]$9!fM$5s9|jv/n枿9g}{x dMok9n[2;)e¡F%+甅.fJ%B6?@& R0S|j?MX؜Em +u~8 '7_LڴP񘰞I2tu"7)NuY&%ڂϫ,h`0uIDD%/ ZNS fke%HᱴEDCxVuƘABM`ג˝ pMj>ԹSJy1u,Hk4Yr ;NvXc,N|.!OOw!ýn!!Id,o7뱲E_Ѥ;DOWF:%HD%BkE7455[#)%= [S!3}UNӜ!TKGc1CD`JCw1$bUfiÐ;7`K"yJ6ҋVr݈+ 4:ebO|GZڨ4>d!#V_v25B&X_ }'1 ?URdftHfYRrDunE 8̥2Xl8!p0Ҭ?a?6&1-Πdw3 "F^#T(;p9eip Ug}k xrur"[4 ulbk_4pbpAR'ߙ E}m٣Q[E%W"e֕Bҕ;fȞ8fmuxdHf9 Fj]=}H+\JB!|1E(R\!U[F6zfyG-HH!a퐱W] .#Y< A|ڊR}zHgHxBS'iM]%fV<#V f"l 0hn0T?RAhLLkw4Ui [bM®wmϱdD^HAzIېNfg}X} z MlM MN^R]_}Z5 ұp`>j4 $9hۧDVrhTk0K%RV4{(wB+/YLhJqh:jj&b)nNhꤜW%_lO2P{F" ')t \rn2E\YeLx!D@w96}_WJAv0ae2:V|YRPU*/qOKK*bU_Iy"Hx:$W.P`P ]HV}7ܦs4C_/B&7lƺ,`b].l:Xuow`dKX478z!F k5AzCL?g=Y%U߈]1vS=FZB(@lruTO?P ѣz;{ &4A<2:t0pv1?KιD?a&OY& ܮq,+Po $;} 'Ll|F1jv~y5RYacͪ9)Ѻt.RQHxyFKE䧲H{|HK)aT C&č\0xa2\-^HȄMT #g=KJ/SYq,agc=nMX X7ϟΗ>0<%7aL0E=+,J^d/kn-jzB skΊn؛TDZOHTdcv"KsvyBHSdKv@N1!%LKNxvI,+Ӵ& !2볿   qALHMd@bB!92;9u/fYRiɃdLD8dĨŮ<󡰹KeCZRsHD Ouy~R&z(MT&C&c]QBaC N2++o厶] Gbf+"@4cB^a5 ܔX$% RK:C?xs=[S~ai_#e~j)ȶ#I-db|"ؚo ^G{V2|" %go۴$Us3#hm*d'bI5?JF}氮 ܨiadC18 w@ṭ $s|! gD@y1SqFݧwrW@ dOއ n |O*/:4I Ya0Hd%Q؇6$lj?:c)sCx>0wdBx=?^42?YQ0Ego{whOaqqT):ځ8 nqk!.Ö: di+&%d^+b7X#n6msv8ӱ~y#r;hlV=x1Ĵ̷ugpPvNiA{08K)n2Gΐ: 34QSA&%ϧ p@R˫/Y22$8d N} M]mܤTAT 79;"`ӫM,uG@XϓJ $֮Fa1AC szE7AFU,&Aj۵!;G*:i0v2ݤIw2y @C{?]f`sCt7HDF}t<-Hh/8$ҩj$T'e,XJ-9nRl/u0~os?-&HHz 7SNj ;xN2J[̅i/xΩL!{ L?$L^i+v]dA ^]@ mg Lϙ/x6{H;( Kx[k$~ߜB EUxS٫5!I=;176Ȏo26N#0p V};IC:vp= Rl \{j4KU IAn97mU2e`rA(Swd&C@z}C%n׵00tk&X 5ܻ%4iz棢 OhC/Z%[5I \I*Xʠk32dzb\U -P)@]:fො-Jln//G39Yhtz^%2ɀ`?R!{6k/q$9 Og<+OcBJ%Z9 ˄HbR LqM-\䮼*-U=iYqW8egСaO^iEB Qn"B C' w磊^-GxVxJ膪"Y %HAXtՅl"c KD*\Y6tAAص_S񎋴毒 _nnV{ʬCy`Ɏ/=E!wzSM+)C:j@+'6ZhsCAx[u"TG䊕>*sf͗!sMފ }d X( &,O _.Ň8F˘<'%tɤ+C%X꾘uM|X;Z!,uM}XӵAfynV1vb8ZQ ,tV99duv<9cI7q8/DMTa6BOw$R=́`Dp1:LPҭ:;ƨ0ҒbbEQ"pN>ERdtt`|S3D>ʒE'"腤bI97)FE9Mxk"T9sR/21) ZbcloZMgЅ7T) A8kЃx#Ie$D6hr̿&ٗfK=Ut({|Ҁ&x]f{BX YAjlH:4F2Tk&+ T(D(B`?1a Xh(sa"{ ȤX?u>ti2!D0"z;*纎 knIݑA:6:[)b%wќt%<9U* 1|ev^ =G&%T %3&8B2Kғ77Lo'|,)yLz`VuɄN,>衂{)Ysci$}?+pL" :g2<Ϛ*dPZI**,cTY8n؟.9D.2 BY2 dgC(ɪ ?L0sCh"J|c!aJЏӾ0!^N %صpt9Feebi0 G݄ ش͕7PVOO&d -7N3$Ұ?B6?/X-c'L?j ւLs%S 63k0VQ*bU3}HA: htA7{HL2o)T6v!TZMBd v1gRYʺlvwڵ@.rt oqcMަ+t#BKv /y`ӫhG2Յdc!t"Vqlh$ F~=XL$c߂s-X7h"maA|XΉPyïg5M"ZG"љCe<[Qvms V_B]*"<6,j,Ƚɑ2䬺p X6zhi?r[^E2T D YX jD*B $V0p5.f+;dڳ md1P*5%U 2K@,4 ^&:)7h!M_#C&u2`;tl46$R+7mX5܄cdٙ封n -n4CX(W XAV$ k(f =%n5l Sȵ.eeC l-k̗SqZU`osoÁu(,lNL1fӛ4Ag~ gՁ$.MB= [  _f$-e? *A>4"@yuP䋮fQA]|,&9}1׸'7Afy uՓRm#=/DM:FMd͗oݴ˜1'R`W'd7acd{d T19; ;%E7E L rҁ{ )W!^HŒȞW),?;yC` Hg]@r־4$>K! [+"vA]]`g304S ʤ8hf!as!tkz’U4#oR+@ $ARg$!wYQM ZZ&oky!e|⛴[C+2t9FvL6e"IC 1EfC0?8N(R%H8L†tz sfY2l+/-`8$ ("8rtVqQ2Y/I薄B=O?8 ԋg0HCrg3CZf#cTԢ3an]A >s*]' ]l2|K" 뽾vCFi i|Q>#D>SaPU`ؿbeI@%BN9r$Ho"&/dKN1Ab_Z/L>XLѡy~10X鑺 xB:|3Zs;̄ Fɬ;U>A҄ l4Nh>i&sHC!}l(QVaCɳ$ȮRİbN]sw]F'z|>&aJd 2%&>G~Ї uWI>I9y5]C%9x-ΐ{y需ퟮ^K/]g%C F_&cb(K/2$2sɂ{M"ehQj洝, o2!3CdA`, 2~5rp{ Eew`|ǭX3!NCI1 DrV~ 43Fڥ[a^7%Z%Μ C>nU+JN'y948֜tzd h~@[p :5' 7I@l~ǧ-BȺwXNÄ3]}&%ؙoH<1%cN1DMhiDx B_ e  2FbKQl,u!uP f(ǫ(gAσ&~'1nnRޣzavC~ uoO~C`rV0ˋ\T},M/M;HA^U% sS6cvvJt&s_WRqHAB{|rDzn|*oL(Q#N AT߯00Z)>+t7r{:M8 q&˺hQoRю9-AP!00AH,v+Y&SIJσQ@ܤbx!q4~6'\5F`)]FPM<"CWydl ~IDƄD!Ӡ͉x`|LybNa` ="@e:#IxM&>;"EO }LcԶjPzB%$$ `,eJ/?0D  #ayvL(RYUl~a8d1f9'4hC6Q^HWU { )ϟ _0ncͰNO(0) 6xr^_B%R)XMR9gQgABoI4tb:^.j-u(, Jβ1BM/T7Ypj]/MvŨJ&0$aVCVZ~m= sD:OQ5IMd4&MT]WvDڃN2 BiFu-Zܤ%ER>SuQz9m詤}]EC:D! Y zWqrUX>VW_@C>|M&6 :U":/?F~[M^A]&~"5!2^01l rp'6 " 1אB'hqeǷ!,M:͚*2Yo"T,ج!ɪF2Kf2k!%{>$Ph0_.aN@;2.W:eM_rfj>EU6"GOa yaM:dQAvLDZJ#(](LATd·{4!0< 9)lq U`awU>IBA8b IdTao`A:bM^~ؙYIWXIk3@h)r1w0Eh@̶f5ꦘhlb\"[ |%tD .2Edf&ƒ۔K!9-GT t"Zyq;"i5 ^Cxj b_Cp Aj^\mۉ$0e N RVe&]̌#`wu>PFjzD"P $S7i&qw#{EqsV ] a@rRN}M7zxR3S0Id'C}UVtHұ_ՏqbPga!TWMK)2c%5"nи2(m.230 4Py6!C-43V"ҙK*gdl'jA~ꬹc]qDh|]a4"v79 xzygʪM.ir؆oș19gʟ+cJjvqiWqvЫ!p'H 1^8 Uat~au2 :z>M4-ٛ.*#;Ig-+Iv9:m MxdYҰtsP8dBN*B2aIJbb_Edk`VvSnҐ0ɨ/q|3 HJ~ $i(,"p\5y2nMWOCMxC;n.Z]<3[/U@~T@d8)/eb a($[pMX7˧zRT6u~F$&eleda'0MQ_217l.DUP)处e' NBGV}|'vX[J-E%;~a# r&Ë hȃ$Q2fM#i/on'_brHsx4|'o;- N|pQ\ŝ $1w]ِ;j$%xKTG&a-9ϗNJ$b>ᤥtx-SMR-Mt/XDe;H  o'&ِ@*T.d;E~CzH'2RZ&"l\qdDwo d,^MjP_rd Ybg%A aOYۘ i礙_B$l %9KF]vNj0r!#쥜،Y4VN($W}DS9;Y)Ai'm!ɼ {SmI %NrWsx;]S'Lc bYdGդU|H<0-퐉7 kfMJr(/ OCz0Gb+|\eU @S$#Jw2P3pRK@#"O4 < Mo5x4* -EEp+Q_' -޲-c"%[`ΗXpXI';aX܀7YIO ?I$ ?nR g'=d`m hi @g'-;mJ}Tb+m eT10 :nB!H2b"ܸI:suB5Ry=APU2Y3 '-"c{ٍcExMX Ş|NZ} A CGަBf#5e LL q99י% ċID+&Uv¸;5sԭI?MF|a*7o{ᄣ\^B&Rk8Fa-}14!C 1JOdžnD MDԗ8IBRm\Ph"֒! w'بqm֪ /<| &%el?^Ƅ׺±ll ~:k Ęن ?ߠHq4TGbw5y>jǰn,7,b̝-nMY 8s^M+?G?&@&򲇾;[hUn,rvP_„$2IddJRa !ZOrbY)WpJ AJ͝HK`L/nE=#yCv JJuXd?thnX; )C^u^2?B<LVf6;l@vҕbT(a, ^ShA(GBGI.b/)95K4iriNvm25 Ω%^>ö^\G/:G?fF " X;0n2p9h|+&{d:%L82dԗW8z-IQo#xՌ2F~l@BY6F=aw V/j1P~<60B746 (M`p32SPie+pKDz}ɀk؅كzq6P6PxַWO t[_;>Kpi"ԙ An]!-,Kg> B T/JZ EulF2o$@6ݑr`{>7$)Pp&F K )qHE[ɾ OZ@w᳛[4D&D#";ӞY-2!dWMDR<8[46ȷ!]sTZ)(X '"$i]Џ8qB=b@d\Yh{0,eLEDYk!uo  JJ;y:W6@NZě4MD30$56RIH(BzT>/M&;k~VȉFۄJE&wr)XYSACvyESΔ@)5tKawǦbuޘ`V;L\.} 3Dx`df0}Qc,.m:tNgfI*ć?'Ive90.h셏 '[G`j(qC7r)bԓP`]dN(;+'#Ri|pA> =1R؊=n>,Gn tޜ4Y0ʤqn֤ƁZHH;iC )@x sZC2|@ C3:{oX͎֕iKd$!L~L6ݹM d@9 `(l c,3  Eyj4vN ulgN15>[&3ò{Cʢ߇~}-fjxVᮡl/arB"qK A]@m\ _'ɖHn{d^w?/ @sC"AI5T&=؆/Bk$m (/p^2.Ef &~xmq7*)sxe*Onb&ee&|EhLB [$ח HD&vPM ESv!Ǔ0:4z/b5sDZ~R,; J2Z M,RKew+ T:i|&,7 Z ;Et炥"mQ )1y 摯QE9 {W mHRŔH3} A233U$nZy.!IBR&Cf2vL$Ж$ŒȕtTa!{rN7!CXd Mjqi(D L,7j7"l5y< =hC\+y7a/?SjiG7Y/t*!'&,n-"#a[d&GL-p]L02 wf@ab›8bWHXRkUL$faG)!!HP;&QPl 3I |ɖ\X'k$K"s1KB&JU.ĪL2Uz]WrSv_$lXw"#sjɱqk቗& Rf VJ"ewqŃQQq"qHJ/εHǹI|ĖT (c2@ͥI&*B0I /Mi U,=8U"n0xO$52Cg [܋GS vfyf߂~E]_e)@ " a Xe**zHP9"!Ηd-5(6 ;t?Ft ^CRD$pY/ܾ7)0&*Ko`~$CD| $,0O{b*ʚ)a\W c&[IլJΑ=@ ZLl%{^'Qǰb䐊<8*"4'rz=[퇜9Vԓ=HX u.6 * )V" [" #~E.Ng.+,B*v. *qI,0gSnl?T!9aT9<>='XYNEY^q^4G֭V$W)k siZ* M20qOC*LG >uchkh sAas3q6d6ZwD<,c҅;LӆfZ$=#7쒻Ț)Wz-ԩ1"\]d…4=zMçVƚ@`J$Z=LVXqACI J|ȼmh%nZUs{:F E:rҭ;3cH)2L@D:d'0zC:* a~]+#+ͤ4tD7~I i%c?}k%"k^w׾oŇfsȊA ST!Er$D6 e;j&f*nA!Ykjk\;r?!$zE2R$f#)VUKZ u701MODrګpFT9Q F_Dۡ5q^@ԙFgl8ZtK8=ևУdي'8]~c wHVoC@$K Uo$' fGE's%[b^$X*y ƭrsSGLT`uk_G!zm ukۅz@XR vj ,a Y7c#%p`R 00) Ԁ WIXf$:Nz@N.@E Q _}#ńEBkԻsY.=@#@ii {4̳3/3 &žL^RB0qe,4@ źŠ l/D/Ґt(8e"#i*6ڽꞋĦaΤ,{+1K`4Ub 0pH\a=:z~-N/mGLjl4Zy#C I|TD#0&2_`&(0ʟ.X̗0Äј/ 9|*f7 ]jDvsoѮzMtF\xn&%Cn:EF$w7?_buIz0'ÄȀ"~?a1F|g&%wt LML8&@ns1ڤf OWYUlpHf Ǡp Mdx*MlCj6yvٺ!ڒF_6氉@i)uB&0<)Cz;lKh@N̞ƅlvR[&TC6!ǩ?~i~9^9ԁRk +d = ]@]DzEbN)),Qs"/ 2p۱tn2/ag!~,VoMOɑp! Yx,qnȈabr7ZBq iۛ{m \&N`Λ`T^+[tBJ X7ƶ֩*5 W z IJI0m+?퇇Kr0 jMSU=ǴjNv ]F!Z4QIvnIg0 ٮьĦ4Y@F>$Smdo:b^גc̠}Ȍiu"0*!LGЗ o y6&vk.rW-TC:^bz`/-=qҭ1J-u%voY4*9+K ݉8iN9Ieo&&֊Rq ( FZ1~fmm0=}*"$#E &ڽssBש+U3'k?LNcktM>Ht~S+7]txL,fk1BՉERXP*JUq_y65In%E*vC(IodocȎ+F`8MP d-`8ؗᱤ"AXs=9-M)I_!%'22\dΔtaF.3D7H,XE)#m5H2됌D:fwP@͘$ԋh:̼]l%EvqEHZ' T.WzS/II@Fg$lNZӭI {'ay!}y!5jrT4 IA*-~SW{i$;5Lh˴H}U[Чf*[/hXz&%#d8T`jzێX94Q( `ʢ{Z-PwiSМ !"e3pob`)$aL`&'#;ɖ;E\:Ht(0hӮL'ۡ|'^|7%;J7}")ʞ D[@vN3+0b.f ܄-'y`yJAW=WU=$!AE*VEwp|!bNJosW]FPp4 G= žQi$YD ePJȗLహI%i%.|i:1ɴ@ $MD҂:@J o^BNO@@ӗ[$)I%,ĴYb>wґ^VN#wX-oP bK( WQb/z$giXVI +5 Rh`HT A ;&ORXL4xXKsRG~nYU MX3Mس>؏t9S섕H[G.‘@ّqwY ;N2b/Y3bIu\N/'9Ge1:K_ob:#~e]MӪQjCNL1T#I3I5wr/1"۰TZI⍨n0pJ` ݐɜTd`Yä5:*Z!_QW ,~_*?iU?(ΞVxdPb*Z\ !T $*.THxPT P Pd㞞ӻ|]`1ބ* C=NsUɐ]K,Oo::Ҽ߉@es4A ޠjQ7w W ( NiеZ*Ėo {v,'=Ԝ9/0hĂ aOd(9-CU^@(L6D^L [8m玛 9^ft5 |fI{HV$0O5Tjrkl5@'lo'`#j1k(>ݪ , \AQ9 ֶKQqzh5 ʇL6JW)|Twm@l&K#1U+5RzԴUL u7yN˷d5 A$1|ܬcZIfC ũpwJ$!\GGo_! '%6:ViH;#YM KdOjUѓ C*2 uÍ @MLd_x1@5 hg~l>tWVٍ$mʏZ'u5Ml:dB"aY!ApGP6mCⰌ3:$DE&"`8i(V xkv,rmLUWק!hwFSÈ{Q E[컧O=|A#a&B0n'HǴar@} z" V>Fz2 Hph<S`Ƀe(>f7awsX2c]3Ty9a7L%;:/ oe&B Q!i\puTF8j"3xN̦IA#^$@h 3q4ų1G 4$#ʡ٠rxQ.[9g7o\Vd`-OcP&=&n$p5jdxM  w_0|& (*/s*?['DibULjy{ Msu7A-6`LȄG c'vnuk: ZriN&TCEjge]EpXFud,Nh{Ұ8;Q9.5Lu7dM}8#$ccA]9GP3 0wz$I;ǣ$ac:lq392'#-QR@j4HD| s羀;i-$KsD\9Qb/'c7d=<\ PB$'d9O ULn`Ilx%;aCv'_W%#ZvHq &B ҡ1j[~##F C W +j0 ;0CX}D 1XHg2Vr$a),>"e*``bb5Tn'ɟ Σ;ՇS`ݐc;%lֆDa 4vGFU槮K& gၶH# n015d@|GM˨Akq@x :S2lX0A3㜰ޣ9aUP1D,nz.DviXT I}u ioVc ?8|W4*. oHE`)wpcL_[ TP0:ɷ5?YZ6u K11}Pvj~IVI挄([t=q8/(o:I:t";ǨuD 8 ͈ n vDCXqCa cjIA %x_ 2'/rǽ`n؁D EsI/A$I d ^_PfrFg$iM +:`:e^cQ| D$p:QTs2K NJœCSLdFߎ=]Y3y_q~څ¼YK$Tz?߅H:NGrk^!|9nQF 47^WPB%_p֎$@)dar=Wc} ;@w o.+oq+oq߽]|X$0&+ `}IFNYl/1Ϋpnf* 98BrRsK&՜$b[|!YKIr$l>,C b,n'm19П]RZb>kt$"7`SR% /"Uhe@Ӧ'=oU~,*)0B2咇㲯0eoVZ ۶Kj%Oi. :jBG*ϢxMwP*2lm|.ח0& $H ͎?fYFʋ Η.$S\d S߰ C|Icdit摋#fބ0V&cN&JJP`A"&~7,O3`]DC[Pt Qq#i을534)T;HC\ZMNIDAK4u430eTDOs$`Ev c(e([OlѾ :ֹ:.똊  nwBCf &PV9ڌڧ9=$sd)'kHmT+4'/ 9&zMQTbڅmBYiZm-79*TNR{Ikb vgNZ 0%&搉wUaw;*<qR{XjGrvGu}^p`LcyC`ס!Ԛk+C8 ka VVZg?lѩ9aWZyDGHHZwHozC7j }`ʔPyFAT˰;N22*AAd3iCoEMla &'k69%wt3x8MqMu]dqm v|$-F8%6 "4j,͔8)6uXnhPXlDBcO tq?W[r4?"4Lf$F+m+q aDkUo+|D]5 ˢredkJԛHB1e$FlfOsc9Y&3JOGr҇9U)qc{{ˀPVg5:dy*Snjfƪu잿B08:b짨c/#gi/\S7=79Γ3]dM-Ӊ\P_^%; ًE3qo{Zm]5(0i(bKқɘ(x( fl@V2ҙ/{ðYZ!╩%r5 3h cqO6=x *JxHsΪ4'1҇i1vօ*p)Ri)$^ڇ,Iӳa;W>bݚ}hMR"9rbP>A:}_$g˷ivȊ, A S؀yHLgvF)5P1*)1M @[U$* : @xadŶ `=4 Öp&|R+p؜]S(n%%dqJI/ba;,+=@ |ɰB-@aMF&CL8 .5K~*|żDI__`SےSӡ*v.Nǝq_VeM!A,2K&ĘعZveLib) I̩e 3ԅ0C7:IDQz ;FNwD#`Oz4L1!]y% lwdbPl&1;'BiHBnfn{fk'ϛ;>GQ ѳ(iA LR΢~ʇpm91LH{b%9# "b~2 ANcW&$Z c q2,)͒7hh >vw'MYۖ Ȉ66a ZEglS͐05C 5t%gXy:i%B{(%Bn HGrJ^K{`\cpYS! C@B:qBHPO&vrݛ C9-;:s;{p=KcǮMPAT$<`O`M^’NfS RO)I'Z'N";g!܆F"~(y+*k#i$=,NsB_-$2 H(MfYHS1E@uD~ʩ"s?\HB|`{կ(5Â7a9Ij}IlmMETV5<^FP T?v&$:a͜H֠AB啣ch:dq83؁Q (8/`Ix$:d{㩽d 1# x_Rb̔!9#ΉpBW 3RQ?Vҋ"m/M`[<7Vf(80ܭZ'LrºuºϪjɎ"2}4L Ǡ'} {1#IPqhSOW';JP% iyc5g T萜A'= 8kMdˑ=^HP'AG6/vۋ554vÆVV,SEvWS ݒìD n:'bZ>2 zhG/ '4ZL4 I̮saf#Y:i?bO즛t('ur|8&CD.'y oX4y3M(5dƏhh?*eT:d$b /2"c dx'sD7悜U0O Rl %-|@`*``Ig*]'ѓl83H ]#A9 _!MOGϺaI's<77a`aO$cdW}( $rB,>Ô`vZOCvW{LJ[: //I'dyaͰ["TUiZWo'9@߃3YɜJʉ/~"+v:EV^3y.,cBj/a]-$𦫰aNj/*=Y|fR[ Uv( d' ޻@,Xg?5%[ IJBeN-rٓ@gȕ܀ƗM1 8#le JvŠ[-!Z-JÂ^buYt&*뻬F N@gIF7^2C{-]iE3"[O-n2JY:֦D{@"C`УŠ(3]yOieWC ԰XТ~h+hQ 'ػ4]֪pjt 7Muָ-Zl\5rTpf\c!-b9?}~e6MV?$Dew{m*U:[)9Pw8Ch`N߄UV`QADpX`QCJzzmrZ ;IeΜ&ƿ,pPJXkQBI-\4n(BcV]Shy/)'m!?YmH:2tWf C$ؑԮTCuE2m7 ZNJ_arja6D֝$l - AE i}jG)WrU/?"oe\.@^(\ipcoMֈڅ kD [ }G PfcK:$p'ICVkAcUiIMnL3a/1سGo,&Ol;-'PN/p%F_ȿO_Cmlz՝ZVx9f*MCa ' xaݦ@ Wbd b bIo3.羅Z!,S= NI$(E4ӷY xb-H"\$#H}A(@QAR:dK>8xUHzu W֡W h̔AWm\ǤvHǻX[;=a]{@Y8S&y([|̅pFXtV `O.|8zt(HɶeX脊00}b*.:ҡn N"Aa虥X:%bX24 M(B/v.w^`b/ًaG@5 !l(W4g~@/aDVӕg'<١3:1.vfdu 8 cN4{Sz| :1RVc <;_U'Nt`)NY|iS]!`|Tr eBF08%b6 ʹ} Y nxaCCfׂWdGe>@ԝΐy$7#桘a< "̧I营"'E_3턹sƧXj~oPB9Α᳓e<uy^1$=0kIx9+UtX&?dqʄ%LVݱ0 Ldk g3V|cwחt9(PvNJstSR5g61 S2A!yܒ9NG7!&3[.2[Ο D:an0Ɍ#wP<t]^8Sd_ =MqRc 'O5%  } ۓIe/hu~SHŻkL!,cW.YހX&n10\'DXJ")t"3 W@;6՗4+1;":LFVc6*,x )sT5:qfPj9floڄR K*#c: jja~&Is.D Db".@N;‰r@ݖcNޤ"V;){/S!3 ҝ4QcD=aWbPj~=}겆>:H(2 z~@1(fĐR?]c<Y#16 j.cI A9,VH:eY^M#)3Vaaj~m/SHΡ PB^ FP>HR%$D2`2 $pBڑh enҨ/j6%쥌uNnu:`YNbuO08?UXa 607? ŜyҠehI$6PnϗT? *H2n"rP.@&\fX7`8XN&B|W H$ .iZ l]PNA2K1\pq%.S" xU#=J,7I${pR,2^9]fk6t`#GX6,Nٹt؈o6}mr Qqs?uVHg$#"iP8HPY9,mɷQOe𯃜I/Au_9 ;gw_*{i4OI!Im^`'mpFGUR^LLXe VnI=vPDbҧl<)[iX#,xK5LAn5LEMw?=@ڽ:22NVQG]z{2}E!#8ƒl',=U1:5tzC"LsPH [s'o:BE ;E*X$x]$amhDb=:a$uF"Ұ]۬7/C֤JdcE|IQ[鐙_-dLpR_АuldP+W"I )= tHledssvYžlL1C:DC[| < Ja}'Tv;' [s 4L͒,{ v81M૒ Nغ鐊dCm&<͌cpfBmyO]$6'dᆸe4WIzF @*`"!/D֕3>NVۏs6+T Psݤ!w$5v&-&[ )jty;)v8ٽO;ߙ&j@EW J>Hȷ礖0Ut'X2 Ub-3F3I~AAi z'Yj'c Q@{do|ͧ|SPrRf31j}ײ=$F0ں_'u:d,]iSjoP"&6e>W@uBrq$)I=7/1,x# OAgj;P#;J9h0KV!X )1ҊG(%EP"W.H$Xr/: )i~@w΀ $9U"㓇$H˿ȼH؈eRpwK2ypf)W!8"ޱj"MIOÒVL$إ;NXuksoE+:ĐbcBJx 4[t#a`$aI-/v7fʺ|u8-,L؄P1**f($xVT)NbM%<qEEp+TKP{;,g^2"zj$fTa9- "B@VTCջvamTb5Wn`QnY9Hx toX>/0,'`P,r~mE*)7a`hun.?s|U$ 7PxQo'vY ciͤx233m!=_vi3C &^W0%0!HFIOaNo,kRh?Ȑ;18z4)o(AIjEBƳQ_LF\{>J 16r=nBOdZ$(=nٱW4Ʒ&U EJLvT~WzB"4蜻7&^B ь8cK9Ĥ=M`8QInbI99jl'Y5I]]#9v l@Fom$` /%y5]~8x R*deR8I1hDS}.uAJ8b)S騴[r\C+6cvcV|yP 'd8zpv/#KT*Y/yLNuY|*Crm U,`55Jܤe֢:\x-+Y5܀I|zb)ŦId/j6ql&IVlj+Ì7ivL$髨IhP0k9N;dD mӨ Y5DƦ^ 481H(Ihfctل)t[8)/A4hfQEYNZ%߮ۏP$i%H>& ʟYwA>Q>91;8(ZIa5fA "+NBb^^tQHw,8I᭛"?<>BEycNrpH[" [}d۔p2K ixnSb˗1^ nz޲ N 15i v8:` f3, Q̄N|If} i/xI% ޭ:5Uz z&X)!![}P3F]'~a L^e)Ai/O)S0+)j;XPr'^#XR^T<[oHȨ.4°)LmB;ʘq\`~:a`I!sjjHcnq2lrI9(d'3'Q k0і sΦ.$ hYѠF00ukkk8f8 ]T$_B/!Y,8Ϝ3UwȸdL+rov/ Դqm J8'%*0F{ ߶g+e( $SHA <'ȄI,z*np[t=H^tEw@>Ix;:S;sZ^/_Ͽ$eL峕 V\M/ϭ~^/I?__??QVz֗>/Yeאy(CAsG\蠲u!:~[EAϏڷ nx?:Y?;K.H3'?Y86=~>5}c55ߺy/<^|,Rg?[GN G\Q( sTuJ(px?r? Rϻοܖ׿?a uψD_~O0xYabw?*yoWۿO/6Z~&_o&gOOI`'A6$6]d jmEc_n[wWcwW3Cw7"lsWl0^VuPu[sGԝIGt 9"n΂")/KNt3ms߳LfrI,|X`ZF"nZXFEsown[Eܘm"n[N`ɡWw"ȿYm ]7H`tE|{kjީt .og.;["|n^%niy#qwh+H7QCv&̉qgB̖4v.Y$nVHv5D{__p_ɯHm;w6׬\h$7$H|壢g cE|:7_klEvH2kMsf,$Rc)45dHL}m.v75uA|FV"k2 4L7Ho0kߖ\` НMUM v۹>e6]طljs۳h$e]Y N鸾O鸳h#1wp!l$A |=syHqIJI5$u/w:q?ɇhw*Zt: bVr߼ 78 ;NRՀD0=i~ 6d;B}kFîMzbǟ>E~4;xoD)_Gߴ kɺ{>$IA|AܾOcǜN0iUv/#ŭkZl:Z߄97ش\r:Stܤ?"$ ǕhŸ@%MMہ;ړ[;Wx$|þA6WCts|G!&5<_sno/Go $'ӊH89:߬°rp+C eеKk:CEd]pwJˑ#[xpwچ"Xڿ$Y5n?i$ 4b]mrK| '!>.UKI$s!&ܬ =~”aH `GMS5?>nS)\r \$pe0u %@.57cӷQH%dӌH븉;*s.y_i/㓙H&XfhٍaBU$tEJq'0"n"9DVM];ĎdO K`I}IL5gr?]l?);:vy6n[Hpù9zm"7@W 7<9 S 'Hz w]3x"cw7 wj8x7Jv/@[-Ph4|IX;$܋܏DnBJ&ɬ)o2$BY$ H3{ŻIމv4>EB=I,0' 'f:mk1l{D&rZwv}Mbd=[~!c$ևD G-$c'օZ{l[qdŀ* ]mmWhm]HXvqpEڐ &s +HLa%.)&3C,dYYG@d!l5v Ȼ-Y,IzIu$FR˭BES$ܓ^-Y>%yM(vZ~7 Yn5Bu9V$r!b%hu;__ȹIRk;>;- jm#ݲޅ2 fa!&`/Iц tF`IH/"J/ .$/peYI όŽZnk-Pr%6n&EJKqmʳLEZMbф I,j_8FzFfZ !ф`{F~M0qet=/4(nU݆'˔vY!YMW"ΪFNM/dϛT=y(B:f%1lWΦeHĻ?68.KoI P,&3&{w1.bIl9{>9 h4ȑyB{pGH]? vOIU$Ffes0NcVfrՒ,~ϡ}voWİ1 컝(< ?-:\rC['|>K4rR#"yO"wp;_Ǫv+ƒ9sw!# }{J !~oQ3'֋ܤTKd'6ܛER_X*mE'[_tW)Ƅd( ]@+Ilju*` yu܊8iKo ^U,fm9%W r/yVOMlXq ?eݨ T+EfB7_htpe=ɸI BY 1 dCǠf띤pmpnàLrY/Lۺ=n#M]{?c((.{r@O""PjEv6g&ETTJE= giKb&/1(vSd ex\^Rǣ_!9ҫܼHYh_Hfƣlw>Iľ2zltYx *)_R {+6ls[Yؒ&8ZU&<#'ײkw9qAչG1zd3Դf*Ih }ܠkfmV6b:9I5SbR.O??g GaliR7n᛼0|iXKAԡsi/LZq;Mc C*ZZH42H*7B $'Y? OR8}5e&>CG/sѣC8fiucqIZd%t*JKl?X㉎6=usttI8gٗ3N]۰N/"1vvw%\Mb\\nKd|d+EIm|:Z\@| ý%؄SQ/hbKX JreD,!; wIK>X[|͡ݦ=:y8'SE\w'Li#M;Zt ZF5pUdCzA~xeEțS)7%3#"y,mEz"U/X` H3нf!%/75b!f-LL Q׎ܰ(n=: jKTw|k6ű|ܠUzQ|L:A=W);t<%RpѿH|IW s>O!K:vP-켰Y!&1DxQYX}=ö *,֙L`Ip{d.Eӟ1U)dI$pD|h@saϘΤA(2Td} tS+nvbKY;L!5(5)rSlVN"!݋MmG; H̆ٿBwIXj+Xn/8X.2pXcz1ֺR|͕ zEu_O1d]+ע@KyĨ-tRȿ\_1xXs$߄-C53f,jj*{_Yocpǐ& qXC!E=\hyJdhx!֢\U醃/Y!%!ڶՖC-3T[&DHb]dEj<_u9ɺDGq꺔 >/ ,b1o)_ Jw.GHvdCliP"('3pI /sP%\7vUъkW/' Ҝ(rDL5zID|皲P|(vC`ݬom4xUD7<Qe3^-$h&xAoЋ?z~eľ53Ǜp),kE% nvaIbĖE:T83wN0UTM'?55wM״/0rrʄȦ \4&<ۍ{L q"06D"82-Ì;&(ڵ(3)(&Uv+(񾀇'+M>7V47%d.#YNdCTp7/bLA/ 8ňbT)*Dm\`Ԓ%k]}ӂ49%H. Llru}¼yi̷IF|]?\F|_/ &B = "1> t_>@+I{ĮfG%2Ƿ}q&m=C/<[M'YY-^|hIM0l.bu%Pl&Lip] DdmtVyN&J"Pr?GN zo\99&)`ҋKdN##etFJ\s(M$ RZJ,13Hɚ;Q]l"ènŠ#Nj "HI8i||SA i\Y*3Nozq4=C~8 7Ήt%qޓgN{ 2v6K/)Y;-8~C̦tXK09uqh N }.TRRY0E#^ 8*`WFoP͇DN}6,\=8݋UO4QD kaMejxjc]`5`\(tiXܠ<'}dNDgVEʗ 6-GA!@4G;K&%^V gi#w(t*ORx&x$hIl}`A2'k~n\,9 C2П*ҁx򾣣Q1q9Ҡ\'e-yIe廚}Uq`@WN6T8+t.Rpj_vJm%9K&b@)ތڴrPBo0@3?d<V)P0^Ec%t+i+k/y Z'6 GN3xۥӘ烙/c3,/YO+]Y*N&S w^x?ۺx/i,nQ2K/:EbKڕ+$LD5rȁv:1 b9Y x,1]g #xM=(L)M]% UI{:]wH*TdY<$WY0(&;\Һᖝ &H,<<*t*NH"KBG~d{НF'x/Wƀٟd1?c|0KUك'0 @+&rt,Jp#3JсVpNrp9u6{d/ }b;@CǤTLDmtn$GGAC׾ wjѿ|Me-N45Kof.Ū͆Hħk6&0E^MY$v-'pN7f9;Axnqf4*\B:jm [Heo*>IeOϯKP`8Y"ړ%E-+,1u"}&z2`ȠѤw`TyJ8E{V1/Cё`_"qlwxp *RPg} wOO=Oyvj<G/ѩ״2H6Y߀-tOuEYN#X:ˣq9&]>"_ҨKƕܨTq$[?\hշўŎA,ISvt2Qc=kj J>yz'P =7$ d/ ;kreP}a.*cvϻK=@3gtm *I?X9G툛lx=i薓 =ϤBOU*V/%'u #=*3C2 Cq !O HbWNzc twBBop[U@:[zkN¡HN}ɋDwjh TBHGN)yߩsռ;3ER}sn ,H))%'!piWRç| 5|z /rfQէ) `>y.^ ɮdE -/dn" &TI{f\'5I&dA8-tV|͠J8Y} LuV<Hcp'J>7sMV?]Y8'D3BB>{%~ ҺNVgP'es*|#OkuxO&|.*MKsևϡI6)sq>Q1~wOHi'5x.eCڤ9(r-:ξgo?zѾ jDuMZj焁X$xHؒH͡'QG@=;82'ogɽ9X~& 8IƓ@Y/\He!zϛ;X~lY2DvIa9U>2N_29%M~XUdS!EԊrB Lw6ll@j hC/rʂk5+To=e3H~cQ{g@#/zͫe? TrhA"HwxJ'\}iWTӅXJI KEoR-]d^~1*+wgK=)J5D‘QQs]DIRP1 c^SBպ<൲$HcU_:Jk ˮ/r6 Z#A1Wd*Z{dzir<++A0k$6KXʅhQCX8AYjF-?[E.y #}E}ɥh_罡pETqPhK$B^ i>d-16!i')L/axنFEA$,!}tFŝ6\dQUro"̼5^ѾS"hu;~46KСnvHܤ3aS*gS 雁ӵ,3FOrɣ|V呣\׼ICK@>x0 \{cI&)s(CP!'ETO{i 2nE . phjY]N:Y }\R=E`-N}USd}Bܭv\싮ВTi]YJ5(T9GWk`>J+&A܇0r(yzbwٺ횛xoJ^]wfީC},}vb6}t9V:^fY(Cg~^s2 _  Ӓ )z,Uwq(6QqjhzTMoqtG\FH5~pCHut s@6GK@eM4 ;^F!۞f@GCEfGFttzѹ;R>nE㴦jX+<ʗ>q=|l:]z`@ᜈP޹ɊIVDJzFدC/x@{)&~ !Zw&0Hhj h\9`{hY.wHwaNl@!rJursK`oR D&}=Fr@ wYav$ ;DŽph{Z~'wN|Ms3 ֦ۉ:du6.Vޔcd-|y*6 IZ, U (y&2!3԰޹͝(Uc'ǜ23eQ+-@~ߔG+.q߹nM(7i9c3ZeSdVٔb"֛|0Yʄ[mǘ4hijNnE9 QʽX>_t_bOʶ7nb 2c_,? ktË4nJ ZeF2!g DsEd}&UGl,޿rNAt&{K3_J$~;='`OLo#^B=mOI ⩔L תQXӫX5 ]0c'_k  ci7v+_vvǗݷmyaH$f<}䄄hS Ec[yO#NId`R'%|Я\i'\2>*` "d![Jmvd WU%G\IrK ػQ_8{޽.β"~U]1k2IT8ɢ*IcI*v =cjFI s:3< jW-U+{=Ȳ/L7OuZ[-3 hxOżiWTU{YGZ~OQ>MB9.OXfVϹXDr[Nx'IgL.Y<^̓bf.T/YYF#]i|v<ku|j O繩Z'/p$PaIpbu(sdtc&m?L;I=㊱)㲂jR KNe7{,lgӐ vħ/bƚ%~y.'QyܻK*3 FDJO6ma&yH(.۱CZ{Q}B3:/@hdC"䲛RGObuha3L%I &J41vnJH\d h|]cL81$ ǁΖK榄E*}t&5f=E:u/L/Qx>NTŸ*W7VH8<A})u}.2xDK o L4/%QuA:Hvb S^dyXRq* _7D5kIw:1ȟu7;Pˡ.ẑTٴ$* AY2YJ49A=_䤓^7aϵ;Q3ƕ R,HTZzNlOZm'h%JVmHJIT TC4xO$R 5|h VՏϖ\ g4F?U~=Ce+Тգ &P6g+ߍkA6qZnQ SGiml('ezwnXӺ?`A$*\e1UFAxΡ DB;Ȇg+[n;H,Al(QW |W8O/:73[A+zAEJY^$RTs0<%C||E9Arѭ "m N25rX=/ voVBS/,O.&&v+ySM.r2YEMZiN6#*; *0Ν̟aR+P$8" Vg`FzY@RÐ yB;ϖNW!ӷXc:aHWhg$K'(&A܉@}壢EX'U@o_"=)T:ߜ%r[QK *>s&|%Q4lQA@NIjR)g1US*%Sm j j{[&FE*+paRc/HĸƖi( d ĺYk\ս|I2qClJiW84IC3`3+\tgI<?5QuhrҼ cݑi_TEOU\ {('}~ uP4dxr@c?u[H~+>d3xc(sBs%"aLOD|F!!HUHOlEi=;2M='AD!>8VVuwQĤ&AZfڵhR9ɦIA&Jv V7~NO 5MHc5 r̃s'Fo*ub,~4YEpx]/^Pf i (:hyѲ '?IDk7X"N4R+[@BK(@O RHD"YEr/,]eP;OYnjR&`) ISXg}Ut sM`EdE0· M=+ :}:@qhAPu0U)0N`T蔮5X~8SvƠGtƔF4~ DwI"]"ԸHQ\m2$Ђ #kh5 ݄eE45襟RIu;.{֪bbϊę_yrAhOXr" q>΢5f >։F6E6)yzbB%x8|M_ҘMS<rV`DGMBzDz12B'f8-Ip&qwCO<:~Tc%:A/T 4vwˋظ|.o,wohRZ !iM4;w~Vt"o B3#G?E&W5:ug%s=T1Է q(\:e.yd{۵ kȪv~dߑNLI N :B6'ƬMTrm%.$/[([wf ߎuAinj e'@:ɠĩtpƉ&q20ɣA ᨊ͉ДzK6 l*'=yֿ)2i')̽HW1R^Q4_XvlKdzeN ='{C"/xzY)'k4N'jVH dD[^ys9ۼ_Lg4I*Ql4n*ҙʦGC%XeqK?$\=B|.""qjYyYm:ȑM/r}rt0b_JiwR7%}Lɳ%Y_4C^<{stOIq Qѓ n$TxH*w:7ވD}bD~c + E kꛜ@zOןq[T ۝Ga ɛI.=GբM)}#]Yep%,_+ /xE~HϺA]U֗ w+lLIN|M?RȦLJ!EṰ.B&AXANSKz:B焪4GkdEb(A9kګY/h)ayzqց'YF>cC쓠I;>hJhkw84WdMv})33ɀ)NjMf"8yoH15E&ɠ-ǡxwjDQfX]$E2ƅ̛0%<_QӜpQ.y9eTnɧ4Is I IOqT"Yh]>O.N Yh͚}ԑzH/}_>튐:IӖ!r8s(IԠ\@#b֗ q70wZlxƌ󳱄6i rU$q54 :#oNsWh6Bm^hlN]&9v5Vul| |{8њy>:&}DQT5(sΜDKQ5j?4NtxڧDMwm\5mkTu.t}}v6u~I70i/ٖ`_Ë/De4%K(b?;Uvz?}-ɢl"_2( PAeo6TxGsM̠P!!O_{ mGAÛߜ%OJg dMJOIJ[u6j*RѬVsAU?'/ӓEb͚ @`_^,UU F1(*w . Jg%„Ɗ%RkI_29.^Z.[2AY XȻEşLub,݂+\d|Cu0n)9$΢,j|q35P=|xڙX;Tb.^ ZQ'%)jg)p;6 %/Ii&EoX?R o0̓ yY$ˤOcϢ֜N<9'Ξ'A9u#{q5!4>Qݷ**}@CE=OIWn6%'%&6<7'q¬(L5 r{3QWL d'ƣ: _vWz p7E-dH3O0_-Dʉt{]/Dw]8U7߬ks61Ժz:7~P: з*ٖ q]):(K[}GYCOsu>'3&J[d !%Zo*CJ$ v ]c?"3Ǩ${' !ϡ\T&V 5~>#8?CqE#!Ϊ!O\ICuU__ =TR߉?PHⶬD$`Q&=IE3"C&>#Ez< ڢ%?{kaX#*AP8.="oYlhOejOs/zDA,Y4 EQ(p PT["o¹P^LXN|l .BR'>CrN|Gc-Cɪ_3VINbkAy7 +|W+dQ UE$zSW׺PK 15pNh+oc= ĪHeW2%Z?jdPbA( :<.R95`o֕%',5ÿD/e_P^`HĄ]JE T3׸x_&6rgxE K_ZNϻ'Y(; i; JC-~|lIn-Zdmk̊[K8/2wYdZ7  ڰ|0ƔᢳDBHc{f'lOGC_*!]8M! Έ;K'G]ğeD57`Dׄ%r2iiva ,IG8h7|/X2dCl&}c~A|r6ėړRݹCިoOl{xwsXcaC*bX%[o$z3I W&q "᯶-m(8]_mPʣUrC=X}*ۓ_Y סΕjCw3_˸==2\P6qKbO$f&hm>z*G{ST<E7p5! ۯ)c߽_)i&[І ;< owy `$,oC40>(4͢?lZFH -'oI8pv_g|GW^x/+u4(4B7I~Sn׼q'6DԒ͝Ě}HLEyY#iKǻxՇ['&gvlȔE7S_tӜ #>[Qy]X[f?9۲IS,@a}EH.LcyDaooZXt4ҪV hWќ`of?[@#=_}+d U^; NlUW/GQN͚5#ՑW5 $AF'(y wUoރ?ibد T7vNCH DW8U,C:?|ao@ƘH)#]즋ov;?+ƴiyqѣ>rLCŇޘ"uE M>@IsޚmNf;M>Nj~B ._?iIC ')!!.dEpQܠbEf M [Numf2`{8.Uq3N|2;/yXewg'>H}/z9 e1|+qYnoKSr?rW ICtP.C#-c3DyV0З*2:q$J^U ߗ ھIHVo+o;m)?y?-x+&tU@ 'U棂ևI-,UV8T݌*|Njo1lk/ķKR ]aq=^V>ͳ-_Kbګ8Sډ-WU(mGNNtK܉4N~H$Dz_2軉kNW$ؔ8ܪ*Ws.0?<2-.ȼIsBٖc|AldĶU5MNg$lQ@$ƖzD: 3 qaȱZl ćeY1YC:8jsGh+ZJ9hI^#cF={t$<>yO۸UH4L RUfcJLVwA<uɆIuK'?:rg^F=fE5N\<'Rㇼ z4XUUYWw.m]PY|S_q $a2ߒX^ӑ/r$Ipcɫ"5{07qԑ]MK% ''zNjk-'>{bN-(+2B3/Mu# rԝ`O8Jcs;B!\| "Cf=Kl҉L adj _>$$Us57b?5jp\|ټHaΦci7p$otACe]"S`F~c='qe:(h ?$ϛ?βu$Y`%c'ϪD-vY{}^Xyvȵ:A#ۣP3SKTyf V_Y$ L=zJd^Y|N""[;Aw:hLf4Jnk_< ,moI"}NmAV5ʉFQN"x.5$fQ2vp!h+MUlE;+e ~j,<d)0'YYYT&mT& h˽؊aO-DVj&{[0Y&! KEvR Oƙ-@Ԋ5XB$ЎʘQ"g4n ]fe^AE–N"h4 DGvWȫHe :Օ,y57xVTS|2$6A,\!M܋] g5`=NB_ϠцM2țwѷY+y3%04c< y)3(fD@yN '^ƓdOx+z,!D"lÊ("WIhS4J +U eOޮ΄2wPͥA$PuPVDkWݠ/tD ieJW0/p7Yz}KaWiD*wŴ8KSa ɳ8hD~.۠wM$R26%$rZNEjMn807*z q9BmcauddxҠq]I~^p\NCó8;=34.R+ROK4Rs%L?)|=q$g!'BP$&8_'$BjDpjul\`x~nGlT5j>\`|!aj 7F9:#\mHsӡwItTpjcNtљYGݱ_"w,n9/}vGNbi6I4)YDCnqdq襤5m􁦕C#j8ӧ}\9_ ^H pcR%<0ruP&0ʿhxƭ"qzr=Rһ("TVrn@V _3UI-zT?#o萝+ٴ&tEK-2:dԠq|Q$\Ҟ%}CaX H|D^{I$#b5HQe}@}G=՝DC̲ ؙ2b pG1/.<IPi(>wBsJrb|q]R8U$b%OHe'o3Z wl`@$HAe#OK $ܤǿ_#<0X Z 8 hk1nrcIdJ'v\9vF@`/&Z>ޚX ܛ( zfRD)a7;}Gcj='DE .%'zՠ|wޫ&ȼa6-ӽh x1dp"Ig'Ab' ?6ty1j\ FWgB/K$6r&?Eb#gEvB$Ȓ`#84L2`W~TdXN(X5SbNINb'Uay3_w[C aŒ>cB3Fd.KF^uN䂏Ix`cMarOq8!~'tu§9۠NZXsq3PME& 3׵RL Q#0!U(-5ܳS5_SN0-G-"c<Rvop?$m!3kSIbehI rjWSi=b`NB8t<3itoA鞱-@K+ᶰXWyJbwi Z*8I|*"Ib r*7Lijycܵ x-hzY+ejY}&w- 6Ӯd8 \C1+EWoe@ 3I]$<%8;a'GTC@ /N8Wg":` 5A"ɭiBdY: E+x6U'Hc*S:0ALO^ 9" ߞVz`JEE-ij-?5RE pxj(m njր9~=og,EĪީ&1rC&z, ƨ|Dzd1=Tr&)8xtR1olIbI#VU\G=c7^$/J=MOK'g*`R#gTN<6Ug͐ͦMЕio^!75f~A 2s(NW z=+$uΖl qqv_59,HV-TBG1?U\#?tKP"PtE5-QlӻvFwrI_9SdlN ,R/ c 8޴@;T4UoIeL t_ ƗKPgmItJnreT/Bn[b^Ϣ=$ M]={Vmi=8+?y3 s 9r[,0 #/%2 3`s^vpte\st_! zo?AQA$A"05'7m[zAkw,E sop} +wu xKP/5N&zt~csϫPwW )HH8g|9B}}?6,F| {ނ p1Xh`WjB|)!ZA6΢S^]E3ٙ+AkPMqRc #CGO^Ҟxk=(Rd0`vۮ/UX~ QL4bɘy9GI/NKF5gQc1γ o"5$PU.Ki{xUJY{rRD<5YQ ye50%ܪ#JX%R `Yq ĺ`o˂`}pi$$R1B~Cd?;bYLK'Ad*H-P "˧1Eڏp~xWh"(G{L0*Ml ;4>R8?eT\KG~~@ &J 0&{b΋A ݟv49/]R?G^Tcȳ@jYɉpulVU3M&gDٍuS?JGڣd.Ǥ$l0Z@Z<#JK)K@:cPL^..^1ܝ z4D͙M+ӥ &T:<&&`8) 0 _G dҵ)lxϛωq[4i\սdā$0oy&IۤQS7wjL)9 ]i= pXcjM#2t6?}xn[wIGȫ,Z׾G8S'F}ce؇(7`R v1&P$#oJ3u*vEom >&9潣 $d*uENn&95kngxCu2Fs*{*y-5?OaaZ5Շ$1tV۝mkKUy`Tv rdȧQv*Ʒ4;<[8菼';TL q;00!/bVٺ63L {CZFTlgg7na!2;u cY ඳ>Im:H%[uA`~xjJ(_)v1uib=UY'a ȚNjqmyѾΫu(1Ou퍻<;_=l<3qo4Oe5.'X]XەyAvїjaKwms;WQtgQL0%S_%p4 .YV9u (2@ypR`YK2q 3[io֘ lIxMeLxX&x)sZzO7 ]dC Ƞ!+qrtLĿːXkKΆ<6W=rhr\G۲A*`4fqZE)yT"$}7o-R!| %ЪeT@k3{oy: k̄݌_@[AYvS=J'ouku7mX^2JN_Zm@c0AËXJJ.1A%p(r8D ,ŧj-M boaJJ(֕ BxfώMyVOc)yqjjU ~Iӿ%g,)n<"|r*RBI<DVvwtÙ ڟ}t-0 @R 7ndÑerZ6OP6 ˆ;^W[,1;gh#N,4 3LCkRvwΛ4u&oK,|>]Jp鿡!4{8s*5nbZl),SWz)0Eʬj+YH0O 7H}QwXvyÏÔ]3<;%:ARmcN)6o,PDS>d/J<: $'2"&)퓋@d#fsvJlJdf6ܤ,DǙbRYט k4:>HёY۔L@C ʒ`EAjbH;͡eׁb7{;)F3W&/*ڴy'N `w{_ڗ :fbq0?CƠ֎1.*jATyk:ףFp9B&Ӈ;E_g l{a^- N+5/Mmȿ7#CKb ĵVO'fyu^r'% )g]oQ4kgMժ6?gK̂~JY<| -Y~y^(b'otE'VᛕX@7 NB2RjKH9/*}(uIdwJO.%by*i65 Dc(V(VE}T/Pn0MD5_'*'h MD`t*%KXj-22h~R1huNsa (bzZG< zeDbu{C$4|)ĔT41o#?$d- Ku)\&n M@j[v2k#Z˦-My'5$;0c!DP簾J\Ka <-qX#~c/T/i,X ҫqlc~d*KPw{" |l܅R_\ QIꗠh.%KU^o7<~:QTGG]ǨI0"//D5mUuxi3QCvYkvxkVǃج|Kڴ^MASzAVd&r#m ZA}r g3 Y:jS00'=x{=%W;X]Φ#B|bٖKuHƪ}M\/6Ƶ'y ~nAd0ipdwL#є/xן!Z`H|ݍu^$/6g罋B?g+^% ٗza/.Qg`?8?Lg~$3 VVI(]U;&:֐Nd巨} UK]Y9r2]& `LK \-)>kb.;qj~kA-7̬^d6D okIXX:k>b Y_JO?T3See=t'uZE4IC$9C] XZyw)uS S -riLC &Ɵ;zwYdhQd$>G-i.F;}U{}=4.ƥӲbAz7mNVܠMS\yMغ9xߢ^ְS[`ehUW.Eׂ0{̔iɽv޲Z9i:"@("7pVLF:Q޻3):5Kz;%(5(VX'\6 R;[^+Ʃ4TPAl5r=,Yy̷Qc?Bsʽ~7CۇFacnۦ Fxk`*zֳL#T}VS;H H@iv9A3+,J |D;fdu^.{`QET4^,3ٛ~njA.<(^sn N `,kE&NmQrLEM6UDT HsC+: k#:μx-iwJhJީQz:5n7].<㇠[m;!LoJ:yخٵAujg _ Yf߫MMOw}<'Ԩ ԏf-k]O.ϤJv>/<<3`\쬾-kBT(.U[(ӭjN=2Z)z!1ՓN5r5_8vAݳ5C1NgrUqBӝL60Mu+H?Gt毢yp]-Q K2tq@Z [Dxj#!!'j ݡ*[m`VSMZͪ9Ena~zi=,b.B kA0p/R57zTtt;{enCb!4${[oVd/YU5`\(4~"oP"F܋oe3(rR-HQkm/qidl7 Mu1e>E/n(wAo%5N۠AsDR"3L,߂vy\fU5=w=&# &: Qדr1O_Mah$&q3ajA]^'uzEo1 ?˂K0SSKG'.Ym.[ߕ|eiy MKԕ Fh9)k`Oq|^'M i9M8M'niR&F/a$\A4A{IKu?7@˓ gu lnq\ ,nlҩ!]s^I!l6FCRP pmXf'` uiD>:YMB[xVq JI5;mIai9)6cC`eNBqؓ>ۓIѶxK1In) &ɝ٤j:c1[9$&%n-oNIյ|S'-99{_J!2wpu[+}2nKl/Ē$Rv! ~?e2uhf͡LV1v!o=[jC_Z 8$[rM*aiYTu;VtB\XeH0?ɿ?{Zd[)mtdvQ'ˋl'([9J ЋT-oӮ-;ۿ[ŢNMpi3C^W%k,o:8Lb9Nis{du| VA2ii.j݄zZ4?79Ptm19<, Hܤ-%c޼,|aC=(Ww H-Y"ۋ'iX.Il'aȔ3\~&mDGo.cxsDx3|Dw :}֚Bmwk cŬFfTnM̃WJNx߱%63l[G$3fSO6G[?oٖ%֬7R&1oLZ{RTe<[j37$"ϡ$~ .=?:6L\K:+jSB& S1]k঄M25oZP(gyr3{xBMӬKH}9YP'[65 M0U.:B'CM@jZޢMΕF2A6 kl";y*s$Oӥ c&%jyL|qȻr0# I<*}'iK R 18bd7=:+E(`;:__~]md(@|C<esڗ@֪YxQD/~+HS'%eTYꬊ 6:v }yUꇈpr6A=$ L{" Y_x|>At<, ݤ!`mN)H<:y#_MEf-(}!K6IGePhNIp%u#[jH<;eNRbJ"s -–!K尛=xo T if&mM? d@ErD X B_A"7f遼8$a; W]$U%8$*iZkn߃ (, \dރr hJl`=ondTBiJ SmF-`i~K6H_g'tb$j} XF'(Хn۟&vDTPzO_AE .`xX^u.`j\rY!s8b2֫~z| a ^A? s?BU ydK! GFiZ Rz ˗ ҚV}D.L@)ݚߋa&9tď*A7+̌2>T#TX~9],ȕ55Xg Օnᬃ L&7e;09V~V&?%83UǗ ޽ 2,Vgg9 RnF.mj~8^FQm )8^o|rń@֗ SUYglKWs.9 `6JԆʖ݊WRm='p:< 7SN@I08c]QeM^kZ|ӻZe,G |  {zQF{e9ԑjь ;  2dsi7NEvwo@1_z`o;OR 皔kWIZ[N!ʊ XӮu)`֯?N_aJI`weX}3r?cJ) 9 pϧUm*$EE?ZIC.3HEV噱գxuAǣ-m02D̀"tU%{&"EuyO,ҍX9}IU!Q{dr:jw%gx:TKZ۪nAЛ 2|yst;_lXgT5rWҖ %StwzQ:Vڽ(S"JީY9eza; &(H)PK 2ۗ,K 1nxt0ՊқNO9 } ]߂6-,_q[!ai\.c 41{)K`VA) `T ΖMA% /=Ы);bGüL^hi- UL%Դ7fRcW)"K禮SSrO1VƊʠ/s.盰,zp iuMw9j7T;d<VE߂7 *qQD.q>IURtn"Q :7ICi?Y0f4 =bg"QXFW9dhI`M93H@#4e^đFY9sdGPG32p;Y|nďIqsFkB rVWuVip RmKo!}2v}jO U tJc"k[z̦J/2esi23d *;7@VMٵgz9}gd/)\D ]y"7ؠk^Pz8f/2y44*1N(KXoz.9@N`nI`&ػ~ڶ/ tw -!ԛm TA]fDiU@NJ~diz)RO~ E$eYTe,BPd}TQF5JkiiXC[bKމ+%ݮ0MXl|fcII"s~D".CvAxY҉jhLs҉Kj2+A%,@ng+:ZK?bIUrIpy_rb׻Y:|AoiJ/ڀ_eFmS:ɾA;@~斢ͫ=cK4]y%/%i#s[lɶN2:%'q?m ĬANδB53{IM~^䧓iSfL:(XQN`"txt/fUՓ4keK&RӤ/jwɄdȏ'Fx2i9n5oܸn\"!`VN=^D.B]|n̑9{ku  f%6AvuKxt&ɫ'ss4NIީ#cyoN2Ty-F \o#̝#"*2ڗ0^ K5;+ S>V !)ةd/q-._H"JGX$iMġqK"I 7EM<~C?TB r3\$qy El!cH]iW ;[*9XCl'Pq2xAt#Q ͱM4%,=T%tH!&zaRƗp/_j4r=Iɖ/ K)zoT[O7aI2'0Y2FyˑCy΀V~ ֮ zzA`k,U$8YR&KO*}_vQH~%ظHH7VqnMG[^DUπ5| ̘;pMfvRv%2MiG$2aύ(%C%g$"JU;oMW/9>wy外$ R]R+(9M-x&bcXC5.ֻ2 W,O [Xܤ(RIտ<^NW:D\I1c/UHA,!*fΛH[àKy,K$?|Aʵ R,ExLϯ;ҾyfUiv~iݦ_ȫ&MIaiPh60C'A/fY8ޤEBKbQ Ap,3 ̕ Vҽ 7:^;׿BkI57Tpۭ({$_*"nE'9F+ FUh0sTX{j`DTSNk{߳J `Tq >+/.zDmj{e's"|{2-m]\ q u`yC PzP ;́ɾk}?Q@oӃPz~7a=EryOR%"/%zڱԂUiªNky϶y*WrT'Wi9sf*;Tvq/yy=nXOXYrq8mNyOZUM~Sװ4=u-O'euU<]eig' XRT9l9gAt]ч[EIХ=0OBc2RW&J'G.[tY#N2U?[d)r.A5mtjDoTn"_be>7??> rǞ/f@-9h\DKFΫ54R|q)E+{at ΔQBa׮ܭ ߋ@b@=1IC&|݅ qq9&ԟpz8-H VIV2 ,mN5cJ1+[C/Ɯ4UÉyw=  PC\9f,Ӌ@s9SyO?R3kRYtW EIC3,͚9s^&XGfWܔm96wmDʃ$YHFIг[OA6$ [Ĝs~Lh|${ 1im.%OANOc TN#cJa %Ԉ|!\t|k,l4"j[Mif̏ E||eip,JkQnrZȏIzcVdz1ïlU䖑 U~2egz>"o\6,V 55<GCR_^/}O )~ Vwq׶ q_@f=EPʖ~Qx' ٦~t;^X >A׿첲/A{`Qz&QM9 "˦xlUuS-j|Ⱦ3.>`_`1nQ\V|A7a>ˇaHFBKJ[ԦAauYi>F4?oܒ6M&4nL) MA,4%P+2>K2t6 LTEv-'cߟiI "j^b Eӟ$Ǯ%O`<jb}kynkYk*P ϐ!K* Az|ZvNҝ&֬^#,j s pn|\]71h03dShj27@pzgy&ْ>ĭ&u!ԙkWAg[EBnHծtFGE##~(Neۍ[_b:NMљMD0zn3%s= >?(ބRfݯE( ض'=HdIUD.(Y&ATvZpMfKcW4f./= (L& ]-EXT&wߖLv,D l><7/G}N[/ ח$]68 DйdҐ~}»2H Zu 7﫧+'&M:6æm!0Rʋx$*^$BNķP$K"*7n O8c3YHIEK^E`GS-&`|IQ4ʞn.e'YWo=ߏꚅI/ aҔ7SIXΗׄ0v$mL8T!5NUHAʌh!.MA5Gڂ2*7 hѶފbّRP`BJ D=2h<*-~n}hDY0*2ZpD_A؂(He` 4IR 0vOTeAOrH*p J9uϨ_/(?uKlLEHV]oBɏvɡ>GO | V= oԛ pח IiRUUk%/R:IIշP&] q0iA(:&.R jfph CN",KКE 1n+=4Zh 1zɥ}re1C`b4A=5`P k7 -pI/&ʏYTiz*jVI\+{b2yf@~.RpLxL*y5em'b4ו)u.C/U-e#L+f3iDzѤz]zEe-:[ydP`g7m0jAPFz9 yKtUJ W*WIEB âO~>9cOB[/B9kɍ/Ûg7x%B{[^_N!Uyvtc_%:P%HC6*J֋[YzVw~?S#mʪ n-ҒM( ԕd~ʘ?Wi5U^kJAXP}KW斓*2qߒ r(ÕpKl+w5eBn AT$IWɧ)eBů&\WCT |"U$-n',3;cÇM5U%õ ΟeԶ_iT^?@[UZL%_%wf) həVL1{J[ ;GI\IZ ۼ՝{j* I3' 8sK^9$@J60Q+nqg~!;|)⠡$C-A}jG/Ҕ7^&PudA$9kk~A"x@6ͭ'J_yޡSJ9RXSDsk+ioRQݪX ؊P&Ve9`>DJny-mL d$զw<5JDMZ~Bhm=}Py]c++t|oe <;A_"[B2qJ/R>r1VS-E`\@޹iRYn&zx?R\%9&!F2X??r 64iY-Dx1xMm#BW^oawx ihmRU[D|QYLLeqZl{1Qh3YPZʻTU.r癧ee?BK)3E` w#?(r@Q<_ȫXD/mA-Dde+';iVBne$gJٝl!N#]*$O~ł'󲚻dS.*ٛ :$/+"6ֻePyCPC7(+VQjw K9+]nJBo-G`Ni("Z ,ݕZ7(H-2 !!pR))kj*Ghyۚ)!n)%tҧUгHYx0ó|"I%y噲/kԕWtJo JV"@_cNlyaQPj#A@c:<V~ m5J~$JZau|iT>, F/J)\tHe|OFKuVEzA\y"dAd( =ΕYz'< ඊRkZ#E|eܠ yQjw A2hrYF`I:>QzѨ4J-+7aZF,ՓyRXiyץXp ]*2^`p. >in }C{#)R"DAa㐆;:35#,|d dA%V mы8P ?x&IjX`d/A]/ߢd 9* sI0 3:%\d ԡ)xݔK=LI L|o!3i2OMW7 K<,M'MiuMۻiCqJ"Jce]QH\w )M6὿ESe_zx?9c-1ix__0C17z֒zp 'c\ UNjnL,4 PU2&scF/֟7TX=dZf& R].٭6dRR>o'$#PZei$E>f^n%ҸPF'sɒly4fRͶ/a^%pPT֍Oϸ$:?5iҍr,i#dO X/M(1]yޡ-AWghu//7A Hg Eu>J?˞>X ~rzR)&(p. b"''얙{8Cz.a d:_өٹȎIhBwuze]R"Aj,fkGFIdDKd)X ȅuR5| ܙi/j(l$+-]>* Ŧ\Kh&.ד.-"4mdښ C+?C{K=vg?(KA0mO.ٲ.uḜ˄k-,Q4K=kڒo.khyw~ ,䗦KmNZMJ2'jmj,A3cwuS5KmՖlg韟Hu EM2S.0ף+@-7վYHf# {5GF^,Qc빿ه5vGG9%%c"]y)y;rO%&f.a bUg^Kбl>K`28z,An-v~k($Yj[S f8aR4|. XZ"vWc`P=zFuu?HflFo2kNyyHfiLaՆ+œ-@XAJ*N9|3XtUeZxr _[Lَ bnrw cb߳`h_R]ŕilZM,HSP AJK4Ni곐ߏ4V<γ7lD˼2؛Le#8kr\ !lf6;%_wRwDC-jg/RhePe!{vy "][:$[K P]љ#Mݙ< hPeܯ`ӛ$<ƭL)2ɲx: W&W('YqaG\+63O?˼p} ,:pJln~P*dE5Syإ^S{jkڦ'5 sOv2KI~ QU$ MT_MA08q s^xz7kI6A qi=b"o$Im (_r%H;¢[&C*OMpgfI*[vIMΘJ^kމT'Av fŠ]&AX$(=7:-~!gS]Y|2SV> 1ڎc d_V &:Lb`J$P αfC$|!loVITl7\:'SJvAݔߗVzAs$Fnھ|,=j 7ƫUk_qiYd):='ՆJ XX@'@ Nbu7قQ|ef |+ZW#MA*-8q*?2fYn%פ{3Ա'YlV!|TvSeE=d,:kAMj+5&̷ ¨Ibnϖx򬊮h+d1Jd/P3=oRzh/_I"Su[`sԟW#lWd 5/}|f-md~ -e:_ksJQʫ27>۴1h_B7==ttbjMҩ u0ߧ-egM`x (tvJu8ɫ9Mqu]E?WtW p4WWoJc79o6t Iު칥9[v{-I pDZ5䍧VtO0 ҽջ iN2԰A꽔]z6jr^;JG" 9yә?*<;c Ol$:pM_ĠMbVCc jyO}l.'xc9RTdjF {~d-֒.Cf_7 |YX#%A5=D?)b#NJ?Jb LufG/iU*:NRIYtZMb?wrd^ `Նw aNB܄!s<(xK6Pk+pkd/٪P6fb@xʡZYi̚)隋Kŏ xߏ QȪD TyaZͦز6q F|MQuI[3Qǘ lkz ^JG RIUf&aIp) Ȗ«'yu2 畢Tguҿ+F EѱLwʥȓ+TC:')*IUO;$ ENB.5~ e bXnk1>&"M{dx/A0pd[P&͇\@Ӷ!t!\Ɨ,9|OR۱iK6YKj_Qzrax6{I !1e$YQ |T姀(z<Rö7f<`^r2@.|58H6 EiI_\& o+}p{'<_3 +̛6{}xsxz(DNf*$4.wcRB 8xA%U^ ߄L)N^gVn\bA^mRC&pӰCS/`ƚ%e {ǰkIzZw-aԶ f6jѣOﷹ)nx_\1kMA71 4M'X&paD.)2S}67#gU:dϋ}Q3i U]n~./Ta_R0[92Eʫ$l q:YLRt ',hw%e'fK TI^E.iH/E2WRLme͑?#Ta4(B ń Q'JiT(AZ E]̐UVhoM Ԛz@ۯ~Ë$($+"Vutn/BL(41`'M OE %"$"YEV߂p쟄-$N(w&]E~X+>cq7ƛ/7OX6d'y)Kݷ|RX]`ɄMq#*M!]KGRIo~T Onk %MBФ \,ĹTLo_>}N`$T0hSx'b+'TIf̓ EkYCTd*EmckcEY"e E[B RO+jHW|eJ-3}F&s(/66Z'@ު-SF,: BHzkbC2&Skz}?$O  ^L6G`QL/'A:X|؁Mrя,،!Vy\@tqZ X./ .H g_NusPt<[ѡ҇KvC/$QLF"w:eqeKWUJ;0-:o~½;Ԩ#vKTʯ1(-s]UEL6dL7 ` D85ee}N혋hIPZ0Yc3N?N@An3ƗD\U{o#A/`2 v9l gMxbNB0S_ FQ[5GOvMz(äYpP/ 7ĘpIbFϑdcFw><ɬ8vZ+z?z  |ԩOmÎY'ap~"I']n IuKa=5NZ: OCb̖m2 )q"u\#ml*YES1*]Р@ @UkK2Ӱ"g뛌LZb.E u{KSP>ԩWHgpX}ľE+ߦ 2N 2(QhF#k0<~ˋ{yw]HI[i=, Ghb*L0߽^"A;)#:IaỊi3obN2$+VD&3Ќ|z$HzhZJ̇% K`L6^KP/cBWaGF0)h8Y2|LϤ}q*IeY'" 3Lf.fgULuBdr9a*rpLt]}Kef"l$O(~1 {'@-`eROe#{e% ֵؠ[X7{Qowزt%d]Ab"ɗWWLIXՋTM8MNWoJq<տA}ɩ! w.:[S8 Gt:2^A֗я(t\Z;˜EX%D&iL; 4b؝)$[p'Lح Ne | b,I>e7X=Q~N$Y(1Ag jU`,T{,|tT{8f|&xVEXW'x'ۖK,ߤDM?e%͂Rϟa 8 2_NbpN "Ԛ2Ǘ,9j˫$)Kgd U`.(cۡ к Q \YNPM)oI_R&9 OIRAmwW ^hzҦ5' a.grRs;6ϝHMR&IܓH fj[c8UmVxv7LbԌ95cHKN8D:Z2A%ܱ䴉iB+dOujiL3{tz%Q9~' A5̟ՋG'U *bKao8W8E BwN K[K^Y,u | kv|*,PW1"CP;DDapl8AuI:c$H~ R)A'` s&iر^)USu}r͓˳⛄g='\9Ji%(RiQ 1sS3((3)WaHt$fN0@+ܨ&sɘ ^G PٍQ*"]$ k3Kj6 lE$ZRwkm~z8iKW'ŭZn$\5(͸8-qC1Cõ\UE6'jDcg'ߑ%5`IvfF656\/n{4SgCzX,m o*OYcK$2mot:%WhƓMQ[' ((b(Uf5lpI[_$)h=؝TSslQuu"cܷ4BC8/=S'iGXteh9vBС볒 NVޕx>쎋pLV4e5@u'T2(ԩ5; e NЕڸh7h\sCg$Lǐi~1%d9A9K6=&:7PTGq[F fl,dH1Qi"ƭ-=do j0,lJ&,ˉJ4jhAĘ:U2Yc0Tκ*ߓ_difP~cM(@+gzDBWn2YP֥#DF&|8Ou`atUv-MG%H '^i_@G.zhdoq%a6Uc' &e|hM"`CJ7LoT 4TSӬٸC_l&EbݔL5m/1)?IRB7CyCy3%hNh[ک~%0Ne{gS(˛YuCdPѴDR&rX~/Ut;QmQ:N^" dkEp8QuV^\vʟd)3Q[%H XRc,.[9R{e/W(z}SsۇJL02YzcI@)@&;YKND}S (jOjMxuOP{}_N9Ik}I׷O+} M.8:KCb*uN(^R).-=EuNzUB+D1tЃ%BNٿdQ-`QEm6D@ʂxITTV& ^/RXF2ʗ5.&bwd'uI."5q5A7UzND:o(\iNl`0-ƴqG]d)j: í2;ޫJTT>(0fgKa]o_|{s sLN \6ȤEyw'+\mBPCcy9d1cRtdUzS&vgR : 966J=7 }F7;Oiasn 5=u|4,HۖCې5,W,|$d2 "xxFRo]GUۗ =I$E&’wukRߛ3[[= Nm>-FLGje‘}v}URD"ۗ L-tX%JOH:Aq''m|IhbUNPpNKϟ/c ~ϼ3+ $?d/AQ N 7Py\P^'6xlxJw$1(碙qM 6$iCKwVΉ$K''aU~ҝwҹ)X_D{d}{qТC"/ȠHj[5;aE^sL$7Y)|ei"hdzy琉& ߓ5bA}˓ehy}(rv8Iܿ΅A$ݔBV $?.@e8xKX;AT(w ZT{.Ddl8IGN*2KU<[G4r$ǵ.i7-ZqQE :XM8 BmO'R"^C$1)slc* ɒK)E_a *+-*>@Mq|A4!uP$n)\(4ۗ|=~k7\L٢JiI GQNXP:4Ut*݂mrlIzL]Lwl*E,w#gh9 46bmȭR-0Xۃ,z syȺ' ?ÛNX@h W/AƴE U]j^BM9RpL&Er9_ )r;Q5YQǃk \3־ĸ$jx~+Ii)Q'1֩E&`jTSeu[׃Me[>8)ܲyLLZQIG~rAMcH8$-DTMuBIf^RX,U͍U᜿<^wTDW[mA"ᤱES՟'mL."h^DyRk %1Ɛin,N 'XHIBo%j.VrF7Nm9iL^cⵥB[Nn֩6`5V5BtiJ_$]*c}.aE3`51E*=%ƽg.Ӭ83,ԜDm%h"u~)ζ&ylL"Ỹy]];_Ę/E6En{+oƺ%%.rFE $YM4riCmwGƹ:D7ڤƖɝƖIimc"_"n%adeۤW/ 'm}kI5Jԕ`3s JNb,alTߕ,*0:j;%q,LٞY4h]/}UwE dw?GnqȖ=NR˗4u^dZ2eu vf='_:$6MC㺞xDs2xө6Rxɝ 'AG˼9T$,{)d0J9kpE*ueѾ qLƫ} 2ZtW6Irxu}],Kُ>UkF1C|n.M@ܥpuJ;2ö秺Wy ځdFzD [jy5mb"3Y姰ɣ:Xg{N"?Bz),l`tz'}_aIx)?d2Ks1ta[10X3=QYwn޿Z ^^r8,^'\d"=N[_o٬`2螣cv; s-'%Kߠ` Ea0.Tz: u] A%ڬ,3t0?P#K_aЮ^$ ӝ`$4 $HRY/fF]$\Ń_EbzfVJM0qZaW-n_J8Y/tRۉ$[>NhEdψ:Ֆ>c0̩,坔@DW=秪;49PȐ9AeD9a%ɖu/yiMl0i+',8AlXYׄ>Q=R &q2 %d7d7pWZυ/5=x4N j"פYTk<Լ&P*ILeOg' *'6I"~waQ]'?2}NpD򭣭 nA&H`։[N3r N;h}*EЉ*A=3(,[.8Y_Q^Fe'cNje.Xv਱^7Mq9d}dT-K;f m ۷-=X+#{RI'>mȖjYЦV5.6\K{BM @A;m/r<j.3G Ӥ,(XCM:L[]aQIs:q\ R$g_KjϝgFe 1MUAόlGrGhAʣ˂6俓jkխ9_^ôB(C| 7r+ogЖ.^a.ى(,yN;ݩ]ݱD 1? 4+݅Cn&}ujK_{ar gNb\B oe7~h*g6De@gE5j߾bq~ƭgPi)5D9jz3+)qђ]wthFqhՅYCpf+H$O7tss4Q(onN4\f&CYe2 QUk?߬P5-r؟''ъճ)?׉S|$:J8;%8I)5\nJ\iё`!ڕ.b.6GjEe+ A `PDƔ@狴D)Hr{s폁nv|ȇMik2`zҘZeS}$W%:mTW6N R8o[ N&`T^jy`g%n`,p=IÒfEϬ0r >TLȦ;fEڝigY(HX#"!Fr_Xa̳BOwLCSHLo=qWRէbGrwbmmGɫt2'q~V6H,# G19G[_תa7C|cI [bANjrߘ܀m }`tO9H@Ji0hMv<ܛZ1op 1ӝ8H}jdseQxŨEu3N}Ix~[ F̼P(~!GίBsv>ϽHāplhjt& h&3*6  [ įV=Eh8\qU}~U nH͎4Hz޾@ϑC$kx$]>TmR#o'*ioM0%*{w_[zhk?W%8L|@[Zn];OHVK[MN|ķQNvK6'ausbL4NiEi')6O)7' "ӋHy9,ь}:蟿G/MĀOUVP|lظq$8~M1?'1SrIL5enMNP?$ ]DD =)pxq|e Cu+2_E^*N"h*wl(|ŶŴyTk^2 ܌_!geXN3<@'Z 8i[]md'~>,>%}'z,=0;X K:l̘C#9e4V5x*Q򝂴vBE~QljhHgk>pJC@tv#{e7'7t4{>{W0Y.#ÉHC9=*X8H1^w|eP`{:H cO4k7ߠH!1ԋ|f|(;.\AƣZ5^*J-Ӫ[v#Y+tn$;LxԅTC|xEM?E23G# Wڅ S[ZJ~=(UtۏIbw4HEK<,_dEB7blyݰO:7tCLp}q<x,p:/_,kZ5+Iא寰mX|Ou.T8q8GÆI6@ǬaDMwxS EwL]Kv{r^BTpTgCw6z[&;ipptk2;PHeǚS f# ;撣B{&X>,f&2u%>-O"ᠺs-2]B]lBo} SFRٝڵ-Ґo^ʇ޵Vmlwr"-q/5i"=~Nfr`ۖpAC]FzPpn$F|JAkZo4E$ )_0XV熠9E$TkqsOr}'1SbACftgF9k|N.ċ|$1ɕn_a?{@!BCeh3~d`d~}7I jZ7LOq⓹N-4?KćC&w<)+05I򥆒R[Lvpr͞RwR S$Zϫ eXHCCZ$dĔi[CLT,.fX n-?xA(t=Y8LSUnAɋ{N[3[LHCMT|:PJbRo(pE1c3S"HMQ!yDE:4T(,3@)RM(Ig$H_ŠdIUaMr5<N|Al}'bUG#BGtK^k*u0Kg2gg0BjVQO)NvqiMi-d%8"Nbwf+8TDWgtؼ,<5ԡ ݵ |x\vhB$yLC 9QyݮC+6qT+I1 :|HXL.t@(Gڦ?3(`pFqg?h$bL˹> xJuk2ݸxZѠRC",7 14H;w *\;uS"-EjIG9Bg&ʐNQJ"܇FLSNb7dQ>e~.q1 V,nluHdZ scXO{א o(ҙ.I0zXɪ)X:+Zb7AGA5jr=-1i‚P j{]-wJd"5g O dS"!A@@%Ou/6(Pqw0(]f.HdGaIIiiH izb٨{/IB-"2}$ B$7{ <+Q3+%jBIF퀼JcG_~{ FGa}1R%,B(#i YS={C`8| ̲.@9>::0CRl1iA]t4߃wEEB}c{2@l@³.̀8* 6(U~AqfN!!1}Yd!x+evCavDڠE&FY3ɦ^IbTQYhg:#f@)m2ԞMj]]mRe"RԥM4Yo/B݈ s"?tR7"/|iftyPx,ۤU-'T#nWȢKP=uZWҴu9)[&Tԫ]!ޚmRf$xR"*P!; TX&'N0_@iaG`hc)Uq*Ġ~Aլ5l1)H&K[B`ZQjY:Je 7,) MS ʦ)Mlw9Ukan؜3{Ҋr=_V([|FpO]:O$k"jAԨ+3e6)R=k3#򐽯z\]P _i _B::޻(`S07@%(\q~$?dюE5>2mQQ"aR.Vi RCX5l(N@$UrB7dL sh(Cz}ӱ^;&N(V2ࢺXr"@:i[U{?R7r\.󌞿t>E8T9 MFF{+ M';8pP4˽3M6[9 Y4oҊQA7=r,[`*gu =yb! 'vG=ĩ;ꡊɻ i W0TYs-[GdU vf݂sO~NOğ1] +4]Dz~=4?.HcH7gm:=s{ůL=QGE|\%']KxAùc{m%7tĈ #2RHvN#d u$^QH]dE ߏP9Ԁ'?4$3K'6|ܖM[<E*>blm I3 ! OflC-LOɀgD!f-o\[]9T6,e"lG&-C8 $ym7F̨񵚦 qqo.|pG%aq_G_HOԅ5CZw\ژkCtE7LxHGw1..-DŃyNv7t܊9A(|F8.[$ԚRʇvC& FŸ=H3TyH<-s}IHܾP+:ߩ|9m `8:74"*$?- :DZVPlS:|خx=Q5>HfsSF"]ļzоd⊛^LIb8[xedJMB-=wՍOqِ37Ud^G6Rsj0^s0̑[$klLц>} q|=wID.hFpIB)S,g > }|'>o}49dV9i?dć&@h i 3Oj WS LDU'[+#qķ~| ,Ow3Ó.-q}FͧD(UK$6bN$+n~'U2E$~p]<i ;?NΨWK.x'`-;Z`OMyN:47V^DYIUh#@:z1{SE""h)l_+L^ĚُkiRyLeI"VQH3j<$Hm c R II!q$Uw,/ MdM"iHʉرITdsըwMhV>ֲB7F}͙[NbX` HT N|O_Y\ Q<vU*D\=OvhK:z!V묒LHɨ8A v庛Wax:GjlACR$kh Y\L"!&Pj( T/"!{h3f6#3/zw a/= ;Ħ|;;ޝvy Kd'F6̇)Ķ|*Zs| D 3@ MYN""[v ruox'jEѽ n2_JJs{E^B]56hĨgܪU2x$vWFdNvf٧٣L^$tv;HwɤU򵥭qXnُf> ݇m?} %lUmNb"юǪfݢsh][o 9(yHdyEQFMI b}og ܦ*hؠ\Av;`+[\-mKD-:T94CŽޏ4=m;1zɴ)zrmRrjMwl֠l )ҙY0HCٔ6 Q#9Ό/4\wC ipޠ;wHwjP[C@Nb}Oqd`/̔og[kN}xyf /6$Z2 EӈAh?1jfŗ4WΘAk''.8 &h!FN*<&n;aIO!k/I].ի*u?$2>A#Cf=^\\ta}I}VK$1oцvf""vm?#lehT/▒ B#2Bwr3Y5v q 2d@Z`vąvKU(b'\xF nAޡU]r?jz$2`o4`cZጦ$:2ʀ|$kdCr-'N@6Gv רճIn XpNNLn&L6Hʥc'ؾO 5)p-8Lȵ|ƾ;o|^YI񮋄,eHڵ6a ]ˉ.,U/ .n3(3$P!%[&s7 ْvB[7+{ B- ESjKtAP늩s ő=w9| -Y4M\ ].S;ِT7,`> sNRs)M9N"ngttRkL\;I zWCzfh=DPyCtD-y\("z(CHH&Ч ZdA6XC:/ٹIܝB{ L՞ T·B/;E (;r@U叛z .XJBfƳNb/*ʾaMc̛XHGJ*}hOBc&YrnBc7X Ol]r3gAcH`0o:AaF~Hih1eXRِehXR\:ɺ]LH(p]lQf"f؋j#S IL(~R=p AR.l>VİH Gb#!74N"TsO WI4RZAr@6fA !./>IlJ.(t B\eUQhx%Xzy2-qw*Rs/5ԂzWIg7O>V/hu7[o}[I>6OJ7:߉GuR>汝 V&\>ϓYs"P뺉`|Ϲl۶c-wV䵶.~7 }(W(v&tt2кVuѯEDPW“.fP(Iyb q@NZ/`2Y~Eoxe??-W>; T?Z$8hNnB!{/9B)Lv8 ];9-V(U7z/6/vѫm(-dA66sC)\(kPZpٱ$*R 0 װ@k^j#!5JIږ W^"QrČS8xlKyȉ;*P_ZP_%"iZC!i]$PHlC&Qw>ϸwd6BD(Ի^-my (j}CQm1D.g8d j:DXDqotGZ_]rדI]Ub7#P{ljM^[foo1?Ħv7tefeg]}}V]ѷT@ö$!M`C&1kF^wl& }ڗyYbO#!>hy}6/CuN0{qJK`FgweȆW9c/SG3.zuD54LpTcyh+" /aEtXSMt;^o U8*q2 z_w4(UUbU=E)j7ad Q3;.]y]3ͿjL)'wyn_}C_- 0(_EʾH#ʉ]2NBz>'EQ{K֙;F>rcѷeDBhUa:L _ $eghJc(0FeN v/ƹ&C7bcQ"QxJw2 07 s ;Ւw El81rueHInI %L;^;H$g9gv́K_Y);ah"t\?8Z D~E7V=5 -QsI '9u]YH%^Ut Vi6ړjWٓlyo{ ݠzȠPNCX>Q &eՋﲙH_b*#"F[ɀjg3Ѵx$ANk!}kZl-^FQ,m4,;;IE 5(Dn͂Dyw>PޔX6G#=f# 97iCI&MͿ'6xy5nϡJB1bZAPu*(ܸ!GѱJVQAjY kva@Tp|m_s}V{Nz<ҶV8}3 F bϪ]i{^\BG%NЗ,!q \Uƥ6q7U G{sҚ@=bs_ 'їFhfK_aI%p}iz:/D _ a2(?ָ5'o͠ߞ< CG V_/5[݋]"4n'Κ/ UלX䢢ʟd:AgO P,ڦjDRI,jNubf9mǒw&O,\XЙBrkή;5t'|HsYak8aj ;Qy7m`hH[9=rkLXIAZP,ZzCPۚTޚƢAF'4t(l4d fE`Sɺ$?40t.REK3EI&'!2T(w}0է&ɸ? 7P3.^;\N"μЌ{۲7 %A0dwOV%HqLd}Iy $hJ& Ȏz_I}O w[D$?,^^!||В{ۯ9)K"uh\W؃y9U$umCLD-D!1K.0'<,E &HTe -`IBMwM9KZȒ(I,ȰAҹXyLx5c_E'A,Ȇ}¸ =F &DzHY/Z d!6:%lrG'F'N*Dl*zJrj L "ڰ%AH&2N5I LwblU 2'moCPYɥH19Dm/nL %(]'1EAJA)BGQƙ$|ԱsRo8vcVY 9^![J>ԥThJ!E.@ =tH>dFNN]v ~tۡQZL&R'7F6@i01"b~G3f'Ѧt )ퟴ}3b28$D͢_fі45;u\F S@G➺2:a,?rj quhP%尡r@5*=;AnR{h*M!8}My/ H( ٚi(;}rĨa5@(c1J S$|e!T|3J ]!guuu6{ԽvJqa}pKdnR@/{ ,0_y]dpKI v k@sZ/v+q^m<^ yTq5NsB{BC!wDt:U9C n]Nb_${JƄ"EZg}bt#aorI( sGDvM( 7TsY'iqf֮9ޥ$ljdwuH?%D<' ^[AHq~1je \ԋD^I\rZ{_nvZl'y+Qغ]5r^г>19wB>n t$Թ5uwǡ =rC£t1i!upSğKL3 Ȃg G5/"21J&ETz+ʁ 8[DPG/Qm yeUMyoK ݏhlD-5뛺U{IncjK71B>.$n@d<'aՁAgh/xX #t@no*?T4@|w6 v '}ĉC/(!1L 5g ݤr II zh*/#'y5j-!BtqG ښ? Bt>D $:OtǴa]Y7?MʈBVt5,9&g&L~_oфMb4OG ɂ%p{fVқx, ;WR&G:D.!r'K)XPt^rP"[m-h'N_ Yd@>ewA'j0*|N"Hvpٺ( v8GѤ=*vRNJPA/A{$\$e&+4gj{9*urDv"HQ}9d ݹ^SՁfRHdFL(y-9,玴2ɟy RJ7)K2r+,Ʋp |AWm=)FLa\;Eb|& -ȝ.'!?]$$xL^-{YIܰ z\/D'sWV~ĸE2s=[D+'(X;XsDUN-B9;@JzQSH)yx2#puP:Y#YmA)DzA/RrxUK50U;Px(һi9-(:aA  nD2>1/$vyRRM3%B|*8^+pҳYGźJ iks{1YzmF5 x7i|uZ_?)q8eWR#t}ъϼMR/}pC1 o,So5DXe\kpP ʚNB!)$2דO B!>RcNʵ3]RN"٤$b-W?5ԡZJ{[P}JkF d `7uqTJ'nZb:ֱ8A.bx̩l ݒwWNb JfHNU=B?Ď ZDYcit Oߚb1W|'g3FuςX(D̷b~7SQP# Ɏ:X2ttH.S#^MIī |1@895Dr"c3^vH>ZKT` 6m~6ɜA{"hK“Bx@3,a ΡOVۖ.LT Nٻ`;ߏl\&WMEy= !۠abSyY4Sy(C56Խ "M qE7kئ1`H?cĎv7ލ$Y{Y~.j13E'iLlQ &FA3|t}E葮pƒe^ˈ&:@7 0HTpș$Ǜ9j3F5*_B_Z5L K/86Fm-qە}Ky햫 E0n۽2\KXM|KMAM}Ely:)xBe$ wZb. ޵|<|ZJ.Ȣӄ(< 'AJ/}z--.9&S=t [#LnNSᇜ%lxϻEĒ0NXR%oŒsԃ;Ba ?2F>Ke<^tQ㾠~w%٬t{,_2Z[մ4@,@Z\E]\`}zwQ. ``Y )(v %AkXp(+Aiòsz+Rh#ڛ>1 l`lv=gw<&]2X08]G%T)tT$4) 󽢲'VyATT "U-l ɛm ņMa;(BnuOƛvŬ5n} [e5 ;O"wWlj|f m`@i>y ]RD⽻ 8"9o* O:QbHɟݘ]/+ݏM>Lo6WM?A/pݦ#%MkU~ !p7l-If^Hct$rrZD:gl_dSHUf*&HL{E H<RȬ7k]|8Pԇ`HK WaAk f,iҝxY\i~[ch6 ݉T,_+j$U7ӹZ]]nSQz\]uN3[@LQpdtvALКKPm=Α;NQ3LO0Xt03jӋżOzZC6roԼMG7e[jor^ /L)uT}hb=Tc[GAPE-!5-5n|b4Mܸ {3 142T;SJ6A*< H)'oU7ؒa\Cᘖr8R=U5a_r_|[%TAb.]B2S7H ¦"_+Y5p*5 n?0lo$2`oDWe E$}YΤFr"ѱ%@g/ag ,٢J5 gu^ &IWWPiCPN{׵^A"e-OMtesV6݇SA(rP-$øLKs]_Ǽ[Z0@)MjhA9N(M/ÄB3F>gsfdkdv;9RhoR᫜RwQM 0>4SE5O}+_:x*R QM:>>R&A$(t%܉$-~W\Ș66WYecù=ĖcsW( dd%ȪyZ޿65r!Q|HGhvBu_k0_&Y>i{!AfFBJ M]ljbP.-L>lA}O ~,y+0uG'&,WaT'62i WjXe%^+ͳwF4gfC|~ Oªέt9&+TN UFrXz~ ]E6pbU Hv=\Zk|Ww /oDjv3jW?Mّ(-όz\U欁ŲǿdRv]Awo /޴%hk9[>.~-/^{BW~ܔy:P;<]:T~hAo'ʺqŭhQv`-E579JY}˹UbmƧ2 u›Zѵ, ֥=p`vh*•Zw\##Oz{LNoh?oa8$X(K}q fEYEl~*cArҤFrlLg,!T< Dj$\҈2f} KGc\A>O(l^S#ۻ'HY_`^@HcO2r^?`-_"!ŃXbAe9$IQ|8@0̾mպY ]l`a7 Ϭ9F)TG!4^b"_ ᅌ[Ff 5__9(_dӟѦ;9Ho%Yk&5&Yspa'kw|/bvNKٖ7fQ& TISλL\z#ȱCle?-x3S&&H/N /F.9V(?iIvۖLS(v ZAB3543X/x?ʦ#(?yݝJLR?$YO 2Y@YIfBXIauJ'ċt!`_=$^>Df6K8,Fzwfhzi^_oݨe^v1:%Ζ_cv°R䏆bͼN̦f) I¬klڸ}\o14I.|%求b[4VW;%h K%uVKw n#˜9)nCKoKN(X/_bSҋ,.4?@{QXZqbԛ'C]ځgxG΋lմq8%#Ph9sN:Zuy`*9v>Kj4jh{K[A`A% S6N`ELν!OMcc]۠z_oA05lԦE1ry,Vr}[\:'ؘ sRsHNYyb Cr%r؇ ``t Cz .;dk7O}!Eې`=( [ߢKe9(Xfѕp>mjA(I šgePRKSx.}yc䮁o!U/p |09WBeƐH{o:oY7径 *%e1/獷Ŭ Rl;Hi(# DܱRk.Z\V=[<21(ײ[;A sD4rBf7a-b "'<)زMV RoՉuXx3o*J)փsTQnRJq?n dH\eyﱨ"(AI&&iiE]@&"5@TnMK,^:y:{JoRkb{XQ1%@ܻ{[eRF&[屩z^4 .I&dz.a0C) @?E}x7)'x(@g^YjS% Ц“%aZ=G:ǻIh\R&KElM:_BMj-ӿ&/{!*.ˤx^ѤTIh;NM0Ozڴ31d~HLd؏"wOH39[%ՍM)fhY v1ĩ#XAsѷ(+GOZ% v'%PCLihr]254Jnp}U͵A0[PAEPR-,⚪>!zۢ=E?rq0`t/2 bA>AϝO+g"ќ.}kcA\ I4oQKwesX:%^2!a|(wL٬&Dz̿r\Rs:U]I_$BE!ӿǸuQxڕ Rӥ`dnEF4.R˦>_9O|! Q-YM Jdro՛ s9fhDmS/v.}Gχ}fҸ[wf"x_1)}|[ޔyz4 \Ogq ֽ%T{o`nmw5bII 4;SVwлo7DX T5m$;h¿I9!/s2j)䇊hA ޠ %E0L;ڛ6ny s JafN{3Zō7ovh~H̍oБm:_r~ @O 6VLb́6,UH2BfmJ7+c<*!}I-&?>Y[G>)YccRy?Ee=8ܡ&Ӥ&M=wcM0zLOr{qF.yϔES/MLʠa;&)K6y) Í ,_bqKz}^m76 wxT˵͙MrwU2nJ?d #u3*`` WcbvǛQ Ljd:Xt/-M}Z州nw"cѵ+yXՔf_00AAo;K͛,ZF@-=&}[7[]`8pBe^KaWMvx>ֻHnX ~UۅjvOJ#Gquimhy~ 4X6uF~7O~봛Pb5^v-xIcٮ?;٢`ɶPA&Mwl.{ 8Ia~?Afϲ`X ̓&rxvTL%Xc0?{/ ԛb-?;Gr>?׼H-PK6F~jK[֓P]cK R^z,9ZAаqTk&AErbq͟".mEGRCAv\qbK 8 bC@aitQBpL*dnZ>1<"sZJ"\aPQd(G+ &,#V)ݿ L"6j\ ү< KU뗸Uj+ho7qŞ&$> VBg3 ULΈj.!]` ϓ_ARnh( \yYy=)KrD5#ZQ€jR]2kUAHYW uN"0s'i*j-dOY64) Yv[JՈV[r쥲g+o\;=n*R PBeV`?,YADrKS]jƈo!a&وYzƆuS:RVY#K6P5-jkVNѬ%1Ki {M: ЉC:t,j.PmwT4 EEP^Gv5K܃HIteu <ý{P2&HgZ?0Tc?sx6gsrئ8c$8E1 }ӸDl=szۨ' gymD'.K}~ɧNiC5om@@㭸KF鈒mI~H% t'o xP䭴\A5\ͤ \q[jy+,$w~n,~^9)[&v{TP coD!Cs4R-2gɧM=HV0‚R54AKaCpyƭ<#b|s8ȳ,.4JGDv 3©%+Fڭ)MXMs,uB 5=ű6+} S&.iԢȖD @K"m.y~ɢףYKⱺVڔFьֈ]A tu `l?.e9=}uE^o.;V)o2[ZvHh[4;yܕX,Q1K[aA{S1"Ppĸ.Ӆ՛:7VP\EnO7+`=b_O%Ntz9 dS~J /C*Vϟ< 5 a]S2%%PXm' ۞'mOmŸ1~Q95)JP ѯ tM?¬Ab\CyZ6Kaݺܖ++=rtI b/Bhހ2V9ucao6; AJԮd '%'iãH'{|mNF4QË/A RU~[l[\(_Cz?aEE4/d,-T.w]QCCvqR?] X;?DՑG|?3]mCkn *$f@l7ڑ[&zo Q(3 c/%\ Fn2 G#g>J4B7A6;o[1߿G!pe0E?on4X8~0p9{4_MdLn b*6nrSؙf d>+7w|KTRpEj=+[dii!(Hͮ'/^) d kI0gDVJ!o]{=A86x}&{ͦ|. H an6OA5H/y' 6g.'Ԑ Ǡ"Μt.7:C*dSfJmh}E^B)-͟w ]> NF'nrAeE}nCQ`(imxow}mw'ASnbNŤ~Q!4ήlB{Γ:g؈&ʞ29`T2pqfIM4]q٤lS `:>S)|T(uԹFt:}F~9;&)=VsZd1ZE/va.ّ߂hQL +q*A} wXĤń4kdQw쭒ٔG9u }whϼyqauW6; `g٣-f_ "C#-j}L&j[hdq?.{(-u DH[w(-) .rK%jmү鵝Cif%Xu`G6GUi4uh& PQMN2Le^,waělQdN8P"j-k;ΗWa56Q,#42t%]E݊ (V r:h͑jO!R@:"ZSdhuzGU(L /iS}T/'p? gJj kN7*rTiKTQGks6)Y d_bGʁ#WCJa-r=Ri*9zR(3@ b+ <_PڤƟ""G<,N @vx jAw iW3mCRԐeA 䴽BNX-P s 88f59 2]iUK|X=}AMXq&ջA` ;Уyb)\d}#Y 3\͛ēˣDH)CA{UK@Sh_釦fIw%Ճ + d*$/Ȗ%f9;WK=A$Yp;iEjN)zadKUd_2b9y` P),΃ :C%i:EOL)'tB`y=trY#y:OT1RiЙU{g%9ƩyPޚB`(O9)oTK$z~p/4E0HCrh%p2d_*#q }Zrd#ѧUb9.E%ġPI Z[iP7;`JO>uZt$/BiXvE,|PK*^:[$p%*}JBĮUREP )6|]Q3(I[>tjKgG)k`H_"^U_jNG/G%LTa0<2#@R&,v᳆}?JæuSi+i HvDV)%cBsK8ܜd_r$e 'J& =]J~ 1, wX ""ҐOR "ݤKP))(q/9VU~ָP%EkA85_BeE7 VVPkHS7cl_.R}&%#`d'Q{E? hS%qiDؿ⊀ Y\ˑ X)0- Vni{W/U%/8I/{xYNGqjG7cvwtoruC[ɸK*'J;֗ ;MƎݳDi3= Eϖ-&{ 2J(AMf-vR)M*-*t.(uNavMfݰ)-QsymqD}'Riw<MKATT+wz<r.񙱠(QAԙk]0 rJz&VWg W6KY&ZZT4 ֍OXEaAq~#F1& "^rjyAMeRwUAwJ ( ld@}"Wo3w{DxGQE'يj(4fFbәDedYC` D Hp9 5؏ KA/O5z+t؏ S[d[Vɇ5Ol9 hܳs~f5DԑKБ-NmqGhZsrYS >H;d(3^rE.܋6: igCiԖ77f9vzehIK?+;R59\ujXLb1mW>pǓn#\;øS M_K)4|%@hCJ6Ma҃Tx U DAϢiI`zOJ<}O1|YSiTK7ٛ{YGL O˚oX FX9"Xly?)F$FkWBJ_v:BWAN>]]l<1Lr[n\g}6=Vcj@렕zks rp-ht*@ݤ( Em;kѢ }y=oyh9Yv;?$wZ^ŠM6&C"S29AW*\ خ*El資TV*aU zQikbmʓwV?چN?XuTƊJ򖄕%(~ fSja{P2,#>55\W2&mUAEP Bl2vUl26kt(ƕ [zDDb}Tytb:LH]\-w͋rJ(gr Ԟ"}׎"6 +z9[SX+&SXNTeSߧ]lc<ӺXavMw @[3`QGӢ?;]MjbZWg>4[ACfUsHpn^} S&+/0-lJMt2fSr{gv~ ܚ[̓XocR>:{yF)6qN!}‹z3)Rm)8GcƓT%^&MيZOX+ְ~Gi5aX\Y+T(%J= <0ro =Ff+RaY~w|a~3&kZ [iUẒ”/NE6bQ*l7XqT˱UT ,d;CbQ7J,h(ȞXOna'ڹT,VYćNfk)~Vu ʽ]P( %AI/`[5 w.+ۡuL⢋ *Ӕ:]>D/Do veRߔE(g.ˬ HX* XS-_C/jEg,z<~t_͏R_-/.F݄9ѹٷ(aA`~ϿƽU0K\jr*̏?KjQhKW\,jAu}~ȸ's1$lV7ա>V|?*sڏ/avFwQZugǛY㰺|6M2]Rj0Z3 mZ4Ip6?^nlLS& a]P mGRKXgΌ=TrԨ.ɸMDVxoP.ҳS;_ҕeA4$x\—,pCJ]_(㓵:,+_y}'9&k44Fj/CwZL/&&GxhKN~_2 ؿբʼ 3E4~ّs 3#46{p,ɥ y]^hu]M=E冞#3P$8P^:{yTfKLj%=H?I _JFXlk2C4?IL~j.VǗ4>I2<r%fL)ȏdCuo9Gf"CӀ"J%b_¼jq̌TGJaOsg*1K^̚1M9GBJ5q+=+ui^B?ɑR#50k V]>G"S$PmTu63T-crK\{MsC}C$d& 2P|(t-P&l,#*/ )T` v9AV%[ `~H&UT]ę&۟m-*A0t$]g;\ [.JNҢ=;.&`aG?헰iENܓAV%̂p)t$G½^y9eyC+dCzH4=T<UrOǫl!]z1iI" d_5eNˋh)ụ.pul]iMmHHi4RJA"x-2/YUSH)jbA=M_@Q$(`6:I6&Ϣ!~_Bf ԷGyce ]rAFK4ݯ -@OI߾% mn\zjϴE,NE7 r8[9TJ/i[uFMD S«-ܥYlKWGSba0X ӡF6V k`4ҵl#P= 6PGݤR/}Y j5&@k@Dc=Ab_!?>-Ŗ=-29Pf7ʘT.zEvl 0՝rAɎGKOQ$4A@)y+{4gɘ{Amw( 6|("S$y<:Vwn/ޝ|k/oZ~=FeLk` -@І+ LRD 51 m1EPM@mQXA΋\iK,SWcHSl5tتu6LcW31d*EAV㥬cFȦ؏cVm 9˶PQm)*YiG/yr%ז Hi-ۣBi4gd幬Rt`fw6f^[E HކRs;3CHg-[ Y$w9pޥAk;ZTϝqs?>4Sz^gY8G,ͣ[Sͤ[LSU^U$Tyueڪvb3&|uUAE֔FHVvLjI+K:1h?VC\"XpT&4_ġy&>o6{/XQWdS&a,W_>&I"XB?/Cj.*X:; HX}FxK i5_~ld"O1ax7 t˽ ]4:7l נQ &~M XRP [IMMgD"L%].>^\<, A'rg3=)6^U<rIdU!H%~mt<{>H9kK?] _dRAӟ>?T@4C8qkʪ'BYm|Zi'UVVg`TΝ#t\&FEʴQ#7QP+H9&HD|V *"y iMojVlԨU+VM*v Tf^F_ KЊo+6ۧb?SG~ !ˡkGˡ\4J(l;"p݄FyO82sT<)A1l;5bCS!{^$tpj?$.=T 0ǴT x"\en&%iNazR{ X m Vg+–S+ʄ2?xf'벩ELo wkj ߹NAt gZ>[Vuu*=&K2rN͛nU/TҨ ޳[[ 碱C".hJ>KX ='_ CQOھÁa!7ɗH)to.3I}l>9>-G 6P7C}Kd8u+=| \I[=KR S;nrpgwN&}z@.`T[@&s) Z9z"`@,>Vwu<ӽ54.BK! _}t$vDeH|%ZQ2 "MSW yuWż?0`q,G xZaʛ_6`@,ھb0rdP&(w#Yx&1 bIڠlؠX A11Flɽ 8e9:VXN#WčrR Eњ6bStdP!{`.GIyXa~K&FxA9ѶW~+n.惂aW\a7A?% rTks nuP0l 7 XyiR/ϙl֠~,n`X]I‚A3D栆:Uh>AQ(-=I8|Tuu G;V1c2ֶ̠ND?pCURá;;.7 #)yg(1{VXTtkN:}VL'9i#7[p'5 |~ cTg <>k;Wb͝"Hj'ɂxHg'OLtVD+r 24e!Xʌ 4Adҹiw0Vɜpqeg:>7 Y Q9J~kIexP$#IrYߧSSdOv脈 ͞AAA1196RI1KA)m4kܦlERvCk6dtNn~3BL6@V!n>)įRe9{aR;k듒h0)\)%aJK@͝~dsCh.iɖ|K_Z!Fw+ed} dShʠf[2$]%ݲ9, LSX%ExӀiۆcIl=vDu_qEq鈑{""D k*wKo+K؀\SgE鱛` u.rT-bgak$~5Uh<\dm :ۼ ]K͡8OJcY - 3'etŮ/!-"@(JʈqE(ʷ0"Q^- r)_(6S6Ơ`>VdO[g߄1 d(mq:nGn VFfl9}A$R>&a~ r7`2Pōo@/X(%b >9Ja`N(\ }P[Ae&:/k/vkxd˖8`)LZ~Ǫoxy(tѿ:mI7@8<6*Y Mu|Thz .N),![U 2cmg9MqL?j]Ewl~䌸mr>à_0]?Jouj%CiI66_X*Kj)dQ= Q)'%aK/.Ek0TdM@Uvly.8d~:/ݲ0H~jV7 ҤX7%]OJ_XߤUY>~6_P;nǏ~ֽz,1c(ߖ\ygdN6 .L:愃 k<&Jx-[8XiSJKYu8jhdsbx%GNeΑ?7izVu0%Wܮdsv %+d*2_B"߼Fi{ _b/OKqX}"p*NkIq0 YXYA9di5 p.oо JCAP8sdG %mn 0g:`.Y?,?M?q vGF<_y\L҂p٠?yMBqr jSч/iʟ0_0)LBAZ/YE7F5 R-&I٘l莾D]dy%?T8UP.泶2I#s$%ol'1/_S9۹tbY_r?NɞJmei+g(y>ww%4 4L]k砓*}@׽҄)S$Hʗ` Z<똝knG>["⥙k38ZʾtJK8i@ϴSe5ITE&aԉ[%J !vP)VKAx"S7}ldȥ湫TO]y LMn ĭyy&UG KJ,AנLs];m g3L;%㿷s%lk{\qo BE]}pC*)\ X8-ņmZNC65cHHwK q2$ns&9DRB6G+AqUrg_tKPQyf4z]OE]),~3ڮWv6Mc 9 {rra*/3%)}o$ws *0@j_,ϑ&bU*u }ɐzouk%doHn2 8= M:[c*NAz$|RB~Y&ᴵ<|;Tl,25s#eXK,aRiy ɼ@A0vy֭y#7dn2^(V.fV)kb052G #;SK,̄O2\Ei_V 9'ecR_BiIE]I*l2aѧ-{/imA3vEptyA-G\ [jy m;ά~QMSY,ڒ.(<AReWnR`P{"Lʲda߫Urn@Y|CRlL* ZL[t;K%ԗAx:@.`ZqB}n"-e ~ g| ${s!wygyS*֣ P(atJOi<ИVs ssQ])҅9aWE\E M/^)gł^}ӗtjn<ۧބ(ZMY2PVe"n|X?zNX/."XRs3=LdҨ*&D"$~'WЫk85F";jɿۥՕ/L,{ޤUe\GȢʛed]gwQ&|wR]/aMfW~=ŵ P`4 %K+ץb-U57f<ݗ@$)p..O:шsNWH>e˟PS4_M君 ǷU~v *m't@ mT%Ёɱa#lF,ۨcbcSde cӰ|2 ڔFHd-#Qfi 1/669vS{ԻVg 2һޞ"w< pÒyXY*\lygO. Sm)=ޱIɏmy!SM'WDb2FŎgfM` /aM.n'rx9"Zʖ,E(mۗT>łA%p{U&X GPHڄ8r7s['d0:jP?NKΣj A_M:n{[I VqhU}TX֑E0j3="!,I\)@SYPp88ч(2C`-I>c NKK%hqH;C%[]!86@AؼЉA5RD` #.ELD&B@}̊ਪ> R'Ўyqa ż4A#5Ml0fYj`"UE~3d /6X2na_يvdC(~m$}!')}`v~,Tٺԫ1H뿤k dL\@BM]waQv~iCݓRe.>ZKƻR # Ye27)jŤC:m& ?C|CB |k`01b-n3%25EŰ8&1fVY5&_R`n—n˗,IphTR[5 l2HWKMcǼK}k\i STPM/I0}IUdR(mUMehUzo `K`J/O~}IS\&/[Mz]n }tK" (JOp.H`p 0v:˕J5d(qs)q&Mn7lKdIU/pGg uKF^a ѷ;G_C65|MEn9 ?&]vƗFu{'/iZ MKlN/yY @TWBҘw|z"#xhy[U(>|^qx6HW(m.)h1s;^2tTۗ ^I"[{7U̔J͑CXU([əRK/7f |VX_P!("zl ΍j9Ȭ^qF:?̗s/=n_E EjUƬ]ȭ1wU~{@Eq5/rs?$[%m]]7~rP[ bEp&p2{^,brf8HѠijR2&N} bŞ#bk$ԛPF]I*:>FD 54h폜 2QX/xRߙGwDj'% ؜|+R3)0ͭ,unk&?dR`n~֛q3eLrYAZ|y>qE|QC'`X9嵪3j7$&b(&E=-ֈARϜJ=/ҽ0wK0HkAJ#?de%(挽d1u7[*-MjZM3'(qE1VF2ڋ/.hb^dq>d.?yTh1r|,_h^SRag}PH#b7V7?Cp#6|Or b&؊1KJ򛖊A=ߥbRhhQKpU߸ {>JzMJ0O7N!vLz>ުY;;2eR3%][,ė(GA#_~A%t,| ^mVv'Cj?ݸ;TsH6l5=0^2.oA/ҕ{]  ڂp0{d+^~>*̛Oi׬x }ܥU)diwNvfrG{~*U)sl[sI޹AueШT>I"=Fq&jV(-Rpnnjlz 2>0qn~7X'X5Z+w7)M%Sn"UGM/VҺntϊnG--brc'a v8iRq/㝛O֙cIHZO'G_<(-mԾ *`d2kAo& QAod ߷"P!ˊսs*H_%uqIZ~fu>bM)/s(b}5B1 mxԘ,R"%/(Ej{:ilsd]μL|TKҲޅY 쟣Gl6O@Z2MՒ9D ޕNүtT$:B+EX/n_LTj| v~S_"rIcnj Xt\-'EJ!XG{ކ6G#rP%iv2,,`MESܐo7$vĹb[~MvPO 7XFR8% ^ŭZPv/l}\gMa :͌DK+hl(FAS`cD %p\II\TU$yD[|iesRd 9È\|D%F%sE7ʂ<,,-Hrmcph8f؜Ns7v'u~ ' YdY 9*& 3.]%M0Usvv$EeٰA!55?j/C(Y{&kIE8iKz?;N.U7s| 4EWAHo" P_BпB_^wLvW&GɎ}Njlz4b $1aJKNRP4&r`SXPU-D%j҆UP ?A6ܿ0[TYᄺoGq|}U:LZ6^Ri$.b_yZAt.,HAd?dfqU(IYAeMzhT(j4B <(auAj(X<,'Ѐ= q!~u4uzTYUUOS}:AW5u2`qsa&'J-8A'e;"!;VPzТR;', ]#Yqiq{(Cg&;t|$~qY[d/a7BݔlZ&p{àpVp">ʕ*Sc%dRڃ,ר V9w4+2,[KIP**a/`,jQu&kbQyJI ^)$RA+9L!vS[V*}4!+V.Wvd V4 u/U.h/r(:JsR(E;RL"C5huQd̼&%rɠ62^bU U;mG3j$S֒WEK{f'8K8"BzR"w[k~jCDui 4Db93?y&3A0NQH 7'u$k27 ! O2=4UG/f!~J8)yi*ͦ'^EPZvCprI*%hrtI@ 9QSwȫ0d9I^ʬANp\oǧbz%gտd3υL)u1V؛Q,J 1d\ A}dra0h'AQb %%qK)fM$.jAfQ;T>ǨIR"P$~lkYSۉKb<PB!'!q9D f'/ wU.(mN U2֜^$l]ϚvxK N +el!Ԝ`Y=I Zb! E'{]dDyi@ ,w7 3B_N/ aAA4J#i8֚OR(˧/Gu**TwؓN'c$w`ݾ`6Z!(InXyDɾX`-Eh:̰]w%3@հݛaܓ a/ٔ56Eߙ~I">'o^2|ux)/YI ?Kf $.th')ȠlIv~_#SzNjOFL6}r"Q.8Әw~e9&ZEµ'< "j(B+DH$a{ڤEx觩En/zcLj.@lV/ծh-_xyazfȰg'EQY|<4UY|TL/ ])8AK&cSNJ:b[sMq+Ig'_m=9 ǰ&Ih{Id1蠜'|Id~>ψ0%/iprp^$2rD=zc| h3tqD"qp ) eZ*!;BE&Rx/5{R'a7g'W2BBWɿF 'vf򓝄|F64AlQ! @*޹(wgC36d;IYDfJrf4% ET MTU81& ˷L]x, u_#Ç[fMV8AN;$yPJ %k,ؓ$g@9L:-P`'ޤ u0`1@]6c PҔ lȯ-c!;AwF>ҨBA'u}I(=^:s;zӼSd"!.(fͷ\&.Փ~ : pm,V>UgfˡΒTY. 37T~߷vɥOrd7#';7 &t|nb/$Oڒ2nOeX4&/R/CG">)szD藚"%lqbW߽ 2%cKƸg!T`lC)%Q:T9XZO\kI/߬ "z$̓ pOFG|$06U2emQ]V2;zWe/te, YFgQ hGGPrN_h+K$szFCɮy:`ϓ)G(bEbM{Q!!"kh_}^wX Y15 ehPV̌n"H@o\A`I"V^C'R$d/%VW}HdE1lCro\Y/*d!"U :W~ A#B\;!P1zIʰ̱bA sy*:YܸW}awai-w)scJ͒jE6 W] ]$ɔܓ7 |7ם (.UIO:LX8vc':>hi٨~k˜;'=wgmz߬NP'1f+'%2Qb=WF\4yN*+q&FS%j"E1-y)ѓ{-:W3?d(E& CkEԝ"ЙC0O߷%d!}3Ar~=E-}_O47%~ތM'?׳.]'VsDS"<6lVar2%2A7C@ע6N=X X&NQGNb4=O5~IZ|^!cttW&4Hs/a~xE͓|Nn,%fBBr%ɷtꝬ$I~:vie;AE.qj1Dlɤ״$L͆/ lVZ'mF6)9{^=%mL7Feiz /Y9) :7Ztʀ&20z\GE&$Ntɛ<' K/U+'ju<ZMY(ﭖcvQ$М2ņܨٗ4P(DـIV A0Q( #:W+^'vV zGn *PԓNXu(Nƙ lMʠ}G R)j XYf87A)QLd/7H/0auGy) >HvD0`O2\(hտ$L--N+H[{-N sz挋FPM:齴(EK$?ĭ_By!'c|bN[/~b<&PPGjp[B p>dx4Ͳ\ {vҹZ%UWg~I⸹HW./QNBF9ZNoBwx}8^R1V_5\*{NX)Dy;\~+|.%b"9GٍvEPIGMtTx56/XN;_:iKu?b<%{^)N&s8_.fR7)C˓ӘXtvyf ~'FEBd,")GcA tZf|uidps^Xvh4QAp.Nߴm0܉Fg۝d ;yŃ2a7QJaH/yV: !\";,!%* 7JՆ2(4 +Ȁ-_pKrD7nXi XD jda4")NEs@m&&,,~c$KNꕶ1<7 T 9O4=խ;5@0^!&ӢKJC&ekR}ˏl`1U ]H_Q;K D KeADTnrJԜ@ҎO^f2+a&K+WD=b^*p`LZ2_hj(͖U<,ΖYMԬ錛X_C=9rz&ꉰn8˜?#pޛ^ɡ-x8;@.٤̛-5!7!tN8z&fλ ah(IO3$lPY;2>)QhL4n4 ,}] n/imjœ`!>} d66m}9? :;#r/M؃>[:a A)w<nwi.ldMN"X~FϹmXd^y!0,Ao mUrѥbϋCL| GԆywM,&vЭM"US%k@ +xm]=NU/v2蚂3b{ +&9_Kd څiqºg ݌Ȁ7xu2=Ț8yx mP"_d/aUfExFn'R˛2I lɲ%D vHxK-(нAgbhKb_0C*uA<@_,yCA֗`sj3 YFغ."thJuikS2"P0'1..VBIxSY{~{/"Ed蒘x%12UdRXɯBV~Q ։7{dN':)dsm!+SRAMv\$ÐqY`>}_a.ݤũ^:NB"qNE9, VG71`eOo"tr(-Z^M"B$$Mz:aEP)(=6ĈJnB=tʒku{u.tʌ"IzTq+*#+^bWIeld"Ha*MN2$(K9Q6p2Ui&-WCIDRtd'*'\ R, vIp*u1k5fZ[ދ-Ii ɍAZ`*[FJU 3":th&TVygҒJp|U:*p@r`yu:YK6,m J+Ee5N`W=J7mBl=aEO_?LdJyI_$v'@RRBkW)H-I;уOKjE 02k*H_K_)Z}/._^dy;A7tS:@gH׽f ͋?P$1`wc\/]S2sƣ nibaSkbLMHeHu.0_e<fa%[QD*LKH8F[.` ^$JVk ^SkDX چ4HY_~y] PW"qW~Nxb:i);ǒYּ/IiyF$1 sjTc<؀=6)KEbE61e hnQ[ -..$M"jE-mآAjӎ+ih @<{i8mД+/Z[h$IL/ Ӎʯb*E(m { ٸ|I`4.ZWeSCpuE&dҐ6r{,)nIl"TAtІ-Ԗ#GkIuT^$̟Y53.2a3qhysrvvP pWkA!L{=`./NsKW"]7!QIPAl-vG4@[<9E:u|j~bIfC4Hy"٠4&3.#fE(|CwJ+PbTrҟRg%(,z4sEa|&ckGfخ A*4 R=?\B#hHMɴ^hU ޺ kN-țbFW_yk]$s'*/(c6ĢZAОp,&T<0 ܉VK}aˋ!K&\9|T+ݖ9Tp~~oɋM.kD~ 6S"ypY Q&D)С@-3#i---j#ޚȪ_b2)IhE(,,o&;o9Ad_cq\r₄o)T^fme.e$c,1?@<:..b)론olptE%R/}M ȶ Ɨ zfYY?oׄU6/AD]p%(HqDGYK6c247@"GGfzE"XUgi͔v:TJ' MA Ҙ3SH{ bԟTs،+K+JUQ=b;=>ǧfEF̔GQ1ptê$ec=I89wAf_ %%97uz> Mk:ďg 8/ |!濿 ^Nx5V͛5%TٖB] '-pnq/i?E4qC<fg#PiITשIc>@}JYyIM4ViX[fV(ȣzђH g&6GdTw䗣M0'{d[sPLʮ$Lχ-yHԊuYDU\F'8nCc3$[S O SRAOkИdMq! pz5loׂ(830HEpoǧ1 )UIb}4+ ҘҋN4\_Z=3g;/:BZ;jaIں,J݋́R#!dJ9!O~kF>xIc;}Hc٦$+TI`,.ӈJ4h*)ρ.`l`;cSA 'f,H_Xi/%RQ"j@Ïl,8\!Q]5z.mu ޕN64r>A- j$<.e.}݈B)~Nf,A}xڐϓ EVdTvi[UaX0 CA" ]L֊>E? _IڐdonZ(H*h5vb@ (P(K+e EE+r+,[aj٢80oh+pܕÞ_ 倨5 Щa>J;5@lr'QO-z^`cQ 0mpugHCDilplR?qtWHY-:4e̾e w 7AiN}Ig-G]Gx miޖ /iFd Sib%E*m:Ig !^ŰdL%R TA4E #">Ά v$iTl)_*z{4yS1q0˹6ڮTzuvD`%%x=:"FRKv(w/|ɤU`)䙔=~Ier'h95:DL(/;:! sE"ݱ%=X.2X~? ed#/1mU$[V8\{OGm `p; kE sV}}f%%azg˂ؒ}F{__~S'~*zEW٠ lPк64a!soE"i燶]Ğo( = 5(k` e ~M [cvYV$ wIiEpM2Bd׸D~c-lHJ/zcSjMH/Y܆8 B}ڗ9΍- F_ٲt{5N28;h3X5fԇlDd.4} 6"C@u%Li~$FX:t 5L9 ZuAq`P]p[_by(ZAIK(4'|1kQDŽz"("V&żPv3t`!_"('1HКM?`b鎲3;$S=hbc bnك=."|]2q=aL)7\tp>r/AN׼:P>j3P.U$]31ɥe<{,",Ƶy^ ԋ$Fny V_P^@.@g LyId͛9Bqit$}7IS"1D4s.2Yi7Q깟._Dǃ:A;Qy|S Ɠ 7i]ݐ?yEPL[} .Ri̠5dQs>& Fa2uЙ٩ٜT<N)& S_YpHy L*b%ߔώ.A6 hg//t?ć&8ᢱҼל)}G1~Ƕ4w( /n4zʭ{Wd0vO(PXũMbqO~ %%\Խj | 5_i]>e umʌ |/2%B5wr<,g_YUЃ iLPK:$@` LV(\nD8+]rVQHmr>̔P:̮tڙDQ"p˽B/-3G^YdsbEb=48AHb燌Wy4P:PEiz%^#8 3Ή-cUثa … @Yspqw:n 9JEo Ɨ Nr\%A [:( 5};X"0~(PK a!!IuQ6,|RBu"-|M ņ"/tƐSq2`R #8ؕ[N.N"]8IPvr@5x9IA=ѻ͕ Sq'*UrIB,Y8-Dd3 սHaM1$ؓ% 63'k~I᰹EdV^SEOwv= Yld2H6!na/A`>Ym$WU1>_: pVW\D`'Z*[M\.1MGRNԃ X_j"+ves@>x8I GJ5Ş2AϡɩU0g2̮\UC.2H+M\@PJ^2  V7{|9HSB?ij#[(drd\Ngx>XU9yw]yۧsh%f ;BNr{X,YNPNG\7#.B! 6Ce3ωGb铄YXGP¦<%l.@Qu 4í_+ՔvJ֏ ;npm~cc5 *on5ʌlԯyn<7.ׅ2_m 剣QƽK mԳMXCD񡐹#7%oqS4I %kS!pj'3E^uKS郓!ɒeݭ^( cD+AI/)_2h:# vDG~B&N:D"-y]{CEjGVL{zPyrԷX ct;z˦W4_: o@EYNrȭ=^3ob9ػu3Nީfq.`.$=_%=k2IqM$'Mc[$:ϑω2ܮPxԤ8yߡs`1$.Q'We@U PCD_:T)ݥfEbH<٩n6W;AU~~F4/q :(n9YjLԸ7K;+9AqG(⳪A+<_JoYF#"ܭKE:K 5/1mVٌ$Ůi5թ^H~^:uZm>5i-s rIPn76f,= A 7(*IŦI y}!8 .O'0qjZD/ymk2Vgo'݄?o F6}ɸL*MEzomt>ޒ:3e{.GtŇPo%ټ2!cẸ-e0Ӎb)]f-\Q.{ވq%HĈΉ]ۗ F\u'q "vQQ1)IRۣI 17]ONgS)cAxf[r;sPpw@j׶W/X^#i'#ry2g%x2(-Upm،w;oSIELIKv^9 WH$i4|.Xc頜O 8G:X!2ޯ~"wbK'SD"+`iYcۗ v}ҘdsE.ڒ VՐhuw-V2@'R[N)y)sռ;3ERP" Ӗ$a5X~))%'!\ iWR§$|\0X~H=gE}R띰 /4G' /Rgݓ%L&2`rKR:c߳0c"$hHb/;dA*l޵ѡrR4:GAPpϙ6Y%REq%D3\Q0x=[\NV?3&+9µyŜJ=3o4aR"JNPևϡI6)sq>Q1~'Ex3 0xR"h51=9)\I t8*?~Y}Iewrv{ T5"պ& S\sBG~nF}hY>ʉr3&զE ZSE'=CKډ{S"x4Zg}," g՟4ڪ?H|it]2·!sNDzvg۔SٸN@%=[qج7|!;IsINfCtv"[7}M}SfU >zinG?f$^DohIbQzS'"UL's~ 2Ob́ؔΨyڬA5مI^a4[74Rɮ7O6wR}fS:J*d }GK֗lF$RcbzaP% pY3ᗔ6/F,bR=Idp)sTu( V\'i&Ȝ_:_š4V.2ƗHGv| ̏ d0hnXA y KƧA` d3UFw²O("QjQ{s<{ʆ*b0N0ZB, Z㯜LbV4Z 4:l%v0[b\]e)/d<%_`.Lzm5IoCs n ?ĸiDP,PBN#-dK^<.M ]mï/G ~>ɀp^"=ɰ\YzuIl{e OIYK9w ɛ X$2%H ,k(bIfAEb{dו^,f ȉ*ZY|BϢ,R tooZM* Uť=XC*|_a=E 4j\Dc$_2ul2f};AжH8WFظFM_]S6GET E" RTlZDx\)2Ab4>Kè IH!)"P/ִJeۚ_4IKb)\* ҿdUvAM_:_wZl ٶNdKVA_3ڿ5Wg L ɥK.oKdxo[zIԇk2jz˅jcV7~:jx Mj=xDy̓%zKA~puֺIa% <$2Z~ĘII$IFQX{ԬmV2b,`hٿdQXu(`- G3 M$`StF)Q"yOuͰQy 6-Wc%p24YxkXUk3NRB U uwnd%5j(Df/hL5r Nq\j V2g#^9xX6ϒoS quNFc6EjrDy|S$4>u+ MA1=詝PPMĘʵ: JCGJԦi[I!jFm7eTHΐ6Ox7=da, jL4JG\kt/BkΠ{oKt/b3к5y/Ń R5zu.#j֐#cQ.b5NľR;+2~iaJ8HXrh"aɍ0h, -(KB e 5jxgGb nV9ޞ_ ޿5Լε 0&w*9Y^AP{~j[|,/ ~͸WlP@s 2 Wl0{ɁL-0 h焖Ye6lX4S٠zλV ΃Kٱ ë`|f(7?ʴr Pq"gio-dx9 i3$sH*yGs%iuc vRGUD K4/9)sp@x/aB ,48!sSl,G2(c&>[`ƹI(㕡;}~A ž.t$gW4 مBiKª/t_RiE[(Vǂ̘[(j -J'yѻyǶB^g2#|9*sv\աhWn 0oz(Wd'6!$/0kTkgku7=Mdbo7.f]6Y7Aǝ0JJyiy-3b$`l4{I`an|!qGMӛenm3]K6Sa}-߰~.7\:,IXdeR߰dɸ0 vYaö%7 V:ûxpߤrwXs:tTa7a˶]6.^ɽ">7|W<7xu֐/Å<2yoR|$XgTϩh.ksQY7ܔGX&( K IߋCσv.k܉7e $<7aMf5HUm:94HmoIvP} P43َJc{]aBS>h.,/yV`t$ 7 ?Nx7]uN;ۖB3&+WFui;իei;Ow.,m4Dšxsg\k> [қ,Hi/YטS-֯u z9m脸t3 aUA" C BEmBXS2ϐ:LNeR|I/$6<S4Vw,`~IDev:".A SVEL-hZM5]ea\[y o N+ V{zDQ_8@Η0%>0Ab|f5)qZ8^ӾIŗc\S^`@.UR ̏G oBM2w=Y(Jz8md/aHCiTwU acjSp 0!1d1MM\/q.r5JsI <7aGikQꯈD lo2Ο5Tv`"wM$q k*;˵*껈Ig$tH`^vy(ET;VRȑ}R]ecuDʡ,W2T ΗsʐE?i0qhy{0*V~?%g'oa.MtiPj窰.SUA;x } d2&u;r"2Kw<.Q !>w&EULFg>YHM'h g׹ ;J.B%bAo3 lj&#s| TfN۹%oIZgI?Uy?w;?#"S ^'u\e{.k0o"AiX.6TS}@P~Wo&_gYtAAW˝L^{UE\, &rdu3ZܳљJϾFSI_҅Aʤ BTYQ&reؼ rwKMە\ ϴ㾤"4i'w[%ԒhM;U,mO^nSi$Az:bM葳هpKYVټf H^7)B{Ѽu[Θ^VSΘEOdfO +^̡,=] ~T$ Hɝ:R>b|PNgK6F`^AsFޯ[ۏ5sK 2MM[ ͚͢υe˕r-[v6wL ЕtVHQc4 PM؎i98-:foD4q7!ͫ+T(oK9( ڼ*aQ? aJTnʄz=DMn0`T[ŁbS&S@2ռBnOо ,Q@ M86j3%|\"30D M6o)ǥATluLnWwKT2[ѳޢblP[AdC:tlQғeɆ?= 0ѪaZwc }ݿ VA)@"q!Nw\& a>M: ʰТ*&h4{\ >DFKaMd㱅>UNW2K0eSP/>Q}^ b #hwb)mށҜNWq`Cz?6騄y8\-;wCg9pzAM;[#Q =>eɸ]i"K u-Ζ?@!-x){$y\ן=[d)0c &_'_rZ w^e+MѾMqpDwyTP=_quuXc!(rjE+w*,l.ne{i r{G%}%CA?`Isg 594ANkC#5zhڂ%g[[RuѪAPpnfϞ`L r8cpi|/Kp:|*߻[D|י8"ԚVfo UUL?$g5ŗThA0HZ r:7]G}~N ?N1yL/9Ab3\= ꣲ9 G"e[){vnL0Fbgˡ2;o.p^_ /ت;G(%gQ7aQGpo|R#GJK33jQESsfot Q ZɃlo.1ޗ)/]$/׻]d8n>TZk):R \;RR * m?k*sn&a# _uWW"xOϝj5Dz)|rx)]ƺHc"2 KK&Hus8h;Z9C°oRDԨ/CreorխH@"EN;dG7I_%XbCiIM$Q2 #nH¾ س⚽jk|TdQ}1(xxuV CY:gCDK(jƧ&S6oӷݤ~"_%Ӟ΃)R:G`us8j"_HUݷfOa97U"sLS.4O~e7Vek8d߄EdHX&UK!Bpڊ qeڥvN<. H&AK8%96-h ]{߻S0ОkM;h>h):N$K21bO~ru cfxk*Ȣv cf Ԣz u09&.aL o"ɗ8#n/K"֗ש!wfO&05.k$͠]7Y;+Du d fsC_JE01gXzwFDUjMrM$ޛ;]v7ٴ}'IWL2I?I~K(E$}j f_]BnM\vAv\!}eIR*@їߤ1ZH)#?vmM%uʲד?Kcؒzt _d*P M7Beˆk묑|]ϩ-=7, :حbu c[gPTmY4g=Sv`~Yr~E )Ð9nR/i{e+4$shGQ7r9߀ 7{C C!Κ_}A}[)/$If.N~w}V‹pwh斔=`|GW0hsB7K4咮3i#GiMZŋ(Q[YRzJ[t5?ɊCe/bIS X>p2T>-?&8(?y2Y&l|2SbY~ZهBѿdx] DH?Qjz@׋$μBs `$sw Kv5n9 _K3瓯9l1}]WIôeheJô|n0-G5EA> H95TQ}I8qa'w *GB[G uMs 2_?!lY'+\yt y>`+N^hJzN֣7A(&uI"CYKݍp&G _"A?zhɐK ʹmq2/u8޵3/6HoM"2K%)#[WˀǃdYU>7(K%q e,ENf&HUTs5yf$䳭%\| rf/BYc&Kߜ,. B-TڭK"Xn/EN]rဝP}f6{.E$~ ,i6Kש[ԒUdۤ/QFNcSE7QkAέ{y>R2}ud=O^;?! 56 /uVhzP!#G,3BS@ݎ$*C_MO۪ zw2w1EU ]0 {K E}fc؁ A=3 ?d(gg4.v=Kv;NYZ~;ݩd/aKϙY1 8w JV=-J?DEm.*UiԧXݿI  ]'_3bX)|㋜+~ڊEˣP^"p4B9^`Oe{ zf%GgzuGGAed%\qo8 I;Ns? Z|iO =6 &oo7`$܎Н,O]kseO.#ReM3[ecIV&1 ]VY|47dN ۧF̛t|gYK62뚚jeZ.H|uB;| o븿us\#dkF.}uAmuF?Mt8ȟ_ТytmksּaZH+FWivT cO=rٍE`=L) 񧚕6?e{5Hx3WrAfާAV==f79xӻiOQv?mtp.tfR:jZZF߰%c}hI7AYLM84?JGzc:t<;TsƜ` `=@I'0]i ԯH);#ߧDkh?ԯkNtj>N7E݀QtFdCbP~g~RW%H<7a%,I25DC?t;վ̀igL/hqαYx=I;],Ӓ`G AcɧYN7'|h/R1#>M:hP4I Qq}]:7Q$~fjʾLbnP1К5tZm.DLT%ַr73~x2bL)vKb 'x"Ê#q6_>cm$__"mXv ˧A9$IėPM"&(DF3Ǡ N@N"qV7o2 CzTň7As| L IADyA Hݵ=H ?N8/XeqH"ZgћPrH$"Ttz8o.&{ߤRy3&PǍ?0M I}JR׻"d^@{; fuV`y"dDž < JuI̡ LI.E4$F,GNLha_e,! b q$ѯF 4 37ӝn`tNLu ǏAc m g䝨̬;g/o:@<\Ƞ6ݐ >zll.VAl'ҷn@lxc+ X)zK= @2"z6B7 8.Qs1C65Eť@uď #^#o?M3I̕>j>J . ˻ TP1[pOtb=q# 7 S4ԐtÓ 1dV+Bs8 #菖?->BYA,scpϜ Xr(b M03j=3xG*ui"ژvOMcC* ԳM0$a g)&2C`؇ p>y7w B7 s W\oµ-L1e2뗄ڳ ǕzII|sRo{&+OȠ>K`ZoЩ\&T1p7DϾA0E.B))\{o'|/a5i L-ֽT7 u"yi؝&}IlN?g5ߠ|IضNU()?Mbux1]l=؆jCh:k>փ|g}|Uk/nl?V_aRMd]d+}q!3m>9%>Ö7 [چ9|Z5]kط9]dhyMbl.Id".YoR_GGU]jocPO9w,Eʑ+_9 YDEM``|kXX "Kp@iA|~Q+/׺.a-(<3y"y,04r*}-®};gzHq-Ȼp쁳7!]ax苟ۊ\6XGUDoۊ 8SNE+s`?OUޘ>4\_MDÏџb9/ "{ 8pH J)gAIi&&L9 <_p9U8Ox,&weKnD4m9ŤG<#Tʐ/7d(8 vFNs7S}<> )&v)a>tA  ;A79 Lwӗ[=k pK{z{8 B|c6oWMG2v0B[ 9z,pHLw G8;Fu1+w[ 8?$#Zys5]uyq#~_^g 46|}WFWrP:Ay/V> S+h@SZ oXB:  sn$J;x`ߣ߇}od1FFƣM6ҐJ! + vM Ґܳܕ LFNDI ojKpUM~c*M 'ʭ:G Guބ%s|;CRQ4H_2 |_5_*n1&g~b/J5nӠ`mpY\ 9ܞ'':7C7a)'N&ʜRt4;:od*6ӈX3L},$ ]ȿcg)"{=y@{ ^;: Ħ%JE8o}3;LLL pH EM7^an UycDF6?eMNNZLԒAeG:f>CvAk}(7䀝 `(~aqkjiN晼 LZdI&v@^^'G\͉RA0^ ]/&}˔ 8X~ǸlV?|.i@=>$!шK;ȩQ@E}c;ؓXb;XjqsD7A_wTάm:E=9I /~(I6㖾K&MY< s_ҔE ~dUҎ]erߤ_A,sCݕEdyN'z?;~  S^ CPrO79|{,};{Mh[,c"ly&%7me /]r4tٴyeЇkqa,7l]L*m\Y%+@Wמ;ΗXv_BoS J@]badu>losߌsy)1zMS5M8 b䃚j&l[ud,i:/x2)2$*Ư,̨O|QZ>_ A{ m\iʾɔ*O5iyd1M~4vC%\]{z `4yŹHAMyXH%KXZĵk̆8.RU/gt6 CzrAe|6)P>WHj-{,`ɝip~KbXnjPGAh赩9*$u ̦}gG(n$R+^D6-O:a]Ӎo'׼d%p86IYۃ¿R#O ӍmP rw~Τ} ꗧACbIO;Nb- M+_bq/(EaQ5Jq4V=n?0>X /9zLh מM!Vo]mn #3h&ߤKi˝@0:Xl)S;_j7ڳTvخLi\pȧz8)2`H&C;o1@>לrEX{ڲ5Sv8QQ=Ĥ:CC`qF-`MfX dp7o%4%8L+_!xesl 6 y7B[CMjƀdJmNLd_^rM~9$>kql{9Z >/Ll27сܩ$~^oVVNwF3IyF-I5SD|e܈Tl5ۄΦВl(uom~RۇOFݢk퓻'_C;[~E [ݼhh :p6#eLk+9/̭8QtU\{{skelGEt AIg/ [@+? E,3ef9n006F`*%t DnaC{yx"(s ysRSژ'I$~ 1%5ge\K:Kb;I{TA -9Ra5Vx)ʦsG0~aȁ/da Z-o-s׹g]!Fb=DnT%%-3?Cb;?-w~n,ov "P7EzPO.zk'_$쩎N|ov|ҰBYA\$0&MY 3?lB} "[{Lv]_Gj:_@T-2>^M79gA:Yf/l3¹]S{`bQ`Ьl`>h$:=U0S9dqAX^F [k_*݄gC( Xf96Y =_gK7d=>}w%K-ߵ8ӄPMzxB݀c'ha#6q ȗE沰_M0AHcf/HQ\Itw fL RenDUz>:B$eU׳ #dTIцG56]B/>@9 O7*[> [l4kG2j~nJ[u t䨒k+OM%-6qz&:< #K{BE9dMfUYd*,gw%G)]DNE24e<;V 2uV5K-]3;:~'O$7-ObUvϛLqIѱܡ*W")MG}t}ױm:n.e-:|Csxl{8E,I!aU4¿AU(ʱ`kQU5oFU,ÝJgiĵ.]znTWe4KXk4u4d(Gj!7)ro*Ge~x.q;BnޘY*&`]69&CϡHN MT+&}70m+m\U'M#S\MT*x BMonV٭$*}d* דg`>Ur?<ہa)A|~^7Qݏ>u$|x:~ 6l+_SHbkUh&trtyO'_EX`MD^pFՏq4/x\dCWa[yV| _ / ½ɺbA0'ME [z.ɐ٪Bot~wfzvMfEڧ8?}/mJz¨xqiWP*HUὶYӇl \ՠue#ȩT8Dfˢ`-v$| Y6O1a-9*nc".p ce XeC@I-Vp$UAϻE"K7&dBX㦪L pT8GmgIA|؁fe/$Cソol@ɞϒ hpX?nk0gA`s>Xv:D_{>7N m_C/圲a>z]\WRr@mk̋,J=8QslwwyCՕo2E},%ж"6SE3EF'i.KxI{. wqE ϯ)K9jv9іJ읡NaVJ9\팜>8K%HSvtB'jAGkŏG'Ӟx]dPJ_fgϛЙNm W>d~ W>Iq1Z4(Gҏ(Myl!q4\7`,]!Yus+i9ap:+Y)kx\Rۗ ;s }N6  CXd4e}t*KY $=I#c *1B&_5nIOVEt弈.Kyေ3#:lU=!svٌ\zfK@#;8R3R7TV&J˦?kl[).M7o8{ԠN6L$hNT'lV 1!ڄNlC[ɚ[SɵA?.{ JЯm~7HYd Ai8%zM(+1/&?XX|pH"kĆpOf2/IşiؙuG)"/N `,JeyNsH|Ll!ΙǔaO5L_M)Ӈqn5S?E hIv6xbL_kѠ;6SSMٹd20v-<[:Ϊ w|PlӪJaQܙaɶ:7Ab'm;4ײ,t-&a:4XROq.] 'Ϛ#W 2lBJhm)lxQgӆ {qZ3_{B=_BGe\ @"xfD&JSTP :56ckCRA_=A؏PW;HA+%&l#]\+[:uǽT]{.!ӳ]R|VFGn. fB+|=f!&  w2Kq\38E[I8 ٮj@5Vu; CuqG4'A|(%ڲ,I lAْ,*Jޅ{Q0cX,2dm8k&DgGGR t;G>sA7J&frCYj{H$n Έf M h;݋7B>65KKE!#4LbQ}w Gܞ`P-Tj2+e::ܠUjrp'5.E fKhdDJ34Y/ BT'#PRR.aMberGPjN2+%墂ly:@> B7g9:rV~7afH (tR/Uq3e FRwT$`q^R4/!C3WQY+G'9rme7LO  8CY2}B/9~3tI/F@I0JnTỵ=,|}LpP=bNbأQsKwx~L鹞C/HYauCt&g KblGh)T1ݼF]wzEcb{^Q7K`x:@jIטέ`e+a_Bű `]A%X^?7DaieMu\5TRmDPN{ /?jfR+8.K^cƑό@І'Dߎms#{ hn[ɉ@"h8׾dkk*_o 梌Ee+o:[S!_r UAdBDeJUӟ!t2(ɛ!tǠ)}x5Eo|c\dk=6mG  -PI\9O>&puaEڠ\3n9C>݁~蓋JcM zEՠ&][.A+o8ӹo,nнG&g?XtAy|_vl1j`v-D\ZN"D{$@7vn~>}h,<:I?Q8w@PU, B{x5ڇzy[t*2⇼ M| D588no= $P}s.# іvm@|p&d؈A" -dJI`ʐyI GU2|q6u=CQ0F?1flF: 1”Ƿu̿3ヴ=JTehOFc^C߯sY&c&BS2ɂg, VnJsZd\%GD;FaבMru.H6# ,n3VXY`v̓5=7S`=:Y mmM{Zzq)tSJ )d]Aj1X3  p:ѷU, bm o58JCYw5Wf 8$uXq k;:K(+X^_:ź- zρr?XS4CVݯax? DDdZ'_lqex4*WsRE"_}&GG 0Y&^ ^M?YӪ @jfl!\VICZ!ɢ`֜דEq0ۗp| I6HieXFNĈK]<7`c!,Da@M߃?ڶ g߄4;q\I16?dL-EI)aRʲ6i9߄e㱦Zҿ.{&8/n d)%k1Y;욍Kvhgh0Y]DhC"-d6ɞsɸP]aIS'ijWdnng[14cX6}[O/bKu'!ai__Ţ%|/' U}cbyVs{Rر%{}f&ȽxױMXZs|&QԬfX/v;?ѽV/V {&J_GN_4ɋa-&~Z}3)+1~Ałߗ%X, #<n3&#p(¿(װX6R [vɭfȟu7twӛb®{rxFXjΏcoO 86mζ N4$s5;aC^hf5JTXOnp6+{v,{zkf5Je6kAh*R5 , nMJ }G{gQXVHRϳMqأބlB3O6šo};%.R J.(7yc­܊&`̎QEyp&ZkfM&ye7+L)*Q#rDGݛ{l՗eHg$FH 9ԖxО|dd1GV`?87죃]~f8yOf$$tm?rS.Eҝ z %Bv2jz,Aн"E#q (L ؿ~ &LF5a}/^݁tcCx!cMOvW .Z|,_ev8V P7iw(!hiPwjdRwQE-^=IE:-]*joޝV;l ;Rda>C4y$e%ڞڡk&AYR6r훰ZÚ?7j|q%i}mKmZx:- Oqd R^9lC5K3#{ei3 ב@ߥļl㡧!M}L" Tu` ){q,^, B vT$8j9aid!hS3*9d7oJ?'r3$lu$'x0ۻ }|z3, (|9~R2#yRZB_S$>\۪z9lÏ&gZCj',JݵZXo@j"kr,mYzt/i{4y9KT}|nɶm+K[%}79Zڸ>?rYn7$Ee5]MWgE0& Px]=Թ{JM hzoam˦Jb"le9tdC(=O`7 &,p1Y7A.ZL?@3_7կ.W7)?.) UNz֚?2ɿNJ8WX:_֕*Y9UR)¢obAܵ&{h*Yn]S%Kܛ%cA+k&Z*˥nB)w<ly'$ބ~;'V_j'\ /PȏAa:U2Ywr:]_//&W^“o0d 1zyT/ރ. hFl dcoy?;`Jx8꡴{m, `(i5jdحi&x]HlRz9bXU[+acYMM.isNav'c%y#iu) [K&?5MkC&l^C#ޟ ?-\>Po'@ DŽ2HoBT)_gˇa 0J>{yGM6q|Rn6t4 U[jbCzѣa}0Nn{}o*sA{z|EpcEb@1HMd2v8uX[hQKhx>^'4 0;LFq`~oĚV+^AݔߛvRs$Fչ'R 8]EjI] mzTl\ U_![Y._7ԳK8:|\uMC58p[:dUn孠ÀWRf}Oخ*АN'qbl- c1ن/#+{ 8KИ4^Aq]-dc⢄'=.-[$ƣːWep͇(4>I 6sأ4&qѦN1%%&a3u: oj*}vR}dyUB0v%aau60nڝ SmI_퀕MU;Φ{jh<(J7+hK&axW׃8E7:')ηl}\Gofgvޝ/&kRm͏A~liwv?]xg(l|N#>^d_A-}k/2 (-HY1s? 'jg9(ݩ. TpXǔ[7t2I@<ݟ.!8s5l.4dFC{|Y!B6'IHPD[AZQ}d]kN/H0ˏ4*szTnRNaC4ب"2dW 1'Aߨ܄%Nt'V~/a4~@@cqxo 18d*wJzxwHGD !7ЂtD~4pr]$kX.}g.}Ux`^mf\_X -O| )K5ĊIkPdየ#0duHcY]N K_#N% ;)Mcz%fUN83cJC:f2:Ogc̖ fXX.iLZuZDƗ";m9 2I# rVYVSf8: 60*q"2e'WY8Q>]=z4 L΢qWY$&ala3 IsrmaQK']$ IX+C\&MiC$,ŝArlk|kDjM_ɗ 7by{؏"nGp21K$VԈ1v̿U"%~rΝ%]ʒݱVs2ץ}? }bPB`zWA< q?kl㚒_$FCvc)D-:V.v~" Na$|Z Kj{WEܼI&}S ֎_t C©{ipiY#/p)$d$z߄ӑ,D )I*KSFԉѱ՜"~ 0SDu/(G-41gl9p8#OroMfa"Ci^zNnR䰨"h;:Q:sYj&;6\Tb$,$q"1LmϝDP4K?d2LKJ(t- 8a Z,0f..%م"a&ő"o˳.E%{S_sęI2szP&SwHI#1bߕ1ٜ$1zRdIݛ-{-vG(WM 6;pJ&C}`Wܨm6UɤTJ ˏMVeউtXS3f]=3SfV-')t0#v!:(x"| dBc3; 3&1FE(^I9 ԋ MLGmhzvfj cM݋ ΢"K2T 8E&}ٶE0E>ws$!qXd/ LA'fzd6xZ7_@6`} CBA()H/3Ez$F9 WAH}3e* _$VPUoe}"pe?IX$EtnVL<^n𗭦VE4$J-Y6E+Le}E&?+׼x{TFM)[EuΔNA-њyNLVYm.(1$#AZ|ΝVr' ǯ"aoZH'lRi"'v_ya$R!iR\; PJZVmcc ' `Sn/mt&C0 w,n/\//7 6d'̤[>9O건*ۿWMqʵA}IRѸw%kw)Y Rkawܕ/67po24 L쀫izA  iMd##Tj旨ö 4 UKzA0$OnTE`+dQycc8_e[xĵ3<$FՏ4蝄N@ `ԼLX\ ޹cI is3 Yhx܄wK_^JyQS`'`q]˳R~a6d!-?6x0#Oʲ$ Z?NR˗4<+?dsmoo~Mr 3 ͬ1 |zXZ c} qyߑ~A 7Sh~6 }dSDP7i¤5s(YEרPnQknɌ@ϣfY`s>e,/Ҝ2Y 0rN2$V}MpE=~9jnl7A<RDE *K2w "0&ckaE"&Wf|PD@nQ"yaϨd!P m1NUeO[=4B1Y4,OKzkbCf j7֮{}HlAܿB$Y7AdԗyIh=1$_S ݩmo0ZN%nQ1 .n] abs %AIˉSfԩp:[! ӇKvC/X$QLF"iweqgY5,GGw0_-}ܽ;4uJ}8r JKZ)Uf΢ &ҧԛJ^YVOLJ,&GE7nr떕:k.e'AijưSfsiuqR& RY481$-mߓT7h@3(]KN>Lg ё:$<:H+Z;Rl'\;UhP&$̕10z8na>>v芚I1a>!WO_T<1UF 'z=G S5 Y{۴؝Z6jO= y{'9@ĒrԩOaìГTf9?Xl|*=xz(e``@&:͑6;<PG|ݹ!1fP jI,&HHS.Q(SŨtwB5IjM` AZ=u_dp =b ouB@f#6@R6s1aDI =? R~' PeNv'saC.0' DKC禒IH_5:%dUwLw^IN)`d-^e4 /" v{M{E%"(r-g"jl՛'TlVeՒ}Uf.Y)~2/{mQ"-2JVqNVS$Ij2`ۊ-T9yWK˄u9/vfA&+y6FO2Py?שn"y)luzOҨiuO]Y rp?_A=GM)̩{"krc-4Txja|"W0\/\G}ߝĻ۫f݂)-7]3j E݂MDْ%Hˤ|DuRl?h=ܨ́wTs J M-s,_$%Z=U)w`}"4kW %W{}0NBé`\տ)R2Ji8]ĘQ1fЮdgMV< .Y+ RIVV;OoSeY"ɕ~Ш`Ȳ߬˕<MD[V'wZ" dH(Whb,9N~ޕe'{ h00;> #7]{M{sO(f#+|O1[ 7f)r̅_^U̾h/vr販“;A}*Y;Wz_XDneblPVFM"dgiJnɺD"aɗ<]>'1^r҄q'QYdؗ2~"13k58L7Dj,w^j/Aj/I"_09 A {QZ&P\JEiyoh |36Y8㤭/Ao4d|N*j6΅Quu"cܷ4B C8/A>uRvDA:PNWu{)T~V2#ʻOO2"Ua;Pc] 2 3ujiА :n Nו޸h7h\33_Sǐi~1%d9A9Kh6=&:(*js8ҭSTfl,dH1Qi"Ж^wO]$[,$˾idz9QɁF -HS0@g*@F;kLYW{`,m /~ ? ehz:GI$ɓ r*.' :kPoTgA bmqm/Q/EJB?P.d"pKhC3%{K@v/ic/p]\k->WNΤ 'u} 1~8t$\ WG;QH镛4LWzhPz(`rrMǁm7jJ wRKv"tY%ɺAH1MOvΘ'ѳ/)}ϵ}($#2$rpM81O"W\q4T뢝QR\!=g6I:QBT OHA A:EfE.E䰹ĝh&=|4PSL \R0Yzš5N;*|XFk(vNvR"RY3kI}S5'JDY4[r;%œ1evYtJ$&nFٙX^MTzTK{trPΞ6/u%;?} ́19)(r#3ݟpC A U|0#%#o5K Wt:rqZ''=Fw$63oΫR%AА5F ˝$*XFP1b(q٬i6KaWԒbq*Eb#B%dQ-2} 2aFg(Xe *32bA{1tVϓB!m'WXɸ{D6>g2Es*yșqlF(Cg*'$Z$>d,Ky$M$&a |Vz6J[oe|k5 Y:v( H\X/|!m _ڐk.M6Lo؆pIk-%ͺƴ׬Cˤ&džI[q{c(ebc*5}EHW';~'eȆIuW%>I,Ӊ8h1ݨf=vK > ք綥ɂh$dQFO(S(DIgU,N/Pnm.bWAW30S\d2Wl(Y$jKI_2we Lɻ!ެ<=+Ojm6Z7P/2Z!Yجיj##xF eWs;Uzezlԩ/1TwnDE2N(t["p4krE pvϔp&QN<{`0'!#,_KqUS"_!0bV֘^b_ M)}$ѿ:ѽI_6zfAB,j$v~Moj"I`.ztuBNiN`ǾWGO2sܼqj Wt]N2Qz\dÌ;Rvҿ_2vN2V+OWwNMcVn#* tV-E"=K\9<,PdI/΋/Gh|0N8 DaŽ& 'zډX"iMO%E-Жב+bKn,!|De u(,ZIXRDE'#z-*<`23+% 'WeŖ$)Dܳ/abʙZBi8TN)D 'kkP"8 /:\է:vTB%h!}' VbXNcuPq)'`TK!{_2[&IƯ$% 'AϪεs;8Du0`wS8AأwVCB˫tF?{^M5 NV(MFj̑VQnܝ0/ϱ/@U 'f&SND?^4~~N]',ҧ$k21*357ʙJ˟Di-B5NKpAub]RwIC$ɂՓ@KɑN8m?E4T}uQe$y^fcf;YK6_uz [, Ҿ "/ ]h^(SkXes{ м+TۓKO$Zn=N9QKh()¦'рmNϓ PO'ʿhL(qcmͳo`"1qNMh氕E+ @4W'{ͨ"B͡!UgSc+اzIT(g'jcDI 8d,M&'ȟ[a+tHwkT+$HkH&_0MNcE._grqMXxR_V:Hvd*:xmھ$F SI_2Lp/1gqc_'lO4Wⵇy ;I Ռeh X"FQ2]oY1 t_F1kfGQ؊ʇ;UslлxфIr-,E#Y:|*yfn7~&߆6bLSmfAE{bu{bŋ]ΕF ;=Aѫ6?0z|PA[Si~D{@H'YP;ɸԐHK\CLiKs b*8'4 vvq2gJuqS.iZ[A9gC%.Bŋ4(LVLrE>Z2dtg97$ǗDelSMEVPCtgAxQ_ '1q\*:_L8n/L)NrJ Ή"\{cl$@-T$+8CWdba]KCbŴ|P;7.]Y'=wpAT zgk:E[qzD]uxf Ǵ|D i!95/.KN E֘9LKwӘ%bEB"0g-'N!LL,f=~f I*=: Rϥoq)B%CW*^iɢV?7(Xvs%r_R8#%Dld_ԓٌpƐ>,XL$R$ v.:Jȗ@.MAEqpʵdbe0踣ou4?g2ٟ Bcm90zly<'ZYS-"?-#.Y'aǞBҏ8Iu~-:gj_2XxL%:U>UڞcEaВ1?0` f}Z)^ڠ00e; ar@6pw5X]Ꙝ>uI[?~O;?d:z)-\&t(^'7Jꛜ s$=+cf:&PAGd- ̠Q2)GbNFl (V1wwGMkl`r3*k߄ۣ>A֗m~&)ns",] GX ֜E=S3$aA=*2w$aA]G'JG-LJ՗1J/DC#E^N{e]X6tpv/RE̡taY1N]됚QY%M\w لٓ :md>ߗQҦ{MwԄ1 CRk‰;4MPכEZ#s&>E @Am/*:M;vF H¶PoS7}V^{EoJI㒾U8L,D|:mBUg 1M5A"9= e\V\7, 8|5렪|Z'hĴBCj$-r-LmYR:-u.䅺Ռى5( ڿ0ܳ] SF=Ɵ*~t@,/W7HA}Ff7.GxV{n5Zˈ.ex'1Ћ*Ѭ6qFc6u/C|`,wS;NP ܼb#w5oTZr OڸU-Ԁ^YzUX#]"oD@ &m$f%,ԍgpE7AlㅺQU{x>dc#E*'Ѓ8ެ霋,ԍ(ya}uC"~ݡA!%&^)R~l-^Y^!~سe*ꆌI4b;PVzS*'z=q{ܗ7ۢZӷ/XQ8H?09*Ќf/5(Mi[ѿs$P7DN|&>=yR_2bk0toAHʷAU LrvmJ+Io@&YYloy;+i mNy(+*R)0u1au͌lY_3ZK QrImķ~wգԩhrpNP,7|y[]=uouuKOfSDcm숥QE]dB]g ,⮛9-rĂ8C|?vNbRrfXU궓0ƤIA00Zz'r[v<ܛNN%_$bo+~nNNb; {L LG`o_O)[=Y&AcߔA]}"FgXHICN|cDMd"ݣ ɦqo;rHZυ׆HnRw%> fFE&~A|$c;Ca mI-I Ռ0aIXn i6Tߎ|vm|}#4HԎ^FoeK5vjjړsԐ럞K,?vr-l 6s{*Z3_kXCgU.'M s?>}ɉxGX-uZ\NIs)͉؜liʹ¹~Jb퉆jӋHy߁ XgC`?._,s>[AeFi\J݊$|j8e;~&oQ VCf"R&l&PƧZ ۠g>*V4KnIxMv1]L[40QSdp]\I *<&&tN$K])[NZWjgk׉_wc^sf뺙: EZl~7Ish$̘*nT>$ڻ; ېIcJ)O?iȂo58~!O8=Ԛ"c57 wEϞ?k+X,K]rb" 5ܦ aXZY}vWfa`4_w"kכE|80F]yV$/S,QdQpؑK &^!h7'A5' .]hbٝQCbz'5Hx|NƆͬ |Q +煊*-h"U8f'ߥِ&\"|IxƻR T 'SC1d mbs:L3o,}_:לa*[&8 +6F~Kxϳ:O5!$6;FhXV 54 +s O޾ю_kkUc޿AǞ\՝3 lfwCeG:yHMs}J`sAwwrT;2b5vgI3ĎlnMu%`/o6 E@I b=|=I닉q2 4n"z iɊVk"P}dҺTn6eJ^ǗrZVjȩ]\sO>d4Z%l7r",q+5i"=~w]v߶b"p^NbħfĻH~y c%WFYet9;]@7|c.>6G2nAcM>ĀO-ن /hoc?&T},qѭ) :?pCXJ^g;#.QLoÊ@C`(wၿvheAkCh4P†<<$;VDt's|RA;㰬ttҵg"c|I ` !)+@V7I\T,%> m P3X F`9K7UNZAߘ%C&13I( ݡVTćC}#wwe-hb!&IĴ뢡8<$vl`[n]&Cív SI~ucZ]_9:RfTd EN?g4lêqI:wA%6-17kNxlĈH& '؝3eöt-z$x MݠE_s2sF^y”/Z  59C+7r!pCnOcʪnP}ե: `yC`dXs>!1dyu|1' 9O"ٌ IOѓ ك0Cl!63fIVl;ݰؐ."M!M`#װsׇ7++y+%< d"hPRrvy՚ST@8~B&񉮖Y`UM o2@ٌeŌ(nH! &Hց\1sW@sA_)]L{ȯMJMTYqc[rAT|UgN=xʄM ),5lpyM.9O{C3,hnO]m/j ;EI7Տdr0ETPP}OIBISAzIC̯%- ? rD}k"췠|/# !-[۞$}z$Tih!Vq,ȗ,\ e˂J1+M`DvK3qUE\C0ғ1rya!D| ז *!. LvA(TzHL?M+ ?GyΨ$3_8&jk>Cqp9WCM}TI2c A=fX#' ؍DwuGm-$Z]$$U!AT@QpzV2Px߲K )M#}𾡊$©kӐ9|;C0'OZM2if@F-nG1D[0 ybr'韤~F[4Lvٙ&.L5m6P톬JoEfVPِVr: yH LՁ("Qy`+o *cژ2g,r0öz8<%!yn0$iq¥W} o!ajI#B֢]2 C IzM>9A %LDü<'ZQ&>KYM<) ʪ:dؘ̉^p] #B! Z&`\_aG]T<ŚTmΆS|"bfϳ2dqw&laQV7o2^YL紹Yp_t+d7"[l<.9Xߓ:/J@3*7wjDnQ睎Q%xEH)mh!Q7ՠI8TyN pisIew+Tȷ . ][d0mbz N"; ~=T1kdpgEZ%(xG~?zoZW;/|e 'Eϓbc?L PCI>Y+O~r$LY[g ұaҿI\\Dbg2hžI3JS`I*Rf QupyRgArWo Jd1 {|3a˻k" ky>s MBL '5U5}3'Ҷ@#+|ty ȊP_eucwD4$j&r?M$(,#YĨJgUԼ Ѵq/]G._\!52epCQ.']Z98Q~DNd蹕/A/n[$2 }DsN?N|&Rț,a-?4fUz `_`0ґ҇[vJ̊'!jT2@ /8 9֧/jK&~?;*Z.^'dz`T X_$ZgSd&iف?HǞ>+SYNC6Nn_d@o ٧XTcUma)]!5tarħ\4u15Bқ{7%mhm]bf(L2y+T<Q^ԾYI԰眲:ړIB/88l~>*D^-uF':sJmPpW}fvv)VKYTD V~tAw :|!n2;k^Zi7(j$Λl-,;I R.KKM5j$e EFb{Icݗq/܄0+7:I6^# j/3MlD=w ;0䖀F &#7Ot- MGp/Wz0 7l㿣E]C~N > J]+IJn4y'^nApK+usʓ|$^ Y !Vk$aR^(J4' A*а(/Wf T6FQޒBf:D& c-/a7 gH {iIA d WKӱpV 5>p"HX% $yԚ%I#EDWDWa]*BMn~$nLI 4C2^`/bgRh6d32t(uCiؖmjjf=ٱ%(}scs?En &횖D5ڹMT0Jxrۙ^4 &D}?evI}p7i&8A{CŻ& þ &|VQd_^!&}u(ؿmϳ ,ݑXlH"qrL($&-G/?daޤ9Q{񬑶҄Mb0(: $" жuk,NӨfyBgܔ(<ιNFm=;[{=ػHUsKITa?bZs$'H6Ijp "0oat: yB vHI6|\Ys0wM4.h/Z^ #/UPNJ0\%0bXk[vܠ@f'}̿? kC!Nb8gj5TzKbܙ duI|3\X.(] 3+9vtߔEJV2A -Xo7i\8W$p*I miH(Xwk`yk0v0Tέ3lNo= n#㍣L('i_-4O2;O_m:֢$QšƬkD(/QCzn6lfAKۻs*_E &FVHĬ]sA"C6̲$; s/2 Z 蠐h~ytkH'ɠGtɛcUӑ}/KDGx7|0mM& 'FD =5 O?>͓M6j~{$vH%2JpNǶ ?\kBA[; #9)'atz=G%Dl| %]GuDl#sa~H46/R 9D$m|q@$u 4,'B|UaP_`)r vDs}F-l3Ka$VLXf6^rRr<~v$a[q8iW'imY'U 1Z4NU vEŕE ";w|- Tx$V &Tj@1NN9 P:C{s^'k--Jk+= ڍl\9]d^URu{imPXKbN|=8 0Mщ? XB=I)r:uUۢY`C94ʵ$dڒ>pwze>x{Ę6S&r,P [ N""0{tPS;=`gg@(o B=O Skȡ䲐HRs'Jz1r*zG=ӯ#ǃLɯN&-6U7 9Rɚ7:u1$Ϯ"P ~z%' t^QŽjyL,U ; "ȈU%#" v4@CI Ȥgd^óA&ʳtr'8'}I/[i"վpLޛ+/U\lcC FhN"m:xbQ1cƷ1(1a$_#/6Eb&Eb Ojc:4@EyStAzgr`ݙchXDun2p>άo~0iR/TG_+b*:E"g*'[?$>ot,rG<&A:ƯPz𙵢Y #>[0ߒLONЭf9 ߑ8}1uը`9zcڗA:``.U; $IoA/ARmcfj+Carɸjw]Z%l$2 ä[(D/zt -NUgg;Mדb-Z~wbaNhm($!f ]IC%>vyWX/_buȶ+CnMrb概 ^0 Cf'A@6_ͮwnG❅ DzծE%3 㤌/A $1!Y,';|>!NPH1<ݼ!P{>Pj9'ny5]d#/,HgN-QV2D\ ,dEs;7O>l'Hzӣ"i"9#$Eb@vvL^y*_y麡,P6oYHjŇ *Ug]magjj ՋT`G;VΛ&%1 IIDРK6ATw|g6G-o T%3|^Db픕*bv%O9iK U(s{-eS`3bH`,#xP8e<1P!a)Ɖ'oU>9DAU/YY)Hן}xX+hë >לf$1&jĘ<[O\RfWi07zLt5.7A [8Q9!M9wsudv24DŽʻiRx!@I1|`!< sMJ;?fh|ki(OϮaR#Ŷ IvFZgFYFӔNKX+M*\w&US^(ýge 3ꘃ>ЗL ׻>eJ6IeU0E}dOL VE_Td Ł #.WHJ''hy&W+Z_'T.[Ik55 +^'7lS'mO,髤tu/ʫZNm*AlE6^hBS$HRLʭ^JH7NRbQN*U݃2MB21 VKɞ7i*atut"(,JtI8 ;E^;2kŽ287,izsp8%Jų$̰y^i!x |Eww\_no5 TwsQ*Ev y5I/2uk$s[?0E&RkA 4m䛜7"F@.#(k1Y%Q"˴^:'$zWZtj\$O[Rr l4U; ڔy?~gZ7 /Y!rp{J;p4B.Ȧڷo*% ~sVANrD316/UC6}%2 ˳y@ܵ4w_ؐp 2,$%qniLo_dr:IˉhNl;+Jq#GګMڗq5o \ՌPȚ {P0L6 O Pݏlh܀.N{f%6KԽ͒⋬{:,2}ce+i$a\$xn[J Q"Ia\@KеY*@ta"%q#I&؃MJc5t" Pu4Lz p/~YNTȜd),Ⱥ + OiaS0\3mˉؗ,+/r(Өr%E/+a'|8Is<ԓ)XqPN*FNjhUm}3L@y#gM '17qfl7 wv1RIyo$Ĩדpϥ p]$gs.`>B}יY:ĊN2ʓ05J=5$r%:i,z5/vuJ:;aKTK,+;ORK&w|Xh%,NTPF|FĘʎyI]A V޻p,b3r8A ?D:vS4= Nb3xJETr'KQƌۆaIF%H$9P& ?E /marh@8ØN69jT2 0ИY":#+{fuɘ 4$-;r[XOolU%oN퇌"~]H[d :]+'!<0kRvPka=Dd2AKdu0Acp1²8| \ӪzClU>'\D[oKtl]A^KHF{wC"W2PyشNgʱ4%7fׇ`}pQ/Wi{O^V `J!Ntx{ii_D N15/ټ9AcFk)M|r7ck^5V܋f0i6N'ڋ~xrbE8"gq=N5MMcemEGmEǷ#Rj:(Μ[D2_dn_%ߑ9њC:[KdrnAV9oB.'X\E/*Ut.bʹ#c^BX{A%ҺuKZkSo51>IMCHXޜyN+5S6];'N\ݤpNj4 [s.Y$מw&oW9qn 钴k޶rIM97]% fTI='PhC9kxrkܹ %QTC"RerĨ]%/ֶf8"_By)ǤP\9BuX䜄̻$j6v)eI(oe:`Ei:3 hyɹHe(skIg}F"U's~*ɟxAh7˷Ѳ)JiNZ~m %!5X!!p}y%I$~$'ƨ؜ 1$_7dQ`cW#݁a00 LHzS#gA劇 Yb_t* E֝y*p!9TK Ʉw$ um6;%! 5jrfbE*eBh;d#rԁ4Jj~ePIúהg`K5$=M)QQ@d  ʉ1DaVm94oSZ'{^8At$HlB:Y\0s1[0lЩ%AK'G"'7U:1[X;/q2NNбtYobtkZ.> lu8i|S9AxN'iyC3W[9O~~>#VXr8Чuy]Y?VUXj3B)~c]SmEE&N2N:뚜%L YG]$"ת…|TȼP?AO']Og`|MQK|Ȧ''G0wqܕ I+VmGɞ;6K?E*#N gj;+DdoRg}\XKo #H7_|G!IU`= O$$ビB;Ў|? 2& $[hPvR5"MDPվdOc]:tn2"pdf EfΒ<ZV/䍜,~B{v}IcW7g2z y+;2cX"-9Y6~jys F嘬oTUr~][2P\hL(Tܤ\9XNbTi.TcZ'Hܭ*4ZtD&ɱ,yIPI $Ob@PG~}UEߟ%<Դ}F{d!7c M"$ dTSźDfxә*j'*)wMbTH(gZWٍ"*qMAkW(sH\#f<#ό_P7R Ux6e:}QW,V`'ʘFO:amQ[3<ʋ[$%sb™EkB(qp_'Dyڇ XtU},IK; fg=TOR"%Rpp =%'Jf*)ŷi=ڢ_v# :f1Veݓ,g1*%9!?\%/ ]UVc{j._2Ky@K$7!RpNl'!kTAn-rY|ĢiY^uأ]T)d/a@͔ @h<Ը3_QB}R(rⴴhl5kIGʊ>~팪|wאDׇ@iBNZ^+a{dm s@o sCէH*>CZ|NT >hoe,N#B`nzF~j?'ĵ>$Ii' ?4gGH͆aa?OgXzyPCE֩$6~847}.RXKo Q;o';dro\mlKXRb_3CVMy=J_R>cjQ/_N9-eaKɧ3[7oߴ%>FDVCO{ïj\p¦o ,}$nd~ΐ>YLrxZyG((苄_%0[(~f.7ݫ:苄qpNFAObKs@%l )<ɦϋ(x}I?ACLjzUkR8p?D Kps2z)<7woL|~ P558 ?d_YJ=hC$v^ 'P< ԉQ[q LeC֋P&Y>NPutIF]푪KjUN @\c vI_ &j: z/H8i_Й:\)2{6 GF}ק("wAAUJ 'aɟ*jexɇ[F}Hcdu"gGFz[}; 0C?ZMv3qNRC+Q(B%9N.fN`'3r]/m@ʲ@ i ܣD"!7'*lj[k(7 'OUm-I+)舓(:2Qtr@4U&Y eh9ШZ'OɄdi}lɒ^\1]Pr"1a/@XAV@+1@@-_-/J$1!_nI6ժ(}H$(|gb3S%RD`ְWt#:A b.*5tR4y3NЙl5T@3I.ʒ`mkU  =f \[ĦLU /=(<D%Xi!F8si*}ѹIh ]B&qXCK[c# Mz?Ԡ,? *W"3Ip)x QA'4Đ>N K t\!DaV:66hK$M:JS:K/.?8l5]/eFuˋ q5*WUkmO^UK:oh;D.`431&Y bN·jg2ɲщ^Z1~WpCAfݤC*uvlsXfx7yt %6.3uϹS<浨}qiw$!by ['01QPdvD5 dA͎i t޾OGweEM\!K |r27&0-wqIEe'7C tb,sXe7;('6P] ?&q( ;?6jJq0]9 Z, FnӰ^2jn(Ë4A:bDž(՘Ael Q(I y@f:07;9|5+tLK^/(RQ8̤2zcy= `JΆ J/$)K*R+T4WVY:/,~@Yp"^m:d$h1y=y~$ث9Ng+Ø;K~Seot6uY.d6.R=X ' G,uLJC"5ۈURX2IisXE|I㸵$Iad1 I\UFUȡ/ uEG4^q#I_2&%bK]*0tjWi0j}(mÛJw<BIM:#*t^EbfHXڄ biV_`;A^}rKLjU5TՓ`tD:Au` y-TTʄe'*3* j)$l0QQ菓^f$|tJYv7*L#X7r1K>eXL?I 6KGbI,T%ڨEd<т&~ٯ.j>I)[:Q3 OixaFȻdchdJ%% |uɥtE֌KBxK{>΂ L%GF @Q%}|8I\P+^E>:K³ -E5:K-_YlRʢ|h{/i-2AIǑ[ٗd, iJk \ܾ~xRt 3G"X+dP&ų,IXh%A) bP'YZD=WPS3 0b߱} V."nQu  S:|G^K/q-K fUqH$晽y}ɛS^f_#¹s{-ц.pK~%"< -3,+ 'Zɕ/` ]=bx~ɠ2n[NiFњl~Ig:mϣSb$f΢4zIni.bj$3_/O+L9d\,V(75Mf!8Kb_IŐnt4!J㊳H2^v,KU >m)G:Aڬ{)6@u;v319Mh"1&/Y3f)EIQ/Y5R^уTfC@&ɬѷKXC@߫E &bqh./60& i"mTPA_~QnΆ_ڿqG6QB"r0 VoB{|#X[=8/LmjmV0D8TC䓰>B.?4ѓ,l{+:H粁p/YO™֭&D5:% yDI:#i:5_z_:@j¢n95OzcHx™2NN> CC㦎NK4 *Y){Rcd tJNPB]SujGVd1j_eE Ο-@c*`җž#XFSQn?ikB%irD˧ѯ.xLl'e| (- 厇)ۥ;6qB36Gx d[gӸ @zDCt AEzѵJI0_(mAܝ p%Kμ@:ڼlhѪF#V`6<ɩ K)Zzp,v`-Kt"q"(q?Rs*Tf)],tFSad8]Ú2+)d4Xzzguƭ REZoKЛk8_*mdc,J \dKUDIIG^4K`3 `ch=ՕƇ5 k[^NDe*c}b޶F*$V8t.R"'P ̱KL :վdQ~dI껖R>9Ievn&5(B4=ȹD%# tnŠrfM՗hϔdj`CL[*ʊ$k% Z\L:)PRT cYލR/Yv׳޺vԏ\Dz|fDi>`a-7Irc pzHo ٗL4&}eF ";IcpdjuםQx4gDn Q !r?!rJ8+*L0v˨DuMϔ6#C|DEvdʨ L$(ϵ?:t&nƣ *_mr81t䱋ąanQ0C aU# 7&]0lXA긊\M`ǐړIF<"}$׮oP6q6LzN|=?zɫAd`i@H 7I-6[ ˑ}cS!sRvt J&c<1gR pcnvAd>fOAl4"%+be~'toz-EٱcP+-I,bc)wlAݘn7 5/\Br?+7{'眝#ۡavFڦXdi45v:5mVLt2.:CBHjI̭M{/Kbr$&ש-'>&O1Tubˤ$=O'3V$ܞnL6b Շˠ;?Eb8M~,u|7g 9K߂=ēX- ńoϗ}"+nҀCstAC\d\KL(ܩRD!E"1&EWᰶU vF`<;hGt5> uGW4hu2{\mm8 &܉ 5P3zcKv5)>nnxQ\wp2Mi(.dw$ >dq4_ b(s[4lN+ Ő`i+/]$\VjN%(( r %UDڽxok$K /xDxo)fG+*o3Lt;ya8d: ޙO*`' ny(cWc$qk2$Yb|$$@tXMvqvo,}%3iި&IMB$wWz4%HDD(rDr"Q?2Z|z5 |;P'{0}ton2XMm]:PxFTw='VCpRpjih;a=H|L"~SC>@v*]>W20N*c,X ;it,zp>ӻ I=8 HBzcM'uGGx I83O;~*ٴdƞAmy/*7Ol*#r~AIJN`iZb_sY[pD` !$A-9` 9;jvK4F- xLKG;k,a4!r0p=VL#; BK> S0d.gB [zdH\ E4N j rA"+T'j#P?Le'ڷ9PسI8;uM ti@ѧAڠZW|k'>ۓ_ٰ.5qa;p%NG_7F |B95Žzq9q&*wC110=ė87ig=j(;OM58Q츦_g;"s(©e=F}u-W]rR}:r(AȯOa^siҶW?0rojBx/o͛Em|.(iGwO>[D4>> ʶ[tvue:q/&#k^4z#7 77HN |ݝ䩃im}o p278JlFO ;z{sQ?Q ~bg(Ae7W VlZ7L5[yK}D'[e8ia|m0C x:&\:QsDmj7qO)gX։߿V5k; ILE+=J nr&E4نJSm(I8d_mhk{pa j.Й˲@ldc5' 6dPAzD#/5}d}坴J8y p lOj`&a,(PPRz_큅Z˛ĴsgtE!tRoeDe!&EƼ2o2a9Lc0~Il^+ .K0{~(KlsjFZhyITFyMzCr5 /$[|oi;(᛹{TQ/it3Q"1<$, .K^y7P?"9WEF7 gӘ^{ID%t_$n7~AxHj$:7 /lo`ڈ F0%vFE&x8rQD"p?9"ARI$~ 9nRz"/"g_d7y78A־HAV)KВCsp.HSI';4B F~ Y$ƞl'UAbvQ+އ.vsm=䊔:ĭEv3[Z2, _Y-,P\ZJ^rof,]1h-*X^~ #uP#A"n|I(Gdp5Zf̊e҉ B'3Qxȏ-MSR+}_{{v k`#~slcJ ; "`lq*ݥ)(ߤ,:fwlRe"c;_–ER R(64T1 DЎdR6 @9APwޯ~P k갍.coj56":(#g _ꅨ"!pt J7ە#i{V"Im "ߤM$Uv%~Ej P(_y`Adǻ CM S45v'(dgVAm{Cg cJJ͟Z|CtB9n"QG>'-$!YQvh/k@MB@AЪ6*B=ųy򯠋X/a͋4HTc@xk@M28'"Ppz <}fͤPO4>>@͆hFDRhTϙ-ao P? ĊkiI(p;ʶa$)%_a4TJ|եxF'GsAƨ:+&@}uüH8W_I¹QH葴Q0wґ{L?#?&=͝_GÇQ@KМj-o&3 A`y:&ݲ3-|K "pc4W=ɔaqG"PcꜘC#ıhhw:qR)8D4\u$:N"o9?čUV 3sDE(>0 !=.#k|}X<FѹH8?(9o'` H ,`gȃOZ dߤReɒI6?]bWU^=3J][d'c{O4QL-Ԃ| n2F14=J%'{ѐU4e/ڢ<t&QIdVv mPhyAĥD> _ ؿ_?6l}Zg0G@Zr EH`>֏\8L@sI'AshϷDEƄCo a2N#OxUIe 1`GŦ-E>\MCZ],.s$ y(s9&5I, ed8ol.rDG?HZA6% T=Ig"h7瓪S >+SNB3C#$c VJ;0a8mÄCvХz,i)$HYt2f|do>r -#9H)AEbI']>N6Ka1_:_L*1fgϭygҴt gЃl<8aLv=Hˁls0S%+3? {SdNj`ˆN=jKت"q [9٘&qO?ž< P), M6++X:gt=0s54t>/9O=5ٛWW&]HSpOF= 4I\Oz:\{n ;d\> G;Cڲy7"w䣴Bo$yV(J;cƃMl&[1CmMuٞA:Cn8Fw[ny`? X.IGPvv8SoԌilx6yT Su lygҸ;H_plh$1{`jgV1"p_23jY]1Nh?AbAA%h—2pH㋥Qi=Mɍ=8~cP& obx2t :_nlۢ-sSGaȏgDo_e ^/Ԃ4ZD,ӘǘF-B*ߑL2֗`.CHeGbhwaE߲u{LBQM csb>@CQ]ht}@^ې?&A iYҿ 6+vʣnG{쯩Ȼx!քk&kMz'VZQe( TZ(^,ؤAb# Mb#w<,';/tQ3$ҔEVdGwy} 1nP ess{E-5Z5ZeRsG^B sqܩ911G}}vB9]J84jޟlAݣ&mmo6&*^~'A0d1wYE8 ]2X&ЦQdC D0=xVoҮD#f3>wWz lڿ̈́W b`C1oZYVj"{܄Fm2SvV' 4Ǘ .BK8Mp/@P1lHt!D@*7dE{lQX#:;2*6݈il4ov# lvͿ 6c{X$(Ș_z)ً f)lR󩳈`F?Ie2̿jLiIֹo;"TI~hW==.a0gtHMp.C} H58I, 1`tE[{, t&bWAͿ:VtTH$/EÞJAbgLj@cz: ?$ƈcׅ͓|Od|p2LĘכ-.v UJE1}bXg[;N¯II,~A߿b _\Ng*QWXAmFlXGчMk}>=QY@'>P;-o"\D|EM~G[5\|'?$G>_vMjo汔!R)Fq>[E|v⃴ݑqE eiDmWB$*0.po^S]țDAE Q)3QEi `Y_SVf ?>\ ̀3 R-ATf2 CcWg;Q}'7KA5b['I & i2 D[P%"QNtJ5$ʙ\]]sQ$Qh5#},mta D|,`jKBp*(a ]0j0=xjD'_7h?IԺtMtW(b cSxTJs(pWx)؏RXJek+ >:ڠr5$4cU&#nQ(W9P>P~]:g }F v97K$RpshVxP*UC'ʻZ>|%DE eDTwƯpԇd":x !Lv8ݺ4#Vt33 =gb  .3*zɡ԰t(a:A<9':k~F%ӎnh!ipݎ6\Qd;Qq!&b?ksTшRGr)&8J+|hDABi?du>;^NBq8c/3VNc|Yd{+O'ނz8^ qܺ5*Pz Qz_c[W+=LW{ihkJ\6rڕ @U{NBd`-4Jt]^ >癊AME$YKV2nVuT ѬgYUQ+Js^=8AAy;bnR:1f#?I'W}e }˾~as^"<*>ɦ VI%#>`zo.E"v á¡zcg QOgq9Ǯ<2XL9sOm:HQiY7і&~ghCd@l$z/K]bEߤr+-e[~5'&"hov[%,Na>Yzvc$j?B5䷢l~!alU̇yah8,VMhx*!]Iuʫ$C4Κ&ڨ͗fVg*7 ;,ݡ){W""ˤˤ^;K|!یk0ACXCb\O)׼ 5lN;2;Y|Y;:>1U9᪉/,? 8+qb筫pr]t֣9fE=kJG; -noY3k%2B3Y_$5UCaZXcUER 61\`?~un[ՇSʡ,I>G6͛MrIaEGiOmV[pݮ%Zhyd*6#7nゥE5nm8;I,edaY#QfCԈvmC&Z(- %M0 =;oRρ)pD rcL;e#㛦";5 %4n^8(جMVÐ F=ƈef4"1LHPmV&8 5֙VrF9lIUQ qT_o(nn)ب67 6HNx 5Bmxp/s6ËSU[1|ĊŌ$*:a~n'csxs UMzC&Lʏ&#Y|pk^g&=7N'~Âdl@Xfgo}`n9V/j8qI>%y- u;%PP"}}pvpe=tn6,̬CE'kQ[^oQ/"ȶDEsfUdؗ\{6־Ig1sN s.9@ u%L$(9 5\-,$W%/`LG2')\ϵwЮ(''g-Ϳuuy88 c%"IG FWR9W'XBQJ*wĤS$ܚ (y.~ >'X4\RpҹG U \8LL x+1/6X"bqs2!n@l!A`CUR_dI5q"E—JUGHp;øԔ}I_+[ImD;\T˯vJBIaI)mYM٥}dDmϻ Q Ĩ10hJ/GSK &hGCR/ n^d\*ˏ3' k+okkW O~%g (eq-\<1]9g:'񿒤1`m!93ᡨ|uTyH1KKKS9T*xK}>wm,u2( Rv&0U(iB_i8LP`=1&o+$-UZ8y"}~t.?9䓠X;Nm"qT1<- VTJی.ϻHauk•ȜAVWJdÉ/rh2KFwR.'Q E&.<1*K/SA(Շ.NzEe_cԶ\5'zB>/Ia"nd_A7 ='̝Z i9hva IQ 5 OzCQEO {@xEv0ۗ=Tƕ )RwxkpRYIN.E")K΄ '|l1lsHeGVͣJx'۔PBчDx5ZCn8þQ"M %.2hhZ> xQrj$\hJu]"'"*x Mڨp*(ШdG;Eބ\C5ӼN4?ڤ"k4-y1|wl6*djJR@%Tn[}N&iEif6Ei"AWDJ`xzt; ne]mnIv\Į'EjFFLut0Pu y>j-:/{fsK:Nd*< 5(V~\$2j.2z6fDE"dv&RH..C"^Myej"'6um?:&M=T)O"EלTfcCIw(/ה~~) *[hf.ڿ#EAW<:tiN4HiN9b5GHi'Iԋ:nD X}q$x~bYLKq$LId]D{:Tͤ2XL~+8IK_>M2N"Nbu2S . 6:gp;uD.FaIBh3x&>Rc*UZn8KK^w"EҗDXKfJɾZE645'i{uI|K, ՍNmǓT!{ F6Fg? ^MM3}{IR#\'d\Ctx bRP.l&pRL $mIdhWLɝdw9D\n 6cej>"D\\$n\4Z޾qNPqx,RaI&C_`)놿XQgZJNZOk_/ 2T6g3_ĝY/a^.0/(@{(nzuS"{O9D[Z'Q oP8{-dc'C~d } rpS" S*|% %Rw*@ $u7:iL_!:uYwcIKdC,?i~DS[4ogS"NFdZ~!|~%l(r.q85B$CS(t#O 蚖=I",sNjְA 䝌%j˿Z_# H}jbT+& MXWĨv:ٜ5;)t6+3SIJnlf\$Jڗj`G Nпdc̶A52M,=o1 3|>29KN%1X9ArIb dSF!a=AaTxNzK-e}9Y\!;Q9jx-ECv*''eXw\k4bNTt| &&'ٜ,!"?`VD 򗘄g@Q&vR6J#Q<^DxYB#fJIDI.ҩ5c=f&6[)4}5y9N@QlX4;bËŴgڧ}NS}4i$4} f}[sA<<B՝~/)2VI+NIO-YJ߭n"JgSvuZݖK*8i%ߡ`/*.E ӡkhtk~h,u][.g\[JHpҕKRKV,z e9:KD:AӨT褴/QC;6N=ɥ; +!E0w:g6L' dyYJNOYSmz1%ϐbi\"C [y~3xq2B'O/J'ֲR%n 47ZֲS%jdՇ aEݟ)Y4R".F:qMK {\n<2^J܋ڷ^E+vVͯjrn #@5$BkS{ƭV6i*b$oyT3{N4.3O$CP:/omP9}d<"z $ʿ6wK-VHo5쿋)mhmh5`ZN$ƛӡZrƴ^czKDlYp띹j$/+'N2$e}? a@q}d6!DxpIs2֗`y2.iݪTXΘE&44J| PvpEvᕿ%9Ƥd:L.5Ew$㭈Hj,D? 1IdL<^r*tnPVv\dssc`m*m@Ԁ f=31jz(ZvWDoTFoH0zqzȈ7 (;H)b! \(M1ppI -_, $߉K̶BĄi;atAC~8L@#tK|]MYZ4;Ha91H8sWp$Qۇ2Nl胦VҖ8֋@\5mu U5 $Ճ)ĴD " W@˶Oz6h\-5ؤ4X}،YTLe{םLBU'E|)t SQWB^^4ɾ` Cr nUP`c*qlU];r#X MtÐC$Q@%ۓ.D|2RD5CvTڠ&@} .1vEM&zAF] A.`{EԜ2ڝ]kY Ъk]IJBw۶7!ܥ-T$#2"Z򷌴z[q b v2nۦ=/Bv3IG3[KQj!sEbisp!:ֻFe.QHtByL?$b};H iw@e$=h7vȇ\tGC'*u' hZ A3ɀI,c h>qa=%^$PNו_OlNJw#b1@1A)7ule&hf@L!bވ[`zLbJT)j PNJt hvbƫfGءQ}M DaDb.. ;)%4K yw1 L0[7":. v I EB5L$ 9~틨s\ j fYQ@#$5&|rL, 1!Dh \*;ix=;,DvbZs<.mk Qc90>^ DmkvT_sMR=0![݊I!As6{3{ωr03|Wh 4'|&"J-b碦~=ID"4C"QW -uDuL)d/PS*.9 fDmf /,D I3o냀 Y@PMX؂_Ȅ@3uhm7aWRҝT$gAh%y&0 Bw餆ì>/1$Hdg#Êu ZGb?>7/݉%O@,9oe2!gTnUvW-݀YWL 6 *&YHn!.bRcį$vɢF>HXu2( J' WJ ڂ7DQ,CMi.>ى%Gzʖ-#[eKG#6i.>×@vo+.b~B=6n!cYCY(Iޑ ݋4d(@-!kx< VIzSBl=,aށ$OB?>`bpQ. lalJ-J{% |:K|)1!kD2Vu`D?KnqA$ .$#ggD,-erI`9_Z= ʁud˄PP.ݻ ( zEg3y':A:[I3Olɂ`MT F%h-RnDP_rtN?P[J z F2JR`0B{!݃-#ԣxEG!H,q'?HdȄ2wظuaRB4HsN2^hVK^$a&~D 1=UHj^ =4_bv[G7w X,?sLKdX{ȧ|T ]"( Z&iN4k,Y;A`AWJ>Q 9RtɊgX  ^;jyρ$DYv`|!ܧd ,qӁtF)!UqM-0 _n$.7WKrMH"Ex5tbMF8>]I ꠼&NZ6=3 ;7Ѝ&( ;bBhK@2Ks !މg,]:j6>& @Uue= 0[Yt$iWL 121AFdSϡt ˠ.' (݉BNVL3t]aR6m|ʐ KcA/LIH3ӴHB'PN$jHLmxkg"np2HAaɢ'3| I iN5,dȦL dA! ҐЊ:Hb.g׌aE΅y!AR_av em^\xkn}l@: d5B0 -AZx2"P g0]4F 4CXgVلu$U,lN$[0 3,#Saby鞓 'X!Q&SA66N&U-ɂ+7Z0"j=Ⱥ wb> Mbss}%MMǼ=HTaǗ2#I E[!AFNjl#/%VW'*<1B]+bsB!Y 2c(iK3.ad  ? ЭX9ξ9E? vI PH:U2rwҞhdbX ¡e-dL PJlGK1 Д;p`Q]=ݟ"+WVi-~odnO?XldGA'5 b?r"khL $(&zjyPC-lwbzrW@v -'(4)da=Z1(s ђ/&0 y4!0v>t IG?T ]ʄ}`Y?Pp. Gۄϵ,.޹]r>rՊ/ӕPT ɟ@L'ABڼƎKvB''NJ6~biF\VHMwjiX0𲖓짱lbך=jE;HfQ\#vBCz"gs *zvNLgwP1o 5pA>}^-nިL婾Yf ‰q'l:ԎĝZA"z1C(w2dNKVH\> ɜi!Il H84Qȓ`1J",js1--fU+$ )!@-/ʼnJ!iѠӶ=@mvY+ᇸ"E:2i,,VWrFo 9؁PO%H ;as3 ?T!;O ӛ]4wR\]"ށと_,De*DEb>^T#:_hM**dK(||A#5W4F 1 (sAjnHq&\} 'r:B*fhlHBoX*=QtBedr!jVkաSC[\K w0Ѯne9ԁdidQǂꉡ#:K=ZB,ȍ՞0ϑiϞZ@aemm w`<0\tvb M^|L@fm4]&[݁VqM`"3;vRQ3)0!D1OXX1Ӑh5;MR pۍA7`YD@y |#zbsn 67m6w`)^Fty(Ax!;bH܁3bRq f% c"%A.==eF6 TV dGޏHGP& /P%"t'9營yHLeȃd8 XdW Fçi E0̙1AU^dXx5D"Y< 3j :`MG _d( )< _aDLk8׮3!f|' -2{ ҄H>بΌW :|V[wF ̩X'T.jl yl BlV':OhZobt'V[~k{vDh뎾sn1mϳR$͢JIPםX9gpN&L;Z~:[<" 07u6X8!W]Vi@N")&n@=_HGL9 D0&P䬖s#UN4ϊ2H7 ݴTr:@;H:3'DPB4N2j+B4OQO$b?YiL" ?^)K~u)_E(yE6O65{Qh2 ˺h[R3eB"y 9ze_Kڕ/?+FF "0Y $!^K/5ye?WP2_L'?-^&QV%_A?(Җ?%D/NZ)hP]n~BO}h\/Y&G/ 5}ڢbA皚26/!٤"2}+fRsHwb)>Yij7S0P߁r>^M)M"kYV0^HDˍNڡ=Wg;bLe kGmpHYi dJV$-H&8dP'v2oMkk'6%b^< BLc!:YRG;mmȜT{AH\r֘ OX B>>\Pl zBj[>A!j_WL@Rͦ.l)>C2'(p( y'ӓegbV3Ӑy2{8 3dd\W  s]q҇UbZ. AUIIGL\޽_G@l]q&(IE9cpC;LozוL"ȭDžP" :2T2ʝXJ[$O 1=WD u;jNl9t+$GF݉yj!åބd*HD-~-y^ CC\/:֬P>񥦄tӍL2,J)2/&lf"$ZaN +C;ArC+b+P۰É$ $Q24i *¢idrO\GHLԑJd,@ U p6R^PzftŬH(N 鯈nb!hxe>G"8$v 0P DvZV(V_Dvn9(0J{n7bӺ B(|5i+فVI@lCBVHXLJ@0 !n@t! p[BBTr<i[Y+\]hf:8ЯivR!4oXGqZ4:EvbT0:wƗ!`E1V-l37 7UЫq6WdЋՔ&t nx* K~ XB2Iwaq)DScr@&iF{')4i xP}C`;1*yʹbf\5aB^f8q^!ffdŨ"Q>(Ґ7j4DmNBRGa"(̷lӍtBm2CQЛL Gsǝkv !z0hr`|ɝt$z9%tF0WH4J'H?D@p jg":JnT%Wfjy4u/"b'ۄ`N⚖B >ӄ岄q'uEЅ Ĭm &r8 :B򼓊ȝIp>i/ŮS]+扡 $rԤTes.d9óoGM\ ĸg|BU"F,6iQb 6!JGB'0/7aF䯇;A.N9a8LtEάӁ dUmɒ7leM?i`2Az&e1Aڧ{}$5`r;/7fEa\iN5"PF|/~т3!%sYK O[q'z ;ϗksR,3?_ʦwCXo_?[l'c"DqxxEch/hL.!.;13BFn &߶[,kؾM K j2ś9I¹ d^!0dU+,$bޒƍ | a#}'a p4e1/O|Hna:,[~X;T (P:Ir ܒ BUK@yv*f.BkL.0[*wy&QMXo'fW խTwfH ]#l:q7q0A+#2OONVxdm6i!M:,im5/7,@V0<spE%!L @,mLBFhȸ%)$ږB J*' 2 בH\~@80P-~$әɘPo!;[,dݴbasJyy!)Ķ )<y*e'3Չ}L$nҡ?sНdIA8@.$mމ7C +l# iddK"0Lvz\w0G3E Gk0Ẹ΄,%#%mɝ@4h?Ofrd)䲏@^JNncE"U6P 8>tTHL~%2ӏ;a}TFIho$ٽn2W$Py% /Y j?\CUK%·*wBdxݖw6vm'$@0O \!:~v<ɿYS y:g+2v:K}h,jy5KRy'YVڮӈ,i@4Ǔԙ|~2ۗ:gc?l)y>|?~l>|_Iyw_fSx$'w=ן_~LlJi>_Ew]HJi%b!9 yϟ[IKX}7RiϝH>՛E"r~:KTy>ވJ{m=7oUlmwoĥx^v>9 <)>w>#? 7{z8Oo)7ۭyxN>ΟNxmlNxD/s֍󸟶sF:畆)?5z[%?ӟvrN9}+~;{{#de՗?,Ͽ9Ϟ;f֛kZ{d9\З!yyTw/gYj<}mӠYC0 [`%[Hhh//TKN C͸/xpelexpOAW [[?v~go,}/R:ANX*Lh]2((ӿ#-ioeɉKjDs@VNA y)>`܉4::l)b~1e1yyFBv=[f?=VԈQR3;eZ̉h\/&iů>volowK}&}6oleΊUϟnRlO_$C꣖"IҞu[ka)MfAI}[$eܛ!)HAy8O)dV-'R~p{RN^2?qCR0~FMux\FRN\9>GcUKSPi~+I=|xa#S{qgykeݕ#rÜQs~ZW1' _oY(Ic̶(9G?ƨ  A/zj_m+!;I]{ne}z*VjU߇:8p΂޶//qa58w𑬡iuvz+_8~&o>pE~|bEz mjكr/:З X.Q3sföjo?Zpކe1ްӛVESlV`KڛLÝ7p wKݯЧGuP:U/⃢@~{W"Doy#_{ c ,C[+gzby||!M}s;Zeok{aMuKXS*c+@yěB}-iϿk99tryW֭S?VaJ]Y_]FVhΒx ]֓h)E:v4HQ= ǘT#8ʓEwɺϻ}zY&AcU:Z/SR#xORU3yw?|g{ΰVlb3T_{|qKwM41c{{ەo3Q>5A~Yͤ@_œY=gqZڸSy>ˤydv\݅ȴM8bHI/S:&Qqendstream endobj 406 0 obj << /Filter /FlateDecode /Length 4838 >> stream x\Yo$7~Gԃ( fݵ- PV{VRum$ f1K݆ CLV$ F|qw1ɍ:yw"ӏf9):6Or# Ĥٜߜ3޾9zq[z~2軯]jEguY[umjFz7$Sh'e7**9ٸQ2I-,\Nп*l$fVn6dۇf?=~xriqPy7g2Iĸ9ͯBtzLL7ҙ8:LeVr2FOAi7?a/2">]|(k' :\|7j=ZNJ'*mŨZOR3h\0w4%FQS5El7ac!陏;CÃn&xMseԹ1AhytUEKH3z=j2|2MNsQy%U騢ppyōن,uzTԴ!Rlj=*{ܤ,Aг!|$Bf6f|TaУLI35Oif1X?f Z^pUҶ ݀ ճh32UjZx&RYJ DϱwG/gFO+zh$V[33Hka[EؠS7lXKʠ}\A퉀% 饖`C $4o 5v:w{ xǺ(|"@Q89m7Le$\@fpuN%Q %Vfi$DحJ eeJ*Z-1l gvY̘4"K4")*Pҫ*~E@m"ph_SwMk÷[,~}͙#K)Oi4Z212` %z }#m Gab^҂@%:xhie(Ы۔BXBFcȦSb뺓e!؜g`y0,1g| ă|Ĵӽo{GÔy벐D0 NʕmxȪ*л)}{/bOș^N-Le1cx Nd+5WPۗhR $*M@0jMn"`52EC݅3)' ̌oZRv:d SH/#'0l< 2ĴC$<8tT?^δpOMj\&9%D689@Һu*or.BܚO ,G1[ @5URdmV ¸1f C`3aBPaT yaпF@䯱mHa N,h ]2+YlVuCH2hޚurѳ>QfB Am!ԫ]a,k>_ZV]2wR$Bga4/3#"elȲN%m)/@pVl!3dE#M{awǴ3 JEIEH;v wg=uܵVp!YpbG \%w̜wC컈&\ULMLx @@nhkª4UEk|`H\+p嫓O~2JQZ'e2BYۻkFKC'dv!`o-mLj2{2w+h=+%+yY"C -Rbw־}wɱ+f)іz8$(I9ÁnYlR3mTL Wdh*iS$JᲙ+(J Pf/u>|1HX#L.߻kj z_eDžIw`Dρ#; xq8n!'oO( lضeZ*m4Ɏ}!+eZ(@]}Io#nR;-gMMDe-<G በt%.3 }?lnt Hc"ȅɘDL&992AVns:oϺD=᎘kzվ$.1x4CgVO^[.f奶AmU/¶Di+'$f]c/*rèKt ( $𺤃l~* me+\="x Q*3 B:/Zɕp^Yq=-hc_rV/pn{JA5^9]Wb?]M _mE EE7 w :9HfZI(rԲ*5rTŸb>j'8(U&W};\gm 1(aZGK>|"m,}ig':Y{q& qtuS0y;!c0?|Jj͑nF s7bӗk̈́5^0zRC'-( )!7ne(%'Y> H2>b5<4]Sh׼=YoGȊ@p"7InC< &MՄǩ,C{Xjxȵ|2BH)s496bgW/]ºij0ٖj̚ȅWK~}<([q"JZkJ/ཨw*vb鲴rB/R'1_-~(Ap~n}^g7䠣ACTjt2~"xoU#+$L}W㚭}RewP QR̻8|mWڹEv2ghx4qĕìt؏@Qj5Vtbqi!m\iee8NG|iHgOct#h$VB/F.cw+{3Vh*NVras{Ϻa-'o쐾k/k>NY} g]Sv;l sA72B0L__f:,?åvɥygd]WdNt?622[{j̢q&͙rr*[<⛓t3endstream endobj 407 0 obj << /Filter /FlateDecode /Length 417828 >> stream xK?KrbwM{#$^(.$>$8CC"}wwfFDu9␔v]?2#Y>.__p}CǏs}=GisM?~?~nk?^~?K?;/+g?_͹͹?_?W?(??VV_?S~O_sB_ ?7+>?_NO.yNo헿]t)3 ks]? g~sc?x2lٮ(|L;/߼|syo=wG~=9W:W'r}_1:kvN}kY&{Y?yP^6!~6@jkzSi~U?A}$/z,o EY~qv,[Y:~=ՄIX;۽O"3nub.վ>3G?ϞoЯ+.!5y tH~^ ?ɺ7=o=Y|"7۶|޻|wj͏uH/~i_G.Dfy#+x:xV?j*N}ˏu[HË!#_s*[Mo#Vo/hr%CHX7?z@z(-~Ж s杺 5lb)4ק5" />tVXК#o~7e{kTyO~eƿiWolR1mv3teB,pw"6Ndw'By+_=2"a濢ilm!ݧo_0: DO\i-yI;a+^,9ܞ #PWƘ*$<%㲴*U 0D` k[Zi;/^f@]%v/;MC W)&$bWG|qݛBkMHREgyע74Yxڍ/獄Q^NT6oH 72pKgMuwB,Ujo-?/zV,t ?[y=?I3<]Dv Ơ5Rڀ:߾=F"g⮳1a'ވtEHD%2Y`*7hxPAlG|;!`c'P1܉O3Gd( ЏHڇe@kF>^nwǁ̤k!&Rա/731HY3F%N -}fS =FwzpSwVKpLv%ڧ-V۬w18LVz:6cɎ`}]ŰL,w*Bq;ޯpcaldx6/E⧻N aw4W@ 1*Uw)}6Lf@r2isC'L)RNc& Tk^iw3i"a \A %=fI>{wJ|M$ǧAF&1Ah,ə`;MHtwH_TNl&7 D8{ߦ5twNK2{zR-`{ ~7֥=]QF(HL++c'*|@f.ٙc"H O c4&~ҏ̞<™󸑭omL3NxuM1 L#]`4  ww?.|(3iNrߵ|]=dݵ!&ke<7eVNFU-7@XmTxVQ}eE chWc*1nn(>ͰHlR!IeodS9… 58 ӡnXxTt;3STׅ 2l:&~Js; DVBda' 1nP7YӍ8xDUm:Ϙ_e Tufycf=SM|8۸aVE1Oj$q[3э{KȴW5^jLnʁi; RWwj613?mg9]Hr44~^t?:8S4| `_i^ZDo ﷯7߂9tfU'{M ouL|>/ᘒ8FvkAs#aY]}w ۿ/s tr- gr>V;I -yijLu$LcFa,]vsXsxF[Zm(_&\nW$}\'Ht7vg5".ܳwsׅa*AfoNF y SE a1A߳ c>Öa#"w|o d%Ϻq!$8:#Ѽ0 Ǯ: a͹ట_y#F$ld}{s :ݽ҃9bDjے>%!QLe0%Oc[˖؇ql4ߜ;?Jtގ S;9^Px57q  3v]iHHaTD*|~r!0gwxg-D"{&R}I#t"u Na^BE zLXpu2sKIkڿ;7#UD;g82@Z%\U$@=D!;W'6KE v\UZޠu UΊ^h0~gHoUg9[.P@Xp[N K  Gh6$4#m0Lo6sU"a7.x/x#P@&e=$|@dN֑0A$9ЄK r"^i|?A,$^zo$(/~p{Kl0c,#NLGV=K0 YY$޶HZ(#F ;͢*YжwRڻEx;(mD4rE>w2h$P$v95&{~!C@>Yr[z-G3iD*ݥc>Hv㬕ݣiE72lTL6&s$xȊ,o:}U}Yp0U$j ӿ}8`Z-PU bc|@Ӏ-M߇ ]aG*=[z޳1PaKH9C lh3Lw뿛ߦ',[A&z@NiTp kD2{z#Ao[O" S# `#wޡ7R^yuea?;?Lۿ!".3LW "8+@Y.5D:QtBb8;mP~[Uև/'uXoʲ<}ԍ,[r$IP)p?/t#|ƳҶ_Ikn$i-i7f=.) 9z32䬳D-:!ǼtVtuLDŽT*^Fߟ#Ss#5` Ґv]fҰtKywP@8sDi/<2'2˥g+Z7?ҭ61h]g&u'{-_"=уg 1@2Z%Hv'^hƯ 2"=ŕiًvޝ|+{O;));x8 'TV$ P;@Hj^ɉ߈} s ^UƳ*\dёKڼ8-KD1jcoIX .6GX;-g/ ':cq 2?}pAkȑZΊ_,kw I[i5$X"UZTY--~S:ڪfڃකt֗XXwb}:?!"4 h^ג͜$>M ++[K2Bò2@s1ݚ^'55uļ묜,Ыפg1#L1;d#'_Hh-xmW3 ˁ0}mv$2{#8IYZ3`b}쪯 듵͎ ӓ8~~~<кalif'i4٪"`MיAW*tUU?5̺l"3# plH^{\xcqPuN @Ӌ8)`^Chl(^>_B@sbl(U[kbs󙦿q䴶e939}En Ǘƭ@&,7c P"iwJGem.B<Ż5<oZH?z3tD(ħq qEkN IEe.< @xB)t,h3)͍>m؆IM:<ԆipSBfdTBS3 PEˇ4eU=чM%.7/HGSq2T }J0ؠN|Af(JaP̢[/@wҡ@$ ϸRWE@GRCfC "b5@`S'LzOj̝Z'h|ƿQ"vC߈M2bsIUʳ?['&JH?5wgQ£#/HG6Z"K:#2Zq?dQekHs=+(iɖs ix:Ly=]H&t-!j%bH&t ݞ:\xQpƽ |˫Q NJO#2Sݞ,d&}aJ6QKY+V#Pj!cP#F!+s3Lcm*0x†@{o?Bi PR!ʑGHT#2PwYJ熐HcƼc8,f7bMDr_&g)8eET"]li.>[-Y) DB~ 8Ӭ]plpL,$ɅiE* |~ǖ Pv:ɐd٦@]x3rSaIJa)sa)Z |[bXqS>`뤎 t(#Y֦#^GCG- 5mN; `aov"lH#Cxd=ɾ#̱ͅ)T WPb?H4!1:0pu~BZKc̑#D쒲gޮ#: dAȂ 눽f2Ν>F0K@2-s"2A |~ebFUC_|hj#Ǵ@ʑc-ڑZHMt$Lxz# 9UWi[2\H6\x*4/B6֘-rb9UNFUP-7w$Ŕ(^io ;*Gr'8)E`?KAH٘O. BբGj ]P. w1-K~Y;GR!pdgQ! $G }hXΖC`xtdb۹*עc6[VK*(gYOaD5ˑF}d@ϘIZkH "`߿Š'@u5CwO% 6;\ҹ>7:*HGw0h1lGWH舡v?ztoTnt$wtГ Zl )[:_QT]=@%vHڽHW tzq0߁ՒJ)@ Uhnsget y0: t@O3%3*46Ȁ:Vؑ䴔avd_Cͱ XvulbP Ne@,Vв_ cH똍ǡCl&`j@UP),|dhc0`8gsN zÀ hi ;2ܐ*!NaEE%zoEn@˱f@ $ɪ>_̀Xy~T1D@aH'G؜Gg9}_ljllRɃ︄짉 EI[&E@ǥg SKgvpIёwj$A`w~I P3E. Y.@?:Lإ/ ágj>WL5Lj.&5@V }BHȁB< ;t/T]DŽbOJ77l#(L;(a CReՑˆ|a?˧NZ%1M6tL7OYhd #+gb 3:1iE6'EO P* w'hv+rW؅PҾ$C% ,`NXǏYӚ}8 v@א#s(WHl{R.@ھ-%bCFdNrÏuUC[;1ṱCOوxmtaKΝ</ẐIו, ã߮T|OE ) rGʻ/8 sLhAp/GZǮC:b`$U`OdWt_)IFVƮH]ywTtM縪A9aglc2;uj.$SMdaIz5堓}xp +ue֐<2X[]䇏 i;ϪAS\C o',H\EТ gAč K7WR~70ە?W+LؾڒwhlM)+q Dߪ5֒7L"a B‚gјJ X540. 1" լOYMp@+k 0&?/yU~;0LJ.~/dZLbO$!Y@}?ԊwT!}%wD6Ȇ ڟaKaf!\۠)Fj,"3jepVuEW#)([*jw]X>HUNtt Ahjp")Vtyj ?gM2s3tc-ioFgA w֓ǖ8L.aj?.r5XHPb,Q덻WVUp6_d?OS(ֽ7%_{jSbzgBq8Uz ojw$389L(ɪXi3O'Y­GwH<^IAS oMV i6HT@vuՔYAM-] #gmP&۠yȬAӧh?@ T]eeZø_`E.S7Ñ^+oާa!&m}^<{{MRQ v.D;l<0VG؎{91,IHRnR3M!Nj~Ԁ;X:21iK1tIyu¼hC {)\xYOj˖욟ڟ$;uE h[nmR @9THA/Ķ꘶_U 0>nMVtLΟܘvSYJIZKNH Z*IEH;!{3JEB>=ҍ@8vRjN p*99;*negi/%8æ#)M Kwe?wÞ|F-dHN3”}viYd-#: ! ZNP $?!iI9Nx ivU eJݟ ?U ' B 2A d?O|,SB~<@2Q秝:rp74M?ԼA @Л8-_ Bq |,T2FŴ3$Аސ@1x SY٘xy!YC[ Y d? *,M2y d3W(Vр߹ h \D+>p01#X璚@v^XWkK'k$ _+@1~ZP^ 5@[!sB )XkVq\sW~rB  OnpH}(cCxN dG򢦽?\Gq{0=i87?ە%@:BSHں2DݡcrJzs$PB"G4D:z~&ȡ˄AZ62]f#P@Y0>H֪isK u%ۆ!0ӂlʷk}Kol@ D!'`PTTܭijPVԊ6e=a3Awla[< {g;UF "d3~Ƥn,0iGs>qHIi T $w@>'u+A) OJ~j`%dIbhiCm7H~rߙ@ nʹAg V-T2J(EQ6tU:`Ip$@rgV]d~h)Ȇb?$-Yܖ$M'LKmAm sa/'DvN2ڵ8 31~Ij AжⳃD ?n8P}l ! z^Cguu:~:#}|jO{@82/_B?Դ $ݩ7^_{~= ͷI܋d:re6*B褪|(whtQobadb? SSݽCs)(ƝK{̯7h vO@[,t3:rϸ:>90\Vr@@@,ZwDndq#PJ NS 4H4]fWIv( D!?s1"v*9eg3M ܋%N7V;>P7?#LƵ?69F܏_%OaDV6bAR]v0HFM.ӡiC QF<#|wOڭDΆi'f 2:xvr-!p֐4J?sNl}n?HYyq!K 3BVv/@Ck@?8|x n"uHT b)JHݯAe]7"c<$ KH x?/vJh-+Pw;4a@{g7ܑ:)Z `a 'TWT4~d|k .΄D7Fr9j佣k*4>OT|, h|5 yHFjw!#x@0)3 1^%ڀȧ) |v> iAzՀȧu1a 7Y~GDI~l;paԭ,e茔 6!!\5]e'&*\uA~Q:bN8f7+C"BG-לj?O9g [2Aw Qͣno mk'~NEeBD@&&~f94uTAeBs$4!clBⓛ*\*[9S v.To OnD@tJwJC2+B2$̧l}61>OdBaJfS=tK"zevJk3!srg׌6dZ*Mj}'o&>eVP mBg\79[1.Sz ]b?˘;gQ9YHo&>OIwBmSS)$8Op7@"`?!ن>0~H&r<Jo3O,%ZI&>$sp\!(2OgL϶9Uz=dbP>TuRzT A&$NvBs2 y>{Y<2֥puqߝ#HI4"X 8wAg]t14LO_9sJA+e>R9Y]TTtnVծUH>[p :&3 +muI@: TMw5mƊN9 8a! 8a|ur7$y#74Q#Rܔ X(t]e9# [ ,}3/}bAr+]͈ d.p'@ tLH![ܹ 9i#̞>Otd 6;7ҧfp ,%L&RۥLNW Zz] K,~b>RE *sBLaP! I@ܠAm {3$>U HtVNɽW~N:aP9~ҏ`\3{΋ٶw4ȽiAkڭH ܺvCΝ0=NjMd!FY0E k KuϵdU`-66bi`*e=_ꞚkXHE!36Aݓ;2 C`!,ܸ0 貹fH1" 2T)$wjAgfPPbpSs$ lֱ @ۓ[Rq6[4Q y ꞇ MF߯a԰hЪWdwa_Ruݝێ!bsh}*mݐTn(|HF Cz ϓFl 1W3 7R 1wbz#}l4ʝ"C 7i`"!V=+&oVN6 ÔabrI+F4g?"~N_ [aPکYT>OƴvVvm| ~1/Pl"_7ތ O-]u ̪z~j"/#u}9. Ϯ _oܯ)Ϋ:c-J"Sq?Pp͆O"]%=YC:L` ɟ3'lCkƆ2H|vD6d><fi"R+J*6>`ȑog?gX4~} շÆq;>q8ul 7>Oml)w9! hAF<87bQ1iSS6 'SuLZ|G4)Ʉl8)XV`*:5&|rA!B4x!9b@Nt$L_ \F.'Nt.O@0AI جG:2Ql:f,XuX)H##ΈtVIdЛΚ9]J4 ?gANT\T*?ŁܱrGR %GO6Q]ݑSnc6#~w"Im2̱/ sφs_ʰ%Q4?Q_P\ڇZDXe2#=vroYE/?ZhHBOl(4&KȀ.U@!}݂,@ʑ`V F1 +@[uMw"t'ð]~RmC8AB*ѕ$4͈k&#=gqnZ vR# UwdJRG :fABG &J"tR'8]yb=q@i~?KÑ"Fs{#´c+>'3ot@N"XQuHc]gx.d& $?[AAܑ ˷MIOh@{ctc 1+h~>zҷ!XpkS:^(vkXtnHC`+:&ӹMU o_L.!V-;ew["w^lN0/Pً# +tY桓6yu6oLBS)# ѧBMX49t`^Uɍt >i6!buxΞp&;A&t?2!Gk>{1G{A~*രΑ_^t џ1a\W*#klVq 4fѷ'x?9?#܁u \1 O-%D *D?x΁&`55BTDc5f/8`^)9eC[!# ,I4hoGxJϋ,N?M}Hf'wH$JS*t?5T8*pwuitB]m8OI8>Pŕ * 2fѶ+p\eED?wH&hP3ls]_'j Ѩ9IMHE"REQGh1q# YQS@៾[D0kc)zk,dcGK҇ SL͑5pDCR7s?q_s=-d?8u _UxU14d("iGgL[~JV4~vyYl2Fgg79ݹg䢙dۏ$0 JtȄ5!uNJۇvYjOOוNOu$bg{@:| ̨#tzyI\7!ۍ=Cf=5'NAg&_iH[N@+`u ~ǭ7HlCv~Bd.wnݠ(eU:}c!;VPrzGԷ9z{}!وh2]dte~p ~gA )xH5O6V{޲#ht}jb|I`9C픺;B"?UΦO))CeՑ$8}"P`TCT!yrq9RG1@v%Ef u}T?oU,`z]}١9H)0(D#@@<=|ю ҡyF%+ 2s<>%HcCtN15/ }BT~Gvv)}r@kތ#a +_f@s#DMт̀ϱ?16 pNbGPh!iRos@G:!c[}2 9tٍo%G(>$gל2 yrJ>Ҁ9CW!Y4ePSw@aP@苽y@SSʀ৆?Xր"A{Gvd|^QDtM,c){CK7P642]^">iId)&Bϒ?'I20Dk0wyn@`%KULG]tTK.b,#u :U5AORچc-בz?@Arw<&1H H\ē:f|zK "1 Xo`׆O9!s̢]g*=i ͟,ڶbB곊Mh]JBfEdUlIbMhqDfN}.} }B}LHh{Gj:Ⳇ&$w| _겓ri|9UT',6_rBv2),tvmۀx `c ybZn گ%lT|-$쩀L~R>hggxM~r?_pi vd>,,HϦşfjq(`׮*FZFW3Cv$?R7Lxw_Y'PiN.0Y1ui^h޺8"g Y\^T?OfyrUːT{; g**Y.)`OM&/bDҷP޹#܈rߚZem6S{YP-$k anS&Nu _C #=R^؅ Y[ yAZ4@`8p"AR"LQ&3t>mHNm%@ńdS6~j.Gxq 5~A[r ؟!4յ g|ՐV8) p1c N`A󳈔D?XD?OѺvcBzyAT?ϠA*; y>a6y|/2!€xJ4Un\R7 Yd?Ody&f/mjEgV혚nڴt`5韬\qFOlqs Q#)a%?te Pӿ ?ב?}2?}ŸlnMkVFG_ϓT?y;gLf9E ݟě@WީsgCT6?ڑ1 urjbI Ё;D},6Tϙ&w]9b)o@U {g 똅ҽ i?QSPڟ*>!'D/8Ϟ ڟZH>8b3/ ha t$LHVoh?t∕wB?q\*@ӐD:Rx%Q։d &~ ;U?)lȆDMIҢ G :a1\tu1K^̑TKyd?ZZzH{.v⇻XRM]$W &eZtky ?74? #,\x;2 HMOnHȮ9 ICKH(]DUP)jBf:yɊ+C ߭cF$L^gV w$L_˒w&D"G1@S $,GRɞB84 DBȾulHؽ4ِ 3(.HxH>:0ٷl)buBG 4J뎄U8-wjUH}BrӁ؇r箘[ >wCG UqMI#Y)b_ˀ=;7u D?%uH~~ڱ~f- H*ySdڑV1.Ov$wpgd I6"'ǐ#q@GrL3ۏ]?:q$9Vt`"9Ϙ"44!#_$tDO#b7nB'%ml={ \Ȱ#rtˢcg-ԳC6T BIoHh]ZiƱJOXSSXʁ9?udCd<>D@OZ&'!Z# cA`/7G6k!եY(#)?gwކ.i6΂"DƄ_ j ;QSTj uTHh#lc]M2ЋSA碬#U7v$p|Ñ\5ǡ GFww!ZL 5)ҕsPU zMơ P*CXRg82z.,&ƇnRad41@=[hP-,7;1 l"vZ8Y3W"TQbнVe@ACGKg(X؅ר#j"xO S@/.rs4dWiсYs o^֎arnR{"\d-p4zaOXGs>r#95ȪSSfjUTNpqlXTu egNx^3lx6T懆ϣ!!ڎp]I%ʧ4-`b M'yKBo +'Zrc8 Ck#c?pd+j4~lg1d?"v" ("5~Jʑcfy%(6C L>'bru#@jT{;FM՚Bs2OOu+'sФ*/-- WR_kYxMp$׌rCh;FHp0]g#k%] +{fĭ tX?ԝq9ppSO &j V ŸRq^"lqRSLEڡWýi=XR8EhƎbOLO=MҙtKzڪ`E0:byoylr^}|J:8>0Ǭ};K!ζ'ωҟHTġcKÑ|BHj#9BșKP;#ԗ?'w.5tZ $}@Ev 7rE ,?$:Bb5 tv7yxP ҟHځDžzJ>o`pL-IϢoҟ ;lQGbSHϵ F*ۍє@캐Ȗ:bH,eDMr`|(dhf(|X@00{uʟҲiG;G wWļ:0ۓn@„1e()unYj ="麟Ǵ H)6*p|y ͰܟuT!&28H·&7{fs/e=F/}Bm9`N2]rNj;П/aǧDͪZr j<.}Pn42xcֿX\}݌ |PJq]BgnM2֟lPwp-7lOB[x|uV1SS< o8JT2-3Z_vS3Ѐ$%wtAA1̻q{*HXR/{\Azu1l w` T|5 .%:{alCs0n$vGk|xO]k&ЍFE0ˤ]cɐv&up:۠@z;N$ m@ _h-RXnPws7~ ȬP>)Qm.K eQ膙  T[< BXxwDS6Xp@0CC hu+~{Hb.?g]" ;: ܞ^d2P:eL7H /m0=ZZ-90 q*?LSa[(brS{* P JhBNPk/m!- r ؁IzP@op|S;ǟBAw I߯}<@@,M>;0@o{=0@ %+Mx. D?A; )9܈S G8w>+z- k?nC !:" RˊjY;-YÆQm$-425z VF#ENYK.C5^:L%amTC餾o8bD0+sզsȰaXoZgT񟯡hO,v<2@ޜ$B<? ?)sF_|Mi🭺7%-7h7`Bu?7u,ow$h++F禃Mág{S{V~z7 PÌy;pw ㅉ@X0d; MEcTS(BdAm_ %w$VM([,%㷧x'+f@ޙ:L3D!;JnIo$4)o| 'V(g_ 1 .40-n~̴r>@:N(ò~C?sSVP& OQb-) @J{jVzݵһKɴxF2ɀZG T o~˲o ^ġTV-@~Ɵ0TnՇ`\T>@ zd= Uo`&5!}N)qBHv eJQerw7*3tJ?C̲P5u ){ u)>; +ˏAx/b=R̚gʦ )ƧsUl1Ȇ;QxW~+{S.JVH E7?;s?g*<M`,m2JM?ןua@WKS -ՇReD V1yXo8Ktϭ2TKؠV!% };Ec^ey}S*ЭzP.pPV ctMI JbZ(%01G Z_)oP^Qr(gh>1U3J2 vr+ =~n~1 cXUTqdO( Yc}*},Tn]VQG% jME2@wQQZƯ4F|5`@urr0>kЀszwvt]l<+PSBXLmzQxZ埳yJi~LPIHEt >f`覯3XHn}Ҫa8ⳄP(.*>$.^e&pzWo&x0}41[c췇Ԙ$6 g4  e6s9 3ZzP N뎝5'!dJzk0@AsI ꑒ-ֽ櫁vZ{}ng i?wH8l[M*bВt54&:3{| jp%q# d u8XSJ ((O?'zGuڷUn  >un s-G(5@qxWrzGt nM6%蔡!k/4 Kj@g $DAKo0+Igh@H˅ %G μWaPVƷOڞN5P[~E "б;(ߗT`o` 2ǁjLu)>M t ^wrwG$P$,( ct`>Eo5ز+9^Wg*2tMŞTK% eо:ද^XP] Z vȔPҹuܧCK4u44u#\ :8;#@¡$O(8 $](o{Oou[P ,_<@c"$m""К~Koq;X9Px`-_9cӟj8f.$te(HСfA^''h|]aH@]2יc;DxAt tc(:8* "H߷-s:;:t=DhAJ6|F:D0L t#t]`\'j]n+S:TO6y؂m< ϰ0`@,Z_G{3!!&JJBy C >IbӀ:2p5sXЍp hlFd>?pT b@q P NzHа¼ a|!W[,9X@?_5C}; A ;@zQiϩ_JlpƘm/+ _KˣB~R)1׍mW)3 li١,x~$5$겲0؀e[2@ve҇勏uw JZGKTccty ]cv7 :  .jZ"~>ل t<'1 q' zÜ,5Iwv-T)^`#`A&9Yt(n. :̤5 4ʹzu : fMWv(?)1חm=[۝YJn >/~ t_DsYIJZt'Heٙ@=NMHpC%g?0 mN@*7ݞ8= Fۻ90L@! #xd[MWٟf\J^2|A=_u&gU7TI(Y#mUoD3Y ,}W慢]ʘ-p|CY<:jw(~,`H[@S(L*7Nܠ|fV@VR!V'S՝z\| M>c}Hw1NN_>&7jrbPn(dνC~!Ƕ $#D;yIt5#mQ.%Сdŕ`m-M^!({`zP&w\ `4L,!A4X A]%$^egeikܿj1B@бe^e\?/wumA_( _|L^-"?tƾDP^ u.ާ1h6g[HP'to.f2/XXʖ^dQ~SÆԝZg$MBj 9C˖FszP&Vn_Hl{Gvlx7zWQxi+5!X;ڰ@GD=؜WEx)i˧y{#0sGtb.&`c we2Ef,>Gpnig2J;l2s"9,~mdoױ@Cݑ"A2+AI^g)9ymfd}>QW(ڟLt8_bCE;)@cL玞 uqv{4T -:@Ճ!lb6臘O; Yp:p@w<] [0c@xс PBYdu_'x C*;9w{ l wzli=M=5tC r[2] =?V@}?.-;@]4JWm9U:wMg;U WHo ^5:"9} y+Pd9y@wL%614]J}YL8w,>8ñ3%!mn{积./Il_x= qgP(-9p@8{F݃o'BNg o1Ga&ǧOb@(F 7xdn :f CU|"!8PdO A9ʆՈc^SP/)VKBRO@&%̀P&>P ;i1pʦB)JRr9BKx4R}L2JcXSC@I]L %(+~]JV% L|-R{k o)4~,c<] Vב2zaz@-췩ŗPӡTܫgJɽ}L%.* ej9Ĩ~OB@BN4fw#!tXD{WLVǛr_*d:G(10GyCOmE(Z]2!i UnRTTTn^cv=i 3W YVwd?eV*BsJ!C !BT`@Ͳ%9AXh/\72}|P:c2_ y5 -MLuXI/[ AR*nRౡ`7=#J،a)[0Nu\TJ#bҫ΃WMjBYPe(7Kk۬&۴P}T3Ѐۡ!/?~=JC),Pv<>'X)G$)B\KXqc @mCBշZ+3uj(^CXy;'П{Jx0wP( ]7?pĊ@,P(>ѡcz*KTLj"P@ʁT9Y>i٦bU T 2X4h$ts@j/-_k3NAǾ=3?C$T,P<mB a(RGkPB0hrE^b ^5`o((F50%ND[ C NB4C܃{RU04bzaW.e5€T0II/ h.ҽYzP*=2uafe|t#ڷ `(;p@ AP*:CВ$ IKs z(CFzr֬.fu4lVsB z X=_&vI>(YڪP\ހ *%0/nA=UvZB}!rP@wݺQ2gu^1`뮝5n@MmSA]&J4 %1pt(I(S3&&4 *Op|(d3"6~XЩ3kP~FV P&^_fC3')! tюxbZQ=CaLnEuލ'!)e hD:HЩ PT>Cdvc !ᧄjz(ެ؊*zt!A;HMd3PҘ $BsIOKLPiPr9 7;z_bV]XП O~ eEd ZהΤY$C̪-h(U`=rf(AUKˡh>QȠF?֡ fa1AoB@Ǐ) {p2,YDԐA6G:< 秅ҤC|$K]XhPOР]4 iG(9dX2p5M+_v`_*P6% {82B°q1J?Fvq,u@7A;H ;jWP:c`l&Ai;"L=B)cfp{LQL=A0 %M=Y(ڳxʧ|FQr(^o,z7w갶Yd7gds@ 5 V&NG>&75SfBQ\;4?@mCɤ{UsVV8 w %$݇g s-<, ouc(2w Iw z7!Y EATʅB!59)s<~;Cɤ{m}J&kW>zPrN"HӤ4)neR:);x@wufl_' x@fJ^:b*<mZ|>opZ"8«_CijqA͐9"Pb8NhO.uux3'.&auo5Y%56 1!0y1(.&D o  "tB9$}x] M4B/Rƽg|*C8MZv"n,x__5w#WYC# C%m'2UV2g[L%ԞFMwToo2v jJp(DP| LςȠ?d .N T2`iwm@J e}&XPrX>w <‚z}.ӓ t'7fefW+tW*~|VU&JYAs{>5\d ԥ١瘊YQ9*>Q=޽G ,4ߘA E " Bykד]O_(*.pekX7qNVqN)Ի> BquW& H(%z>|U$gJX0@ (Ѝ-pZo d\N(*=]XPAW %y}i * E(;D=d@707c (TYܡ ->)!pG`-9Wkph_+Bvn 8A uv ѧ}OMj10*35/!F@maBn@ LPȲU j٫l2EJ$轘xZIK ĉ #B 3mPL]\)Y  \c.R2+(XJjA(S %V&S>/а| :f(SdJ'3Uvq }%_v89ɸrXXL4]&ã*30w5 K n7~ OU(ҫgW| 蚜( wv;apw% w;5!JaKLi Zo^ІzC{+c6ƻىuvCy ޼̗Y ) +xwhm@@^= h7 &nyrXܠc Fzh~;.n^ DVV66@ 0%opbC h_?ݕ .&oHwvqF~WҘZEwgmV/6Dfܿ#w? D_9@)8rYʻ {,wo픻uٱB1d~.8t"9=;OVx ZߖRбv9y T5DSwݵ׃(oR`HOSD{/+'7AM_f1>k܌$]<9X/$U&@CW'#~S |gS-T~tbIy۾w͊QO=A ,J=y9&OGM'@ 5dqN0Pl.D=߈>HpKEg[}h{Q=vJˇ2k A]H:<UVt ޺OAu~E4 J-|L U$6LBܬPMY(RD;+^o!2@\:p[BdF H!L[Pi Bu6ԣd(jsX{&Ta=X1dH\(L)P*K魎oYQ\`k>&Ӕē %5vH${7xE OB(t[۫ۖIJWAȱ՛TP^b=@ ))s}1FP6Uo. P*}25O G ed쯃8x)J)_,P>gN>dTL){*BQDCgm\ rl(@^Ē0X>gMU'wM=Js ZPb !t(.~^^lB؀S/y蜌ȉ~!J2j:X1S濟Ql}(} "!}wH/"kPæ#5\J#e^GTQ`zr ֣־ ꜹPq)a}V_b@Gif#. {ҏ 걢ClY(>,G{?T_2hlȠCQ z6mhS 62 a2-GpT#ȩJK?=ujD7ȸ( L6Lb )响J>9` B&/_b1-e5 }{A%%^0gPd"Fu5ǜ;|Źӥ5zwJ'>PT>d.pzR[ U"Q(vi}L&W=ÔEz»}$ ^GTQ:'.9 aPA;}; u}x IԌ\* 8G zZyVT~C%7y9$3UwPLz E tZ> ݲ)!'tV*լPPL ߬4-^>B vj#|Q r>FP*+t]H[W % O!/[j:l!w3Ue\(—̦[9~4E@-RIsMK0o_ڔʠj2S>*XC1MZ*_GT=B 9TEu8GQEBP]\Sڊz{̠lR "Hۯ #ԃxQ 49*Po1+S;U&\1p(m |*!{-&@,1&qe' ~'A|eSs3͌&@[C3gmb<[F4 :Ѫgs1JQ͉V- DddPٜ7 #:Ynyİf?eV |(]Gʇu4P3%BY!aG1`(f[!X%0 Ǔ`Ѱ :hU#M|ߋ,šC_g8haE}c7"z4ࠟқ7Ͱmz Aȹ?-HoTt?!x 0xF`P_fӻoP6&DͶ!*7|`=:P."}|G VHI!^[q1zK(PTUF!,&WٸMZgʼn`~g%7Y#c=kw?‚::XЪf: 83FLPLPL6夣3{Ƿ4BA_3^@A肂wAAl>:$ Gg̎ћtc@谀6:PPۏ}.Gt` z]5\l~1UVzŏg* чydrCi$-%w6? }8A&[&h;~djqt}b;PP FwB(1Fc^cBc KŘTi;< BТI{?Wt^G,5.J)y WVElYcS '֫PHXПoX[`QS7&ciS .„0|HtSحc<5S$[#Y}W5|ZT 9SYiB1u@* +CѲĘR6J6!s6' ~^t NW Es" @aƀ7>-_f6 5֠,l4Pz1#&A},nrϮ0OUD|gJ֦8[;8 g-byRj[fnOL", ']R1IkO }>+zަ_VTY s X@#ņl@H8wl˼20\`ν %fw#00c{o^F4:3% ȹc5 tqMz70k3FmhqLa\P&KԠ/;1a :s}g2;=MNh?g290gMp?M/Q@ei hONrDe=M!5l4+Hq>xſPq:`(a =Es )4^G}M,g%٦&qZah[ϿXw,^XL=BiB3f-@gj^y? hfԡ ;yx(oTܧz!Ɩ (SQ?`KY.Lw% hGfr% \cJ+p1vM<П7 :` +PV@슕>?J?l%po~thl@@9BϽ?w?ACv 5‹n5-wuM u"]cCt;w@A"VY-K\}J;4usW1|Z>Vr' X), |nk S3nxw7omngMO>dExwܐ?Pf[J1"b(ϕwF}4v((>(R J8]^R2 ]5+Q鲇?ӟ3#5KreNLL,it@@EUG0V PҪ?RwTO FN@M=}.t`xF9RgȄzo+bDpƟB 3>v*x(w,uDkXh~@^ssœ6p\kmy˗ڽ cIPLM Y7};/(bŐnlUEoVpࢦ%3 Лw X+~G PgFh@D8υָ x>rrJ![*PCi$/_Sŝ}<%e`-)nSBq޿翟ʨu:hT IUR( f›hIxsCO)EGôEr|CC!d?a\`;V ܴu S*+ rj%qCx(v 3JЩ*R q3!D?⚡ ~l6u>ԃJ?t$TkCyQޛW"VK1< O+͟s~f˿̼PKMg1>ů, }ˡʖRBD(E^1J E-%џ*NurVʛ&a[xM(~>8鿢? t@WSx&j&eN0? a"t:{U= 憿$td36Mte@L?vNd?* %(\: ; jr ]4@K桼 "Bp~n'JBUj< й0;.Q7>V2X% ¤bV%?z@c1*8:BM@F cITM+S<v\ΡѸ&%!dw@@g>ft_'#ywmY}* P:B)xm iD EP2bQ˟CY>EWnL*WٿkTMC!7Cy'q. eS׭dGI攡~kW$_A3M6f{GYU4_xV?&Мn2)eR0?|V)SJpߌ$󊙿T0,b̸*v$P*=^蟟2z e}/E[(g tWQ ْҲC-A%&ˇ1&uʀ^?mgVњU-݄%}9η~ ~/T٭ gsP*^@.=wjPr֙q^eHl,5ɲWSlpx(\7I %Y诿@d(e}&W F6͡C,RE@@lmG-[Pgkܨ<[?ܹ1Gڛ/pL{ [kҠ.hs_ZzfEP(]AYMkCPކ:KfLҏ\-џN݈C(^x ^sK?esLM.i6PmPqy& [\ ddwhSӛsOpϹm؆u(g/N !dlI3[N({tm(o˿&' wC8<~uB , e(hc&Mu2)OYwȟˎBTUJ#E0luȟ  b+JʡMPC9 MgS3WP4_/B n_ |emǑϟ0EOa"ޓU+wgI ֢|STC([wP6xvv,Y6aކ‹(yͅN9 dۢ4g E>>keOOݩVo(˶;ӇI^ߓyr%0wȟwp|(N}xd9ݗsRt?g.7d4ہٳ/L{4r&f;JЗ25e7h[?Q uL`y&w;OrN)ef8k{l?c.cBbom+e^)0?[:2yH|d |;Y~jӁ9GBC̟;Ho* %чbm,{A9wU?`_9h4='6[r1uG3.Fg J%!"Ts( Fq$$pf1p *A n%F_?“N!d:ʽB9<:Og8I7!Wm_9Rp?]8JB\" 1j~%ְyV*~ OC1ow-Pq?m=~/7'R—9 +$"^,b%55';nNq?AJe Dj>ЇWY>-cck`Ҝ?F( 2u 1>fe&4~='ϻ6 p?ńy'ij{[gu4>RpNH@hO1^|.u|Q}̂g>yװ& CmC9,7L [SO/ N?9p=](\(1d}(=>ʔ=pGpJ*dN(2!oFPDV?oew[%ȉ}!ds0䲏PI~0kgȟ>O0@.w7wi2sDay[Is4T~( \}ĹlR669fJ(a6u^꜐?휂^vh;zgP61 jȋwSOL؟3:[avrx s^&P%m֯g=^cqsA-Qw`=\ d`(a4hT\YݔZͅY]UZ<]\P䡈x|瘶)4-gM2 szy cpI ]-8@F(Q0-8@IT ?B0 9BZPUL P?\0lE_yn}1:g~ Qh 6+Fb X0@oDx,0?]b@5 J!fƅ-؞-fv馯tp1\^ocJ6~3o*߰z'}b:hab.p @K{Z|WO6D9n0wb&t %hV{zPy@$_Pè6ǒ68Po!Jb}@&)Z0Пvțʿ m,V Զ| wӖ6(ПQM {᫏N@o6N!t>y-70ǎx'60@$Лnv@v=MJ<t,@CBPs_##ŧz:#E{90@P7|@ƤABSAMN1XU2HASs 8oJ%|V#mBQtuýrRv?hs|)"n+U9# C[Au$ *BygsݦuC J):#G0PϏ XP7i b΄B†X@F Q%֙wx@v5,8Q/|9x&9IrpX)$2> gQ=:DiA u5>3B9Բb =\zswKyz8 OtioI<@h}V:Uu8 P߮)ڼ`CizhtR)aQ$Q~E(_+[(kP67I}(bJB13A(ρb`oc ۏ9UĄ0> %eR&S:\ϛxPrK+>MS(R,8ތ./Q>lժP*@0BP(Del[me%:RDVgū?{KDD%+/ ]㉄;;_X܄&%|(WnR Eah+ЀLea꫏y[r 1ЀTzBӴS:2lZe ; tPpy:h:w$ ~h(Z.>f1 J@w#' @VȎJ.f?\[?uz@Ze؟U+#»2!IKIWBC0[?MQ܌P";`Z= ]_h% 1Pbp@k;Haz?P4SJF21oPOTNL 搉y+ rop{z5p@׃(}MOjrq@9eHT_gj;}EYb*8 g$RH!2BPü(+!d_]-C\N 4~(9x/b,?lz[,,Ph()ʡ|9K, >iT>ݳ)UQ3@B4mm;u~G(G>.Cͫs \ʛɺ- rXW`sp.b %5^U`CK ,b,OX(evi$٬tk}C@(^!:#C|" \ Us9-j}ʄ\rX(dIT@?'N3"j@GHΰEi\+u_YN xP<[R k'jz@/] P z?=A=,ӫ,*8Ӂz3|V(>D0J +,P#MmAcmaߩ=6[͜ ;] )^PlP^/[2Ǫ7@fJS>X(E-4@wl=SttyxoNvM. Tޘٚ:\l@Q*ڎ JO5M%JSzlKłW2“iaQ4|u>]Aj4,5|@rBUaƄ&&P!LEЬd q{:1 :$V-$Pֆ?DPL(5~ZG!E0kz"1g/G@}TXYߏ Эz$@IEQ5a %ݟ< ۅ6]ݬarL &UJ>sIgrdeˬod$d(Y1Ao<>Fkt(k1o}(8l2ߖ9+1 t@d~Bi8[ tT/SV×T3;P '6 }|HPAz^݇+lCwAJ%L=2V8%hL T>VɁux@;~ytȉOMe(OdoO|/L+[8g…"."tN#Av=OaՊlmz9DP*+w; uwe0:o[*!=P$` P9bn`9%BSXPg䄒M!4Bܤ_ ᦿ%R4BL~>~(7X87I#|&64:е*kBm+ v< z8*荫LwepBTj%W犾,ځ:BxcPXŢmMpȊ,bMpayKؿYӥ)&躇,&Y ~x7v4N$&P ? 1N@=M@FZ 5;63A4(ڝ`2ĵ ҼݥS)CZ/(RHPV5).Qbzn5-rԙbz`uB(: `e6GKTsy0 󱀂^6bHc'Tfa2AvBm^d[>1Tx>]OyBud=5Dh|vxhp$/פ{P: !PU>:L KB}f8'YX-}w 6Wh4PTdBz2#Z8_EI>)30ˁ ,hsqZnˆ#.@m_a->FƌYٗŤf=|02#:FLXuTX sCT{U6"#Vw \ЛEB ZpAۂ dDWbAod> 3`$F(¶hxt .P=.EJ D^pd> x ,Ak٦,! zM|Y+7h},<:QXp7+oBpjתz(;XdDzE$K\Ӳeo? :__AHٖ,@7va< *3Bs>(h@H/ w1,q?81 Ӷ݅Ihh *9s t  z-H]`aJ#pF7a&adim@w,!xDŽ 7PCic6L nC8$d10Aa"nCN&̬_%ge S&[[οˆ4_&42@' ñr*l!AA,=ybs73d6S}%xב"cȩ '64奌$-ru;h6Dh (0p:6~cyk.l`@,Js tW~xo@ۯpnX@N$ [χVJYߗPzU!x)1v(PP3r-0m8"IlP5ġd˟?JUv t xx70J'DӰ@Л&{|p(:yz瀀G @GQ@}tQr{&$ڭ<~&}IUH'9 Ao zs$ zJnW挝-QOtG Ȁwy  TPiQ=0AHE;a}C[lӁ z',oVP{d [J@ &?'+Ձt7[<Jv%?]y([?ؿn"#9V岟kC@CQY1:cSW $ "tLR6Z>e<} c|U(o/ 8g|,pj"z7.PFRXuE#̲-Wu 83L+PdbW'Ͷ B)(Lr?}ϐXQQOʦ̌R (M߼Ƅ~TN𐾘``zEz+eaL̦`f!v4E˔)Mɮ ŧYzVЭAyc[ᓪ (?= B[89ONs&AZR]ǖ@}; @m3yƧAmëՊ6eKnХdPQ(699MkpiMmeK!$tj}w d{+D8@/©uVNυ0it$ޛ@]*Cut{+L9fW ȾoI!ו 袭08U=290IS[8G9K76 "7J$-smF>HhnrV3 49X6$)%vաoSq04 .<&33RQw̐rVUhfK*w?CC^+GN[ h"?!qs!=Msh34 ={:$WQOb/nA#A~! Pʰ )97rZJn(@{^;[4olaE:4=m޼ hMreӓJ6\RW8O;Uh״ tJ %!Z#s] >INn 4hZ?.|v@aI>]o=MM@2s+<yIL*쟎P=oq(@1Or0@)Nˆa8 Ф  r  h%)pW kgc}%(gi:>^OFixJ$-56;/+p@pjmKuYYCJ3rbX@v4M@.EiMS> k]JsZ@ݟKK tO% ,b(Bڪ ) Ͼ?1E(P$ ?> hv$^-^wYXӅ&E%H@/8U>pL.wbP@Es%EZF F 3zl +Mv~+gЛdQ F*񨀀RcLzwJ,2(MK3'sɈ=37Z݈Qe4n\US eu& 5hE4 ԉ'E@W= b)4|l hysZ_Ǭq"jf'ƗC`c-vkiUXNc;iJa*[- |,`@49x 荄U`@T`@b@tɇdˡMr`ftz: ܍ՆS{0:>\7T|a՚'3ح+p@N=IYI-O e N)<ЪO h1]jGŐQ6-hWp@a:\@V"'3IBcu#x@7JSA9Hgl@{vS`mP@L̪9l~bj8u9§ș,'Ó/rd2 }t@eYi4t*o4JYՒ6.`qi$pԵ1 hb;^ jB>S+O)34x@>eD )%,8v>ߩA͏o 4ې{DcUe15/R@7`EAJJ=}Oj4p@еbo ^s4F4liՑ=&wj؂t;BԽ(()Ӡ>S^yk^[VNOYnQ ~^Hh A$\ּ urƀ`f+b?+Yx^| /ޏ 5.:gndAMb4(OrӃ<hgخ@M"]ʘ坩MuNLRu_lp@]| + &ˣ} I_lCOԓB]c]TGj@S򽖣W>35~R!=El3׿wgbtNk$m܉(5 ^{d cs+53գ;@0LOԊ^dտqМ4 o}v~NC@Ĝ|< kz5ff@Ua0 \̚~34f;6j{^ϒ2? p@_h vO875j70&< 7gj0  &(Ņi\t ̄/.,Lxhkwu'H ߐAG@sg@Ѐ8; t .NрT{ A4Lf$Y3z`q1}z{lZW(k@_m PqfK[,ֽ`][ éMZXjȢu%g.[Z|e!gVXgstSs.ˮb+`@#>" ko~X,D|+J%d740>ލ`=uRz:(d'+N,9hbn{ƻoeI 䥉.\Ip@VDCԽ2h=@$Pc9XRa*ab&c!p=E3-,kJh4,_X8c&K֎ _!+1SV i%Ǐ9@/8@̙Վ;o%}E&ͧ,zb~T>MƩ 6 ԋ+U_u3[Y6 e9;Ȍ^FJHWg+5RaªV"AC)F+Cu^ABT CALV.h :v16@[Hԙxl@_hViW VT=z4r<}+1{!m}P`@YѬd\e®ߍ[e鵬8̛u2C|+A#ꁒF-3#bJ)x9 ! !.ʓi_ݵƴ e`zxlJV|N>c"q&dVl#o嘳De՟1Lu@Z ,h LdҀ4p%KPA#lВw"] T L4Ty~ m,*Le:&am'mEtjU z= 4!W3aU"=x yU!G1C%@i%3.ʌd)!N;tTh1gUu=d{ \2WL>>>W tVMPT+SX@Y$! Mp*@PWԯ8k"ku=&V0%UFXj@_V2P o?\ҸR}d,ad+4(e ,Ua!BcGeB(ŌqU`> ~ 3}%VSj qIIJdme| 9YG[ iYuxTz Nm]ɩj$1*h1tDŽ&5lUp g+ulU%rKoPBР:Kv+jDOaj@o0AhyBB"X[IDt$Ey $ dWKvg ]&lЀn1ܰizh@hފZc'm%>K?kL )|c0PnbQx7рj^-〭vXVTݿ4 ŭGOj ' Z {gf>`h@otM 8~q {dh\Bm#k Uْa=DZn|"(5p59ʡ[ J|@9'g+gtX, \&}mxL7Nej\A[Qr^HOVbؗ"Jg^o:9oV{"{KDDz&ل(Oj]+tz ^]]h8J;LPCLWwmwp@ԲUg8sR ؁= 0x: i[:z2<񕿫M\zd;X.b*ݵg>Jg5|d_f1%Խuk8@ztjV\.Bx+CqTؔ{M"UuP@wd/8HOE\%=,@txw׫ kăqRGdbY'[Gf2spk]oꐀ" Eu yNgU1M $51X9feQ1鐀S5܆$;:ak!SY=F`8OZzn@o^F}NJR EB1vA=[-)dpc_xDdUz +0;t`@.J%c@`!A  0-=2R^2 fFĮ s8W#c@14[! <@A:Ga18[kI:0uu1-OMVIU z:XC@PN@0F=v2i軚fШޑQϠwEpo H@wqvpKJc ݹx~4:"C0whVo ԭpe t d 57t3z pϒM@&XuNHrMDڨH2A @ !'eҞ#Lcd$ zW8 p7?e;]8]̄[)=bߜb8݌%5zQrsKz1;K",?_}t"f7s*Ԛ9혱f "Mta`@)00P~Ѱ4ޥ l&0Pcx ԁ ("(- ~e[9m9+Мr2&!BVN[݊8}(W߭ lE[\jE[Tqmǧc7w,4s#,F[835{^ap+b=>&Y/@]ne~g,o ,PWV2 NθA3moNB^)Ǵ,-Vb>H,(`ו.fyKi[`~ϰRu .Iޜ f/@Uck5[z;kSo0|j/@7nUioV@oj,878dTk ꅖռ@7|*N|վahjNą 8|L/i+FI{ *Vg(]0A#Rj3'^A݂%*= hw-t)2DҞ[-˦jVVOs5kV' TZP}w_ݥ ,P$^ ۅH#Sy@9GTkvϮGx (sQN׮@J> f8Jl,Ksm% 'f=ʔU֫/~mJbv%d,Y),(EB54UDS`jRqzzA C`B%K%2^o>_Bg5z5Ӟ"<ڤp>"ݞT Lm[Yu&>!%Qԫ 4(5};+Mk]K'kƑ#h;hVRW*g(RɑoBYm@E>{ʖؾ')%+7A&jRfݲp ld288(2?NA 奣wQ:5= s쿊(蠹V~.qAcX}ϋ\d"e}ׄ7O(~WNR D%5䡬ˠ&vI_ݣ?%"%rXY4etV%ݱ%7'jdӁPX Ul.]X]TeO@VA 4"[(ざl\*C,e,ic82]@y"a6{6h" dԒS`I^^֑\Lgؠ*=J"0:PdRsa{v[@kߋUGK qx[L7F\%LL)Ϫc PQ U_dPDŽz^z=Td4gxU: z:U2vJ6Q&,!/T3_)FcѼJAUQt,j (*eEmf@h,GY Ȕ6y^zz7T@ x4*S ;Zgi)5Ү{;ϖ'e|Do+tM7bޫM,@f4_`<$%l<5)A#SE|P[2wmz:|P2𼲯p-a+V dJNM.`9Y(|eEae)Ø( k_42N2A"6x]f%:|b!^r nMzg=Ul8h B(;ט ܆[$_x1GBsUJt fC !1*^tslDWa5W*dן`k>N 5kB~L BhBs[WwAEfF"(u *s !(g9xv'[)=dlqԣmZ *EBT!7ȮfW TU@=J"/Kd>>%/e9*tljQEu@*]]IMХ TAB%tYI~]9?VSpНb%#%7(Us%E<; UH5Z)ýi& !i=A3k5v(*iSUQNÿU$rz4%Ao-iʞF݀P#.i0<1*(Y}4+ -we=$7TGޭ-prc 8'Zrɒ3&ߣc tU[;K_mAG(SqPB)Ϡ֠kAEGXZSJ LbFmw҉&Hox*9$SnGHՙG)Z:u*]ܚ1w?|h^ko7|]1\}>Rdlֽ5A^hVV1bAVB LN3$ͭdf4ǔOVgQx+pV:EH§wES7s>m *>cBz}jb",PiR&5 g&=tdZ7uV*VR% I?|OT_%O\|t# 5 at赀(AE2Q̸vU}#FzWNHJ>i} H8Q' K9B-91g|; ';=JPw@uccRdE~e 9z+*OV*=~j2RL|ݦ ~Vu"-CcV""7[0, ")%Wd8P;6[*($BIV}Ob@,&HУY&zlp@Es[ +}&z!r+c齩J`][ݭ/IQp6)AD״z=I^wh>) QHP= >S!k( gl%}&[) ,+Xi`{A>vMIE0PM H{auq`UZ@S h""#*|>WxJFH27?n HPArUY y]Y $QN۟Ite=y 4t1$(~շP @3ӎG cgjƭ[ַ5ci X7l ҿ—Le8VN>#Sf#` d8|6-fAG9Hbh @}, H \azADJ{G>d˜oH*LFrSa}prYx@Ӏ ##vdM X }F`i LWs hO  hvQ:Ca$A@;Aqir:m5Kk20_wMeeHЕeG=ڕIA5Ivl=^49!,e7\_K>~ϯK@c>>|_KѨ2hQ[NVXr, WXpsVp@+Мz- wj4 zCf8}~'Tb A } ygz+_hU@%@r"c9TN޹~J6]ʜW(`UjP=* (57@9*ݭh A4x{/i!ﶢ =@uL+Ǽ5NԴFkBd\V j,htW@4eG@ /]35pچ(YSJ4&" |cx5@%kAqoilEapZn9cY| xLW2\n5G=|´xH pT$oaLekE [Ӄjho<3Jc+ 1.iOğ_xE}{pnT'DzYv;z&ԥ[mӕ,M%2PwgoYP@J9{!q- >>Il|SJ:ԷnCaM_[9~t~l%e?(;\P@PP@gG?A]OGסްnof'+f.ne>F{6wpfq۸k'=3s pwo1˜Ý>:N Hؘ- }-NX3' [X1vt@o%h҃-TVkt@}L'm2f rFrnS'G! iV t-BVh+ 4?Kg:{s?7cKggcS,Vy͡n;=mvԾ]pi^^nDpii {O9?y'?6E,`5C2#2pcϣy7Fw$`toՄ>iN㏭QN=P&VUZ+cNZJ?Ác s؟ . ?.J,9aiKCBS?}(7vП܌GO(qzC>?{^ XƖYEg?V2*$3q7*M׫AYgC%.ȠiJMM}g5e`><@AǛ XSO2SD](7b*3RǫL l}ro$ٗwgVlr ]xbO)'UJ45Ʀ('Q32pD'ۃ9[(=Pn 0?oyט&5Y?c_YkSyVcƀ<?oSQ; r,\e&4W |>tQb2t9T$o-LAZYSoZV"3I&4?tfʄ! mCYw?ϣnno+r3هYh\k,: , `Jd&uc= hSWMԷZəIHDcc[;:`⺒rߘCUo%zЛ2uj}R9w,V"سѽ+ZŻ9] q`r\ƓՎU\eBp0p Ait'n)ʪޯX!|R/fSYs } 0|aES:F4w ЭYgʭ?ؤ+ c-ZZLۊ(W W[TNKTXonx&5Pos{Rp"u(jdVnaP@ӂdVDV A{LM\/|'CV:̒z[2r PκВh7[ƯV*a4KR"btzL) .N`V>KYJ#-+nDtO1ŭL&}IY]~ju IkjY-U6sX>FksJ'M^gw܊H1J ?[)T/S)*Te~LRqߗ /Y0AzdO,:FYR}Ho'A>e?7;LJDV{+QB뭨cp`kb+H⢝@'k2MJXV}LU h?PVV`+n$=kz{L'4Vjzȣ`G(T!zpm$#ĭ$Ə&|! 1b‰Mn9 *VVX>|<5Yl+m}"A2(Cߊ6y0n%AÄ,Am W< T謭 <{ 41Cӥ%%ǔOP+ KC`ݕ$% _vPc}o4џ, SM "{ hTv04$X g3 3{LN1 8 )9!cS@7*dpgsWCk+5'3uI( ѕO8Pեm%~qhaH01ب g B. LTPc=2<ӽ˧mnFxߺpd)FW y[5ȟ#wJndVӶ)EbEB+Dq"S@7? h1xΜ:u+?"@lbX%֝M)nZJA=B T@$gܝg nEUVDb 6nF—Y??CM6"跒AT vGMf!ܒ3H '-mxwvt&7(CJS|´ Գǭ ׆3C}[95s92tDP߷0$9ÁZ$~YBԎow [˗Dd΄jC-hOŠn!tLh380b_ (K[`&QV^&}c34b;3 9/850Pz\Lα[{Ūra 0x+ &Fv;0 > DP=|̙9dJg<%^xI߁M?Ef dxn.١=zUTuM[`RKR)=>}lR4n5Wzp~ 8g)zYuo7bI:Fߝ<^I[Y0ƥ:WIU ڊ~pʐn@rV"^[[aOZe\ŌJQzC)Ed 3:Ɵ*A]㳕)Q#LPg˯՟2dJ3X".=fLPm=[ɪ}"((cAZy|mPA?Rd[%.PW ,.F0Re6; 3}R Zn$:!ArRoDL!J A/Bj+u2@S*$;k {PB 0NMYg!Wv[Wv_fq(\ĢV* U2j))>fp/f5oq@{BV!mzӀW!~+~hw6VīaJJT*b+)7ECvt2fj{7 oTf̨mJJݨ~W@] [T%<$Mt*VohC J+`+:^ 4ǭ;UN8 UpAڍQ2yyJ 47 uF[aw$rٮr߭P@zO\uRcWCC; TЦDhDƷ X3ɐYA]AX (I=[@v3mlD:y Ԇx :܄(Y?>FhPLY TV/1q[aR|Eaml"Dzu z -I$wzT|E5> hPI64A(AV1hʔʀjP^7T 8`.Vm+uqV&Iy݊(JDǐ͚Rʇ_'Y֊AL1jTtl.%Sr/k[ J0y 6kȷR,zvPҟpmYсU]ށ6=ٜaFl%J?A}43S@@1냯Ȼ"3wȠ}.oxW~,A ׽ \s ;E]‘4*vJx ܁:H [HLV ЅzBޛW)U%_t% r槇u@7u=@7a4oݰ(|m<ޝV)X[:B;\v%g to>?S [90[Ia,+HXv)XPQ :XPzrCtJ/3]($ $W]7L4g˻O}YT7jad;Ի9om0) 3yA< 0m(-D zC,]`AG!p"O 9҄>[T?KxqNydSf]m[%)cî/3bC_);; zV|`XJ 8pwsMR(s"wy0UQ4~'/meF .D FLX>IO Cg cTV/. @pޱa+uWpխϸ5w떔,1k9P:dG@Ao3 Fv+c%@0pMM 1} ;j#wu` e/,w]r ,]Ӝcճms%|`CT "GN@flmeP<E'_EpG0Ao|&meӫIkW(OM@*"BZ+T별2DŽzW6'DPszH@m+hO|;/ fl%zNTgx3PWBkד T@n3|I>T£|$ce*) ,НgBǦ7I]KcXfmvn\'I'cW 'H W,n%|Y,xÀE $k3#e9L|)8G T5f[89=#7a 5 ~z(Н'퍀ɜ@v\[ _Iڲƒ7cpl+< :%[ NmՇw=y+'xM]@ -X) +9=IϔkѯK]:8XhAz VdĭT2|.D > f  un1%ҲV!hzk̭;q(HÀx~@ii2 "^n ѭ y7|LK6 0[A2c 0ЭZn:wJn@W,@]giu唲4`r /0YU/yIi?ޱ`雋e)`kn`ۅ`k[>1TINǕ_r}]yD|T.CA@PP o%Z', p P,'ȑխD*h_[i9V:nfOh Л(Qz}IP yR2ڳ,ZV"|Q”N)a[zglEHYB!uc2Srȉxxl,` Ok87-T9\ -t|HB(B}Ɉ#Id1b=~@A5oAt4 *eQѠ#ֻh[S4amB.VyA> j=Swq1U+vSJwAfyUaP25p_ DyDվ[ax6 $7W+)OM="xRb!Y2@AVrEB$)j5tXOkrI>ʷ5.=-+eI/PTrb^T`ФJIUS͒p,I`P-Tl2ٶ$ * B\9V*YdP#K PIAPR lAhc'$@4w5+ 0WdRɁor^|ȑZM ꆑ+Mk A 42gIqlEl FXZy ֽB>{%XtbA9IBDОKLߒm3v,|+ !mm;-D4*WlkL]p##LB!#v238$Р^,{c1J bƕP~_8<8']2 d+b6urA[DAEIAG UYT ΗPe tYD!^/@rD$@-!'TTϭO:3'A3pPM*7t> ,b軯Hd@ iC ]9 ,$KnR f,*; Ȉ_gLrBiĒ5d_O_Kcʀ>W6W,YhVz굣u9d࠯o6$[CoEiRaEam\k@jJ,:(PsuvR1U% lVTn'Ը{/64K5ͰA_M4@wh6@P n-7O<>F& \(@@*dȠy: yԤ M)NV2`z@J /YT (7dȠ{ Ns\EU"Tgw *%ϛszuJi?Û-<ح@0 TPr,ȠO 2 Ͻ͑ +`z!Y".S3lJ /G)pAJZISP[ nLMg(ɘ5M<(AM*!v%M \kcJ{04htPgeD,UgV hyOAv13[ؠ&ZK` bO=cNs i^8[Fft"U ȋ[YzxeЋ`Qjr.Q0-o*hɁmU jvFBgH`RZ*]PJo@@T*8U@ K (Yt%^5щBT3UbTȠ,tc Q" SbD`3+hD&XZϩx2lG+ɽTȠ;TAVpU!Z4/~ :6#(sZEe,pUmAa[*l JT j4xˉ>Ce89[JSIy!ELYiˆ+ɿ8#FpLz``h` e~-{ Ժ? pP/͗ `R0p֠*#IN{cLQ*i#Ou UFBw)z@؜&8KG~ʶwQ?'uGIiɿ%ZE{͠׷ǥBLdfe'l4A퍄7rd y˷0I<%vB86Mhl4IJϷd`>lйآibM}D-9~/Igc 0 o+gW老";e}d78KJ$ xjPyp+hD>^ =خvA]Chݥ3Oљ|.X>^$mո{]|U\԰AB-^:v+JRI3u[ tsvA0S<.A2taAա)kYBjPP[*L;2@oEThDqLл݁݅\GJTo%Y/}= Q:.PO 4N*glh.[$,5G1k QtQ4* # &l{|X/8@# @ @=[4 4 4y&躅;ʊ @o.MpA 3G|J*medjeR@6v|,&Ш/83˒\בVjHu0wUziI0;i:S/sLW'XPq tޟLc &uB5Q" 2Q V'H X)\0 4^&H  /tܦ޽̓~1L]B"I>D_yEbvTc֩^):=|@[B}MΚj%Y|@;t z?UZ dPޖiJ^& nrL*]ԛ >AsL'\:ތ Դ: ZpD> *F] (PgqbкؤAmv>(@> zT|㺘z~跠^{=<L*#4 oCJK 'ʀ赤z[MꌪG^Ay1PHI!C!uh&B.&#%`T,@7q#{^1 }}W%x9|, oN1`\WLP9B9iࡤgxMBm˼ ]L?MT94"a J&ϧcN]0AToT~ς0"ЍC/*KTP%(W*PW'$!/ukBY;rkُ3]9uUp@7`ԵN|y@%&mF7ub0,Dllx@z1S64f#o UݝuZnf;/.η_0߲KW[$Zz~z<\AQ ) y!lPU6\np<@zl2Lf2`goPQ27@P ~{1Cz 6,P30Bλ"qmH7rx)1ղ@E([]/ HXji=Hs @˟J.D(Pys/)SP2|ځC)*gR5pN(LږEMlV+9rPf6^hr`Bv/Ҟ۪sMe`ҵWJu !>?|ȂVS/h38D@5S"h1߆JM1v¤RV$Pcϣun"n=g| ;B7% uP@ïTU#.${ e)P7y欉dbdw Ԩ5*uH(v,S[ mSz˽JqkR4;NX~*@S P4%%脮CI1<^)8嘵]HnUʦ>^Ga0LP f*rRqh{NW>rE ԳՍ@t{@0?L/d W?RX7V*{IiԿ0PA]JdF:ޙ!Mv^rח :GgP]b2u5?\ rZYؼ/(n48ߛ\P9Yz%B`b^(6)>i]hhˑP:NB9m?(JW_AϿҬCd P*cJ j (ύӮ]U߶ ZԃRwRҰ]*?SF9Cf2uec5(%Jt)2pVդ~W_4 IYߟҴ]mǜM B9CڲI AFQ%n:t(`0.?g?;pu?NVPtPNOe{=nem'٠qzP-$t<Əa,Ё2ހw~_B;ݳ+@ڷy%tȠ8B9?,RadCEN8KP6 qau~[z~&`x}CPaXYP&J6}e_|cHBS+i gq4Ϗa[RI`g! %lK.c(1 $).дX槔Ȑ3>#EM, !>,J'!1j3;~);  4Cs(s(#g[ CҤX^?_*[ʉm[;6t.{Y1{ B?W|kBќUt'oH6g'kM}J&'k"  48?voXfx|e?}AH l L*V! ^:* ]0>P P)$а]8sJѱBiV\ ٍ( QN(nEvc^iBA@r= 3{W@$-k !P!0v@A/Rm*zZPA*,Msi&DZ|-@J t' MsAmp_ȅג D#i .pnpAWs6qAFp{upubj(P^GOck *jTq%,bw/4 ]JqpPxDBorAJ'ej $е4{>3H6RY?7."ҽ `ЮBɒCm_G&Dc.pQ}(/kj$6dnA3 4CgY! @)Rg {m8}Vcas_h ζ(nQ^^qڼ+t[J.5蠽=l5Y1>ky{6F: tho˻b>o=ĵ E{MF)a}۹|7);lRoA}CNc"0}5¶}xi* VF=0!*ށDB#bGgbAohk?fvctARCy?ѭD;uXpuAaݩ Y/7McJ!ZwS4hWɮD zW:XПw^oy߁yPi7x|/(A,6 _ u:@A3#O @P,s_PjP %ówACg f@E}AC8z(w=V.4ԐPc+R'iLOj}vwO1$]םޫU-x: n{|o});qc7RC$Å 1H]C!wR\ 7 4mh9#|LN?4 aa~Ј>zP5xص+2 }9!UC@P ڕ0^cCƅ=>FAue|,|1x8H3dP(|, P:t6ɜc/Srʆۮ9e@&[6(WZXP&\oRAzaŚ*j^(QPIЇh濟IzmUnrǐ-__g {O,)/15ݭk+o XFf$4Gƍ y"bQ&KXUˠ5ݸ*7=Ǥ:踿BYM??r I:XK\VIae^y)s^@b9fQm{ PXV*yI J_ЬM[ 7;ꏢ~X XPʛ㴪6̭}P`Kw_\(1/+ByEz_c/Efr@U[%Bʢc[-"lyp8& u0 Ca@t{C΄wq IaB5(;L\ϝ$йn:t 9~4ՌtUmB*D_ ?'3زPy̨@XCYۄq,ILP(I`枝ݦh E,y{lzj=GpPNϭxH_j(4 IQ=k(B 17Mow_2T7;LKG9O+6 0N9Ļ_|8Ǹ78Rm؟Cu6_gl0wl?åMt% 7SAXC+/-E<$uXQBQz2}П7+HweWqKB{|4b-ͽ6V}/o7L* Gk eS|Iz?݆yW6[l6vvHᘨ6쟛ྒྷE 6;@mȟ7+aCL6&>CS]i->55П t ЍӔo}͞NH0j3 ejؠ?: PR%t{ݗ Ԋa1 &Nϭ368eC1%?__Y1+O,?Ͽgl8BsVTBCisV50BɦO&$S(BT1yJg_)7cZ.%w(SNI(Z ?JũR+%J4V3(;5?C,տOOAmCP=> A+ڠ^NR~^;:R թ0h_rȟ +8ng:EawV.)g/Lv2-jRU "[v7)LYTszB)%Qԏ-d\fQc4 ȟcMٱٱ'uƒ̐Hn|؟s}9?N'b`NY߭OQVNR핲_@xy(7)54^wj4iN`(;WOt v(K4-c43ȁ1 $:8! ǶJQ:ƶ]\,ߓ[=BN'Si/JBȒB] `?տ%QBa^+h,Yt>fL5/ ߤ~չw-/BQ2Ci/(Y{RG7|s*P |2LBd_Uʷٿ@??w\PH/,ɝ~`>8#ڊJA4Pzt=_,TPh #-Yc0?mB}ߙXoiO('sޟ;,t m({M+$_'g Xbf[8e/1_x)0N(Hzr4F NjߡLT 0?^gB|sl(M/C)eh5_oAE|xoJ]9^0HG>&wcP([]>BvI0|yޡ|BTl/2 o(nj>_C PDI Nβ2cX? sh])mtR,:@42N-VI78)4=6A^ L 0@f9աPʙ ֠\@Qa7˱XrC+FP(N>cYGPe2\O Ǖ֡ )gZwML(m|Fӛ+al1 lҍa1 ?}=2W/_Cqz`?(do$ fS(RJc`>;O_x=0 A`WBxP``>@Ї@OC;;eaRyQkBO_V'Ojr_%d%w="[+1US2BY_)~cȇnd*Oǀ{ig i(c/p% 1$B #69nPugjDAPҏU p?W+iDTAe jPG(g~"lJc&Vc?ܾ ,P1i?WzXU7HV~xcl+熢z-q?p?% e>fϼP$._)sLV+B kI#m?hbJ+7MOC2(iǕ[x|Ҧ ~WS**iJ-Qi @9D[?T;Sw ^A40- Ek҄BټcX9ekڴΊF[56{sCٴ6 &ꏝP8D D(ɣ<*xCYn:ݪ7o^sqA><"}_nFcr?Wx|Ӭ_=,8 * k3/WH C4 a>:~ۃ8>Eju'$~)s*V73 ~<[s|OgR(aӍۑU+xr,EH;Q~&0~>~!gן4-}v&ba},h5a`?`?Hϸ/T h$>#h>@R4&F10#ͣ91'u;X؏yhxp6zd" -_Ed)a@-,)+>qϷ8:OnXrܻ %2p7CC +)Bč'O[^I;փ,FdЬ'ϛ\6ENbJE< P6*)Yb-)~ݘ>= -7FٌAz>9r f5s2#^sp?wH~j’#`QM//Zj(sI]+/bbЄs= 롔S&O}3"d.}ti[(_l[} ߛ _gҧZ%J~Eus7>UNlSq%33o76e;&8D2rrO֢j1/X׭]>]x h( m1#Ƈh3>^zm+,s 3c%y+I!,jzӞ}ye2d}ނ=*HP%W>]B"a2l\ }-?o@<Ɠ(MpѪNa8Y"<2V%9c|{ ䷢3C v>1 BrLjgP!R{}2CHJ6_U~~}FmuFׂ̀Bix|.?, gPC$-"+Q$~̭4#giy{`ᅭ$DbxY>; @νd${%hKm't"l1ND9 |gM 3,H4`=}%-~ ϧM@|PGDh~g1TݍEQ+>GcjP6GPrV?xn go?L>o0N/D0 ?nIW5Mlq> goLJ1 ͸ ˪6[µ}gJ"c?n8?F&?ڲ$疍~>]ކw3fǪ}l TC +?a'gމyZ)L(p=V8݁;{r -Ijn'=Z\ V~p} l?/A=`ϡ (36i4c=#q0clHTak L:}dR,_|kJmCb{Ql;9D'u4z} ɼcAlށ(;SdžC%3>^0O;#;?D~w>\!"ROyZ)|ySkI{|}%{w(2'3ju}oJa%XaWBcHH'Γ_e@gψy6=ywwwZWgdD(~k2YX6e>KΕ}z+2MR ե4|Ҥ||5d\ wciR~M*+,)"a16hۃfN)L7SkG8$Bƒ2×9- dcm PNXTPbt2?9kC"eacAx}-*z"}Ci6J韌P2&+̲l~O6b(A43 /g!ֱeJ!Hjx}fk ;ByX*pZ&[Iy2R}HHr]Ozzz8- ckBuW|4^cHI!]^?7H|)0"Eu@ͻ(iڝ 4*=JL-_w| A=9Lzb#~3 —, t7 lI|ٳty֡l΂颷P2-sHPO(ǕʛO_!dV^J گr̠;X&TIν8|ҙٟi/Ϸ{v7Apa<3?oWHZ_J?_ Pz(RJwפ/PCCy1L_@⼫m~x,7 %Njng(t qP:m T<ֿ@߂ʙ+oz58EqP  of }7{q@97 5d nh+0@m= NPDBd,5'B_ ;Q`\?*x߮!KلYȵ3ٶ|nScL%9+>qtrUGaFp(LRӯ+CE} 2}[_x(@> O\!R`'!W_ X8Q =K8h(mu(8TN~W+M D4T(@@m~ (#Lz zGa>k|JȸUƺNܣLNJg^)P@]>Mq2#ȱتԁQ~"ώsfg(جO*TW='kpi~*q]}:) ՐП7a1Q?ϢCYߌ'Wut;O䅘PS zsc{[ 4\L܃PTkR|L!JHN@4 Es۞V"|h?-pD`%LeG( Y&2r+ Poo L-΅gV0@.@$\ VAUrs xt  Qa[6[q\jGZȰ89>={| ,ӧ+P $e%gu+,PLu{unXL.ƟPwЀ~B9>A tJ~0U*<ȱ[~Ϩ?T H+W$ةeU y__JdɡRyCٟzQy]/PӀntM h:0 v&۾PX5987QNM&^0tUAT_F\¦6Ӥ=]c=nˊtW!| SwƠ{ P *3mKduFBd=X Y^_2(,Bu a 4p@ޥ1L@^i@R)YVн[q,rΦ/2ן P/;@ 'YYB( ,!8ٓ7(p9i@o0AWt!Z򀮓oȴhÛ:п,PW".,_L-<%\&_9,d4@o;ut# *BHjCVg  ]hIˣlۀ-/h$sNچD`Zv(c6{ymB6P}QBn5P98t@{F /FY!cqO$8! UY,2бgnBUu|%ȸP!} P1,p{ZI,|H,*3Sx/iԮVN"/ wad'tW $!4R݇R|Lڴ'% Oh@09FL :8йeʓ 1-( ZiՀ硺>Kg"0N&X=Ygjt_c9055rsf2 1NP\8, naBk:wx@7|LJ%ByBvdŦ/;ty\mJp: ˜,vtxf2(eJu\`b(ʽDž'4! BXv4omʠӇo@(9_@O7^}D: %'zH!mf"q#]7 P,:Рra5?ʺ4 XڕX(I@C5{W(p'$saM-HpB(m?|C&b\h3ĭPb6ԅ /a8M-? PD{|5$͟4[>& p׫@u(e CoY^;ZoˁiS?^k>L |:@nJrJ E0F^_t2Caw,]51 ܰzc$|@⊅}[ 8 AB#1)?_"o'q*Z" +Q&2xLp&4nI5bqLF|ڎBYwp*5mNhlb_cpb0 eRmL11s71: Ɣow'H1p&H #ChN(bT.!aPSqߦsV:L_N;@t̎ Dǐ~^VMY(Mxٛis8\Vc: PTI,1m}@.Z)t'p E@Dua yvÔo t ȼPҢ-gj{ל^(>e0k01sm߁_OR[`O@s'H{ ڣoK$O }F'pw2{|8$ʏ t eO`R`v6`Sk%ApW>˂tD0-@ !>R h_F% j6N(u>3.`Jj% PNւ tVݯ╉,”ĒVt{.ԛ""xϪޥ~U7vЗKL,@T^"\cLJM؝_M#,@w_5|͊P7_gAB:xjgh Z"5 \߭e_daI-Xw=~ȩ 㵊uij{1ڠs% { hqf \6uL1Z XD \vb}.`S1<Л|xPPn)'/i} qim_ Y=j~Zs߼$_+hH!WYz@ PIS|zx(~'m;go~w\$,F2C5'x 譢ؠTVlpu=W t{fx˳ӎ 0PqJq{*hoJV>@C^w~Æo?}̹G68[KU'n#B%W@ﴰ3ӱvRCx|!Jc owe jy5Y<]ya5:6H$T;Ȇs<8Ja)KHGy="IcpF78k5opwEfc{b#jn P4.n@ lAyP a4ʔK8j~qlm 3 CŌ[}14M71~ȇ2* 2I2Ph 15`@;pTQ  {(&a{PN7n>.o)?8X)ޜOޖ"ܡI+I, ('߾6d:q(UJl=neOC@\JK._+#N]R2ikQU g$73K՛.ТPJbl)N3'J1gE"͊ÕΌd{fOJLTħ S˔ӿ'pDV";Vh%B+w>I{ڔ"3V PY33pZVO%3?TD4~jۍAo' \oYkx: /} Os.nr9bxPTo+I=u|1IS@]@J#Qmӳ WUse`9p@aRvG侇Buf|:l@]6_R?V|VJUʠ:oZ 4%,^8@CU^X1A[LZd6Xܩ|R^JU"oHQU6WNOkg'* (uzk(k%KLD VCX~b!O|a: p ٧ˬJݽmB@r")l3_PwN~A72_Pw{dȫPZvV =gbr/s\8 3JgR$;~'WPe~$ *|:i6 _ @!PtT%,?$_ 7p1&MPrsZG!CmoCy)dJ-}Ґ P8n1|397eV YiR(&,\,Jc>K< h,@@1hhZf~VfĄPٷN c_ai(w $ Y@@XѦ&PޣU> 0sUr2lkC1G"Y>%@nM ߙ%Q@Z0OYdYd0ކ(/iT㦝Pk1lk = /" =$_7&; ׍vxO+<pPxs h]~_E&5ywV8@-0@ 5k E&݇B:Fu9kB- Ρ RI>sQB ҚmppB˳Bm?_f}:=2@o$BZ_mZB?֔ϘY7>fZ @V5ݾHv5*$з.a_f3?>if HjIrB淉l@LPo; =޼%Tug()ѳmj顿 s? X 4ZqY a{ub1Yۆ f,+L?h߉A5(ThI3j68q&h[j$l= b4@[u_'tp867TgkkHo](.Kjl940XŘ r>S9e o @'sB JѲ'!K3T}ݞxi9,Po:J#׸gr٦- Z OۤąѣS' ԳR  uul@U, yomXWQzțSϞ y tjV}\5  CH7)ev@a>ObzX0 ҜUd^xSA՜ Ecfvw En`UUaЧ{ntȠ5w^Ԕ9;,P2Ϟ,PrPY5{ a^Ӣwm_Yڴsz;H.wXyv(@Ñόd͞,PW >5 nw aS3g'С z=v?^Te?7s"̤˩ܯm%.#]P༽0@ ]%U(Oo"  Eճy_3ϧw ?jǛ i*sw,dm!.1sFxe̴C۾i{zGcd22?.Ut ZD&HmKLCO' ПakDfvBnPus[m55$1k?-ԷI}>ϻB84/sύzo9-gw;Mxs5)sPA3%+jLH!# 󂋟?j0]~Rts?#"A+f 60)Knh}ESys&ϻOw4~GpGwwh]k}l2nco%IigA&;(EV>4ҿɘ(|& 5l:.:ӌk%d>ʧ%{F{2-3fΤaN?..OM?0xhN?w?Z14B8cZ$Jy a4!ԓl:8SO@7=A*妏:=9]GP/YxBלްRz87jB*,ϟRfZgi2$Ũ]|#1*qϹ{WYw3 n87zR=4d0c'7 E 됦f&XϿ%-xKsW*u:%ԯaKP{f`dݩ9f48d,Zp෻ >,Vć ^aknn/Ll-OvPِG jέuCyY;VjSFb_h{Y-R;p.q+Yp^)iVEϬw@9{fJo5Tz.?s-;.s/}nnyډ+! 8Gw}!+qz!yP*_I8G%0Aҽv oìO2=ϬxzPi{"kzu(YHr oF2ymU^k1n_Y٪$Ѝ<51h{ߪ鹓4yLq=Oo7q\st'tf#JlUJUے)G}D}ҏr>fZyΤFTʋΎRA̹Jg~M)JS]ʤiR:P,-3IX; df!}P: m2RҶOlM)$cE_z  U'Wb/a3/ݻ󩽂gmO/\hd\[`>F,wR^Ja+]wֳu6EB'~GS4hg gƃz$HH?o|?>~ RI.?[Yr>7gN9ZױZ.YG4o~OuWH񍺔2fǽ# gC$$[Lx;Ql} /3[ 93 _'m^Β ;o)yȏ7=?O?1ʧGA,>K1Жg݃c}$l/4dr5 [@qLoHigo4k Oyj]`јV?CxɉO~ g @^_8l7.CxI -:YObޓ/N>OgJ35?I x+7o}v~#gIfu*kqKb£T8@9 #]‹7ݬqb?ĜOy SOˮgc^e :гʝ_HWLN[ˢ>bb,]rԽ1 Qekq3U؟T9Oq3Oʯ,Oӎ^)ND.:$iﻁdlCBנD?(&;m=ad +煙djbf~Qzn&ȵ]'n_Ѕ:`1h֤T?ʊSJuWŤ!iìN UrQV{2$]'4kMu eIs.nyǏǜܰ( i5'%K0ij@fvMKh[gKOko@o%h@zā܅@v t MY$:^P]jL{՗_QP5RD5['hf( 1u&#nC;Y"4NFP:jO6L "GarA6<#r5Yh=+Bmo <7+[prnH?,٭R`OgU$mJ(kәIm Rv8Пi /,߻hE^[oQd{R2C<+iЀ~'37>+蹏T8P}z(?c;<6 T2&F(7~RYN? h}:nm:иNཤCw *(|LIv6s}̱^:OM(M ]_ ~S@n08D: #cA;:[gSR7Y,Wjh`u7Jѓc3uՙ5: NjI1;tPfڟ(1Om7}C#!>QRp&DWԌ P4L Z:4PsC,sx 7 D ԄPr1GEB'Ad f g {|̦p9^c 4&c0PCzBQI1,Śy0PF}kv Q9{t}LEr 8X>gl4!!Q]dѓ0F5H8r@p6 cf\?!xn>?CHh??7f@jHc׋ͣ3}NNQqixu%a%Pg% % `fڞt g& ,{X77X`n"Ø i3ݍi7v&NZ>y/€*w6ܔO PP;_'۽#mC$ H@yLml/Q"9k>*v&hNW, g (㆐yzS+'DRC)k!V϶2U^lUVpeH@O9% .LH@9 O[`@:Aa)9mB  ͸i'A+'o|"ڲgquשEuܽC Tq'Л6u`wlB}Jϖbfsx&':6 psDjf39`2E fwND)A&ڧ$gaզƿ٩1OZL&T)s8ǾZOO |G1)rb:f&'Wb-PFLJ3A@ךּkhih+2?ϋhPz' Pׇ2?Pѳc҄Υ=lN ۅ9K75anm|-gN~='Xi!VN]3νNZrS[W+1BЧs/@@. } C^VqXb^ݡBw}^|Y G`S-:he_u+>DZ1XJC QWbZK PESW}C7I]Q S^@n IJ^:]IBוS/,Mߎt Q:Ed%aGy|Y[J̽Q:V=kц=^JZ &U5:ظyIM$&2X]>kw_d1+WC-@ÿbV?NY7(%5Ì9$?KE %.(@E!0TDst~1z6[tBO#Huڶc! Bvf/v7[ڲz sR6Gb?YD/SLX^߯A ;o'bJ)%{V/%(NۆjF(21{q r~k|o8@ѡdW zExUCYRޏ!^hnxpw?sSI|Xɚ- c[4h+v|Ll2HdxB¹0RN+E!l=7' ā1c7ϛvEh3wTm0xGP̎#Ayq6OoJ#B7, *Ǭ(֞Bk;L '}3Ԟpa@-n2̆Pۂ*`,7$mkWh6Poc& OnLE El& NnϽ)'ی;o(.?&/6^~QR(3焢lyAKȫc7Y4BJRӡ R·.L(:S&iX6ҡ&C.}Pg\eߏb|i>k׭*3MCQtRNHo 2w_PrP6VŦ0ػBQES8J߳և9BYL϶q=J(RC볲nTd(2M _NƫIyE E[o uO`B@CQ,R6_3.CK1xhV(ϭ u eBb* pګeCej3mqO7*o d~zWB9#$,D`,y(Ǣ5j-UlݳN܇;h``@K(j PPNDϛ}PH')jETwUV_)#n,2@/$* ;piԕ /*_8S%~h>yWK~o)<Ƨ(IjƉ>9R:TJ[Rt' O޵xcZnt Mݹ8|2)>F({VY򧧯[GOϫI5UO" Bi`a3W?mͩW>5^ٵ.灼'$U(˞Waz!V,S J:r*O"v>C" 8s`6)TEV?y$#}#̲kWa : 0 Uy;6$MLUyy1[a& k8i΋o304 cLW V0,Q~kX6BYd;^#z]BT`.Ua{,CFbKeyifDW V‹e*O'n%ri|3Nl*ޫBGӝbPCyNދ [4c +@[Q F\ piڎz+bj.b:R }d?S7=j~JLt굘C>=J %LUO/T?Uиj>S6hή?dZ& bGiV*0_*|D`T[Y7_+:Mk?HlcX7|o h2h*;mGSbpekA[}V&a ugUifct+oaz~+`ݐi^e22X `۹E^ Vzt} Jfxp.@Jߏ9]]]y9tuV&Qs ыj%}*Ѻ&JS׳8q5]X"b:nmY{lV+q ]J]{7Cb+CJ5j/7Ev-)]qK ]vU@Gwz`3İ=t:Oomϊ 1;M?mzp7owp=o.Rv?77t(p\,n#s=/e,<\J"(v~d}ZVf(lAfVEC5ك gfRŒЌ $n9SJ&?g@yWgN[FL8+c|g}3@z=˫}oV&No1x=kEv?$DwA{M(ƑH֬N(JL? P o,J/ܙQ|>C(aɺ} w|{b4"̾!HQnZˀtSVF SM yi(|M#QȳwZԪ??ortCcY3@v5óL#🯨y)@(Adyqkcp=qi?nZСY]dJ}"\m4Y2Rw+ǏMX%i7P(y/Uva>#~*-DDOw5V\9ڥ4 $: Cʤ>Ld+w"ZLP7  S㾶2^CSO%qLw4yf%#] 3Jp?103 p !G8U:fYlv_ D)txMbJߴިl9y@HSJWSSP_մ{Lr;Z54gǞ<(,嘳(4ǧ fQN?M[lN'Os70tF;]}Lb"9!yvv⳿2Zs IsآVmgaѾ mdKsͲ`?ƍ$y`b#q?MU9')r29Snv*8~ s׆FTq ;uBEӻzeWY,?wXX@?V@?[b(ߴsÙBH4}-4^Ryu+7ya﷕X ڛ7Iʙҳd[ݕU[2-i2 ['%S Y~Ʌ_ڿd 7a?MKV^ ۉ)N|+?sY~lŏ;f%V%gqE@t_0n`$`Vsg՜\ڃtU,7FiVX}9Ƨ |ǠmɇA\qI} - 'kP7ȤPSyOL dN_BV1_qMry-;3iHX^#d-J벀޴⼖+ cd)T$wt>QH;_l!8Q K(]?VGYJ|KIuw @G8(U:>bFՕ I:G9&XT. M 2GIƖLjytb"n}R;(ڶ'))>hܡN(` (Gg9JGSZ^1g(ڏ,U)U>J7$\9G$ciӗo ٤U'QQy(~36ǻ0%?d(v_1ܭ&kHcSOD{O?_Jl giRbC&Q:xYzQ3m.QQ"Dǡ׻Of[os2ӈLIO3)gҷ)`F$ \ (]f]}Y+z &TٗfTe*ԗNrN}P,*۳O)tMXH  Wjm&~@v(}azlJ-orK)z k)84d |mNF9F"g1-ō2|m&,9z(9}4ٝa Psn:I n)ϳ]RHQ4@L)GlzLȟ~ahrʏ3hqcbYVk R|ْlM5O%BGYݥrB"XȮG}I+# a w"h*OUsK N09{kV܀,g&rUŞa 2nml9J2h3#CQQ3s[2Ipt{ (}5 b( CdGNMBԋ&^'M`zUAQ?ېay+YL,~{aGvnp!>}l@GiyN|?12FJP 6 =ʠ&,k*x ͕)Big gk_༓_"ɸG|$4ׇT꣬1 gGX1?).myӮ/vyU* @@RD\. %Q^h+?)ؘug/igScQtNcKm˨Fe}43S@vq`H)[2;bNy2)͟a ^m>>+:6մhױ 1R P!ɎeMk`y C6E}@lEc+PDʮh$_!Q kKnϵk:&V9CRHnV2_R!YD,oլ}Rh9~m\@G /̚U8@QU3ĮS}_xҭhh-EwQ\#]Q=~̗2gĀY @>vj%׬U@ZAu K_Pc"8[.CKR-tCʾ~ vWL 5Cup4f^.?7_ZكPe41V FcNT伣}d&dbUQ@̕ h$I(1RU>oUC}z/pZNh{v 7M-X@heG,o3kifx`T)U5=p+li-q4k魷c<Z|﹚'-x@k+a۵ChKVC AJf>uRu C+V9F6~upN:`G8@@+cn]z9vR舳eaY%/W)Z`6\Zɍ1K)3/}h&@aDZax>_d8GGoik*yG#E]& n-Ƚz8SP4I)&0sm&:Q }FTz(<2Q С-)Gj=,xcz$lϚymn:DO СU)~84ڍ[X9׽&']a?Ni[?C+~Djv@zx_epmx\ _Z{F[ҋz{C`[nMS@Kh%z!mC 9exd^kd`2_cznyY'_D @[zH9qGtU6:>d,0E?u QGxgv&i۪hUq=c5\wsUDp RݰR4A|=@@㷤rЗt0ӏM'B= gZR46Xn_A;5qlZ0=m@B|0Rj_0C|Y.Ǥ]v6vޡd, x ߭ O7 P蠀f&H 0aM=X@/kNy=P@Ǟv8 s}eK+GQ=CҀ:,wߴ2Ի~5x!R2ԧ(\JNTgIH45O5`9jc ~83zJv }n E%Fv-mr`{rǏLmi&U|!Mo]4YFlos{Z ǝ( & LW ̡<y480⠣DmSrO`KkPu,t,6cPNM t_0P]uOO*bze{Cv͆:(]_8ھP(E8JQƏҾC+tWX8 0@-+ <x1~T  CE+} ҩ)|@j{ $ TZ p;* P1G4X(0@τZ3!%d2 8v4!7ל Gs+Cw34k3 ?)럯=]ZޙЀ*L$FoRb3}M"ײR&О)'.{vB gdP=QMI&Xpjhv8J0X)vuzK(8`jc#hw2& T%GͽpV׏2Mp@Cb`'4Mh@*EKsʤo:& '7s(w AUY*)b5 u ḧ́*QZ$T'E8GɟfkXv:J{0X8)>dytl+@@ky)1Kc(V7L9@@_M ח'0MQ$q ܻ)H B b, ?2ޤDtWts (D^#j Qte:d :4,6KOYP@oZ+K@{_b%C4ϊ)lU Qbmn ်jeCpU{9{%Pu0Wp l= 2P(=YZ]uW0׏ .8BETW{%\]myz2&U{嘴;֪f!2H)p% hQuV%yF-9G!PvRb2Y.K d*ob6o <՝1}L'Z^.QP !}@niP' qDu>-@j"\wَX"+-(tTd /XŹB h{<|p:/p(r,,..@Lkky&j@z a1'h{ߙRvazjǣ4~t&='H2r#70o4~mvY@ƨ9t~wboE$ޤM)6Q|d$Pn~bHpv24wJł *p+"z+ѫy,>EvM.G)2Z %AI0)Iў$%ӉNjަ<.շo%ZY~WTl EaҒOe 4\Tmr0ttJ[W%=ˆc.b JMRB*P-2/` psa=5nuzOqX[ .Q *Q@7|V'|Q>3D%)J *PXN)\  Ѷ6א_e?U4c*LJ"fTϣ(|V,O(ֿIR2QAbV1گLOXoFNL~|f4ƬG9;{Kb . 8JL%MsJ8M%uL")f}8l )U{ǻ|u@J,8%Ad㔠 %5[u"VN$eb" (GPV^ƣ=S>c2=>$4ո{o *QN}il3 wHPQ8#;)Ưt4[9쫻Kcqz$"Xx)A"ASZ^ ק4sJ;&@6FmlʢV@P{EEmuZt "aΔ5x0Am TJ]"s[)oQJCCw{"PA ,RޫGl%M T"8bYa&HܣLU<' krZ[9`d?3lPGhSȰA=dؠ"Sh̝6(IJp-РEBh˄Eҫ>bϸ &OT !vmk2-HJw 0IR m 2)4kCbftopEpA} ᵔa|N0%<`ASDŽ &<س,hy|sDm-_8JN8PN>*50"e8A"(;d;Q&)KY4PuV#V\~p\!lUs ugIV(^C12`lta^^( _]o0Õ@BiQwqY_ ("kl > 6%7`:^"HSLvfC݆`D=JAg, B9;JcK͵@e‘"Bm6:dX8ho}7tfv=J@W ST佈'0D|(BͧI;R\l?)*@s>d 05ud> MQoz ..~IJ}EmK'sLN/1`>u-b0% ˭X9d\N r 6AHN41U1dgkB֑*ТTAG@oC9J0BSM`@&eRl~:[*eLU׶2秿H6\d+V\]MC Z`*P2x~5#00@\LLd`\*VgqR_r5iM T(F A#ع<LjuM&m 0â]c|WA@Tovͼ2ԹT6^JitZAb٠l"+5AߗՕ"|j7&Ŏ#/NNjPBGMqn-JhWgd-5(fk& _%}Ɣwi) )L?w`-E, JKDoD لSߘLxIxVEL-F}Y@[361BUÆnG˞"gYG,J)#tyh1XE6; | %PpxK +GQ9&pV \:Ư|i_cTգW ٦P @ EMu C>jP >]nzAi {{tOu8ma$vrp'y X x)K,\WVNJcN%1߷U82YhWk]T8'u`(JLu@É b1{I~h)wgw‰  o#g`2~ClR t}~1qz`If[I`b;`of[%p tA[9`jʏކ_xc suYqJǥdAMKa}{/^VzC$_$k b[8e0MBY'@}=Il%6:㙿 8'=d;$?0 c}yqL/~+rFHbЬdx$:濋e"^@FLX4_T4ݰ7()!h{f]_B'E<[ ru|%W!>3MF@cLpFq=qQf(8s(oeQp`mg)+N)aAg =կ8࠯4ymnT9mv]0a&AhѼ:5צ GHN;:˂ ].]_ pp6vGXFY2]lt6{8{~ <{_縫rE[is h{=L(@J]L6)uO1b VKgE49> z- iȠ2bI0 ڽ(J}˭'fGcpu=V8ƵLv|Dx4_3If< I7!ù (M^혉9=gx{g4}0Ҕ+3I R>0Bplf;rg gi>bGNߥGO V/V")q hY> {{9`{0t˟UiR Aoal}x^Ys|&>Y0'61AcbG6JŲy|Lc]Qb6Zu42Al&LP{$6؂v9IV–{+U[BB )n 0wE3nPm%ae հvC^ t+HJ*KҸӒ˷54Z2ٙ)4~f߻'PT[-^­DC2?_Sij *m>jُ7\i|J>`_ǜfoV&ݽ$);$`(R1VJ~S[Q(fW Eo. )joȼh퐁JgJ!͇T cJ-3꿆b*¢1 r (`i8niƣ$ j~^|[eT ?]aɳ @L s$V0TFKO 񰕕CR ͭtoeO  L48cOs t~ 2߫tiI4ЪfT"`XDwI^,!TV,02f"%CqԏŦ~t+ֻTmJN7p;-aq{4PzhKmʰ:4VQ@zuoWN@Gߊ(L;|G܍aN0A{wdnNG9и-$) $7Iʉf"n@us ) (3~gy m (h9Y_ XRw \n0A &h[6i8sxpFmE;7;ꪯJyoШ#c~n<$`? յÂy|Rc&wfx@耄}ɻ:)Cd4 tJ77CIz zN۟]dEL]$+Wm4XD@43H-C*Ƞx7W-2[i_;Cmj Q&Ut`Vh1!NV u&5YDw!45[Q cE -РNJb) 9*-T|K[Ӳ wNz\ 3f Peax Q>zWhP YlPᜎ³YlІǟHV7J0dJ%n}aZT.N>dcFQ` 3hP¶RO:#ٝsתB71a8ښ8pJa:T-aQcS򉏐2Wo8|ASu";Iܨ\_` SCR(1Ǒ{Vǯ)4̻i$CIa2zt dQ1|L'|̀}\S . 9Qȡ4+b!dOxM ډ\ :,fn!Z`%6TVѬ|2(,P7DT(X\ GJ (P4,n@JQd7bFmel1%,ݥ47|5,AAŇJ%]RP.7 Tk[X#ŭOV.1BPnEiy^p$A CAIz+* %}@w(1#[YHF. AhZkJ߷3IԘjA [Qv^BxȃP*L. ۊ8(Ыo.躛22zVbCVhDP~g $7Ja@ܐi# /ɪԽ)暨v`AUx ·ROcTPWn!E#by9 e[I[_r@?svä 0YV_j!cHdt eu[Z\kPg)Tl| c[i"h{j,j Jo  lE+5XRӴM[B[Y[0+HkhV@C5Pl+3U@pomr}񅃞:< Sq4yU.荾dv..2Ϛĸ sHy[QմRH)[ixSBWOU =zߎD- [JYgh+l1G=oeBǜꂂʵŻ`)u )ԭiJ/1uw@AMsS{pn`֫J*ֽ253_oCXo:PAA%m4jI}ǎpÞG5ou׻PX,zKn,Qzݹ,uN4% k4Pd͠Hі~y@'u2u;@4 Glं'*(J"[/},n5}LPUbQuMN{tF싄 XhP (kQTEQs`+Qx-P t)%&ԗYXV:HP!dG?$BKto%\:!"ֻj+V]Re!gJ63Jgߊo+ .Ui+S&mN܍ 1A= f!&;Ҁ J;F?A ^OljdTEƑӪ҄s |WaTDH .Pk(pueV`BWt tJ/4ydw-cf m7\ -yFFŧSu Ah/Pd8GLPOȣn&(萅=pUkne*U7K 3+{mE>݀ T=V*(S\1#& @N-_;W^&(fр jBܳ]9-0AoltLo^%dC26P?X4(jlyJ HP[#~[T[ѿ:Ql y@b_g}B!Dv>EDV9 &χ9U]M d #L޴g&<9ڊ pYc N| &JN@{mEY 53Uc N@g&h&IX s^νN@EJa9m [l}2XN0pFlea^@{zR]E$m nэELrgHIq!b@c(1t Tyf_g|9 l$\,l)*}AgA_j d>V!c{ JKm+lBrUVV W_-TB\]@챕H԰b^s+i햐 3 M-LRgw4 J8˷4~ &usGM]ނ xXm(qwleQܹP ׫o%SSIG[͙T8*+@8CUDVŕ:bc̺=ڪ|OG7V:V\"|+Z$-Q0ofGNm Kb0h^`5d/3Ʒ2$04!FE9Xׯ\y=q18_Q@rs!5}bۊc 3CJ[g֭$RC1aSij-˭)|f} R-OkoڣӁV*3|LX2r2? vT[mE-^7ڴ VX|O]V_khǗ 7Nt[Y$ VbV9+[Y*˗ʴ/VbRTw8%L/&>FrJFhqz+8j uW"wy:֫w[QR)Y kP>ٿ-1@7<5 ͝[I z}u~*\$t&M)$w+K*F[7'-On+[CmFJǬEʠ̯.):vFJJTg+͸JtʝaNtQ>/'Ϩ#a bd"1eҩ,%@Z܂8)Q`DJ@J$[|\;|_PioR'_i l4V2IR꤆`!!Z̚x);3] .D<} 5elPW|RQ&D҄R:b>LʼnIg(Ц⊒;ef-Çndk`+u~Ct1,lɒM_R ;qR,t+ъV:y e&925|8$?T7n=fIϷ_㾕ʑW* $."LR'Jact޵u:ښ}5; ) !ηuY]Gϋ^,ARl3Pcl%m}d+<}6uUy6πA w Y%˶YN<0)w$GOĤ̪(sfWAذٙz@&4e(gJoh|Vm}~;=\pVp̘ss%ؓyc݊v5r tdضMe[Q5ʐ pʙߝߺB+#A4.1ǐɠAV{<%o%{aР6@J__>t[2l o% G!o|YYg@6x RNIIh1`~ L;6tUnVgf{<`ue@fmGag@^e>b)y#5߁6]VoegmE+A.[1D))+p+SiB]1S I_d I %$~y1s&G5ႾN R}G|Lp2+G)}!P䰕> TVS0z ڪCRm*3粊 p2j*`PUŻq]uNVܦV1▿dPS϶q| eaRً3.Ɓ+qjn!ȠAW|m2CK ZJ:+hP{PUhPUm%U\*,`NbV ^^ATŃsΚ[*`f굷0>)ƱF= tHPݡ>\>& t뼄D+ڸIxBH2*dP32Ktyɲ0Q2+h3CBm% t<1T@35@ J %KAL} 0r:5(q5gρ#jt3)_ )]Ft1~'d)V]f=MCm bҲi{nqΤ`l 4ʱj?Œߔ}ϊV@~Lgjfv jIF w 6PO5 4(_  4A8.ݬnխHg ` O` *jЁ@­_(@|r},r!CJ!^A!vX!jiB0|"9zܘ[9P y+ {S] B[9F)!Ak@Vp7NM KX)&4>#u[B, )mƜR:9fapaWtڲmP_o:os$>\Io!hdE|:] \rV,9?ο!:87JfY>ܙ^yzMzgTN($,L*~s66wa0n1f}2նBmPٛ+2`ጡ9 D]t '+pa܅ݡʰcڎMܘR"5^1m:|pڽ[ ĖЁJ"ҡֲ-U05aƘgfY95#[_? X!{s^VR2|Lxu:x;v& ξdI2u+{d< HU[“P0QޏWDPFJzv(zhgV FN0~+٤俕X䪢ڙ覃ܡv<:tPo(4:v+/YY,aR)Kxs\;ri:"Uf0Kq=l@v蠎 }fּF"t9}`z|YS72•f29?<] Bof@JSqܥ!B([4R(uS @ ::4qٗQ EwcT~=ܨ.N>(:"4.Ƹ|PQjZԔ8cYR<>Sh*%et;>d_xB`~ *et'cԍ"sQH6Fa7+t i|'1hwD."γa{a@[ɌSBy{JMPvUgnf+ݏ䟩ni=# :dл9VʄCdy%!.NLpMf󲷒S'\ni  z2 ]&lPP&lՙ@2泪iSJfX{N@C38qVΜ7)cFsS9ܶ2YDEy>7rBD6 N&OtPo۵).-q^ZAo d(Hۺu=pЛa@n4-VORR7}=lZAپ UFIAoV*^!ung+#2!*35 Z٫:@%Dz GdB/ȠMȳ Z,4W * .xpbo+ gkb_}5ןM|s1[踕0Wr 7}7vo`ai.@w^'n.^dܢv4MfN&ABu[ҎUןͨRCwVwYk*>NJύd++nOE"Ro+d>@Br,Z ?ǟ0A"GԻBd+9I'V)ZiyM8uIQ}R 9K{oPAw+t^]xK1dB*\PYx+"]V5?V'q7HPqIA I9 0["VeXH)@%,($%ݓwj>&JR0wGJ" L"vArbŝ0hs+GSsg "hU i ti8Vtߊj}{tROFVeU?Y[QoUvy>YJ'@RMJX6G2|J脵Oj [Yd@PaI s+cIYdJS[d)<P GTj LJJ`R\ +u}Dꢞ:ZIQu+oZb _e5GJVgunSwIP\QS| zn*+[K9a09jgNsn%۩xsWGwLջ _ meiv +m޽!3oA}Y!e7nF\NޣTkl!cTMiw[Q`/w)*?T ,).Ι $h{;o[K58 AVqH>iʸ}&@ܱFl![BMh3GiWИn, 'T NI@Ar*+Cilo1A[L+|fG$R!ѭ]Bw_RI)b+ۊ8S $CrV…s ^!'g;r=xf2Ⴍ47j1V*0WTw1/g@&l%XSy@1珞7mmL)P3c64brx$!F[i3f̷%$&ENnȵ:Vz)}'Զ±p^݅߹[Yae[(` cJ h6t@F]:& z:mؤ z"Kr"XC[[T/_3BIja ӛAt2-{0]x1ʭ, V8H~E}q7ۗnYTS1fNk_!7<>e]] DFH( {-AQ@]@yAz+*0 Pp['z#ĞeJJ!i[Crfh/l csk@SBe&+w)@g_ 3Xգ 0;+D{L t+@ ­|r~m@ ;mE눣^*~[ȹk[9 y[9P }+=n?'iuA ,ж"Ml%ϠUޡ`{gDmLsʤ!ˍ.пN@@MTT$3s q1 t.A*z;ZZ-@HƟ!&irk*0h5E5|l [ӭDhj+@0[9Ͻd30W.2;JVdiv_*4Vh+QZxt̀3e!|Jٷ*ŷgT(^!*jpǨBM5Q6=4WhJ#fTtNzG* N5Z_w jR)^>Qz>-2 8i+9l\a^3 3*f+S䳕ƸK@AGI @-N4 jB*4\YݐdN_VgKd}U-I1;"b0G&Gj3ڵNafKmc4'cŸ,!bpRHT؉Ǜ~^P\r4tm&*LP@o帬ZB) g+_jle~kf@@Ը4@ 7W.Kfh@@ǐ'2x\ed?0\{wo>4xӀsîŻ`$ ?HnƶFP@:ޱt@@wpdgVLO05 uMLf7톩;Eⅉ{ik(:H8ͷuZb!q OR8P'oe=K>kbtv$uѡ~|'0Ɩ`Gko0bE]D:ucLWJBc^ǴwN 0@t/"CP@ڄh+5}ۇ{cVZcXM«f @Oɛtl7'L?q& P 9p5I™&D:J:;L;:=/1Ρ>7jϪddO?ws2';;ï.fgH U.zݗZTJ9!zaKӴ'0QN@wx <-$̊n%ɬ85 YJȾNynA0N+1{sB)~Ŧ_V>k^V+: 7ʨԟ2z}fO׆EٝfsoN"]k_ (Czi[)(5 N('|aPz&fgs LR?d[ݦ'3'(@@_qB@֧ ^vHn+.:HL?7FTGҗo~%# ѿ[ysA* ^Ms[@ôj1M#6ڕa?$(7}زp a[Qp],0$,@l\@V u^|̅ eҳ[\ Ϳ_˃:g26 h!$pI=hA@~>Oĺ~wkd2b0IAw.#/1ԡ nMޞ\m\|rO|x;|Jޭӝ֞XN?tP?C3oқz}SCOkX}Axi@Xd'=d>1H~Eig )ey&˼.sh~9^?MH q.&Ldnݾs s?ov\'wV;|yC.qA.`"s7k?r-ע ?)?o"s߫2M"Qrdy"`3wU}P |5m (@3QMD ч,-#|x+8RnL)Dmf ׁ'"H\ePz I?'1sf(qp3S$OxӜSHQIQߝ fp.Z])Rә@J* YԆm,#W N!|a>T3EHt#r3 NmFɕ<Χ%Bc$U1uB *kTt/#( Ui ; hJcP K:]J* oQAd^Q/ (o% ( ~xDIX|*Yd,i>FS(44%w4JF* -E@__VA!mW ih@3&BZv @@3trPAC6SrF |& h d˻c@Y/n&Gr&!Uȼ< Q^ˮt4jHѺA\4H# bWFݥ 2/OhiV$ 2)@ _bMlOmӊ% 6/Ă@}[76 z}ho5]hǙm }ןFPD[wU?%\ӸMWT2 4. p|@u6:i@=0bM@~|Hg<N>]5RA'% @*X:ـ H*J R֫ d.v+9.B$Ʉ.P%2:s.>%@4ׇ&CzYF=3I@5;sR{4h8;V-Y 3@uzGڞNCGTiq' g6R X_l]XDj -v/TӿN_N6J"hf |wP.I/uLe#hrW:I rq Q7XPrwv pՑI9@U  RaǏa>? 5ƃl@Fg 6dA;|$191-]AUcØdu5z wFsy0K5s̛Lҁ6]3I 1Iz3t7Stήc&@h!Ut+̼#I[04`LrQl0vc :P)V:&EA!!Ǥ0'C zǬ//gǘ"s?yE r`@2#"@cWjLcL%5ǔ=FOțڝdz= Ww.bӐ ڞ$$h{!wtL21&Soq Л!+Z;b$}ayXdSF!/Ћ|;R-C&HЁrn7|IJ o *rS@wK'@_ߗLbs`SJ*\:*~IZ7I<Lx@O3}aY?*fiT@<MXhdhT&f@" RұgC)>s ԉE߄ZX/:%/V U?$_o}XF_"ܥp7˶hnw[b˲R,RꅊԥH@f d\T"'P4!l!%_` ƁU t˗׸MJ.m'2@] ?@Ͼ$:d5WL늎@_Uu@wbM)Z#z "}E 9Px\'> KH$c*cڷHt6pol>;iف&"=Gsҙ;gD9Ex7GIz[H zG_pPǴƏi]I twZ7f=C-]]ۤuU $Vq 1K=uUάM"@lނM^ M2%o1Y7ynϾ@zdu?h $6[IuNcW㋙nfZc6-J1@e4vw2bD->P;D+Õ-i nlV@K j@07-͈ZNbwlRjc:ntM#`@jo,s(. Z`+=@ 7@Edo%[{7@oWo@]-I{:C(2P;{S+f/nh]YXQQc&*Ai:cC&Ы@xgdNWGl~:ͼ (9E^,&nQ2oJP=g69I*aM~ʟ '>ܫ>1y$@*#i<[u]Қ{ =#@ I^9=r%':P"{zPp+Iߧx/.x<$zW'bߝYmC  deSIPߟ_*?Gg;}A{H/k"t xҿL9ޘߞ_QF]`Ct%"vn|5χ|VZyKR x]`$IG. tQB}9DaHe] ڝE`@yGD 8!C*w!:B2W6M[ v|Hz D2OͫMe2y}Hҁ6.%Ǟ]HcQ2%wcK4-|:+Ё!e i_{/Kي/HPRKazef>B ˿wWD se½,C!:ټRCMVط_[);뒫Q5Yu:'^\ǠqZ^J n><)fZJ`y1ȷ?Hcѷ G1g1s1[ګB{|Y; |%^W!IY\D߾z"1}*ݏr!踲}@u4@J_mNBfY.( ]Co2o@ڷ)ٌ:Lnyr'%+3ujv?} * dиP[EC2v\pލM$'s4wD0Hc,v{dE 6?j"%D.@Dz%V59)%P TwIj<S\˪ 4T4y8F&"uk7NZIV-^TI @-bWz MhE-c@0}&4lLZ!' GsXHZzDXLA$@ٝ.F'#A5ge8B@ {YW)ԞƮ='sm?'x>_R>(%W^RW_TH\_u =" AF|PKF:">?s#x>xo|\Kc~J8vq?/??ܔi'`QB_Gu믣f2QDz=OJ$~7sRCX??}+l#8/ ?|,KBkLHfr|tp>~x>[ cya\/9/z_7ߠңGc4>S/-UoOJIwvJ?tEӕoMAtIqHQD!uÉD]FHXٺJ llyI$zGHDy/ka\HXM}aT$n˙H.D`D ]Wk&s8}@RSg3K$Z9(x}"sHE  #,{J"1}Lu euTyZ5%YD:D"26xP]ė\*/Q7x(\aU dzB|e oh1,kO*(#H~[9 $ng.}-DBǯ}mMl$0Hi|]@l ,T"! ׉5D"QןU${Z:7)@Y!d %Z>fR4bX P]{@y_mݒDbtm'op/{x bwxH.-8b]IFsO]]gsOk_} قھzeSK/K }<>sn.|nXŠ;~tOs=`J`nиʖ6K$u}J4)457JdߏI[PLx`O(|}uYqy3{0|W>*eJoU!mOy_>Z>E^Q'}!JPFAPWGټށھ_}erP@Z> J^vr/d1rk1Qe T#|L|@z qgJvYʾp;OʾXvz$XQ=|ac~w5Oy|6ȩ |(5F+RPH;lcH?P |=LBsu8P7{1Y7Ս wÕ12o+Ht@o‡ޞ9;^A#הC_{@|ߒ"ӤMI& &i")@ V|(ⓣՀσ[95fWgJ:h&^qde)ȉ*tvR&U~]kjO~2RU~ оM3oR79يKb2x>֤%Mr1:2hCD_.E~Ҏ^ot/vG_YR #;>s5K$~^edP,](gt;333{owP U~ںMTE,@_DE@<2n(kHC%𡹧)0?ӟU~akR >7u%hTs"E~!t?r'jћA_8M'>n=3E~m =79MتZ0w?7:{^FV!e26/yX>Qc1uR(Iѯ_~OTy3 4υ@h/&lA6R{vT?rZ^=j"!iB_- JB`Z,0֯W)OQ^-r\|Z3~Z(އ&MBίٯm&V-AlջZ(k0L$TPg҆*rЯ?bldC>,wYd95T$ s^JGؿ۾BcҬ%YNmB_[E=RBaCF,ÿW,8Ga XzY(|E׊d4KgN/BZp_||LL~mRn w}L(["W^ )Iɷӱd Kdbvt/qNm&\FvyR͉/\ &Q~ sGQQ&BOh:`1@9 -m*׌!FEu8/=Igzi l/$ 6R8>% e"v畓MFc[t:r}<>1MGnBRkU|ᯯm2WD/H7LUB*춿u~-򉕶THE1A5ikNS"I:Qz~sfg@6 Y_bs,&ows^wCCЪ.Xє2Q)-0YFv*Qϒ?l6e3in˷*މt:Aڷ({/j:(UI$,A;}%QןcD_xE~]ӵ\7DKFQ06ei(tk87jB_*ܠi ʶ'n6lTE(9}hϭՊɘ(I97swx&fi-$ ܲ /(JmR,Y1@ >}$/@Hn~o(5(]FikKooNy[Sb4UKk`+ݘݎ3:W慑7|rTD*yNRwŧ9p.28}`zNKþ2\ݜ:B -GB(Qc;t1H}~1}]-扜FھvzPے:ᅵC>0!4@M> lTħ:pk;[6R5qKK4qUda_W &5AU_hSG}J"tR,@g" [JDv*mQkG>7waCd>h #:5>|w̜"![FLyx*&Lyޛ<9结7|n,pN||ng(ur2L/J$XF1{B%Xg}Gb셸I6{'}wLD$e?hbz,A3b?$<=璡<{Fp 1Dw(KW{"^+"N*B2yy]D*2^ab'~c;I_ZL!I-dAoO"!4F}Gdj)Ϣ $ H`b ,!nU!):?G0滫:P}^q`k<4R|L0z7M3^(YGȂ+U̹@҇|rI/͟3p5"Ѹ. oGg!@`B r$ItU?H%ivf"-1Q./!aϻF%\zAaRRN?e)a",BRWgT kYBW~3!JnnNyav#%-8DW" z{/9;+W$ӑ."2  d,h퉔 ܲ@£w P=bpk_L$@RýƎ_F@+N 7Y]~q!q!b9YP0j,쉌32ckD`PE` %E$1T@߳Yڃ@xg9=K+[l9HM (? E7`l $ ,QSLm^$D--"bUfV Fogis c_z`wX}  ݢaD9&I+q2&%w3 F}[H]SHrM՝MUf1s3|޴S?d{= {ၔb3U\~p;#!Qʹ|^$#=w`wXӄԟW*  jXPiD }A[@?绾h ض9@ҧp&v*}|Ϛ8 P8G- FZM"A]C '.AEylVFs"Gbwd"_{ Iwqƴ^mkO}tsAni @47%lz9J r@i&纑ti}WVcNl$Ȇۡ歘݇5YŔ)߽k6tAN@;4`"]2YXs3}5gp;jb6)1!L/\}Ȥ5}b. [bw|kcwF"U1;݇v D]F8bwg|̡#{2uu1;,gR#ó9Sݷ{* 3 r.o 95RXafפldIWs";x4lٹ1BFefU0ea$wE0wHm`w8Z%_] )Fmo9iW0;=J(t^+RրP⊼ny)a\eK< YQ* *t#kS@i+ZjP/_u%#$eM-ϺO!xeZcQc ߹edrteې7%g*3ľ*0;".ֹ%HU7 Jm$ˑZL׌ }HR-=yaB1LWf{r͑ !sîʷmݘl9ez 7QI:0;% cY*ѝ+>kiT'ؘ@[LHOL_"#ww-{߲dPFCXI٦[sk ʲr<`kHj0Wj%LHЪakGI#{3A0;K%ߢ"m%85|Ly7 t:DFa-DI:V~P95 0F| Y~64=u]UK26MG,PaqcwF^X6cR @Y_cw$zz) %h.(1ڻu¶I!W/1;3iMo?8GeWoMUy/}^I3f"ooS޷^0vm$E5g9rP('Qa{Nw_}=73^ Nn}p*]w}j؉CNqͰlUs_u9̈ ňۗ 1V2j77'F{>F) cw]RtCWVQ7%ST#:^jđɢYU_7|Luϋ1F^;%azCNu_y cwH6}c_\c4Q):?Tv_:k<p)xS*`5+%MyU\sIg t8Q+~`w01cq˙m`w Vʪzb؆G8>a##]dcFzZХ0;U^Ǥ!j!ԽzƝ- ?0fzH2x靖 ^9|Ϙ"y|LgsaK z_)KrD5VeפoM nkMI5ɮ3Q #o@ fE煱ޡ2Zl;0;%}M2: ԟu '~?ӽB?g%'L /pF!c ytuW,.iޜX _"yϥex?ϳ;u+lN;@0ds%IcMga`y} PTt=D (X؅YH06?lI~ 6 @?MzmC_3]/i 1UhW_*dro-MSm*rRR~Of$ i ݜ*}4uEntՙM{]t- Y&t%Nf Cem-[yd5)TL[oat4DF >&忉xsk/b`-PM rf=gbg&ۥ]IR-gq}O6?%XV  DY:[Ui$\@T"]@Wɽ}uW)L@lj4a*oT, ,Iidlh=O"@a"-M! nSʤj 7}Ɓ Ty.bmVRՁrG:+$idB xÿnI:@rz"@ "'fz,!k4!7tvǿl,>36*e^)9Z8v` =$ZazлUH~Qyx__u[ N u iE]H{ .&nOCmQ2P%-#/f i,!+85 Hi"lJZH1"2p2+[t_i3}bҀ;6h2Uy(E P v=Kg ~^}s7x<$rHHj=?+d}M{%gm ċYT!e~?1 c*E d0^#훣@rbi!h_JBOoRB:. ]" dg&Q)MB@ҟuS TT$@{hb +b6CK~RfB9)0r޾F2x^@X?DMXD$S?|tr"L#}@P$2@RrJ$|񦪀.Br;t^noVuU,ko:Zs 9Yo M/1O|1]$#V73&$E?b }NoV[*,&PϬj }AR{eU% O뿛JK-]+P}Ç z,7 t 1}|Y((5Ar9≓34U >FD LƏ"?/%IܟxrHN)@i14kq/NKEҰ#m6e T\!qLRY T4> -Ub?1bQIB#)SY 5m+9j@ĂEm4&dӋ.-SHUI4/ha K12n}b1`=>f#2rS4RO:mVuB: W[Jx4P=sTP~1xhX tJ7kؽJ`4Z܁}689*lpJ/S,@N@=9&\$9mq0v3gPku:z7k>&I<`;*=K"ҋљ3;~~3`ʮ"D〪띨T{yDeͽI?@'Hgk! "3_10`49y8SGTHkoAkηxj}~.|OPg L_&]ah^XhJ>wɂ@&Gky( ,ů#{O>`A ) wKI:Tz&q:9@p|;8@guY>qBNPKNPRU`L ;O.`URܕ4ڤdpyZhTsJAfueGP μt!|ҿya"ݴ/iv"'\eRF&:erodZ-? -cmpަ@p:M!A.r,@(h,">l#*0$_QqEB?WfrgeLgnVNnҬw.u&+\n '@_u\wv D&)_^=(S4E2U d_ hzq 4|3wrMiMvєbI .DQt'9\Ew5$%㷁gQ t :̨հf[27En< .ziS\R}] K`I ,/d(EMp4$'譫}2siPyXF39̉}vvdn${J$f3u2ޚ FXC6cL4i sOKV 2M0]rn Kq=.ƋBс'[| -EJЫ+(:"#i#؆AYiTDm%&f!!آs*@&wpB!,0)RbߒHcievE'wSʁf(J J&EPZR Auq8^^"EPUԋmd;ք~U`+[ ։o$S_ 8 pmo|ތ^gwwN@6SGሀʺ -PŻ;ڍL$ WƏnti̩{!+Ʌ q#bH @4T2(ݻ 4\[ \)ddiP[  ߍJZyח.b * @YQH t=տt7 5БY[R/@ Η@ ZNo͔}rX`RiWEI5>PH"`6yA'uM Z˿(l2F^bmϛyٽfj7@05#԰wfy$*>@ lǎf`.@G`.Hu`H)*U:] y_4PR8 lf m > Y*$2?K Isݦ zPSpW p?gwWiT#)yh/Q7,ˆnLeXGqsWkg ˫߃r`ݢ@8>f1lуghuKd.ZH` BkRȤ>fIr{G7ȑN@i4L{$iZT)v^-'#wv 1?Nc,T&. :4&9G^ dq/4_Я@zO!A?"uaЭtY!Azo޽8@@4{zz'$AWlSTH0 &EKHaT56" wh^k 5&߅BЛ~?+{Mh.o#˛< e؂-DԸ5]vjW`H$?hA7x e'n8,ߥՀE0B0~~:r^CZAP]%AP#ئv@u6]4Ѓ.S)[ZsbPj>Odkpm~Fn1吁,WL9җiy#=@QС9ω)AUAHzpJЧ|7{K _K?P|gJs5(pc=u%8~a ˷4F?>&%+ p1], @P2 d DЂ;dBVBr6p?)8BGih<Ĕomx#2|qZҋ9 A4#/$ }%Q/׬n,U0i: zPe=j[ްE峄$ZR A TFSOc!T i6K@H:>*_/t_7|*aG?i}ٰkg5㪁;^9 rXjt6c!73ҘM1~no0E$T/3NgBj6"HB~A'!I$ } Cb" ;~  ?}o5,mI Шx,86KEH@vӧ:Ӱ?ponoڰܡGh,!'^>&E1aD2ХiU菣9P S`XB)@9w(Ɛ S@SCq7O7Bs?b YXÇfu+hA!s+NeHX`-Qkiܲq*K\r*(n6:c%|K}^iPxw3rZc~.9ʬɧ9 5liLkW?:BKVKO췿WIuMtk_".%ɘK1AQ] \DI>nlܬs ɘrH"ӍfM% 18Wnm} j~ 4|_ sǝd~1Kޔ2Yoj9j>rE-$``,!9gk[P֌,)Q@):ˈLo"HW Nhf17gVf])fRa}^dn=]vj`Z l{g(\o5[rd*.8NRr]o ΡP:aόpF.şbln@?D2%XS_(ߤJȌ498S;J7e\| EZJ|Pr䏮I 4<T0B#CK CDmg 4Pap^*hAT]|!)dI^*@oXç98J2MabzZwދA}k>YPYQZ|{ LhЈk~>V U. E4q\druFw)7|JQ/(aZZ)fAi1 J(x9dPqG'l8U} Sګy0~5)l)D[7urBPMZ Կ#\Wo tz[B Z[Jƴr]9!dT{dy@cPo=EwCɰ^SBE(v Be(j@oTJym~3=UBK=̳FQ(ج^mWb`ϠCB3iڔ[G{5 Bf 0T4 %cڥ" =ҸT CIt/T9\X1iϪmv*{D % ڦZtdJ\/k֩%?+ `pL!ذ.rF@8S -FhL:1@Ö]k0h '= Bc*Pddf(w_FDX_  4Ik=aJvH:5kC(,ܢP tڀI[\ꖒtALЀRB |, |Uh횇VC+ |Xz.B?V=:G@IO#t?jţ(>&=3<1CQ|nVGCo*Ad葂`~ҥ۶Y?Yovy:P,rC2}Dc߄D7:Iz0kP'U%z>_p"}|6UUFhT, ڪNHh"\zeB?BM~s'%_#1R(tA :" 95eO珌BhԐJb;cL(1b9ivB#'K x9EwA@KBP0Pbj;*R2 y4kAQ!rth¾ޖ3BPYÿJje] B;'ă%{m8x|bPaCQܽPb-JSiFؠqآG41(^&~iozl&O zXP\B%JLSРnto4)qA8PΗM?XλCFU:e(9y>lm 0("orXp4Bl aaʥh%-Iәn,4i LAoX$Ý-|AJ}_Z.ZH!V34B'ؠv+HRW6y=a )MlܟQ2 ´8j,3OT}zys)ܨ# |Mz eve =yUȻ&- ZOb7|pD9g3_9Jko$+W$}*K Ī$zcZ %ȚR-~ wX'&aFI4в1)de2SF҄YHX t4!0&mkOT$S~~*G>-C1s;?( H3spM~鄃M 8M@epjt P)]g|iBNЁ BYfWuw}[-ZBU+؜& Aѭ{B)90ȯXñl#NtRdԛ2O@se{/L-?$,~R ШJ=Ls~&O"!t,J`.d4ɯ{`j[jb Yx1 Dho'h(/A]E:˽:C wq6&P:[=8BJ-  3l;,4W %G~ ) ts@ۇ=٠l~~]E\W٠c* ppNmkA~ =dEeԧZ4Bc)?$ozZ>))S<"Mg.BceЋ=8PO`^ 19&*V(< `"xTr$>hG k^yJ kAGh~ׂ -<-/7 5(ڍ_e߼9lYI* 8}4fMvҌ/2oAѹ7Ѡ>lAH4 =& HnAcnӄs\H}U(v! ߒƗsK dd#'+6Aу8du?!tٶ9<>wqp4{f$ J)ܔs`% kA@1KLS;|3!:3Ao!Upui Ft`7Gf>O$2PE%sдk@s9g 'V0ΩӤ+7t@"s8绎4ɐ۹g}HE$5W^N.9 _5Нv!thg.ȿghpQ{g<䂶O.RwBzUΐ!x S^"?ׁ7b].P`9Ry"";E`;tsMI 9 4hXf:j请\ٽig5% Z|Ó8H!] MYAΑҹm;Y6lu?~E) g-T;pkBiD` %٪Pҋ7RaWp|f;ߎgB|\gS)%mgUz *t %'}C pd4idzKnׯRO-iw)i aN2xk܄RYݭ4Rߒ29+BwҒݓ3j(BY?At<]Je(IX 5O7~<ԏX}GqwIR6/\4wGÿGdUB=j؆B|~DWRє)OM   dOytJ]qeZI+5EL mB&P˄D/& m,?J0”/> T01;/+"S2h( ]v{*ݑR0  Umri5+G&ߑ7׆tyuPȃ[ ms $ew.rsVڋڝJm>D(3}'ӁOAQt(g1wjarE]T@VA&Zl\!Zu+h% *y_ ,6*h⪭P7!hK %ڪP2QU6j%U A/M*.NOz69Z'fm VAcrک ]Ch.OJg&iNE&-"pk ]E*YfRҙ2|rT[wv&Pm+YrkZSJEͲ҈JAd8;|ojvKzυLcdOzuCm,}o9$~T]J}7H% F<}`k6"2}^r)hݪ6BA h6Jn!LPEk#Yk4"kHɒY=6(V1՛Ui[R2sh z}F&'F( XZpekF|)`%?5ƈ5!~GIV>M(ٮgN$P|U;N+^k/PvRM2?^%a2SS['ΔPp("Lp[(|ezEZ-l\H8s;^;t euƄ:@(hSKE|"CnpާȑC'e`1_؞PVa_$3݉mJ9B褁ec"Nh](|H[Qw@;[dRҍ`6>؅{;}Ƥ쟢ylD54?~/{N"4?Iν2^Bm" nfjD,'`19JRPF;;c]@.,nPؠFxKI h)4V "Eɽ/]բ(rM%9 V2k4#''ƧZ/0PPL _>g7Xe"4L( Jnb, ]ͧƄvTM91^T&\Q~D&%}T9 GaVs+;@g3@Ŭ>/a/(k APq4*&GYʔK@?`9$:UQPE JLlk r]7,0%0&;t"0/N+W~ sCɢ.SERS "}Ց8: 5VZn( s u_TҏѕJjn qFhQ?d24Pk?1{$' t*SJ- zéE`BVNOu+umph.OābJ;r b+\): :5ӒӨ揅}(COau$XMs_ec0ɄNB%ct pUP3K$ t ]X'IQI krU:1o!*rq=HECO B"vhҦ>ls$&iجTm8L@㻊ܖ h>4fZ73.tn ~ TggaЭB15$ (C17l[r}[/,}I$*b/hש mm {[]ݱ9صIo5 :DL'J YI7zsj4n)~ȿt  tt"O+MѬ: cgKmBg[ r<ܴf9u:[//}^mC i'4u82f>dS=ICiI<}/ ,A_Opf_gzIP5Ʃg}ܐ(4ɳYYeJc,cCIkg[%D%sqP͐\_O kRW jOs+_dƲ31c/=ULJLAd` "f^]C">J [9CHV\ʩe_^p\) ;cn;-+%} %[V}Z#`,'3sIht^ Ig-Ջ90;Y)U^Jv˷dZ ؟["glDT,a-f ?g<}jq7rO1 ҄էQӠc}h&)%scFN^Dy&C3-%[S^ߞYupgtW4q]mUtǯ/povmY 4y`mAtsQ´?6(}3d%ݍ O,qg'/Ǹ7>6\֗Gs3rhcύJ6\e Jx5p )t쑝 ?rwJhށ>$9͞?CU0vȀ32/7އd?!](WHo(dvsYjsJBAFې^gWp3qT6?<*݁ {'O;g Z?1h@b뻸YypY fAs #?̰ws gGiQAR@R <`r\}4(=ŧ8e]'*Gsn!O4[>cyٴjiL̥֏qyam!S-t L玢ϭH8?#+ 2JVУKͅ#8<X]>OT]CzdzchyN [pѤ X Pr(CpDr|* 9vܔ35ꎚ O h=gN8|?FC(X9q[yP)%͠!i(>]4?%9g4rs&,á/SƂNTւ+h'WPrO %%2ieZ`YR7ߺACSS6)f 7|O\UMC;Y8q=m@/+%xSPXҦhNeL#V\p禺)XlyVـΕ~)I26nJzsKPr5p%5Xt_yH7wxkفOiou$8HvwST&SsKACɴ$ӨԈ(915}ddr((V>N( VoV󡌟Pҡ {Wz5T.ĆR|L,U!dRP0ig4 -?h + ks {=DiiUICJy1$@B~?  ʟe`r[>K(^EӲ_IO),%fB'/+BWVtCP25YoOqZϭL ׁ]4Qx?r&Pt ΩrPh@$߷9<JϣTcv)B} }b\Mp!vr.%l %G춹+5ŗ8j7J)vP&C;&503'"% TLCOxP}MU~*9HRhbwS.+7qtu^??%oD(.S-T1Z#M1$AyQ{(irJLt9*(Jfj _M_V= N)y!UV~{h(أ  ƾ-M$ tml0EsyD,^k?` sZZ`[tPVn$sjɨXr@-U'JQ'P: mI*Ue|f1 U[L`;8YaE(inE`yH>?bPRG[8K)P&{ 'wZ-~AͪKա4'C!K/'P _&F* JM`=m1L'tΝF:xN)J[0] P8#sl,Ǵ?o lƜ/o\ ߏ1G ݅ضPLf|z K7ژl l>s]e3SK^+0m浜Bshjptu4@ޚ yR&Äe@OH@#.8;)z丯v9Nۀh<Zh a%aCb`wP<މNPP*7NP%丯# e*+_ifM9.pO?a~&jO uKRJQv<\}/(S9xr5ssB=~WitS+ [/*-f7ӱ̪(Հ,?P4{CDCy)٣P&ߓFT]H(G)l@m޹+ h^:ys>c6^yς馡u@/5/p9=Kdנ}:F]0{L(SU hDFu/Agxswx˟ӰhֹyZiL&G}lIw//sNt );XF'n}Z:QThJ-eFmBwb ec((CpKJ8Lg1ܷyד~<\*v@],Yy{s}6+3~~cV9jJ J.Gڡd= t2AyBlvyxprZ a< 95 % (9ݿtQq!Try@s,6 9ޙztF1%BnPx锟U f @o`,"=P0@w?q 'rH:JۢQ>0[H?:rc_PrYy 2xng% Hے< D :=Yr"V&;'@qSբ| {ՕKâ|hXiL@@] hI9OBlL峱9ԡt%6){ލU'wq{쬸rwviUFJ, Ezz`]Vf1K&ׂSMX(> A0Ff QOt2(~kxc&.;د*ȯNT*m~~pK?Ĝ l^&P@jXb`!>e=D2@Vr<%D,q`VѦ}0lBajȀ8@@Ox0j7{i~p/Vϑsa8{|РUr20p4w:sL )h܈$4eްX g!ؓ4P!ty mƦ3' hUE"Mn[-BCYLrH, Fq~ª cx]o:(Vd@/!F/@?qU AxV#[ C*)љ ,u e2!XYpt5,:wYݍ-@cC:TkJ %+J? (М$K9{bZWv zt^u8^pzO@zzkԓ fmh \?D1}a=o =Tvq3YR⛹Ž;,T߽{ƼֲQ}USCHyg $[%2*Gl!dkӟo>22-.%?T4Cp@v 8,%:LP@dgw+9o.)!9iAٰeC _&e$zE4PkI̩{rkb:'//ً{k3@A-g@e?-9!\?x Oai;N:`w>DVk=ܠ<)BalrwԮ'zH=2NމL3$!~)Z@X:'Q]X>N`CE(/?`@3uJL]Qbp YpXo7y@){jש;ި?3N2(^$L>kl?Ũ7A Zт:p!s(w@R]A b:P@VmCiw@nFUJR@8&' pN4.sԁVZX`re;]~I(UI}t}n8 7hp@o;TO!'r@ %MP&N>.)yg|*PP\`@ VD ' +Ivv5<#+mT>9I|?T8KE!$2( IjjJQPTf{xL*=$V}] hESF~pqtVy xBɅ`>Prc>"j%mgk(Mjma#21S jxCQJ(@$ +'>J@]yա(:o(]UJx=cMb%IqTʦ|L/ 9!JO@XXu{rgJAlTJ}PyIr BqyB,:VTf)=-5XnxK$;q$n܇]T+]-%w$θ_H*NJIg z[TjJvs_ľ wCK@kbUdhk Ə7% Y#B\ ?.Bg)PMªJޔ:=rB8CAwy1 ^)T!#٠ɱPAhq ޟ起SٿhuIE1om- <5BA^G6FLDҙ麐 zl"YLR0F16<@A|*9J64jWeJ+Z8O)媪iBHnCU}. إD11ZzBW _ބމ \߁TPpBsZ 념c z61p~76 w5)C)xYrsZ .=R:$q /O/s2ث|!ȋAYd#e(hSH*iL0[_iC*ͷ4X̰Y@eљ4_*PeUnёҘ\)lS:Jff,B!l{A"V<t,eg$0M7PI@ḇ~W7!\c h-fBh U 0@簪}z⁊萭'R^JuC7BVAmY@psam@–dKTE=ş]_ ܖ#hFZ0 mo D׳XV!P} 3N@0u)'γuG 4(zr>_r!(*Y@x-TM., Jr9-AE3X~'t%:EHGٞtvqyP@ϓy&YpȿhS 2FZTU+ԧ@!q{Y7yR3bm2͕3Y#zv݊\P DCZaݨ`+vF4RAV åcڊiܵ^j|9?"T%Q(d\HC)Fn/KM&ZB(HKꚔZeP@VZ񅂴ې! 3 %\̳/bmwwtGm. ß6/@%3S9,"nQfnj#Slp@Ѱa" 4A.b(0 dYo|f}9.DY<αdK j[+E ٞOk4ܡP"=x gF 蝍ƅhhzY1wY,,f2,37AsE)R*ݛo*z<7h4Aw~~jL a@_J [D,<;"j\z>RM|uewܷޚnٍ`s:p#U bKȱ_%FE}z=A񒍷28;8#\ c<0ai @l3=aDVgz\P!ߝPW˞/ͧ2}̑7u.j(;ܟ k(ʲ ݦ>?z,ltb009 1<͏,-a( uZ*z3ٸXdnaSڡJ?릧OCX!0DO cGdѴ7'd&GDQb t Μ_c"~+9SAØ|y$MGЦ_bǓO'ُ!c8 /9h% @<;7:YfYu42s}mpjl rzCi-N*@> PDm`U((YUbTe09ʡ(~MIPSEALB[0DhWĝ>$P/%E%&:0@UeCF4(#lO@V^\޶3w5!V{KIxB4&bz!BлY ӜtM)p0?2$nR }55Z>uҏ+*sj'*,t(p?7 VEEi;|>/ #X$Pv=H;$ ֍\ֱQcPP6KԚvgvMb\wJ%8}|Q=A@eJih|`&yG0Z4,z*hQ2QxEoFJ<Ś(nOm ]hѫ \pѸksۛ֟7 =aqs8gYNՑm<v+g7rUY)0_VY3ۻѻ/2@]LJauYYmjx({w\@.8o9B[v>dpV&63e;rNJ6]%$gbʇBgsy:.ayH,l|ؖ~Lc) OCt>\"`dyc6slZH}>Tۨ:U^4|tR}zK4h,Rcqd%8 yBNw4t%Si)(mi(L4=I簜䅽.N cc0|VF(}]+iD)Ϳ@ /YBP@ڳ>/2YLcw6|46ܦ_qǏY 4:Z ]LzS"/.SAڛ|h8ɒE 3HPS}0d?w|>)p_u"q1x%X9awkTJLk?K7u6B/.ܟ)4mz՛ i Q3 m dz,=X'͐I! P)J?>樐g>̶϶i=c{vySx7oj$Ϸ1OSEӘQ38"-+8h7@in)OMNu)6]6@.o5j$3jo?|f[Jزe8b9UdZ=ܰS&l/zscB;R+ʑ(l!qvC^b_߄ޜf$&nz/<&,i -lJq0" ~M](^{<?{Hu>]lKt,PF/|MxWTzIK c?+#ӆ|4֎N:~޹|/8;A1͟rW#ŃI7?ODzJNuJEυUDo۱"!C$CGjGJE}޷F!gmC4I;u 8mWތsq۬P&0C;R?o0vZ'%)sv!Wx=X/4Z7TG_ KJ6Ͷ"7Wg{laBߑ:aD`]% ^!sa 0|MqK{V)a Ѩ]Q{ҙ)|*Ho ?j1@ CT5Qt4|HU"a˫>o]y<sO%1c Lv*i󯪋"gHItRО0G#Ч9 )9"<2 +h~v1Lw\FīaA ON_J2?$y_? o Qf\9R_xfCA~RzFQ‰t+eLwJbrHB k98JKJ}-H|s4Bx9"LaY.49ͱ2drYϧBPӣПwl)J2N2>k/77{hbiY!V04_ { lM!#Sfw(Y*獕7TTK()L6l\3[-@_raff@^P_RX8A$ȇʘoa k+ʢr?E-.e%KJBggOQ nTfʒhayBjj,M#kjL|'~3k+̊#^Puݤ}~C2Q kt{>Mt%3JZ?.%2a "QVjR -{1NrRҝoys~C=}t8:Jyn)'1KfIٛRC@::F.69ۥWO*Rtcbo̬ABK9BA$)`6~na(Di)hizCDTGP[ BgA6-B) d.^H$J㦅FH?ߵH{8ƵՏ${/!ψfU 9"5I~st!xUXSsΩb~*3LEwk FqЛW  Z8(Wc٨*Fcʖ~:*'']ru=Li]e|i*WW†”/rit|sKC$ >iW?GZJg}8GzܓS a2!I ?4 ˟N*Pr?J`\[ p"Ⱦ> H ll ,}ttXjNCAZF󴵹-1@ZHR2 kA]77fBWa&?JT=Bai\o?=՟p_JA% # P*P: ߳% 6cxs C9m jJ謲PgliG,$d O,޾jf,pSh[e>T7"U,)h{jCV|Vkθ ԟ9=E])x" [kyp?* ~$)Һ;+ ѭ ދyޘWY [}HMd5?yM]3?b#sOq@͸G3fi=PlˇJXɞ_]rXP͡I-"S\?uj4?&])dATd|:H2Ѹ9vBI~q{i鑓<7@f,pOe,`~YR ʖȐhHgLE'` Pg#u X?UhJYt`nBm'W`v3,/MK 1vusN!pOh2 ݘ?q)4P(㛚z!JLj Rx5*@ S)@ 6 pgS~{gXKBU]7} a߲PʹQ2\aGi='_n+$@ ȖNVP̬3ۦ9wPYC4t`/?YKAMi4VZg^f op133Q8=9|n+M϶XBc T 7*E{b9MEkJ\$Б;~e^g,^;I oH ?^J?E$8:G髱-!aۃpӌvb3߳[ZٟQd)J(Y`؏2?h¹g,2N?Ϛ7WvŨV@.nZ,tF_S4ne3V ~9 Zl]bSue4Ol>1 gu*Wgv? 8?O)_o$IrlzHv:sQrߨD@/`N@g>y1.25Жr!Qg? =:|^?s[O9Bo'Tum(譮99y6@2x"SԍOߍwJ ;`$"BSPo ?'3%x19ezHO=\ NӺ3S4v~JM@$`k(;uQ%!/!cT# KAQPr7`e6-U;LrBAkO͏;/V(37Aמ3c;0?2cXM?qD6}NyHtv|,ѨYh 9W"Nc4T_EoV. lgщ6m;r$l=w+M2˜Y6rP2fZgc΍Mgc=S174IP m?Z2f@s]j{{,{JyM0ͽԍCrLxrs$tDF;Ht , [;ݪ68= ܤƫS/ڜeC?ϬNȜD%,SD{Yw7fI<~&F\ܙS"}CHٚC[O'z`Ƴ5?;r`oҤ5 ggq׳f@cr!QҬuŜ`;O'9` A]MO{,9h )^ Et|wq] i3-w.b0^ Ϭy3i: ZB) u+.3K_^ '0z#f_n@? ZA20ΗOw f9-b2C#,'\+߭Iy Cœ/(ƧbMnSxBZ0y@]&%-,dhXda-2q,cA4+iV-?=$ ޖJPe<,?o:AGʢ%U}IXܔu@V*_{ߋawd 눦@o`%3f2P?7(p Cwk k{L/ݧ$@+=4cN@^}w.u3($-3`[0XTlZM;cdD]9U@9Gnz6ٟsjRb:y3o1eێ0z pZf-3g؝=TA}K*htx4v|>b̵A\8UN==ȋQ &&%]9w`_nΟgoJ>S n]A^F)t ^j%3-(So8plLCMyq|ƸҞE~f1JeSs\?uVoo>)$g>ЛdSbZԇPT7MdY(ig? e3+Tixxџ[C)+U8zzMyy lO?Me)l3xHV9V#("93\9.؟e`;$7Nr8adaaǀ $=M<\ gsq e/V0=nȀFg*:enp!4=w's@S9;As˷ݡ/FP0} | )B?C)i8dy(ȷo$ɀ}49d?g2xؚx]rO庍CRJ82xPԚ Wib1xĢc&ӝynTy 4LpˋylR`?i_N"WLaZ̵ e 'RBsfūtHWR(̹S(Y:* P:뼾#e},7|fŲVٚlc*\1_Ӷ(}DeGca!6=|\('{sw3}jF/>!n*hkCiR>Z ~ nL0iO陝u%( @W PGʳڵqJ>4ܡp=w(YC > @ Ua!h[u(abމFT&|ÿg-S5%VfD{Dr1pPrSc٤ 2冒鉂s1h~C( YJH΅^$#DDq@]ACWDBbb8͒x h$<j\ m촷[k~*I@ h@AQB"+I6)9S!7&44FRA;Q]Jr, %m4LUΖI91 㳡^l%Gub-4i^JPH;k&Z|e[&=Sdo&%>ll6!e ]KЖ)%UVJM\Kې[AmMe&sV@/Ys .;io)%M!hY;G(^"@LmvP9n4MBVr~ hSSC䬤Mf%Έ]iS|ˎVfb4QgWYHGЯϝ/4W鯂Q`A2ER @+WnR&iV%gC3LSm*\sLJ04{YalT\PGe3+B0ߡ#w/p@YPk~h@5WB9nx$轛 lع+wMQH`mtL %,hE ǕoE([K@p̫-GPr=_p*iD1 pcK u)MU~h;Vގ,UҏϒJq =J;QY%BЛWPߊxH{$C,U$ !45 <{(p\u@Gng(宯Nh-빚!n8~(ZJJOb|L?+m(س͏z\QC%uT \h@7՞r(T! tIK'jL Ģkp/Skݘ$g 莌fS?_&'-?߸4zk@1I/2$/27i3qN$H\طrBI[v٬qfMaم2FȢ^$NgWVҐuBV. Fh4P @%Xn 9IV~(1 uY`@B([4/YiB IpZ݋.\0 }Ƞz$){Z$w]O4oe=5gli4-2sZ`@}-_( @k0QصЮ6vC4hʠ6 >rӸW1䍠odvK\)i-OhJA+b> (L PiR4 ' v(9=S5l+{fxWɑյhM@SPѦ')k:㛓(.%GYO͛^^ЭӎtAݧl(]L s9iG=J J3l,> 8r)* )S4RbNEƻ}^n xu&j LOͿ7]\ $\۔ bi'e0_Ab.(d\4 4kE7"$h,/L00?Pphj6|Í`*?V 4%ʼnE`a/ ŗHnhmo1=\ z״G4W"\JnƉ}?kϸ7U_0ptab\");gqYehօYe[-uW">Ϡ/JrW̠߰!g-ʻ0@?~.OtJ.u)h&ܣV-O(ٰ U2ql;U6pt0TҜԷS3d!Fwλ㛋UP`{P̻5}9 b;; 19((ἆBw;-%ܽ}h@;Po4b%#U \}N^GOA#[ۄ:` h9oqynDL+&"pBBI6brKزQX'y+4eq+3yjÞ 5)v.`هܟ~Y6Ft- CA I?& h,dFz/`@ݕۡTf{v xwn~h@@r|3-JQ 4RpʐJTFpH2{ͅTB;Q H4$^2KL> ɿᴎ hA}/p1u_VocEZ +%˩<~ӆiE{;?Zob~FWA#Ho7JzsM Ph.Cr-D(͍4hprW0{4lԫ{ͽ PQ 齴A.aʼn0O99' 4^H&h1OJg-9 wء(ZiA]@}/t!T(o" xPJȡ_3QVL(ٹrh%vEhoiRr2sYv(779'%eҵl>+G[ЉP4r&Ecڱ}CiGJ. ebi>$;^CY̍X]J %[u"PF\P.gMz 9݇r .} 4u7t 9iSpIЍN5?,C97!D _BҘ# W;bSjN(KG]or.[&M(܃F(OOT zߛ{JI{̇P37z첹3'bY*&O29ءCɅ0PFoRiNO r?g?MsCɴc,9 4v`I"__0cDHݿR27T y9@vCLZa|)7cWUSP-̳)0XpPҮ H2SA}N;Ai_Fhg(`z朣`b`vO(iٮ sg r> .]-6Z k=wRFA?}[XS8+DJS)2+Pߓ-NU &P/**<\ڇݡU;U&3Nf \V*߫ACh{ FX ZPs5Gٮ jvԋR9s!sw+QVd(X(Cң;sa%ܦJc t_Ve0\ V0XǽЩqĮ EZaTJur (~8{oRgK׋ߍÊwekZ UT-0Y*-4xvvK|_^z  D[^&) PeO1gTכWΘJPF7 qT4}>Fc:M-y'C׽7+Zn @ᜭiT \iTȞL,;e&ʜ\ށ13hq51p 4XGZctmbz{f2Yo $8 ^lJLbrBFnʲ/J#C_Rt-C޺^?z3aGvb1s86gi/:vo&;SpF썩*(%[${j TLFRtnq%@eÔ23#kt>k/j2McwA߼ΙM}mZ(? PL›{3>B>?['UL;ɉE ZHGY:6P$)OXGJ֊uy㡿 P61Rϝp`A#ٷi1ѳ(,wO)IF-0ko4`,\V>?"N.Bɇ}(i 9&@Ys Uf빥߸VuR#Y'&wxh_V"#kS\x2^!j2 2—K<ͭ&%7m#ٱ9!L-d- oޫ;ƛɜLGeʝC Bjפ zH$p[[80A0P wf\ROݵdFB ^==M6h Q`=:s}BLX!'e|NwV .z o؄RU d3Hr/Mn gA0CLF,{݃`PWąҿV!sn\Ш|1^5~Ji t1"FA%TL[32D%;0Ơ@*,j8 rﻖ0h0:0u~~(`]MO Q /<| [PPC?0UpQi/J)(ps|iݸj7O?f24kT.R&+h/PA3JGD5 l,)afc2R^J(ĂO$ߨ4MPL)9%ܼ<9|=nG(B PPJcqE,.- .PV\)mPj s6$0."L"A{4=ɁsɞDm5ذֿ $ЋoNB^luvqd|D*M^^~( Z撧W4>ٿrXȱlg*ܗc[2?:Rn{J3] O/M04UjNP1eі[&b[@}A* eC>$34&38CTޱрrFWrd>CُI@j_fߟ.ܚsKӝ GvE}/Uz;t9M XX?c_ ̳a$Lr: LMYAƽzfћM̵ra5l2>]CCƜS=@kC(iL: ! iSq "k#ƧaK8\˪?*S%J/I}l2+<hq㫯qOCJ&~Mȫ(e i?j%4fC|8g !3T74<κ[&OJt g/ L~B{׺ߪ]  ,@z#%(NGhg &P|Lg g KEߘPUuRѭ>oL(fշ+377w 8mpV>&t:n .Po)9anRɡ?aY7ׂTl~l!nnLf0{сVTC#:iCA޽:Jr;VvP2NoBA |i l2A]|7X7/x =`;Lж4mb uZ(a؉uUˆѼ؂b(ۄ6E8J' y7{{ 4?!. u`mU k2`Avm !+0E#lPA{weIz^t|nRA "˾Fq[LC崏7A p[AҽS"џ436 ?YCf 4Rͻ /zٵ KIFmWP*- P%Y;mO"#?͍鶁K$/ar@}}jBю7Vo}*x݋S\#aenDa_)& /z[cP? ~ OF܀xT9mTm%JȈ4kh׾ո1g )%S('zkt(P}LFNPQP0*.j(O?RGN$*W s @cR6ѩp< e*<@OhO q\(3IPZpp`'4<A !O|GhPg9 T$Р`4DN>D>Z 2A]Ѡ+}74J>\+% W|Ci%,C4a\fotA]bJiJ ~@8tmAӿIiپAoP4ܱ< G(}܆sCގY7#ioO4a &\yԼ-˦o:@k:|{U`pQky T@n! 4hK.`pQ'/4h G}dѤ:|VR̭;q֭bDKmɑJK2PwK\/F?.yyu  ͗ɀ+@ }/ؠ% |ֻIҧ{[WpE8)t,+:mtЬ!w}zAW+a0{YQӦn%ey^AMh9 T8s*=BEެL5En ;9BZrw=\PgXv4  Kd(+;EF`ӡ ڄr4>Һ:I R4c1PLzYCY}rκ6m~:p/ 6,Fn@H&e2`t֢ KCyzz^ Rlawڪ& 9f-}\+^<S2k)ܪpN(r2w4Bny. Hu^("$.5DASru*} @.<6\N~CA?,@'FZRPN<7M#\?W(5OtX8d5 S 4Q 5b Y Ǘ9?|TOB)v\qҦܤ⸅Yynnf4-AVz(19t !ѥ :-!sbVLA0f0ëE(=fqʮ@w3d3P|dĩhPuDZR*뮏ɃbO[([z7uA&V4..9eHaߊjk< :卄ֽbU,h<0hS9rji/jC 8?}(iWa[lLQ˗9W'jb(%4 .T}j^ ZzͨeZsc %Fׯ.*o$:VӞu+ӧRS*.S e-G(;])YkԄ7זCN[QTTzzWy4"ѺA_(=+_ e] Fcn͏|dt.g?$ڃ5._&nk`%U}Kߝ^HXod{ә1/yt]:H͛sPy!|(RTǾ 6jӰ Oc((3Y $Cߛ̡cCMp%4BABiJlR:OIkvqRAy8}}h[|@<KVZ 䖫 P gm+u`uB5&" Z_MۼMqٹ{Fε<&+ d$Ըl9ۏBٴʑCi9R;Zu PWi ڛ!A4I ˜9 &kN*h=~OT;`Y(4ٲ;@N3Na\r<<7n xH5D-%YxC~:[W6-4_n('N.T<:p@qN< W]2Pr.hP|[:p=hn8׻"h Ҟ}Oq"C+AZ%G'WTRd~dv7+Y8<,:.~t"qACSv`;= y@>wx ~s-SX?0gݖI֖;=HoTHD׊A"{Wyd'mLYN,F\A4r 5LQ agI8rGG"3 Jt$.A'C=.zt()Qlb>DPW%V4_f@믄\EF !.T(v Ių%hId $˃OP*"if"r|8?0 @\9kʼ5I.t%I4 Wudr O@O@3:aG*ߎe``+Sky@*4#;0 aB4/s6ҥ?Q<S|zMkaܠc, edDr]u-^Bۧ:*7aצٍ1Lb@JBr9}wE8Nb@LcP* %ysG?r6u{31_Vߗ;?l,ڥԟPP\|UF0kGmVfGipL㒸6X2͸;5NU ޿Z $>Oq8՝9ǠI崟hכKZ 5lefk™1L0,Lvaʹbݍ +L.M+'L0@p .b NP@t{^f;45+O@xr ~ى>dTvxC>U :ɞtǃ|8\1?'FN5 otm)/мYW eK!B" N܏ sYT{o[-2@E˼|ސ]E9*E[G!˙]2|e&zC+M,2@P̘Ќ́_J߼OZM͋^#s .;)6.d 95Xl`2qt(W){9\9WBWe4zZ8\y/6bٴc ׎Mc֎!6V2}>eGmEhUY\ :E(,dpWF @ӓ:L a.X'Ы e `GۿHdo]F'@`@_I[(9?ۻCTE hg_nI7"~\ L/Ol^WՃ7%ӚNgAOo(Y_cwkB[VPdD!Bshڙw.mM6$1p=96z,s48NTmCiMѝ!. @_P2=Vl"9+EgL60eЛ4z0}u4PNŎ_mb)5&^g. i8 h8 }sA7I{ڴKz@S(B`|\7Deu КۯV̄{g.?4>PpH/E7)tĔ:r\׾<0gKȡTJZ|PR%yT:t<D?zL(;4J}9& ,4QPui@. %+GgQ~fJ.nd_ӉBtZ#mBBThˡ$Z])M}Vh(]$όMO'g0xC:,D"CriJk? y9w,2˗Ov,ώh*pN$γ^}㬿L֗]g_!6?Hx:p7t$=Fga4 qe]Sr3ajIVpȫ4YdCANPSQ9l=`?7xv!Ǯ $- K aCI_A7ty/yp>M"Ɇr&f4@ş.qp/w+z"d3K8i "*jZKhz.(@u=+f#mgP~?`; 7υs" "2*72[m+Co;7!@ E6".d O%gx0ъp2.Y"l/HʦXMIȿ4NvH[}RE ɿ9uv6.~syO @qC*OZue4Jŧm;_x<!O{v)Qj)NȊ"ZP缩,VD%7劳w=kڊMPn,,~pڴrևJP3!to$CpS s.`12dWfMph?>)v/`m;|5}x֍v!.:"Zt1xU-dH71.?7BIsW@C%E}ԧaf(ϧD ierp"E8˗@o".(_e} [ !dZec@*';hy ?f}$,UmTr9E9P4+ՏPN˂ԋlPr_ %G&,XPe 00@r. ̠ P<=\֮ -Dh P-Jx1-bMd}S2CV!d,2\qZ&kx$mW\ 4)g@Z9^tYC ~k~ pрB>dFój]Nkc%u@Kih5B2{JY[h2xOٴ3_t> h[LȸpʀJ;r؍3V|\սt{ q.JRPkGP~xIb)_P8™ESIo]misO#W6K%GBt0ۑp>0D h9+8@QE+2+e1V@K\V|_ٰM,ж_;r}|\t_,XnRʭ¬PڟwBE|}CA 4hk1CI/V@=fg|451Xdg 2ISxjMv08,zDv %熂_M)1qPt3n kz`va? !w)6OC] 盙؟Ү-`( J|ɰ3C~~mloRrsjVCܳ ]g4r dh`!L5Ρ  v03}TmG% EB=T.FFjIMOs22ŗFBKh~W(@*Pʽ?EX $jf׽ MDwC!3'k}҆/s9ڦf% O\5>avz=z;tlp(OGe!Zn[f A1B~r oUPb(ȶ3mF\ F "lzs P;zL#*}"ᆙ'opP@cfQJV;D FPO PGUrMӐ%|P”HB C㿵+^epOCWT|;9Ei]3@СPh|RK ewb_(6:)@q'n]d4={%5U? eӝ+n _2腲:We8*Mmc* ]JyIu'/ hk+S6nίB{w~{]BzC9.ط<0jJyR!,IU-+C٤t +÷XbLC(4;bZ㗉O'ϒؚI'PwLS:{1LhCu@齳hy(*~Z';례e<~{N &[[(jE2;v?_hsxBAg_kn?tlv UE^.1ʬc q*촰GOɟnJFMݿ5vY%~qF:}xaC5)r?Q.(Pɭ:5I:!g)^T1p"@gCA &TC1I~wXCX(9J:JBIn])E}vFlG39~.?K\yї)>fnl1A+.[#qȇ,1_&e >e]!FYdcp{. GgF2JԠ6=qJh1@+SĻPr|'|g}2?g?T6)?*.:4@'"?OV#;lv;hRBCgpM@tԻ't?wmw(YYWB-@% -er(7%ABI;`<=7fa2٦:wz2S96e儂W PgKC ]$Xዷ: {ԬpaYf6vq'@2,)1mk6'.7۹HGfɐƖܸ?39i:l=;Lb*AT&3m[Ic֬P&w8N@/8E. ͕ 'D=~"[&8?j150pIl9/_Fcmb\j*"䅒~, P΀D34wl?%ٟMۋCSvj:W"W9Ja:<|~֟p|?~?~~n|)_-+0F) a-1c :8Tҹ4$w0$ϷLlLOX2h 2^rw }Չ{2 ;lȥ4nߨ;C tK#u(i;G z.:"a7\B&" 1.z:sgt 18,+Y`ұ4׻qz.C.k9A0"S}u)џUYeL˕/ȟIhRo-aB$-4h/^?!i`ꁿ|o -߄ gsǥP&dvl|v\n݉nd;R`5&1pF`eW3 iή`ξ0-n\28-Giv~;PNz0|( dڿo8X_V~) @(REpx[>)6`iw-'w2^]1lo6Zho  ]5Nϗŝ̮'n8s~Vp~Y"wћ{rŨ I9Ҵz믏7crv/r7͒ipǾ.!@}Wֻ2)oAV$Pºq*ۼ`ŷzz"m ЛS N{& ̘msX ls[N թ(3O)Ȱ<}\ Zǩ;'D*}p@#4lPlv6B4MÝP%}Cao{m=2a6M\ ڻ`&A0A^xtN%=F5 ,$F?jBc ߴV'=}$)haX EW) ܀}j;+ Jz*V z0FX85z0\ZΔCQjvh\`kf\j"ku7vhV:%&((Sle@5p@ʕ҄i$r@g9P,+oqMoh ]s' m7@@ {N遼=nԧI{|EZT |nq0 P?{ѩc/C(\Wh7Nީu*l*H2 ) Z@;L$\&NaAs 4Cfw+mFpRhv4K@`?%cE*)ss Nz( sSt㻯:c 4 |р~#aIitT;yu@]fJ(]0eFӚѫ:y@kэu/{1a{{["ho;;X4!T4T`M-5@ 句f]?\'h -=A&<5x妛yێ޽N&h=-+DzkxjDv}[#h0m p郄5m~? DpnR}2~}I dr`&g'MMLP&{yH'qMGD;pL bIaj;`@1hw0Ax_L@pX _mZvf"Ag[J\m 4Ri .Xp;ىL9$ntg@ ܁گ_# Ap"AԊDe^u.ܱxNw:/ \OZi_pT@ %.턑@llX}L$]QNmD#k7ۖ`bW67ybJ27:I/lA1n3@SGT2w4||@M/A4UJxRomd؜`..B&zx@3$95E0AGui>$L nMy@m˝>?v_*в2 jndz=V z,&-@  Pc&k%7摭4H-MFX VyT:fo%0-^D g5txd;g ((z&ikꕛ69,4P>(0ݷIߒ܄F1qwɇ_ Q"='I~ @~8&&^qM@gׄ0g!!nMֿuT*=,1?5y 'I P^(=%H#+s ?o h]v&59NUS$TmRrI*~.|4=Zg P= 6]qlaZ+@kfڔΩM '.9/-•$Ne'-fZ:,BWARi N!Z4f#ohsFHOX͊/#=E=CЛi@KeHz1:팋Ϫm+*NZ|5VY., OjLիхVڻi Ws 4:]81,`@sƬRƷ!8Q \s .+E'iu[JIk 9-@Eh\LG)RwP %vT^%_ϕ \9p\!ɌiiZnDms]$25S-덎E P~|UUs6PGᦵ6@(-Eh{/v->0eB2 &o XX \ r& ;du}0A*Po@UT2ڇ\`Jw7_%E0Ņs ~U} 8fM,Pw& ; l-8 rۄΪ+;,ݞ]KQ@ɂ{#cf,+\v%k˃;tbdSڏ/ [+nˋ܍tw<nﻴv3JXL}4}lpF-dadc9\ / 6s޷/w}v'^&kؤ0+'|zho-q\ON>Ӑb଀-.Zߓ5n2AY*TJfk,7o~ޓ'oh WJEcq ZP<5qm-,K{e{U6@*I cI$V9G@PjIp}~V "h&4)Fn@/|b vܮoc{<^pn^վ?RA6_a"}R&+=E*JV#Naþ?5{.ȇT67 _C*xMdpWBRO_ (]Y@D9uj3,Dx ~Z H;́%̤#"حHX]P?d=C&hcWߚJe#&hShtƲqJʑe`9TxH*Nj; JPK:XHah[R& _'ߘ\pi4^י؜ AM^Me1gqoL_w0AIbFz|WO! G $U*~JbUk`Ӷ m3hhnޭtNL N Sq2_yqrW`f7 %@{Dg [p@=% kU> rE:U{O(H4J1~kь[>'MBr|j?+๯ǕaA!|~].C-4g[';e(pjUM$hAcێK"<1dOV%twM626]Ζx >!׶K"賁ξ$V/p/].l!|ҡE,ٗtu:ш6l묄K0u ^|:Wҙ"]W`Щ#q$U[iK2h//ɠ/~pEuHr- -;o弜;|HgPIÀ+$~F;A( z.q{M$2h5[ %T؇T\@ 7&2ȹwNܢp4nc8-5219]AtICdf_ mi*c4l &\] g> 0޾ZX5 gԧE9T8 :UxNY 2j)ܜcIs*$bg0Li/jŖLeVቇyL%ݧ⌓ˡ]1dFo+/&YHBMʥ JPÏ!? Xи9J5}VC}iNst\9K@>>CJZAMddvRUr&k,PO%r| k{۾Ɨ3Q>x$wwʓ7"mM௃TrWR9>)?ҝT4&PABm~}2g,՝lDDP2Cc q c u!N*mPG_5`*﷤(ܧr@@ׇlV0w`sNAPKʶSqFѤD0{tZ BTS"J %7s֜VEW*ɠ %cz"ĽnW%T)D:JuҸ-+T(K/ߟ 8hG* A.੕8gTH$}~VK{v彅}+$t eBYJ_Tr;ˋB4=yxcxu]#TS_Hҁ6)u1F&$#L?USG͡˨3w&T6֧r0D9WAGW\d/pz>&@*f&?R i彄*e~ʌōP:1)` Zae:J<c3" >P .ucJUAz!TȠK8:'݁Nqs0e+c17QL׍?ЛJ< p13q³JڏZ}KQ%,P&]٤,:4* Q䪿/+>`pd72B[`C%(&pƅ6"p EC:}*;<#AבҘLPėJl 9&>6䃾I ȃpХvwTLUHV1tF6pd}{STr\\jl X0BY5A$ieY8X|~iaݨsUԦX(*ZD=>i9?>G6P_ޑ,hP% j(v"8 2ƏhKF:Ⱦ xjw :wn(&]YbQm\,CA2?˒aZM2 A8Pel SIKH); {4k=ƨon#9Zk(f6`;dn4"hICv4ݫ*HZݾƥ :@  zTJ;@KС|20|l3t"nW  tN,Un(5\պ* L 0 nM'tkvRA iai*sh><\9qáOAZN@EZ9ubAJ.&N,~6Ă;H,=p΁t(4t/CkjZU\Ґ]*Hww2J:q&yj}1?$}4x&:Iv*t(iNHє XQlSs h*T%mI4BU]itĒ %26i!d!hRl/6)Vce]H h \H: ~eJ8p;-X(0` xC:_p@k$ i>&IGi|9i@^L.fwLv^Mŏ_4f- };ЩpzrѿyX ^) _K$gA.3tylZI;hN@; jP%0u* !Q@G DkNff~;} nLTOHmHh E hlT:5)g}Y?4O")}@t kX'AS(*äغ`T?=+D`@cT.+ӟF} ^?@AņW(,C [/BX Ka-PA5P(YkǾ{L-(90R~(il, z:s623Lntj^Z@E\w i2:oE4d s4,@wb~p: ʝD9\ R1,B`|d%T,ͰƟw#䡔GfdAŀ+-FP?XPj ƄU0LE~ @PngD%ʴbCf6mzp6h}xMk/-$ 8bZ@cN%g-_ =R9{q3M0!J/@nrܓ xH{Z@^:kR4~~r׀zȍ #uD-d*y v=w?HS[眂1L>&mO7t3 ~PmL~,vXG1Ch`#Z"gonXXIhO*Vt).nQhճM& rT*R "ɭ3  "+f?sd8LeZa^`.n[ 4лTيeLS^0gRNP[GPjy8`d,'./ 8fۧUЋt1}_sZ IO P 95`wX(`Чwg(Ve(t.:3H )&q@m2`;) O~s}Q<ٍNdj:l8 rSIN:_U)Ou(O ^ :h7.RgASU],g&ɩOb(n(Ҫ1 1y9}[Mh@1Y+ ]:f z:jC`NnJ33`"xE@o9pPɲu"$F49&vТ?aNeRYPsLTq@a/h;Y1dN uN ^AI4Mwl<ǤMkл~zVjWȆi-mW݄>ȷrjXj7{s^a}Goqs@ܣʝì¿0D°fkd\fe ŀ t}]ٖk4ݱP`k׀@ݴ]Hc:g lH( "#O./ hY>+U w w*tyS{'^U{)Gf.Ot)!l, %x6~9B1\n\ G04{rv`4Ya +7]JVVkz{Ls1xoQVZا XJި QLћ{Ds >l1U$vb@ps)gɧ=sfQȕ&MI]R/S]f-C#^;E$b|Ӄ~) P~P;,|~ܳ됴oIXzrU@aќ^'i?N}6bo!s=gm<9w.@@OB@zӊ@Fx(ds2ZNWeN{!{CRrYd!3dg\Gh4fBSqFw6FU) W-,Y^k~? @D̍ 6^i0AC) 6*ÖmE{kEIy~€Z-ACjoK7/P(45 bT. ) P@aZX/uם+ UJa@p@ r7>$~N@M[ATЩԞ&4a]!| fEV=UFa' 0/NH kY ֋g4?g; j,uR.ʉvٛI`-N^Z27%34 l jv_W!BoY9GBIc8~ )Dx% j9 ] ۶N2<(^K^'9R !P ql9I~C| pxB]a/d>' Åb(XRrZoC/P7E^N=7 2zs߃JZmR-C;=}͚N]Nr0t~j\gT'5ߨ؟"*fv*(P$4liq;*5?a,K琅׽SȰz$4er N`+ UP+^wu߯A h& PaBl,@C5l[y`U cRPj3 %gucRl,ZG Ca(Oѱ84:LP<"ހ  bp/0z6{9٭Ι蹕{Aʠera(i.+$c[`=1h<gEe\U|LtV7B(6܅ކֳ`0oW\P>=ʎR1@m-5b^42 A~ s OSTrRf/bn)jdeDEхO( 8, ^tdY^<[B %T?jn~| zpeު}]ǰV=;"PJ 36pRґ (pL )94!b * @e5 V'O_/Bz; 1@Kjy*4̒z1<5 ׸7T¢\g;@) azY`"i;?`%M`SbzC( & fIr?ɛ0MJ% WJo}+߳"3>7=:y 9h@8(7%P0;-A_`P :Za0coSHF@xs&z(PlTf2@k c1c17>v:;(nj 91\e:}@]0sEO0@7C/%eN6rr 'oe^Smk8j}n#f?YJ2ox_^`z) 71{BHu)ѝ-f,&=N#`%PكtMqK_/&s[ ͬ^,Zss@~ܞmC('n&^IķKo( !e*yILC $cZ!r uYS3Zׇ;TuL[R`@'`H?u]&8eJț.|+%Xם]@ T|0$-f[T{Y]n2rF} }ꐎE]T!7dXU9L~M-77vЂ@3 S 3=k0}w9V!FEǡ3 %w`1pٱtt.,2@eI#u8<ܺX TaKn/+&8z(4)whUjf+ڮ'݀&ӭݠަFì*ǀU >#3=DC9inz&k(uNȽߐmϭv}a8Ufސ pIQe? wHt \ $M0 AM gRZ!Ami1 jh ,P*M{(Y6Az @D >6z Vf ~BՌaow_)9AS1ԊU1&w4lSct<8%բSoU=tF62pLn | n+ ^@›~B!\UgTn wN" >ٍ8y vD-DA5:.* 8TPYb[N Kw AE4N8r4$5^8*Tú;2<H &wtșpwVϾϡ1|MgnJz)- tN腁{rg|`c@=uR~A(XCߨn!T8Є)JUD!ԁUh()au@Pzoq57KI7o&YUP JJU9a[<W.O'- dKiW^@XgB%fd8I-#IBhj +lK% z2=ܑz4a>Mb>*Onv[NL*|՜ʲn'yѲ!TL>毁W{h^}WZv$C=g!1e:.^\P`Q&MTl dLGR̢ChY-U~@aB~.Q'JdT"F..ٗ+jMJO'aΪ/U[jeWwGWe]JjULO1?¹.axBFgȺr|=P:ڹ][o@)2jZ@Nel A$J|q!A>klHĕDרL5&k(:d|Ml4FGT˷">?Gb Ժ]g׿ :jHh}_bh)㛔k B Ž۱2җH$\n ~c!p+7cVȉ;~K~;. onɱmq 5箂{kcS$Y1tn.ЍpS g08@!{H??B={%>^7S|k<(T< ԇFf׃=mMXt@ӰE1_^DP_hYDnU~}.+f?ŢH~f t> Mn0@wZ\* $ ts9EQh?SG0P߆-?Lx b TeuOATu@3UjQT%'P*9Cs Ṫrfā%0:bG57$^2bys;*MeyYCA)O9HĠu( ; fE@  @N(ۣ{ozS8N*Z?oq&)`bn+&p@ozlk͞R[` F+?b_FeUmat=990 R<'~*5zq^{~ z3q +tuwÂw5ѽ6ЬJr y:j$K-W}ڄc?lFe Uk1w_XbKdg]beT'}Rin'wP͡!~C1{ͱQ˺ٰ.|?(M(~?TJ),|iw*Fդ1YNN̈A?ʄ+m:&+;{ldu;oyjBɊT_D8…w}%ЭvcȾF1?gtMCD^ ȲTx.Ϸ)455€X=8k^L@ V-{2 c*;ZQ@)/N>ei٣z7_cFg< u$JnpO†V]tr sQnJ6{q.y]QGuoJM|V;%<ŒK7 Nƻnd/0Ǔ bB-#oob/,嚌J/*7X(cV !7s;;  \ @EYbZ(=/saeT)̼e7=k w)P14"aM׵z@P6҇9Q *U`3 X/4S*σAi mTь6RC2ut̄a  V#RT|f"[Ԍh􏚛q9rWl|B>usN d=X[€(JIgNAu}#?2j>fsƴ?O|Ԧj57*} _@rq߶3 >g[MC3bYmuJW4L00"tGW~ƽ)F!AapgNe(8+Q31=tV3,!; 8@Kfk"@ 0@; BHuo1!72f!NM_H+ѩgewn<ƝА7",wߏ,ebJj*)[:ĽrN2J˜ꌆW`ٞuRa)ut &m*m PAMc ÁCަR Y3 ֈ<#lz3w?\v'#]SOQ$PXP:ȠiY%=;NLwT2GM`n@:"(󺫳 orxZݳ)ćpl o+oIJ3>mi a^~ g8ĦPٽj_TӖmY ShLiTwޙCa̞ u$T^$T&@#r,mv dNO $ff~Z*?:gdktMs #ۜB#sLpA]\'aKI!3[ӻYʸʸXS5& 'p{ZQ7bh̟rٶ= :@"3%l*%eob Tf\&9uXPyf ķ"|lfkvDŽ нL4.L\D%p:(78? *M8+!obL(9(Ʉ=y[Ն_!k1:%BV"AjZIO~_Z0-c˔RLPYr>/y5,Tk4_ zZ jUH8dꘜd7:2,uжVC4p`],,M_$. ֐Qϲ@"T**\Pt6*<AGaM$ݓ6|jx}#/ᘺ?1YY V`fX@r'Rp XP0쾚U+uւ={m K4׺L@%? Ѝ|BcY-$ !h#x@䭚9 -HM6r\kVE7 fpSkJ#zrT нZp?RW'lk(I Cj/hGk/ģ0V DPmMq3UP6 t$5/k؃w("߇C3g"=$Jycִlq{&ho40A\0c{ S4iX堌ާ\@p\TdmHIVt@5 Pl&l5=Vp>'@^mO`h]P &rC m ,& LЭ\`?uBkjJHP'i@mPAM\j &ԑm_Lley'Yf-o _3UkfM[;ڳLq2+.M}N0a@;+ w z6@3پQ4>l 'VEú:*dg}r ܵ T`.7d}5Ԅb F ;5]g;Gq^ ^pE _J@P\dV3aURfsKud1 M)Z .qtȓeta>­f Ax@އ-G !h>Y/vCLըyF d8S6-khE0o9pvbt)o]lYSa&si:d^9@"RG݅T W֞4N%9טmX9ӎ+(2Z"YDJΝ2 gsS=(@ $PE(m?p@'/$ Q RZ tOZ"WՃhCd&Ia]s$ t ,:d*[QwIs) | CArW1  V(i.l_ wkh&hp@߿2gkg( G@ߔ77k.&jS) s^ XcyR@;D O aۭ"ZC1N*neϪ8)î t)w7cwjȉ.0 E76@@߱aW9n樺=Â1R~Rҽ6`5| M+8-i"}@6@2M3" C[cz. haΆC&R'kOE Į!^V6,1m_$q3 Ҩd2삁Pxt}1,f HڇRYѰ]@Bsj hhd6\27wl IZ5dxe۽UosVv1r7VE_4lEA~ ю&K@(;ӽ||·$ Bd A 7OQ}~aɞ{*q~J9 9Z ? lY !qbzZ>JNh4j:zVNCHPtd'oec4<I Ưt,Ohtl?Qv( $O:F@q~9Ef@Ђ&xrA@@[IVg.ޜ y]^e Bov|#S{R=iqAhYXWsKVehlRԅ8uRM$ V@u aqs!H4x@>h ;ch#RY4?Cno}( KPa~T6 Bb/*Ԥ :kʆp@75$ކ? ?%hae&-Pˋ}aֱsa. 6MIf]9\B [W}lRHa0hokHL:jWi NH:w(wGv2޳Ƨ)쟮cF՟C謽"ڳ|߇7khr(w$K9TP UːhT͆thLr,C6B.K„)q:?Pk0e6HZ;a*m@±$#o u(/>Ha 5F&"\`!73`jpiZ Ip)?OQ(3hONn;z*UEG.fk>s"^@2S\(?taT:r>Io0ߨۖ`l}v?ua~Ron$j|f2pd+ ?7 ;K - ٪)|q@jB]i[ڝVLLbw \@mShڰp@:}P i9-5[@#11QF(RoP6`C߳·;ĶO?w@D"u@S@N}}_n,{$XУqL? ڠs7N *]\|ޑe/fҁi1?|U;x@w)4J JP}.k(T׎w s4$%9 84=1rT=fgԒDWRwB &!Z03;Hχc5oF@ T$Pju6B (&ЬX(naBJ&~ (p^T/hJp5Age(9;Gg1B8fiL %7?7nBT{MpsJnQsPҘuW($МKM`"dIķ,(Iʴ:‰C_CYX9ZER1T4oe஡4T?dPb"U} v,S fl:p9"h'chV.u*EMD4;^œ<ѴO7,QӁBȼ$fׅP@P&߇_:ۭ.2j:&)q`/+FMB=b($ @]Cة@d˥Ԗe[s`˲[\Jkƨ#p z4bU>j(5<(B1 6ҟ!;S(.l걃\vZcasca2R.C>vg]sM1]I])i( %3a(enJnk,Da2MÅE4݊ ǎ& ^f،uY8PEF!rLFK+a#xhCJf< ;u*H]nBlAAFq&L 5fQJmc3 У&ArKkB5f>B43U_)k,a;ȳW|& ts¼9:Y8L1* W/zi RfΩwsxWI.4 552GQh%0KZl[cVŃgW2xzȱ\(ϳN!s( Ωn .l]bDG8 : 95P8PF*Cx*-8lEfသ5"> hl%2Lжi̼v%e3 \<:~:%_ ;*/ٺau Bqc H9J~( dye?!{ԙ{B&cSMzn^x&yPyI ]D ͮߏC,;\J4ؠ/煼H V&~RHD0 D)̃,܍ZM0AMfW^?Mc^X?M+2HR\`a9)۱:utJ*1,AZ J6VJ-Vr Dh6(@?TҒSO]t)(K PX!kp76 Lr@m .""ج6+) Cx{ ҡ̱Džb$ gӏ5LVe5bɨ E*h ڪX* Pb^T np׽6׽ o8+͞ڡ9rPҏ $aIY@['RSVVa'7Q1lkr,C !g_M*9\.GIk~I¹5YPHB( ( *, .l^[@5A_Pn5)p&Xm- wI{½:(ğn|3KrV~0}j3?5xB+hY@d{:%>cTro |VIR}h%XvVзThᬸ?eѦz S.NReMLVm ؂3wXTWvtL*tߚ3 謘4ÚerT%4 PۡFQ|0csF.LHr n?)"_’[Ȑm%b u'F/Y([ ӑ`pB҅Ҁ\s)7S2dTfz=Z3ed E"?j)aEF+oOF!&{YܟKF'*Ci>f*3WgKI9?2|^8h2]<3韊 NP(lFX1Zѱ#V >ɯO<濷rMjK_]%|L' mgocEћ1Z KD»S`q뺎5c Ϩ()  MqnPR 4x&%SI?P~1J>At?hB-;CrӳɯwCHOؖO+hM/ Q !Ju@z^-:提9P|#/203;<8@H7iv+ҺN$+FU8!7BQ(Z;2v?w@*ubi:!XӎIcoA.cy9~o} }<SNVG>*^ k nHa#lL476p6q>H `Kt] |n&e)ꇈ'm>}^giΉc)`c pvUiOUJ)X}>Y'7ܧssP2aml?on%c0o6*': ._6x⟅RHw~nP*c~|]/OM xp>DZOVۡt.ļ/N}Y]N^*'YeKa" ]?݆d @69o?oS PIӠRo`rEz?Yt۱;TcսMRU ?1"@~nUl0?ϣ Vhwc"}<)sn^^X:Ƒnӏ&h?shQ3*{JB?3-^bӯ˰f{N~r~#i&@f)ڏnjBcG?7j~wYBN边r9:ԏu9UJ6!SsSܙyT)h:Ɋ%Te2J?}eF> SkgD!SS·OCP"!^d0;o'X~y`?}ܔ}OY2)l:ppp2y6m[[~%~`$sBM=|`w6ߔMq6(~qv/D.d#)W꙯~?ϸ~?33J@و,7t$BP4 ]wci}ٌ`MXJPz\(㳆6J&:rlOE(i>oϮ6jغ2ޞH۰ [4Ҳ5C nNbz!T%-PƟ, eLor .`vW=P*@Pze cb(!#'9x7֥܏bo㘃e9 cP)ĀʀtĪ7>Y?LSɃT.o_}p@(CCitDCmbv Fp. ~@W#臟5}uFΏ^z!GxUɀm.rH7` w.|F'CE +ZGa}2^֨9@YZ_^chE!ooki(C 6FħVjJ(b(i[0LXBɆM ďicd6DžwrC%يUʲFƧ՝э:a4dat=igi lao.C _a.0=j{Ô[CXJ, )C93b|&PB`ڕQ ʀAm~[J2[kCZ(9 7 C0"8?3~۝:Ѧl۔lI5ڰi\*g06h|jP  RM,xnCJƃp 20) #QoD:3C1jn=C(M{1t8ʒqp>?4W>tT2~F +xڒOY`9>ZCNܰ:xo~ nWF2:f:PRz(ٰ;q?a}M`٨쯽'0ΤnT en UpB]u  LL cj1LQOCBiXS9H)"pR9G1=6m~#e",@)>oC TI1̑>J~(§/'Z|5~SJE1_ O] ?k(tp2n&v(6vs?N bnnCYvY8A?&|#9I7PY`C#{c6ERηO@>OHw0K߷<JGں}.<̟\9sR!C=X?,' w\IsvˡM+T5_t܂0A-A-)N첀9Z5v<Ā#w{r) L*YB8Ǚ&oϛ7gT(kMJ%i)Z6xM&X?wv(f@I? #Iҧ4*p'H [&P? K!cιDG~}b8xg-8ˣ e<T} p>f߮c7ӧ>8wOߛڣVe=Q ΧYϻ3|+0UBX"up>U>ܝak(ev*)31<kO`>)sk-OygȦEY|ީsyDž@_b O%m!j<"Y}`]5+ ϩY`aX Xk.p>$p-p>0C@x numŠtp7Yk1XN gͣ  ;_C-5aѮ߯tP7v {-N8i.y-)l}ƗZ}Ǡ֧+8FXV?]q"̵30ܭ6Gk[m|s`ݱ]6SWg%rv.>5kɵ|:aBsݖBڧFzO*z㻸0\ovyC3_߿pPkYy+Vn` k_ǰ j3yEܧ*yh>8җQ:joK5;6]y#Ҫu-1ɾI_[R@]@kC3Y}6SHw2>oTߨ>)/ŀKa睱n]Uwкz?3aed}*ɺR^VBUaYZӵ`[>oyts}k>5k96~m [b6:?:g ڥ}sh?XДW/a޺e TGO kU&P`-U(CIgoP%2{f6o6=0Od xY_Nvnz}aܪ:SV|u1|x˯a"Ъx핔qKS _LVxWUDkAT[ :4s,7[ǰ7]G *5MNk(k*Z f^.r0U{NKAvYG\{ܕn%;J`IKaYE J%󽆒rܨ vE)9mFӁĪ{-K0kH/ Ϳ2֩|Fy]"XJ/ʶGȠL"_ heXM l_JϢM ]}?z}mN/'S͉q{>*ŷSQā`JsbL}aSs,,؟ԍ/y]P¬wv0?~WvDׅd~q}f*~0{C߆"^ޕUtը,/7牢R_-(ѹ\(#+O!Dw ٝ6 0PT;%w,^nK;UgiDۅ ]~- 5:uYLe)K0a a,q bz}c!~m * \+<1ZB똤tBWhvZ8y' {jh^ J1%^]L$xg=LN8XQjte*$)V_QC\tC1BPb&Ν Í`S`hم&68@Iʧ(lý~/d*)V yk<[M]k;]9DM]?. ]ij`.̠mY{? Zݠ^u;*O&mZ\M|;x4% <>1 h M"طm žvAHVҺLjӪflWzmC5#zd:jnU ;.p~Hdu:, e$>w..}a΀j;NӮFaT66F6SM;pAzҾoɊ?]K5dt#?.fZ po۹fCZשy7;Uy ku]~tLv[biJ)g4$̾OWZ?~Rچ[7 h:}_,}i7.55nEHҭ;S?xsP8v%{i%r߀n֭ۧ!0XS?aj?ŀacëAx_U8ss SD$7*I*1UY(WJ4S)gn 3OYG->Rór68rETg˝O!?RVBmM`.S^V(cr8: M a %+OJ ,)vDj$$Qi.czP=xɇqP!3>q@'Cf@h}?:XdTɒ a8e!c&hΤ>͸6W?>$PrZߌЇ[M"oCY5evR?-Oa-I 63sSɭz0 ܚl̺éYF%[j i ~ q@M0+ ji.XF(Y Q;%WRv %k>xu*; P!%w`vKJ“3"BPr$qqD+xpQs/y#ŝL 7L O_m]i!2jzy 8iLên08o{J-WAakLEڧuoT7)LkNgjS4>y@so)EFn.:D#P(aׅ%JnhպzBaAG8f kdhEMl'ܙO[r<Z!AI1wngzW= e9B_HPCÅpqp {p6*\B X'!ۇJ6ӛ(8al/ܧrʱ;JöO%V YKpG++ z vs5.s{CYvHjQң{IoTa\9'{A/JiCP{i{ʞ^ށiXP.2% rA; :PN(Xu]fH93eDp=P'@_3 L@@zMT^'P*>t`0t *l GC!Jޤq6k$)ưAsST:gBB^ӧp݉| xuhPb,?Q&HaP:R|3 rV[dl@بa)>Ɂv !Iw*FNQSYcDPBIȒ@d? #K14J1AtGbݑ6ӝGl@ݞ=c#eP@`ބݞ>y |O@~~6(T=58m!ɋ *ZgtT' }WhDst%lszRAAwtE?PP`},<5VtaQRXJyuU  [Y#\9vBF %q?EVA#Ng#,Ar(|+^࠹*&%E*,pX(f5ULO>Ѝ/AיּlӬ%9l]ޏWtлEVmƓGBUܗƐytH 2<NH`[Kad,AETΪt8X,j'Laٿ8 3 (wtRv-㷔YHpagXE}y.G/PȦ?4.{A\fI~ܪ3]WrR),WP J4~1V/ߧz[g|=~`~SGc|uv/q/~zF !LWVT / 學Az}qt/.J~#l1C*.O@}ra\5/^J_uƓKf7vxAm ~L"PFipB^S+ % T o*=sM13r+-.n4^ιʩY?^tl:&;@-AC['k{uPӝ2~nZE{~dؔ ;a ^(AoРo#(g>_"vAGN&CA'W$W=,۟v wd.1#{"=ftTV^CcU-J$nj|M`6dbEw1w`a{gdV;:09ݝ=o(klr߅]h$.[On4nT|4]d Zژ ̥]/<@]dla4Dؿ ̞@1,)SРы`r|X`ѧn^hسg'W0Ga+xK\Ok6k#15)DF!j4,]XP(15vrAC`+wl*h c@nc?L* M! =~..1oYn*܅urYq֟ nTj3dhe4tƠ@.*P*r XJd xu(rr 굦)2hZJKkё9J3BNNA(ǦvmD)Y vot{3i0k#YkOC1%%Z7Y9%;emPf7@7),?Ǥ]9&+%'}zYeƧRlSV)6{V)63}dzƏ345 ko+~ByE6tF![^8Z{YP 2)>)4j!kf'/Р1BSH({6">~U9#ʎdu+ׂN4To3$OOH>Ϫ!q BehAs1 u@" _@pP.Eݑ7=r{ہD0XC[B=i],7 }r(K_ ix$ؗDq9R\yl2soFB냏^A *^($ E0=o#EwjE~iܬo) !縐72k[."KȓxU)08*@m޹}5z7j߯ښ LVR[Mȉ'I@PI١BvÝݴvZ SބQ$Pܞ ›}?@g0P'T-/^ДэQ  zh&<>Vȥ3^O5:D@iB*^95>Dti|Qd"łuFmuJyLШu!k]!Đ'},1 %r]U=ӽm2?9/!>3T(gDJ0\WDe_[4P7)3K`)d^Pǔ;NL\:J'ҘiC(O*w߁UB: ֫@ DR05@DOnfe9Tl>X4p~v{=zB7`RCfheVX=TD5d#諬BȂ R =T3)]R˜/".p7zKQ"QOZn)ԍTDH?[ j |s=BY6]:%ؓ%|D_ !eޖ5:(J%Ҙ }F;T ^-ml)EyAwLHgްRFw횯ѨI$ru#q޸%g+8/z#zD6ƾ?S{G?O\L"vXs[BnM!ԅ:t8:)>$g`Ɯ꽃xq"%c8E&Pr\!ޗL[W|/N%k3}2 9}‹}xRZIch?)"tG:??dg;lB*u׿H3- IlP' q?HIP*+ fDϝB~ !zSm&up;鬖NObO;W?^D˿GZc\]tUJ;?IσBC"ݚBʘ_ΕI+uA :Hj?ӑAHg&;ǂ?j+_j5e,jJr]e—AD/HyS .p~R ܟyd ?|REiS{_&cJ|_cs̴X; Tt%83%Kٵ[P7vj{ $Z{`y>gP?զ_Fri]ΧL-:oNd':?g83Z ޚZI`+<6M?SoPE-2Żm>J@1:Y"V3kdIrM϶}M2{b%96tփ+ڗN[lku(*NdѻR8TbM*k ˆCg{.#9)ϗոeYfQ=HJ-3[l*]_%n_K#K?"d$M*l2߅Q|rQxw!H?sb?~/2>7?_ڣ11vN9Zc΄U g, o{Imqw-L>8 O$-z! A(\h{skݣ5!9^s4@٠}o̿A=$U}bI ַnB$`Ëhs?9 嚚(+Y 9b7,Kd%wmO0qs!TEAiڀ ·nZDߠ&.OD >l~W|s{S3n 0L >kWIL{+\s$@  b#Um~~apT+KZGhnl4_:mOch6ԃ7MA4/Dv"UH}f? @cJ'IL)+-v::hఱF"83$ dXpNx=DhD"Ue.)hi}L  ] D~Hgw2ZJiT2*$PuL4؟Ggu aG#Q= of>)~HXw_LtNtjWI 8_p L̟iP~|ocy'8&0Y]HţTg`∐ xX ׷@9?_~}ʿqJ >.g'D3,g={ٷ寷QPW D!27z`zg?r\z6iEžH v{!zɤَ"q@AS 䇌1?Lp9G__:@b xog(?2>3(@8DKQ0H"1[x^e&$gTz_i>78b}iٹ?l<\H^%cH}ъ|iD諶oUx\qV/ڷ:R" r|3H>WTg@-sIisE)&Px;ԟg %| @s"sb K%g8{yhlpbǀ6?,piKt;ԟ3]RN{ԟNvAw.x?gVNoy33,YK;f#.?s@=j7K)*]ht1rKVqAڗ7P?^ B.?= җ8F>9b~#*n1iu77x?ҟNzd$/h4@`}=* ~owWŚ6S݌T&,h -'>ю"D`@+( Y"%Pxrܟ]F(7D"O瘶ܟmAv%ch"J&Dbkgdz4T`^꣬}-k6LJT: O]}&{O8TiU0^)CPoèrtBHSGU&Rr]s,Kq\Q?1e?ˀhBCH@Q1 ꜟT\YiV( 0Mu+oy?fx%Ocڙ "lWǢ>3\wX"Gˣdp M3:h-,z~)oB*K8ec,cX!3s^,Lbbiѯ<8{+;>HEr%A}X"YLI(?g`Ю+o]F).)qdh}saL< \')SdǐMl8e% |yQ}OJT:{!/7m˯NX΃tXnRܑLd͇$R `1)$SHsxgN!#DUhBUa+Yݪ* #:D W"EqޯM 'R2l0Cɲ.޸>.8@&&PRp"׵%P6ݍf-.{%GRDP=IHy@{_%Rr? Nz97!07}HjDJэF!3至)bc+*\9-Rfv) h4>'M%ڗ8I+UpL:@J-8+lOO. ׍?f(DrT8W}nm§H@]{5ڞL "h#Tu902YXA[ZDʭj"Nm'9U3%Ro +i85̵I<~)I@Z&Ae0iyKBoǏ䴙HC׵)m%r>_)r*rgq!gl[&I7P sɞۺ px2Ye v:`h1D#t֏pc?Kn`gBD*۪f* tVtPGgQ]1Wwwk"(PC"c鍣e{愮C͐X0d*JdA$aT[Rp~]mMtnľ3Ou )$Ϫ}j")=:7 ʟ]^+vhW"~2N;p>5}2mOXӎJ捰ۗSeDg"l"hX݉_S}|U[!av\R)-dMP;.y\jNؘ| ޕwh"Ws(t8dxId$C?H|}LwAqeaR^MmK>)r5[<M/`>1]qG;ŬH%-e6@Y]Ht[~ѐ->?` t;@r) Mُ!;`9%KnL\1y86=r#2GL' Lc܍B%TuASDxD6#+cipFPipj.perk}? Z)K,$:dԟó}`)] .y ܫ!Ry&FM#PܫsGטA|8kwͤtP16!l(ٳqHlNlA5p>IUǤ):99jZY= vgw<ު7PIEWR:LBx~LJ\!נ5Tcp6'NIh4rRBJkqŴ`:rxs1 ,cI9T/aRm߼dO_t@_% -${!%>~J $ B[/TMG_{ߛ:ÐnX+Iv%eHg'u^h}(hj] ѰDvNeHxw#?!S6$5 QH}bU"-xV0Ə]!6(W@gq 3? #T/Hy>Zg?$~,;$Aff BÂǤ fx߸ ڋ-G{oek|H2lB"o Ke;`LϏB=p{kuSH@,f8w1=P\̇"z[KԿ)})rٶ'+g-'?>g2]'54&/5&R: ʶa}ܟ=sht$4\ACl%?̟;=ެu'R:l\9ޠT&]Om"3H8w8% a4*So8"M$D҂.x)w\U,@sb o"],@{w3hroD H9@.MLR˷Kv. 7.?Gٽ:۹)]!kIow Wow C!hh7q9-*|*)E&35P5j̽E)\d?e?c ӬD]Dؔ#;e̟!fޝhtzIQ[̟i#ZdK._ #2Xc5uɯ/)rp0KZipY+*D* o> .@8ipAɨ]8YN|znHz kz!Dʙ5a#tAFW?sV,i!7w&/|e1}hS) t.W]R*O3ӥ[^h(SJg;qv߀&AxX}(ϹȜHcH=0YPIl%$&x)DC⺃#k };&#i~h L aSc+ᙍ4(s[E#W9'nD.')>XM[ v2"`#z&RƻsbCew|dm܄-W P6,>>kJ<-ߣ7Yd u*=&K3\`ͪjXo9`{@wY^0@ Tv( z'&ICuSj"hsqKDAWfu|aڎ̓4YXp$TN{{/@4,y .8@58]R?@stl8&䛹8@VoMwi3[4?Y@ϣ*vN_ o؀5ȚfzGMS*61HTCHbHEsv>10B" 'RK/IͪÈwrSLt:ß X!UD*l"pl_<@)Hij,|t" r&wzu"BlK`0bSWk"^oKV<rP ىF~U`J>՝@GՉ`6k.]TNR|,DuNj|^8AcނW!#U n˵TD.0}F6F1ў\1T?O"L/DƗȤI J!KIͦ.N^1Z}~ŝ@M-yN-_bg\qZe Jd -)/N72G'Pi P 4|Rul"%W kzQ X#ZDJ1_Do8')+>]d.þfF".>N9:MB4p[O \ W@\`|:{az/m; =~PR=XIlvI dRDj L;@u Nj3 4y@#I]2WD:Nֶ %N^9W&_ 0@I&x4R \s"ڛ{)TH%݉N.c",ҡY3k|A-8s# OK7rR$ t{ӿ~N$A-?@:cєe@nAP3"$"Y_LuLؑ9"{piL6:X-A )DJܽȦ 0~u(rcit3 O=+qfQ~l 9< i  @YC*P~ǧ q/9@MўHEqHH0w,PN%"B{:c5n"ڟc),`g` Ζ!$O(ࠦ[5z| 6+4|}aqbLPf"nIWрfnR=kx./3}L5Ǣ ЬؾCd{[YqYj?-6ץ (Y?0&}{/SIh"ZG %Rk[4t"U+H 9l"||eC9A.٠N0潘oj>y}'}%ۿ퉔/U ۏHctC!kI7COa J1Edwm60ib}Y `NNVҿ}VI) =k_039([ :,@oS"eP/C ķ.&I@ws+d`'H5='; % ,mI<9I$ #,6#*oz4_IBc+ecYemn9c?aVXE̤-%ۗ)_"V(4~N:(7^bJퟌ$v7ICl4‡.IӉg=RNz^@h*# 4݇y)6[[]v]?8@ؽ u:nJ`瓪9v`HscD[`C}=nz0o5ƛ Olu‡ɔ.6rtL^D,p~Wi7W7Dfoa <*8H<ڥDo5@" JZ$Z$bu6LNg"w5.>H@s0/_bI5(vP]E34=AR @2Eȑ_>xr5i*D 500EC<[ MNdBe^t,}di8ct/@&!$:֓k>M Pm[kN`?wB +*z"P6: @䫉+`}E""y<"U 5B~]drya|4}0F«sK,ɿ@Tu*з)|ȢGVɤ5\"(y@Щ6anR7@\ *&Q/{_"~mR#~#u&'tn/&qt2BI.   X7 ^i@ar hjle8IpXB{V@_STpa ߻ M@@6No;Єj ,Oqiy>FkdHvRjh?fD::%Sнe-C&%z dmc~!eMX?}= 1M`[.=1,v3. LP5x"V Hd_GfDs)ƌ0@c86_柴-L2u ϔtzh;}L5}h?))NR?.T3(hƇosdJ+|bW7 VUʧ^J@Ʒ"P5[Q@9`~_bu~u`L̿HaVA%'%2#`ͯ⸏_t%ϾZ3vK1T.Q/@ܶZ>J1s]rhBvA .&(?2@SY/]/lCTIճ|`8{DTIJA\Zc n.&PfchˡLޕs!Qr gua$?Wt3]|@_s?xAp/\T17`Sɱ45 -STqcG4D#ZDʡ}cGJ w^vj@F c;l517o~TQfY}v*@ -ޠ₩/LEo}]HI''X?|&r9?}4des~vVPm}f&'b`9*yg UW?ݺ`Lg.FV1ߞ9#7l0YΦ>TzC`+ Ag`*D-Xj 簛4v1}ͦa?&ǔqy,=63?ߩOo0"$B*f)v͙|tp&&hі%R~pze8\Hw 1`˯MUAz ) ׆vh_4.GTE4rk?or>EϳU'[ҴѯZ4@?M5#pi9S%Rv!YHEseL, _BKo+Ve[_Z!渳4DLt2'Uyq8)B.¹`M pnp1;-s/9N.^C xfu!O :YW:J^3s]H0́CHcy1dz rMR22k2-9;. X Ox[}  c?O, %z ˓RnF!$< @<t6hV2E~B֗z{!95 &拻IU*׎:?ՊZᆁXԟO@#:l':B&dVBK@H~1\V3gRƟ]`18bT%W.*rq_(vvJR4TȔ] ! EKcZSKreiĘ XvA{!skP!r<N0?@3CCh4FOQ$ \]BХ ZFK!d[b/i[p0}1|fu<P&>@_]Z Nۍ~] 3f r6dL}I݅`>SHd(G{s]];&B:9vPR2E8IB{rR56dڑimli.$.k.w+z_H?ޞH_=Z\12Dŝoioo>*͸L|RߵLtaARn`;VH%[Hh,9K& @;X@F0xChb هv9NdHPʗRfXkJkM!)In5|98@e/r:(@OoekQ~ ;Sq<:94P8b=ht*.  M&#8PD9ar {NRmv忔}?R߆$wNywC$~9ρ%@'b.EUтtqeLM_p 8%{|H\gFCqҨiĤl4=:X@R;g An//vvD@Fk}Ԟ=dD}yOɯ]0 鋴1M~x_BwQlG棃 CW&\Te>J;@;Wz1fJBq:@6 "ad+sIg^{~Qv /@3=(&~v W򣅠_z~.s|ֽ B.Po/?93 p0"A7w24MhN F#5H! l ͅ^@Rd0N6c@Ѻd~}M|E0 J20zLȠ?@ 43D@^`6,cFc t4gtQGb8zE0WzͩF*㫁HT[煠դIܫ?*| ҡȩQbSsCTL`{z*획 t cwts\\5  o6 #-?xB6 i GYq]<rV<@E_nZެ0 OB`d/Jx肌nos]m/ATrLS2@9RR IeG b]vf P}<&G5֟JEm?EA 1c ز%2"s(Ix]/<4|.}I"koiRkj!r7v(Ά,d9;ʦ8\&>)f-2;M3qךO @DžTX&0&@'".^`Z*CܣKfpkϽutmB7N[?E6kеZ |'#hkW2z4q\]i 6B) ^Lvg]ׄgр\|c@#铬q}KZe-i %1oӻ4YE Zܲ]0 G[@(%"y #T{{z(3lņnib"amFv*NOmѿ\\2΂Cwȹue-2~I5,#`ӡ8m/6вF?"7U x-*d!ލr| t[x/$pt)@9y>bd̐hy |+҈m~vC oRs[ݝp  nFmCWKV[iZfQ A:n `%/[-i{VGH$6"N,dnݥ0} 9I7 z,Uׄ r[#rYQ#AK^FN Jzޒ @&1Q0 Bd4ۿRܯش"+Ѧ٠Ѿ&r䲩a2齍 lPL51fBcJlٞe3(j :Ktͱ79|tl~6@MPHco |,`s[pYR*DF5sO*iQdw2*>n N5OJ_[AtۻaVs'hT@k8 C@MxXۗ7im孶ڮ]A˞\4K&ɜ!/(P,SW}攽~(ޣOr~yA wK4mD<gW>2qj 4tk&&xAl rrNc#B Ǹ␧u:{t]N)-ШQt1[ -ے3xS Aw }?Dup*#^hhBjmK!5MB?:QTē?eA׳ AZEt=b frW3ԅQ_k17NTz?~mDz nEA׷4۶_ɕ+b]mZWk)"s`r _|Vk =H(GXL"߰%PVvAdfXá)fsm?Kw1^w`V[}DeVj*93\a*ipmlsN% /uaeV r%_f)KN p1XB.u\4~ ^YJ7ʞ&RW J9ߚt%-?.J.]pt5z_P&^MPH-#\`;X.ְ>Do]y VbB:ӮMؾ񣟡s>|j&R#0Zt=Mhwr@sJ*ȕuɮjW7Pirƴ=zL%/ho* &pt+ .MS<|ѥ~.聲Y/bXk DVei/AEOM'G,uw?1. I[HUaU;N =Z2츠JKVm٭/@]B:"p݁BKuA `[ Ae07p z8ꛑ#.=a YH5v;x{K RG60@ 5NAծ[H+-Z\lqRJw1@tCۈY1)2̜2|V:5d %PCD|:k 2 o7A䠿d `0 Y\FҹMJAsK$б rSdXWť|am*Q|C'@p "?ğ _ +tlvyav(OL?$肒i~t!m8BJ(Ï8]l|NzBJۥD44B;A[&D9B6B^7|œ=e|Hق\c WS-Y|/%R-+`-1I\\!W`QW W#`< 7s XGȜ Kd߇(R h?` }W"ALN,+dZ|L鱾-9U ]g p2:T iGH>jV J#W :|C?iO!%#'h#kZ>50%R:lrhk!pՐP]f"%Cw֚.Y-4p|L]"pgß@ITs 59 9-w-Q%RJlJkV;B.n}}% k:M_ʘEn $5 3|LTP"¦Dak6DJW zjCTMHـ1yn{{;V@uY= )q߳JMɄ6`i742]H& 0{0&ke9` 1GZ헐F.*vc:HEN= !# ,JxŒ08H橼 md]MgKS罱RyoH:7 1GqI;ȁnl)[?hf騂;J4ZRu:KQ]D6?CN?BPokŠuO -/ fڕ{4=4<)DĦ6Zy4O@[--@FY"rc55P}-Eʖ-Ճ ozc4E0:Xљ4M <O%D6sr}BHC{Uы^l_t7Lȵ{rb1]YOa4IFxo=^mƤJDO29@ W:ǔ5ܒv~|՗>$_ˍEW"){6 QcӏUb7Jܴx}uuWMEP^qP5TϠ%bК z*hq;!`9Qҕb"À%k裠*=`?{_e^V ( pS5W?xmDM_b:ua`}3ܵc?@mcmbIx_W _ut&Hz0EOj}&2ɚ _&rU?&>|bЂӤx'}׺L}keAWֻ4: `v`M/r܉9~?$Asn#K;5F6=)ICio-NĶGKb.{: >Կ[|!HhkQVfLPR[7﫢cwv:|f  L_#-4H\:/3ۜ 78z|e'pJ  iTs/||w V$!5zL퐶!A4܁D֕c(( 9+~=$s"UhԹHQ}kz@!UTH'bHv| )Q+@YGe"/(2*O@ɇ| ʅS@\R!PISZ%BD~=z[>Ŀ@!{2U:Bk!8YE 8@:d]ǰ5#~?mj La7=%hK]iE| .5j Z~ؤ=ߛR{~ ۋ˺E,Nk|ђ: "jޤ^ޜzP{R4WY 61ğFN%;@$@Cba }pmAUޒ(jfeJj;fxr6mr.g7@ћ jR~}n 7y@+PHjud(uzM!.%W .+x@c%б5~Cp+92>m/nut L&f4Бu*zuUGj@ԴB_ 4I)7Q](su6Vyz/||HI/K餷D?̦,Kߺ89ěs( :L0f#U>[mI6+ jpsRr?@w q631L p ۏ KXc hF4X4ir@qY` 2fF`L?:NZb d*? qwy"\{]<.۷÷з[:2}Lqr6~%R͡errhElrb(B2qb8Gl ƕ7x@rB:x ^G?r^xSms=$J!6McfoCp0 \ v P!~ *aT綪xfݖ+HE m FZ)S(m(w^%(.@@JHq m.nuCс [QLT ?aIw 5&B|Hu͒HI>^3H9 oDk>?$4i"`K\i")^tޙ 4z!mcû$r1Xf7Og?WLT4i-޷;dJ pL"s9?MH ;D*1D3LX"^YŁalR3!Hs% mՓұ!3g{'?߇23#0 78&QUSvEw6og О%&?͙H +3We"T/ѶmҰB'RaTHп>Y4")R.>#'U[BJ)q2iD*k=C-졣q|P&R*yꅔ3%&l(W'~YBMX?_ ?oֵVó]bρ1]D}6%y* \X?t_PUSO^;td$?ڛ8&2Ԭ*к{*Ѻz=pdѶ&A\/ `cNkCLޟe2'9aН@Ui\nI8I |SL&lխn\ )HG ъsްmNS >/qHpZj;\|eWժej d}Rs|MD`|~ wCh*A]5Pl䠿GQs)Pu.MSP7S-!# YE}irel<~탮xjk|lӪ@$y|f 2PBJF-oA5DT&=n3#ןf2iЛ_U'#@r57A#[@*wt6,XmfII\Kd?zQst<&S a$埗" M^F71 ϑkh㊿؛.r[M9Jd>܍[(l';`O67Pw {٘7/O_fp~3xz\L7@$?vWL!)iNXdl([C/d+= 1'?4|6A26rh_#v ?s3 +If WgA{ &߮72wdAgc?b<ؐh~PGEs bl;Zn4TX=Mkׁޑg&"WѠ-t>@ұjqRC.!w4C\<`3kM] $+rkzj|̥ݣ= ]kcc*Oǣf#@7?0 7誫}JaZZŷX1`RZLjQu!xN.c<ϸ`O26h$}e= TG_bw  *$>3??ñLLb(08ՐIc< PUz Yo(f*(Ib`Il" ۈI<PWbw|G: GGh'Τ#9ǀvhp0Eg#c::89.C;,|dhTqRh:4 N ]r+NhM$Z]M@Vfq-Gl'@TrB~7C5- ۪a d(]mBM׈tmV!9׸QqCW1;ycrVM:wMU'A 6U> 5~03o.DmΫf@SjN d^eI5OZ~vH6rMIڶ6p. оAH.gUݰஊB H̋Ohn^ŧYG@hnJ|\J0a 3]Pt9v jf}n]w6t$ Rf_ʀUFiJNN12ڷ f X $)]n/d n"p9In +eiGe{V 46 ~Ӿ&$@#OWO ~+h\W!\fQG@d>҂P\w!$b`!ͷ zw _ЇdJ{ ٚ{f ji"bjd'y|A (#ءU@OZ^߁rhs$='@6_BC*h ̕ $)iQX @-[ 1@# RhSi!x=IV*{ [P&C[ͅ 1 R 0IvYpgZ$\՞yqߦ,}doJϖɂh^dAdЗOYI{$RhO!} x.kl2|\QemrQIGzr4MT"N38n"_e$׫+4@#x/>OFrzA4C~):ܧpyt {JsnCUjQÑPIr ?P߹EW2إ AZ[AH¤-oiG| OZcwnύ4~zY Wȁ!ήn F (wtmbd) *\bdY.t97@#X/42@OfO4ZMmMHS9?I<1WCHc+^'I&$LFjMh3!Ýk?ݣh ^AcfC3&ޭpP(ff2$3yos4h7?G붱? DΟOp [p4ܞL_嬯߱xR@m4Z.$VzOdcAF۹@Ia,Ylۢ}s@;Y<~;l{ * YlUb\q 7rm^ߩ,~֩v@3CܒW+/2x|tVy\WlbD>Ty?5vs78GpGIC՟q:VFAǥ@ý;{ώDr]F ???`T t`4>c@&]O/9w?G7ULnȭsI;Zϐa +y/tilYty$sH:ȁO8\ NS>ċ6 i75sD@qcy6kKG(Y/D/e(W1Y=k(Z!JNҟCoRh}2ҟqs[90{*t!&w/?_\.t│ LWxWKwmBVz}LZXC/IV%+;,K2g} /@ uKa>/w.u?-7oN?TKz)9Fgqݥ[s^ J;z ŷ,z7u(QUo.mŸ^fJ`V>У,^(=@I*ʓ~" guR1*/?ReZk}>.> w[=PB'?".?w^FZ,ϾBK^>'qi!չ;2\!^nC$rLTs,kji5PIs_3]Ȥ)Rdӫ7(xl[@rkj~k? bܗ3s uV~ RS&*⻏p~HzW#H 9K 8N\^6]^\@'_}ߛod"5/pFxTKz_J H^oF/bG {>>?Nf9k i`~ӳʟ8,>AWڡZFWqU{l^ŧߚ]u2~ b˵+gzW~?bW $S S|T)교!"9}t p:”,]PJiTu3S ɜB2S9~@̎ϫq ŗ? @w9 (t!|d tβ KVDY>Co1éQS2M5&ic6Uܒ\Lp*"} YѶq|bY9=.o,XO*By<y6{YOq~F7wɂ$CS>ߍO~!I_mhN dc/ٵ@5{F)_@'A'O*Ԓ9%gpj(y dw1 U: knH:CmsB@QǞn~yM pܱk:kG$=~>Y@.Os~M (6I }`pb9x:dFۛZI!d8g@rc|"rb ?T @NB gg<bd1wJ&bs ۩@A|'_"@@)(Z@ӑ\Ȧ$>~Go5 mzۨӳ|ӷS3&3 U:4.59 y]B:Q@543hd $/-kв9@!W*ƴVKBρ@~y) d=G *1c s\@;T FS(ѡm:T?C6Z|CΌ#؜1 g\e{lJK$VJu%\:@g 4|ʪٔ/ѭ`Tf&" X/ިg?5qd??L>eü=gq(u{i'\UkP-fĥ$1]jp̓ ҟ,@ ̓ڟ1 1?RA)}󡦾'GT4b_4W"Br6?D;H=%p5Ո^g?֣'3vS?uFC6[l v|97W'?딆IVX$>g>qL7# 89MLQ] GJ@ɽ/{kڍTwuL $W"q;+'q4Vw\? |AϦ@r(A7#uM3e]H։G_j:ȿzx X:3A֥`r9_bn>ͪԎۙ&ڼ֎vd /,vFb|,{/R@ܿXDXa׫,G6ZKtE)7 T볬0+27( K\/W줎UoDzHey8aH#. dĉVGqS=Z8|2_yj}}TѧVc:]I &#rnj@k~i]1;/tJoh2魼a_acc!ȍ'L*@{te> n¿'?bC~Cd!jlH`d~r}BxddUA$HFc>SL#y"3` .YSR@e5*3=XߵNWE| VS郙<g&)bA 1?̽ m̔c͔:G.E1K[NYZVGgfR9g[>> Pvfr?;Z]CdBh #l͓nvE|PMHsyKH$R I'h{S?τZL~3ۨDMi#OS7{9-nAtv"&b-@bgG'ze Lՠҋ=T(9 keB TE,B@i( h)v&/49!CfΗC潖 QRT=57-.2J$@ QFҭ[ 2<@dlRsU/2uyk hyބd%O"#?t 7(5,(ꝸVSC(8A# l{v{B©C[3@ßb?ZT+ dNj*igX?)޸J\W֊Ne(!M=S{o4F5B%dFO!Ũダn|m df%ѻ"aRndcdA' d(Wߛk _.t@)'AdB6F1n[~Os8O߱2򆱈mɂXSj/H[(Z~.:>Fľ P &&ۄS%DM8Z@rgY$")b˂OTXB *V?I/jx/H1= pB JLx=2QgCv ugDlG#|_oD@)4 ?Ȣrox.G룥|AsmH7JI[,3cL,-eMhrVū d>2>hs; Red6t8`F"FR'fbj4t%/L;U2yI՟vJlAکnL1p9ݐM.$S/psd 7D@c:41Áys/5ojR>1|Br c?!ccIsBVevc٨;y-Kkdžh9TBV} wH֮:@2]B-قrc̫]XHv98b)8xWŅtf8]!ق+$GˉohEҕ>erhf w&fsOt0oDTa۳Q̵W!%@'H@%2tnG뫣0 MHЇ=fz)ʳ=%ӕvؔy?;=ʹO*Jmt O[r06o)_ʞ'5cyc`+>$wT# >Zؖ T;;@3r M9OT@AVHc6M|}=}{ Z6JFb)K9z+?bH?V :4ؾBԋ CiWJn*ۄ.<2r)I@3txl9tdg|k@3 %Jҟ]Płg~(U^?y͏ߦV՟R{ SR9<,a=T{䧻l@Ӣ9 & 2)B df ٜ!9,: jzuB/)x(sCOtCǡ9E_(ohV\lRzw}l/E~G䎾YPtt3q,hz_QoAj~Z(uH7@[ >W6@gvP)sM"H19fK!{CKvD?]zr[U8PEI-i ;ScӟzҡS #5C)c ve?"xb`$M!H`~~2T?Ǒ3}D%|t;o}Rǂ)az[>q}U#M;o=s*vȗ*l[%pw@WR]m"s2^~on5㯁I{rtg.E?1os盀o~d?i7o'ҼKCP;]~)hˠv({oT SRۊ;t 49 qمܪJA~ L,Oo|fNAɊ\Jzv9ݙb:#{n*~^KϗFPd"5 .>?>]v.#j(3@ap?$ ռsy%ߪK" rܷL~F"K#{eo?V&UL*>$ pxR=:GcrԻeG=A^~&Ky ?l,Cb\'VsxM)Mfr)'>i6?O/gt#=>FoQKF"j.!U@6v"6cSQ'Etɾwn*n$8!D:w >&Vy*MiʮF_ӗkN|@rOG-#s,PȢFMПL@| `gS>ŵ5~m9%e\*FƩB݄_% eӠW6ϧ9\v&XtiUn=/UNcw`2fo|i. XaſĤH57L8?___ulH} n#UT)8)x2iPH#(}{bf-X*0|:i "~%ʁea>ә;t7F; x8c`U?Gj\BYj{m^QYt~JO/2(yYͳַ,f|DhDK>4 _ ëمodNi аD=f V^!qڲsG]3mIB)/tF >%?ZS;IE xPe9si\+?*Sj@)F|:LwM҈6qQqj`zf^}ȡf&օ(_J@d!)> Sua[+ [KNn %t1*be<6Ÿk/6h-LdoHVZ6>-zџ'fJdhRJi *n!'RMSeS I_v,(F]^a*ۋ}'i/u 6e:yYT?pZ!矇k. Jz|Bj*=t?S If;CaL$4 Y=;v4oڠu[H-bضE3CN\ݿWduY a aĻ6G MU{tp2`}h/p8 O|( qӨ@4WH RoDei1 k+KxmWH?Q hTs*oNP  9sl ب7nv }̬tV%b<@]#P'D^u@vGW)Ĵjꀲ"9b7wq>P]Fr аw#v>l&\dz(и>ޥ݁N* ̬#L̞MȤǥs* d$SKD IWdz5;c L^#:!Kf}㈔Yu&ٸ0}@'_/ӻ%o̧Q,W|T ^ "F|- )ZH @m{]쎤|c/!@}ce8Щڏ@Dž''sٶoGRA7qDЗA铽YF6 t2'9gHcNPc!JX`/J P cŔ^Lh;\H5B pJ`îseog{PlrT[NvuDD::R܂zZNЗP}ģ3ЮaA+@]ͣ@+˓,7=>J"ɹU׿KGnM4uziq4/w3Abp?ߠ[0L(1O;Y+#?CRt?A")@(4iK0l@S Dbܣѡp Df:0:|9A P7H"HzFyK*>V%L#:k&/MԎs(| v'l:K|N^rYJoR/y6f=Tzv&t@;|dɴW5Tz+ؔXLtPjSПR $uɘ6^MH8q_"l)kP'@Nm0.!P9'$g/@V ZbLLJ=5)qA")z*ԈJ ΀HlRv`// @ $GtrwEw|W ,GO %ИV]@LԅɵlJv. SsaĜh[Yޚi ⢇t>TAzI7Ωf̀{^FkrK;+ j)pR/Es 6:v_yOhfON^񟹈zbBO G?q4wW\r˩~`#eFſS|tjۃruX}q*i3@I5Jך802o@Ew.Esb$]'^Zh)X{),uwRL:B!\ Gr֭Ƅ"K^DFn. ?J 2#A'x)٫gr[W`b giנ *ق2jF \ X2^IЗ] ,ti%ͳlQTi}t9]TtK@D'gs*$}X@lEOwdR`|ǢgOJORTq=V ];Լ% zW"V }2DgAp΄Tk@U2)H\N}>d!\&/h*`HE٧fl"hE _xG]Ƴ0_BrsnT۲o%LD]3g2$T\M]L7^>eb" '>gۢrO.0z vI9]Ip]Zk {nSԛ`HdҦK"Fv){$wz:xo*/Fqv?:@~:HE,F37@vw(wjf=+5U M gb d3]ͥu["N "ٔSd*㪹!ڇY'߸Vf0)Fm<5@Pq:@ {BO%@oB{"awEͨUt6D@V#`hAI4:j JPYd4j_ inѝl/|}M_z35/4д z\HhΞFZ՝Z ,Y@bAES$p<}&KۿywNo#ێ? %[HoB@thfC|ly#F/- {C%eFШ` czMRD`4 $Aʼn:g~(\dHw_DLg|&&@+K^^e4VggLRC͏iD24E-OkRKR$ޚeEZ^en:p1H NINEahl%`H)@kor@EH[iJ ٧8=s }/T݇d琙dwAE[3m1n}j0e/r[.vGk{$-8ϋ6 m!AvXlw(, }\ '>=0scO8KiO| ThD ЬjBeKh^emh8tH2Rm? -Z]/lS=d $Ha`f [F/OB4kTMZ%HcO+dw#TРoUc6ozNZl*&D<'va.@S IޥJ4PD%$oI'hSQmQ?ԁt-7)3rR\Yhr}bsW™5B3[huтrEݦA3o#]*Un˽ٻM:zFrjRr$H] vt4{dI@2{<{X7?Y$L$#Q@T)dc&h5ICRhs;-6K*ƪ^_?/n>f1qW {B˙]7fhe7QuYUB@pF/ɚB! +B! 7-2PC& d0R+D;sM&N!8oB@f!AoO ?uPro\ .i6qD %ԗBDK#tN tIF~*N_|{Bǿ+W3tBW :"mꁬٜ@rMN gy}_@41e!% 9 d@Lxv|s*lf;:!3th pTCds3gUlsS81GaEhLӇ2@'Mgw 췑sO.#W Sz+׵>ԖewV>LY6ŏL? i\W-C02EwEݎj`%K9_ U0+aY)~0훾ugP|x ;r6N"[ L|?0sw1ِ,{y0<45 r1o ҟB1c޾ؐ4U|VLY.||s1n 4TeҧgUx $v~?F{$1+֔c ^ܟ-L_+'y^*?Sǐ T@E ެ4⟯s ɲ>d6\,ՙusV Ҙ+իIG2 `e x{PsId$LbOY ?&܎pߨ@:gnC@62H%DΗ8H׷Ak Bd`9^ ?]`HJG @u%zQ42W!}@tlh#d0iZ}KWf Y.B@WH*Q Dn&?H4((UbΓ=Ͼ NF>4e?A_o8ԨQ| Ks~V-]Ogg9e?v'?Zo7*% +4IҚ2EfϤVdsL2UrPq(5t/^[flT[k [>U$% 뒱]?OL4a_)Fo~slNOZܱyc<5/Qn+ k\ٻ9˦ONs(PL4-uJMK&G}k=J~u$2jQT RMU $㶺`O.;یv,}R,F E$?_uz ypg"#"J7AsuK˴ km@?Ou)x@nn*tVBU$ct;a[S2;-@ZB$FV+DWv#Ͻ*F V7s=G#d7}TR' O13MՈeD< KWOLoyK6$HVIo ~V!ni r:mo ~aoftWvq]2^wZTyNPcPnP;8+3/n6#[;꧓CR ҷg >(l>] ǿN]8 O772m)hBqPb Nf" x3Ÿ}i}|KXՠp5d "m;4ڗȠC >QW[86!{ݙq^DWy+k[xi V[ٓv/?M{&3?si wCW{ҫ]N v'?eW2ۮS7 Ϩ#$)s6}çp$;mi$MFog 2.`z} ϺU5'?sBpmyMhɄgjB6'j dHpR şdl/u;D ]Uٕl:=N7$H UѝTCaԤ›Ђ[K֤KνBFɥL>iNHEGH (kz u9Ok7bRhg6&O.b ɺ=:%d#;i#v񈛤eIB פA{g>dB Lh6Z HtmjOF2}; .{1 K$r"b.cn|&b Yd2IxLX<VHM)D$} fB 8qg2Iл=WUT]SiIЦ6߁1stR``dd3yCId98$؛[@\l@2p@Ff*ڍsQhkgUgr(@TS Q@5MCUX|ܢ'7V{ }]}Ɛk]}e!:@ DiH%#r hkP E;c)tE UU5Ql23w.Jߋ vQR ^|E P7,$OPۭtOpJ^>SOv&~tȶ:SULiwAs4- Io:dҎ D ?w-^Ih X.k\46IK Do >f' rVI,Z2>E8!Ǿ]P aɴ( 3fuV7 EPSط^;ӗ kH֖<҂h8LgI(F1AcMPMs0l`wU!.霜 ^@ɿZB߮ F}jM{zjڇݘ0u76f.SΟ 1(m,c=Tmsܦ@+@Z˾,@T dUy/]0Mݷ;"n!pS mjnC%Y6@_jg3i`_6%( (pB_@s.fSmځ~ mcn ^֯ϪulU{\'jnChA$Kc7{c_la&alScjO$֟2aT[9:z}ؤɉ}Ho^KTu @A"\xϼY@ U*p)ku3h|mhf>(LzJ^cB|ʟ/k@t1Eqc} k<Mum#Ͻ'C7w8t.hJVTmv!9nT5J,;|bsM@+p@I'r|~BI# PU\ZTzKP[x.k ,&!Pt:}(A|:^;G!zRfrr@]{Π3_mK{ 1Lgx/ȃqء㮓 +hbjo;_!!a@T@U l3зr ~ ?"G }^1h2>r&]dN*EE~|tfw@@G~ٮ->khvBڏs9,8lDD'^6 {$?e4g& /`!͹l<$GQ$@;fWd1\B4GcR-*AbI \\=n8Դ_m?Ӂt櫛Ɓ}+kFU^be5Xc@Qk3SAaJH}Q01yK%ȢJKۼ > tqog7T".=L`үnKIڥ Fե K9 Tzɡ;آlɖJi!TD@Ur_n-q9dbov wrGDžR37%@ǔj28e5 l*9T&@U4)[l@RtK-8rX0\rm}` $^h9mLvjS K5=ϒy)Jf<@!zjrωa/Wo VP:~*`cN~y?1PA|/!P=AOA@n̝É $څ{VCFD}CU0? j1^^U+@6i=1@J9MmX.AL j As2m4rYW׫BM ^,nj,NJO +|J ?h' EǿPwJO7a 9,p|/} oYḱJCFPr^Q.Nz_! gMw֚Թ6 Zz,|U|L-F\λ |n-t M 굍P OPއaG1f8$Ly4o_*c\&D4jek"pDHF?B纪 ${u/J?Ϙb.YC@.|k c3ڮw3GB&GYr~88z~Z'5PYu4ZwCh=iFW&Oq9зgt8o 5쭺~ %~vWWr32b]jX2`P9]ʟ#+ߟzT $[]?k71MM"Yq* p"i)kyM$K(fRwdǣ9WΜcӲ PãeãAzn"%O$ Qn!a&[\'+CHXI맖HZ8DufLB6\"Y/SsE G8TL }ƅmPG4L$ɼo"G[@qĶQw5H^"g-lP:vu-jB!,> ŗnl%=$͎6+>1K KԾ'MYw]u؜PW\H|K:R"% த:{~gM.c9ٻ-~uDйy耽cHce\F. SWm.9fJ"M GH>yg2[zOܴ zFw@:,K ]’)浽HSWxMkYhlH;+yGGz53OJLpZ߃u)S%2)Ak7oDP%3ucrd4ѿ6 ׭Y7 ݾ&"2IG5^Hb[= {/2*cM$҆RsD$1jGAV5'oN2mԯ,)%dsؽV]^IJ)j'M<ۆ/H6,YI$EjuMIKyŝ5AI{= x+FNX.9|l D8Z`#,!>+jꗘP| iTLWPWrN.?l`&{yu%FپSZD,  qٹVtSkg +ajعVD_ydۖ g="oYUO/.$,%J["gXk0~$o];dxgNi!g{lZkÁן| pWr3#mY2k7;nԽؽVn-߫X(Hrmj]^[޺V'c^kjYX;d'ҪCT"uY۞`#V]"yE ɬ:&Y஫KaUAUZ[h^wq+cbϋh >_9}{Z@\i*oĕϷq%/k˔н6Y勘ٰ\J;F;WطP2 J-\X+K^\[/E?;5Bع5u{I},Ó^KuE3^PHz@Xk}@jXREJuȵH\if3+nҔRYٳ5X$,"qEz!@ L,<\3!_+xҮ5}ܕl"yV?+˙̧ma5%8iv'FC,W-] 4nYُ)ͧIOj[اֺMJsT^7+ɢlWՈU^'GL)dsǰ^yYn9|Lq7~.I?I`JM?!&wW-9IџnsARW9nvm[K?o }H#ܷ|Sa U`}m(N |էĎ)hOmZ 7 ,/ֵ}G^FΉL_#~kkMEäeS·>nځjmwmb\M 7@6oyRYPptIF P׿Oн=S(:Jləޤ窿A]UAu=M3nED2ݪa}my ￱Hb0t`C"!51|!= 9b؃DCKY 7wYΝfaC$R,#i~aw܈R,JD?n[^{>F:$P{*M! NCJ'GCJk>k]˥Lӷ)TC6A(W=ߥH`iEf|Z6'Xђ}Իv)sEwHgҔ=8AѺVͶZ::|k8xI×:b+k,Q8?Nu"bVko_)Z~'5W}Y Y {Wg |ؼuN JX#Ta}YB&%f\rNp&Gn&O{mzKkCѾttIay%eT?k^qaQwDҩ7F+{}R\؃?'%]"/ ,! K  `{BmNסd%;p`o/jHnF-1^PŌK =ڲڇee|Oyټꭩ]kߎ9#qG>;iI޵fN /M8KPuA_[藝5MA15?ٿ}k4y-+VY0^X6Cf풽>? uks[a36g/[Wꮽ@F^'LdG dЬ06R9UH?uUOx@k- گSwЖK ?enVB! Nk6z<~]A/L4fEdp{ȇL9 |QB3bZH\o^aڪ<^zrŷ??D7 9 .Akz^mmC&ŧ6lnuwCy!~*Z:3\k!ͦ1 D!C!A\[w!tcgфhZ;8+aNq}WEMJ 0J޺Ln[\+z־D]"_a{֎yYٳMٔ_BT~Qٰ3_[s}d$_"$ĩR׏iଭhW늄D&bY[]meǓDP ?[m2ucŏvHz> z>^Q+:./[}[/eвvI>t I_-kw:2X'aںK e.RE;Yu\tuwlY=R95ѯv@gcBQ?rj wf4ʆO܋Jߩǣ{˛6Ha{7zyn#Jx\kv\2f]Uajvkm~ˍ&PiX•"tG+]4oaQ64"u7]k` n ⻹g!7x5*4vtZuWȰ,LF֯Oתc8F+0|*jߞ^?׎l\;f*in {45|ilj(WtضIg 2;Je9~ֵ[N$jȗelغ4@.VwN{1ˇ޴t*FC5/,wnY(h ` "妏E1ώ4ٽٞd ]guv5-s~ >{9_#j_KپNl1MFƛb1sR2.eW;Ǥ=@/&,GC6ǵɑ+7`gЧگc8!51KnS^+D,/س0L"QHȘZ\׊E@;!Cr: vLrAջ7 g_O5)ƴjO"5w-t7}\hR]b,#:ノ˃ :/hF{9b^~ݰvTʋ[s"V&zcBV 3 z.YTҒM߶IU(BU[VepDUNJbhZش\ ɧG񏁱#Oev/Tx Sxj*{u_uq6 c^!E`uX |8 >:WC'Xص[>\0dPܣ s Y>60lH0@X& YM{6< ᙮ W1@_ش,6}k `ms;c-L7xrLg x~:i} SaV=ݽϪ=kkwYV _aܲV-k`?JHe#ȁfxgf7׷f7NF܋u6={+vE¡Tƪ f&۵UJN= /P f DLJ  | pv "-V{E_NτmYOTfB+V'M{Nhc D56UuD*3Ol M~P<fRw,Mh:>l?he<#ޏ&XnOx0G`,BRYS>:sK)+V#u^hU{txǂ# jZ{uaGzYt[>V[ JYfci2+ "&rmjod`1-AK0_tl8;UDĹOlN/ON8;6/ _Q ٯXJT##4zPC 2ر|VA7anIzY)45 |/?%mjݥp>QxM\8rBؤsLp1b;kNY@U~]إnRإVfu%*':MU aǁ'y!y?S<cInO4~lX#Ciޅ޽7(:ˑ*m ZMp>v((p 2)ua]<(]`ۈS,TNyh-5d=fdqXߩ< 뛴-Ad$L{sφ.ZVz+7]x{sa0o~n`v(|BPQI `i]X}{r۵S#7QwG>O*.7& o\)Z*Wv]USX*F ~,;]I b*!r 4DnɸT1&9~Izf&@G>/X*bjWv>CyACke?rmȟ<^Aq` SX/f8xtAA7`Sډ z~ :Dp.oܱ7|T<|l >8BsnQx["=.Pl*!GA`Z!!A*SX32 HhV{0#T^_pB_R {W8fTh>ʀcR&VwPYFX#ӓϦꏒR!scLy6ۨG$5)d>l٨ \JL C1t@򳩜Ԍ $L*\# :5!;sLFJS$Gu),jw*|Ⳃr4u~;0?IK0ʶ;'T>#)Vx >Q> mhIS@=Sqo]xvlS 9cTbE*O nV~j5nbq>zu!%x⏬TH=|DB'V1iht=bS<{rRYYե+BcRL OGSay2˺J>@HA/=Ul|֔HY8t pM' ,()vK*LpvT>CR9c0d:~6FFb#c 4x mhTgQ>墩Ek<\ P[0(0 ($+|m6Rf?4aDoD~5 ?e2ڧ5 ?)2*~Qqc.D3yw(ʡSnW* G:*J$N'KS)w?, `BnJL5 Lرsh`q !CWav%r컎a=Z?ϳS,-23`-VY ~ޕl9w7Z O99пMȟb%|庲SAYʶlS7Hl*!5 *ެajw*kt OZ, Z}*ćIօS̾QY^1#|N?F_`* M|SϚ=O*R08C7CX&vES)3]; hv"?Jq Q" ).0fg-.R` &lGW!a|y=U8 <JzpGtcfL۱eb9OG5(QOҦ0?L1Ƌ Mڭ 3Q Mv j4fjgG^ar]d!P٥8f]u6|'}bpZVSi0U`|`J`6`}ŏ;:6##$)=Ne(5FWvZ{hȏdڮv =0S~ީf\'?BۧaTo:c"HϐRq ??N–?)`?{SK*M8ٻ "Brcg: oO ]e#)pAß4bF >m*cRp*xȍǏ2aЄ!((O?e)|^L⃰O8@>y:0?H@NCT?RYM*Ɩ>ATn' [⟢TGn4ݒ;ʉ:HL`u U]2~(=қm +o*vعF*,7*-ytOcY|l^=~g[*}}PW-0MeK y xZȯ/d]KT=-*G'x6a?`Ty DXJc1,>G06&\rRH_ ]0:pc0?詬?j$ĘTJ|ovxf*ެZJ0gX %E7Iz`Ʌύ.L eثQ:U*hFuW+~ty5[p k]pQZ[M06-FZ5+u,kڜqmeci|S)|?LĤa@>Ӑ^E9Jq}FқBFg@֌a$}2=ê0nmHV!F٬)zOg }5u BRa1ϻh`}jǨT0FeXNPllBg~14bDhP„qttxErG'- ᯘsP$`ߵ+7LraZ}b&5R#֖2U)0~T ԭ{+`E3-cy_̔Qc|VHL x&NV/F~1CSa.[>d fX^Oc6W 0Y xq޲n.aPsSLk7[ζ=)E^Ycx*̠0>QUc̛c:d75td y TXuuNڧbtIПfMkoxTe8(oBD&,josb߈#HسU{6Uڬm 7-pyW#6|<97[k/gV!֤t!`8y4?0cp> ‹֛Vx=Q/ާ`)Tl>tartHƟ$ mlWfgBa`vV{Hue{טS Xu8T*=A*lXAa y[߇y s1 y\c^TN۬57}^ca?:<gc]o1i[7 zxgTJ'7sJF ԮB*Xa{oE^SA>B<ֿ|y3lh}? GXP~ذ8ËO]C1e,0&4mnowe!a@~zz촘Irhʻm ]i310Zod Oƻ(RN n }pHz>k}= GH3hdT]hsfU&M{aM<%9&{8ڽR6c+kPIvDdaUNMnvS1cۆ_ x5*2.OΉ_֨  ,FSܫ:ً #>,ǐ,pRHhRaX[kr]8V=JD[1ۤ~j@\O jËـ~ %?c i@ZYH*9yw\>1NZ 9阃_'>/4T CJK-X1D!tR;S*̦D&9~)&>ԉ.RտÙU-R~ S`yLbWA |WC- AR0̇dܰڂu@Q k> :&87){w^H%: fTַ] zb0Q rZC|pheG6:^>8E3QH E)Em# ߔ9=tb? κ~ùO oG9 J}*cr-S ]ycN, (mfƣmHzL9&X6P`:?tx'l^y7чq-(#G0pͽ? (Ц=p<=JG/n-u)s,pɥl2TAxDžN*m8 5ڦ2yAeaYv=t'e#u兾ٺRћa1Xp:>W NQ CvW*'nTzN=JG1:5knd:1hā(m,vD6osRGSM~י k ] $ G:4ЩcX7u W+LWF34@}nG  Pa?eۀQٵtV5~DfRB36@?J;$ƷF h@iNI6>[ hjo73Z{i\^̐☂; c<;0MMg :S\h\ *I](SGhazyyOY+8KTFC? ovPAI8JGn8F*m_t;?JK]:F˶7z7[ ^τҴ׻viZXsٽَm* es=sp~s=O &i5xQwœu8TjjgSep{]!m }ji'rgo/Y]d:W=^- ӣX`tbE\yJ1}uY1.}]fw"(@W`K?D6GRpD&` |6D@_scٶĔR`pM 0 ;cOv=C|yz->(] Пԫ0fQ miqxEAe!|( ?HxmNo;5$?4aCNF-Bd >NI A`4Nd ;Gqc+xF@QN|ϧfGֆ,Q޼/KeF-P=F{Φ(0jW5QU2&<9'6 @ƵekRtcV+jrt*6ys֎]7c >9p#(P SIh,sXtŶҾQaBg >,}viNƝ `ݗQoԕ6Cuu !B-v=WɽpUvuXGd0e.+,7I:_axы\&mHqJFQ`'PN u&}lJ!c7YnaF;͗Q,^% Tp`2u?A)szɩ@naξOww;Bdc$Q= @y\Xy4Y,^ PCNp.PrՠTӟ(fH&|v՞L@eOR똁)u t ӕl4QN@ T z!;1l3V lÌ{ۦ;'}=Sm{NЉaApSt#$ϫgșfZ~7j: [I&1MLL9 ǦNkqdS2L+IM@>f@{yTYкIXuH* _ӱJ^5xBֻ*δ2S8qFXI$6 ?#&_tf@fPS6|F1`̀tM Yfьi+JQpC(5pg {1Mi4N3faz=|G9VQdpUN߃f $|m`7 $/mM=3(*PH4o]5h4$:ws&Ls Q;])!5W+955`vzk<1a) ݪI ! 1v@}"Y!9[]^Ŕ5ٴTg@Y @mrV|s-&)`-jȲZ@=87b41-ЀFWg)0q8y!eڷ?g)5S!tхY(_`5-.Xp2_`UL;\-,:"'@I (H (}v FAϜRpf"QC ,O Vѭ|Q"q:7ʳ濁zG{RR̟ᎭvNS {ݻZG+0r?MŠF?k/KMdUeQi 55!t`]ok@R;up jRjt (-DzQ?3R@eaEB@9 '6ˊJ̀uIX"T5  axl`> Э^T8d(iўo%(}|(,p6XP0nT;+[`"xp)/ ֦Maq Cw] GC5SIK/c^PY٠#K9P!etAsP] sc_(E'TtL`ݥ+G)#k 0[H9>~LJBB!;m! OܖgǪ2<`za0ƿVCtG x VAkuѬKOTSw]qvgq@ }X/_d^Ļ$ @ (;;' a4' c XysX^ B@z^4М'pB4*x@htH<2?9<-Oҋd}s :3Fpéԋ8}b +~0>a,,_عzVCN^8v*ZB(>Ɗe8֬) E[6(']|{(s0}{)ˮIqp5 j؀= zAA+儂P^t+GN֖(ϤDn79QQp"Z$x)X ]\9hy^ N$[( dMKBqpMC]^I4̢jZϯ}Bŋ.6XG9CY[VAw S;59Vm~mRAaS(vr ޜnjcj9Gnhvw 4v^1usDР]5iB /v tL׀CֿAbm{`9JM:=niB ZCopyt &cAx}R}x(FkE"Txc 9$j[7&NF:NucpKfAQPrxKw*L+{4s_K8:b{J#!ejÌ{eGPbuD(;91̸'}{qWgwZ_}L,RS Mf0/ELߞXӲdLmX>qPtXJGn%Wz-XHBQ,Utȍ@;Ӓb`.?MW6"Sh7OI-Q!$5a[Nz,7 ڋZiZ07=04Ml#Uc2[}9V ©"6B񺕣$Bf2@g DܲCm`4kMVALh%j_E&@Aʦhϣ_{j)t kjZ.'h ZRDP33cM2ѵTja8 OL֗Ri36;8\"S96Vkk:SO6T*ܨP2S )JL*ƗLj鎲c+PYrH7}خ J>&(t’VnΙa&(x.Go\A^hQN1ʩ:Ϲwи֖,ZX[ ׅ &fX{eS9Er,ZgVPوVH^)) LB <Ħ#$kd_[H4޶jN0e.n:fd)T5ȩe:˿6d+RRz"-PCt@1!;aB׃OW9LhV/wlڵhf/7"|?'۸(4yt}eT<>ͭ#(jF'>~ ۋt*2tiʫIYIKeߋ:E X*y9{{V 2>ЩG%%A k*`^E .;kRh]ʄ/.xX//y{]*(,@;`B*'?2gn Cg]O4Ɖ[_HojE?p`$Ru*L~c/XvGBo ѫB@@1_'92ʾ163`2Fٵ#8TR>u1jkI()8%a; BӣLlPy&!r@])+Q2 녞d ; (!}@/wd,$3o<1BaT ax0eibn@ii}( pex5z5|L(RX^)TES_J@Sc\6UDs>,Dh?QLV 0a+?(Rq@hg I򽜥OO RAB֭*OcӘ$jbv:͎T eʢ]ͮ6<ٵ۔Tώ,ӿeG0g@Չ9W C=ysC*I)@̺9C칃U|гґdN2TeeĪT=;,:.PhBX؂}];,lCcXK *\阪R|bASa7bAgL=Xk*k} S1U0v: ?0f5pc 0MqAi;wް,HÝs*o41L)?H>w:JoTƿWt cУp_\P_VsBH|p'K>d_ 'pHM1`r"O9N, [4g\ 6Taz~AU!.Rٮ^P cpp#?%* !+=T -y1Aٟ0 S®`L M $7QdL9&s5>3S,A+m"RHZ.*kȁ'3W]Iǘ6&q)6gh^Pp#w2AoԵ`r5LpoF $tWl5>TptDAm8pA}2oU_ 6'&&h[,GyIK t ezGݴ=M-"(BA6n ~uvӪHDjT}:&Tew\ ]9Iv4Y I|b@Ez<ЛѽLu t9qJ,ޜ=UCx)e/qܹ>n@^tb[\Y_Lۆ!95X`|@ +d6.35SAw y}?REz#ۑrȷz@7z]D !eἽőվR  Ԕ͹7y˧{m A|);gK#|zRs&]lWeBHA^4kKCDxP_ٳwrF"јR ; @BG*jJwT#BʡMebTXgRQ~)qOCç= *}< *#X*TNrz59T6EҷVn*T(Tf_3L*}^)M*2S,@lu7*LMб'Üʧ,fÝwK9ܶ/8 F.3 0ϱ(Tm "LF2m+ߥ)ްqVrh~J5|RvqJNN1xS8TƧ;!OP)KBgq˲u%Wn *,6\:i~pcGlC hh`Ȱg '- I"[-@le6ҷrSlGJo2\LmCʊwP:X2kTW܀tJ4B=|TuR1RtaK;5 ^hkhZS: ]D.gQOwnQ磌tSfVSۧe)x: }l5 >>u4|Z  N %o)'=Fe`#ܘ3ʎzl&, (^8&CNLsY9*fh(ȷm:&R<>08KbcN~mi[Igi ыp!@c0tCffh3lYxGWP LHڟP]f"=懩bc^e U4 +b^YuG@PKA4?Oܮc:4~ܞTo=?7VB7f}! bJp&a`xe;t5q;:Q{=qguP@5!H$RH\?Le"F]n*P3?\X Jæjҽnڥ /7l`{a@ܮDo]ȸM0:~Ʒu]kYep3wY?hÉ?bH:6n s_4^sMA<w3@06c $ؤ2K)Tbn }>CûbUM/ SIʈ }i@QTT¿t1 /m99 K-D+LahnN$b{UnIF ܣk0;3?\ ݐ$J#0Y/Ϙ?:?yᤅW+r0 ۧdt {},^г3P{SC'49rN/a 7Nv,=QJ5<"ߘD.׃T^ҝ?oY R+r0 tȻoxSxPWD`jTN O. lNO㾬߇ltw.~9`TP>NxT:HVg_'ŦRDzvV,Hmv(c+1tOԶ$A/?Y\NgbA[ܩhIbꐍ;+7H}] KVB] q 详L7YXJ VCm\V`u-ȡ-0 njSb`;Idw̲><_o4 wS8}7n+aۣZC+pUko*j:>G!HW>M5%& ;t Pe-mu#9tbc0UslE 7 O%jYa>dD+76D0G`j{L"6a>y'+3} %NC_RH@o >UӽUᨫ؟`r,[qo,(s|lʪ?§^3/ w[T:U>~j*xk&h9YLR6va_(6 [eF~ƽF×Ij`@pmMа NKs5侴Xܺ.苅ld݆J}FaNJ> WD?Zkz֘Jt?UJ.;pA0u"L?RZ7uhAyo{pT*-͋48j扩ht'3/@|i8FNܦ}R6&<  8Q"Op|V 9^sV Nc} Py;^t0 %N _JcwTp?8 M^Bj^SA6gO$!Eu8\p JQB8BwPfQwt;f8zarmj﹁B\ b+.5ȍ#fO%$"<+L0/;b[NNԵЇ2kӿuЀdwKςYpxuڟB7o7k68fJ’C4*-U`s-廛b|VVpt'?v}:nJUAR!{em@U{Ep9 8jb»@>Cyb@ qTgM l#{\a}bE?[~l t=U1aZW)sg6=,JyR'r4M,<2mSv/@nG{zܴ%DiVDil1!YCIP@;B>k!re_?r5m)VqR[A.b;jw1@7Mb(h͞9M͒ţrw1@3n:r 9(]ųaۏ$e-ۘ< tɿ' 0@o&u9@43|/[ Pwx>CigNc:,crZ<Dשּׁ\H:;umԄy-:?ѩ7GYܛc|tו ʎn{7:Ik眺YF$(&6O<*Dt k:'6اX1Y˘d)S>֊QbAM 9씩'w*~gUMk;ƙVɀ 3@. 0,Y6Qa6tPfme/?R7'\&A )`ުH1@3ǧ M Gb-C=6L(hKd?oP\?U;Tg|;Od˳a07U'.-P*(hQЧkp H{ q{!Ǔ cD}5NNa?I<tFjtŒbTgyv0,,n]`!bxFth8M~uΣw Q&tgPY^U GMvۣF3T>-r{cqR]ɔqB֭S1T]ǐNf=$l5Q([Jr+ }ѩ190׭b;}taRϖM?qX)w*UP,*C:*}Qi*]cerCIMvO-&>`GN't$h T0?)|6Ygq~2~Pp$Xd>Hl<R)7tJ6,y@>H[:6=$]Z FF>N/hK1!/ .gBeQL&~:R݉e6Su A@]eSm`7T-Y }}J="JlQh$^9Uz`p%m| g.$KR)AˊS[km؊z SQ9ҏ#K:'˂]N?ヷq*w?ՆQ mՒlE9G':kVo 0l‰dps4LmrD 9$1C&TAu~r,!tuL 1ͤ?hb6̲xEˌT̝x/S$.83Ij`2&sop k:h@z0ۇzq麾?7xsv{9tC1PG6)z={8Pf^\wd\}]W3 >r薞4 F Kj ;a\8HL0'5ځ? EpRj֥71QCk^ΟÿA8W{){~_6>H/dt3w( Y 9@E8R`t@@{Q]1bq`5⛔Q!nIA‘@O2Fݹ@@gTF42 )4 b|:#ɛ>8 4s.T]ǃ<~0w1jtX}PĀjVPNxZ]WYݠ{fa* V(JJھ۵,p̟;."}/\M_ etRi/>:Z> Ra75F7^9-<0.}5 ٞCO>㄀6b蓊D8[!ǩt?4*ve[:[&FO^}jJgXBx( pwV3:Cwa.Jz@8|Lˮù@sLs*A֤?vPQIJTz,k5 Ggʨլ8FX(h׌2I[mք)ol8H89.l_fJq*$?|5}PҽSH^R懕ʂVVSZ'gQ\V,.iTjzіz{RIMlm{ X99ݚY0<&j2͙ E0t '@N:(Pmמ{u)p ĕ1 KE5# 1gVU?es,5[=fY-~:yKG$ Դ$IM(jms3q~8Rs[y T9r.Y,ЌBg5~8`ȞbN]'fQ`&āj\`yAAsm:@ s蘨Ѣ@z$^=Hc tB=?[F=Z+YqR5n[ٺ 8 ڼL xUpR`)ȠD벂ڮGM yS`޺r3fҋݢ=I崈==aauQ ]ʺ2x/e?ad0@Zc"W0j B&&H9llD&6*ZVߋ $WR&܏UY3p>P  z`I@1jChvdD5f5'[^}- [*g/,XN/bG+7T1j8W6uܹI>89Iw: ^^<${^|ƆQl [/>FD`&x'^pkag4fB+^90IB@%¢CCHb[0; BlD85"Lp0JeJy9Q.M upAU`JhkCP8 4$8wHLLP8`6ų3w >kް4SZ?7+{>MKgu$10D2ʬL{hV}u(k%k {|9x@;pZt@_/sEM (۩`݅X YYrZ7&Á݃s/,O߿lz1kyHfՁS}83dJON8Bwaa6oe !I.$[2HPժ VA'T0&'ȴT}\'rפˢsPL5 jU: ˔};R1,3p@_h*VAM(kMGUOm36A,Me:f^}{ ԕ.A/p_(ZnX֧+{6yG]wx,Pm*tNݴo/xܠl^ Ŗ7)@$?2KCݓJ%ghmvxO?/k$^JCڜ4nXMFڡ. u =/9nOI`91cw@/c|eIr~ocޔ׽;qtcc06pȳV>%01O ^! sg[.  ] Zy5]ʼ۱bXfo113o2Ƽy.7P7k;ԝ\[4? &Zؽ {+ F_d[JoICQL:eį")Z!K)o;doևPK7u)7o*ؘ*BJ*K&1m4/qo BGՊzLeQ/6w8juGMj?dܤxx>{"Dܼ2_eA}]ڪRaUt/t9Ql6މl$'Pv͉Au 9:ikTΉweآa cŨ{%onb@enOo8[*eMmYoa|} ɑPT"]X^7)V^̓T'6B{j PT 7n\*ǃ3&دt{xݩY8qcj~(`]ك%@]ڭzNNalUy-O"@j*Ǐ7(Ǐ +n*Ǐ3n"F@%ЅˍmUR{R:*bHa f0*nT,ֆ4JZ{ >ʽ&kQ}RR1޶{vLVrNm$(k7k߈;?c[,,oͤ/MJ?Bq!7 x|Bs.s?g FPpɺh"1c2G }Pi/:IɱϮ4ԒxKaA.(G"Y؝8iÁlТ؉ֳl=d"s2Fű4S̴^`ߙW#*kX*uʱ|Oo0'b7wl ΢tk  Yʙ_ 1ǐ5p?FU .MllanX2rBR)1L[%YSuR9kzoY9 Gs~W?3JG@ʹRp#>R`ԮUIR MҪ"I:f6uLʙɮ7 8#)mv}!-ϤIps*g/TqaJz p4F0v@z1AX"NZU<$pDg2%  (ҤFJQb4:yw9*ȫ1^b1v%+mkeF?׵zG!u F?k\UG1͗B0Z+aOzj? 'SXh7IrmOh }z?:0`,@MH]ʨ?LT{`%1ڕ`1m*o(煔Slow$V bIJqc ֿҚlT?.0#c,B>ʱ}h0#aؚ1tLzOi*H!}"+BIu*e2%CO h%2R\αG1Lcެ7'S6*a p4 s3twO*:d!Xt]$X Je7MB6&DaN0?(g(7k SGHE{e C(:.OAII[Z=>v)z t3X ʠ3|*+7_I%uF$`ֲs*@6XZ{Ew^Ia#c+ Wo2 b_*L0b\C2K *< IȇnE|m`!iét&D8О#`{Ն؇:) R3g:9 HɅ3a}S`kI e_ˉZ-6wґC`X5eZu9(*D+m!7U[2'Pt rdBfʎ/d&1+R?Cf }WOঀOY@?_:i}2\SabR 2lv.HLzSx[?5B?; G> w+kt}}J0"0S(tٺ,gڦX~*!"!3$s:QV,Qja1?UT2 R;:&0(10fC}8 UFJOtbb1x]HH@ŰMԘ+ @$1`x +oCّeThKB)JV& ]2:yd' = 䬵,=EBL3/s \ވiԩT*،%2 I] 8͊:(PH >L00vzxg\= 4tfT 1E'SGaB6B7lZӬW2]G!o#L[o/V4j50HY)4 !0gD"]_ ~澖ЦRy ύ2si ˖s%sn'mnQGEӘyp͎S):W]ZZ}ؚУGY+J +SXMv2a`xU\ bR ̽R,-)-L__lݯjk\bX%'7@&~XWLO@pOɂ N-?!^^"4jaևzQ_b*&2jac,@KE EYc JC*t\ǔKy4:{RZhZ0l5Ö/Sa1b% n,b@Q 4jqL ryuC!͞AeLaTb=Nn 2X=pW=_RWM{ "&BRv1Wn?T66s]ҕVv%8z"w OPp$tֱnƇ#_@@!PH{Fޔ1.OjS7=]qRa@6|<TйTơ2* aN!rB@;o8@"C O6tQ`snUI1>TpO/X*l͇8:i}nz&_QU2-2J7@@~ Bω՜yN$@^C'J %QGTzɱ M- ,`iBcBʻ^Dr}b?hg5gz0g.?NRN~Pg>LNb^KI%Ie[BY省/jV*tf!Q^ϓ*O <=El.+ ӆ6}%kAC7o̷kUPPA[bvNKe]`IGC o#3­ hהT*9I9XPcP-؍(c˪uE?D 3uӂ6]tlO$C..3 c*m~{:Lt1tfJtI/,Y9cV_(ǑpP:C)34 ԋ qlK9ܘz~4&!eI\;o1+~Iv?msO : R992Lԛu 29UآL6M%G[ubE>ЦNY[^OJpU'xWy,m*9d)S9IF7 oوStE& EpNQg(QIC^*96asZ.E?sve{֔ɟ0Ho홴6 O3EoN6EIa_Re-k?H9Rr MԄTgp^Zni@S~.|{JزKIܻoT9)k7}$]Ь䳱 ܂]ж"؇ ]ڏڅiS̛jRmcibLJ$FKf5n6?1-1w@`t*gW[tZZ~oRtdhm+/!#T(ߛn?O𤉺il@[p`Uc('i\86rUw@[0t hLajA\*g&Is^z0*Ph-({CARu*g vn>ٓ}"S9&M܅lS)a[񋡛8\7Qj:rRifBwTt(iӶ3*C3ݗؠ:Swwۀff>_-+]+A/Z,?xlPu o@(@MTz٪) ZF̷ČJe>dh:GYiTj+kg9#JCCfJ*qGu/>IU.4_ǯq>'΄FFJORd*2:A_;&"4$5CG?17w`Gy*VCi U VH73rJLt Um ?qA??i`mx* 8SRc;bS95jZG=D`Fر>1,JH=0@?r5_#Q`+Q'gHK%&n1H́K664,)#&`Jaڀ`W7Y(?/QY8i]A%PQաLq`wTڛBYC{~SS8\=Z??Nq*-J4q XéTz$xu,[o!龾iЇ?KTL3sK1lTsplK?7~6p7Seߞ'kVLTNʹy P]gj񋏉5,@iN8Cwgh:*Ie~S9Mk/SCg#~rn1+`6{A~u? `vQ\iBS JH咧:fô`MԘ0*,d"Ԥ2QjEhM%PORؐc%tIgpS*UBQ1`8@A9]I*٤=SBzg>Жxڒv7A)w hM,|,@k_b/,n 3Jq`H<( K ^!3רOaAL KMSU7R8M<'ʧ(- [ؗ8+z6Be3m)q>RB.k \'hU2(ɎT<+џR,$ *?ْxJ9YjR<;0pJIOD':l'W ZE h]  Je} >nx[}#>ƞ ڵM0}w6'qC:+|5@xЛ/OW*j<Pkv %r؟wIjn[D J(ӫRa&R@%ê}fk9}SFQ;0 N8FF1@J EVHڍT؍saq d,Cf+yN/A 9j["d u)s.AS0P= ٺcP8\y|RɐaD)xHt|:&FE#㢍@9%gl9G?G4)~S@RȻI*/NcVSqTM)U|8Y*zu*8Jo G2R,P vQL=hvQKd0tӦd TX78h07F?N'.RYơGgL r:K,Iw*ɴM~!̕baXZA P؃rieOj*M1's@$oMCɚX2;Z^ ;.S!Q/Mrk* 5p#Xu5n::j/:jl5˔ :S3m`kd@=k뎂&L6-T =pJd`4CW&ifBsHZ9pa5w(1c*MeMrĦCv>R@26R@TGqTR1lP} ^mE%8Щ_ 6a)xKAw,ʮR:P|C@;]g3W=I[]r< 0PǦ<:͙9ݥYq'kc oM#i3ΒB-@cS)52>4 !>PeC8jN]}X`/';\=Z9v-'PwMhWŠPVL9f2f!Þis}s 4Q2mtlf*3 zSX(t}*S~PhpcL.&(bb zi~?rdLY{oYP{+, ˬ$i'&l2 /@pؿ_o/='6s¨3#߹0:*81Mck33\By 38g:h)N}j7/Kìi?а|L̢m6** }s>jcH/MNc! .$:CP@gf~n uz3Dfa^/ÆY+K}nGS;f#]:ŘR^"DC[FHT^ilB :>zЁ8> [mYeUĸakY ~W)=iR`o|ɫ  (0i<f(3,@5½>æU$g:9d U aZZiZh” <H@b5_Cvuhcd3¶4luXP@w]*kI2j)uƖ?YDl5e"o]NY*<2,>o/{f ,@řKxMT xtL*6-I×CݱX@x kڳ:[jϊ` 8tpyj؟rq)غ[d\ N(cJ JXFJv$P٢kÝcT FoVmrlb(CapϥV`@TS).k ]*JƦC|RM\8Hj J0RY!{EUMs tހB,VJüaM%@15րUf]#TT!>КXQ-d( Di fol&C90i+.7=g>t`@oB6e0];aRNlGHQJ1*Ki}NZ3!Z;l :~= ^x h0=Xx}Nl ^_V:⥱g~6p͹. =ưyuBms Z@3 u}om 9(@B?e{2q2>拇) TƟt"f*@oщUѷz=δ$C(4R ,;ƒA=4dʉG*a\TxӅ.Sy7=+iٍ+0yGaWG[4X ~09 Ԧcc6>un\QQY8P¦̊ϖp?ZS(0P k@X[\ j͹@Y54 A?FGzBG6fkkqd(Pz @`bÙ SXO(P> VdJpKLڡ)R9=F>xpCXi1 @F@V Tq2@vw*'9I R9⡧r23p,.]4S_ mo]ˠi7,B"]"r;r[vR!>tLA+W.n’OeW2{;]mzh8nNte/fSn֯nN-, Idvk(t?H:fsTFݩ!6>wFD~by?0gecGTMt0٤)Qt7@cngk sBK}ts|;-6+C`$DL*筳,>b{;\99S{ (&=iqy@t{M4A)8?@ޤڠƽ t*r6 E:^!7}(G8.SV# =K›A,ʰ~ڛO|{XG/i/p,,g)7/+oS7R(vRَm9#=̚Tf ۑnz9Jف @$ TL<7$JkzVVc*I~oՏu<^Oȶ=XΛFq}zJK謁yE_4(SI%ćC'p}H@ tHYM !&W]R {o4r*2]@ޛcؤ2>k*'xDo?8~e{奮g 9K~y?7NY$xT|*^yt,٢ʇS&M*1_JQoQ(0ۮN0G-]*'7ؕ9_F$ R*xIBQunŪO"=8Ӗ^?}t T{Vzr3F{s, ,]xq|[ TvB1Fu. (D?3Q-$/L‘ÏWrFzB Sؾ޸w'$'rrNN ɚa(8anO*HytGX9! z xRa~Rpe  +{ AK-J5)ۺX `1eä Hf _+1VTv=m܇f@}PE5SC~\(Tߡc O] ND^p)?d ك{ѹK0rrbb2>{cFH8)FHW*Q|Q}  @T; !wG 3-8uZ;9>]TʥO@k{)YCq:ӁS)KTՍɰ9! 6L7YBB OSX'-@'nѸgj|9/=)1J `F!iïX]ޱ J u 78JHJS?GO!_&d*Ї#ARX}βwB n]gJT[Q`vX*m쒥$X=0M=,|9ۮ/rSH7X@3JٳLZNelyna愍=xrz+oTjk{t(ШrPjk/ekܸ2p5j4ӱo!; EC՗&{ !>^h( hQ 1[ETӦ±h"$<я[X1r(PΜrW .S6yکT$LC62ӧ.`H4]q@S fYk7f$#50ج-_ )NK9s™ co Et]wв :*E` 闑\vpL>@5mI:7 0j?AV[ a2CৣwHh@ulG/Dއ<{8h65{,r SUm"?UKMP!dK5@~ߧ^=֎6)s}P⁥®|;p@o.ӣpfW=?;Zq..:QMJHSag5Auf AxI.ظۺL 愡/kmdɱ:[,\<@wHJNMo\l'Y]etCA sRϔT cut'PT==)?ab6W ,@ށ4Up* KH52-x` ckPiH H ?3`4Ϯ$r$'1IkvŲzM{1PbT:r'1? _X SabViH;MI9ݞiHdbO*SvB֕XQծœ괎utNo#3a*:'L=ѥ:y"B+ FB sR=Ldۘ 9m鹀 4ZYs)GtX=ަkw!,T4 u^qI mFwsjGp@}!N 8J|߾ݦmv!NZ))|uen;*k$ VǬGu&R(NXQ}Hq tw݊V@y ֠p15xau':?9fG*䷯ՠE>Ց$#pu(ђXm6Ցo&eqI`v*il]g:YE c #r` %)LY_5~n:)C sﺌ z\t߹$(kG `:,C@CqD k¶Uښi9_2a226#wPU=*1PD;/k1Y2m;gE ܉vu b"%'*He,ȗ{#J=I3>B\%0\_.W }GD]􎣀Wn's<{'  (Dnwݯ"&fFTZl+"26"N]ʧe;Q4h^ $w JccK,)G/*|lo*r 2ooT.'  ~LW ^h*!,Z:dǗz'H^v,KB>x*T8P=JgUU 䤵-lLw(Cl[k\;VgI_SF~,Jp zD)E;;&*E4г:i~0M{:{g{`PMx0Ⰾ8܀a4H`Эq0Mip„ Rjw0rAEzNAo}wĶf'?Q@,4h7zN,6НlyQ .͠uAoŽ 4k{'5ePzڋ z:L5L)y{inɬO%M۳[׉G`ً-L8e&poE5;Ŏ%u8VDA_@:٤ok-JwH*HTތ&@4`'8tг oT} |T/̽r0*BΌhzp+R3]uCni= 5_u);]r) ^2tLmXA0( n"E\.RYg@ }WE.!ێ;d t|x@ZFAAs"RjܳSQ>tQAϦ|ƽڅQe2 ty4|A,T{ִO4%*3i0@W,|V̮ T6L *`D*LAƴYZXɒrdSA唓Cx|NL؟Ƚ/b ^0 AB.`4xJǓA7uݞ  hީT - 5Le ۯ_@G'YLy\g-]L)E]'e@弦1gb7Rx盎9_5ީmR,T0@(~@neI9YFNK*'MTq٠?3")KxC8:QOnTʹ'\ TQU0Г"2D)F@4 # K5RA6mJ>S*uA*}^T=)S^q!랩oPN;DO?z*IٮlH< 6w6JѦfHZ2H),̬y1;1J4/-y|h;2y)ϐ{kHeސ7Ǹ^Y*?&Y +AEc fॲu Z3 4PmᦲDleUPd0;&y}l$͉͉i [WX8PSRTXs8vm L CBddu@ٔJ{RrHU-04Ps1rJ7:dt:moB`aڱ{@;w`yoؚz hM,c6~9?>BӦ2leܛKetY}[UG5k [22S9SSp%$gA8zua^mZ7NnFmP .5ST4eLH ѧm9,+.;!ﵟP;ߺ^Wᢾq]GQAߓ[ \$RIR!^ͭ`[=:\F D{ D Q;e'Tظ_H;f`E~EbްQ鰶`cZAI ЍXSĶ;;`[W-)"$i`p[14 @/ҒՉu KȈC ֿSABߠ6Z_4 FI\gz*\0BA)*u! T;FI :;KE xhl#tr[&˸Zh2"27@7 PٸT¾8@7ZN'8T(:s*hc5B*b0!M[SuuN }-Bl(^BF.н!oV{\ǜ-;GJ%k!N"7i'ʰINJZTs ,6AIFTNe}/(s3RYS8](0tm9JNK IŐ~ LП+B`6؛݁D[kEz('Y*.{}ve&- \x(A_7y7#L pW$ڥC: 0Aբ;:Y>|Ӱ0 YI,@JS!L~:E0'6RZ`UiN4M@v휨"UrN1G:i̅OU*N4TiY1 ߏ\ +HPEӧ#KitWQkrz/TfL~8l}h`^px?|Y횑 P-!:8C`&@Q dS̭Z><@Am!t:'}(3.sR0"dr\7'+rl+i_&G)&h&x d&[` bT>&[`ސFMVB-)5k ƣS86fXOT4]rZ?^>ODP󮡞?!S1Tvў`jMV23ϫ1:z,CƢ= 8ĭA.^*'gM?`ʆk(o;D= ;ROnZ{PY b[Sf-, F=BԺZWQNhb>#VAWVr#@̣bGeAhRM C q Oabtڣ>T ^Y:eF.*S/IMk(l *6%dlKRerdA>.x4N0m<^k^Cv*<&]z"m3%qA=` Vr\{rsZF?z!oئp.N^x9 *-e~#ɎNy</u9Ct]}ʹNj u;Hd|**%9>d* o*ء XkS1D^9C/ژ6CM>żɀ@m䟧\L~8H"I7tH*bQӹFĴ ڧ`+"(ˢR~ic@$` Wl',$]>t}!R~!4'RZe-@!wH 2u)D kZjm{E.ӣlxe0BoC|e>!4'AEz-^tpR`r&*" @ia]m& 4˻\ lzс.4" BB_Cx<ŝJǃmz%VENU(8~ꂳ>`G;U^.K8%M@إd;,F~Pj`ͣ@EPi.FA.[J? (:˜|ʳhT69̬zn  ==(i3XѦ.UOIp ֤}rʟͨ20>fcis @d)wcj_Ƃg:f0 G6 {|VM$š֑j47wQtmSzliXc/u 'JGE]8*x{8uEG$xQK+}#NIcG5Qs;k;.u4J&lPYtR)~=*su::l}xGhoWud1#*"cDgZ,3eYMl,<лlEi_%*RGSY0So^ؠ-xS5,eU@LTQNH(L_h c ,&sYACF< GNK@}$:Gzk2֨ރLa{%-G%^e@^Hw@h*fdR!mRR15ڭ@cIYTClAAs:cVŚފtǣv guZ.dkqnՉ/dս2^uHG_%Jeh6綮nk#0TEKa`óM՛BٴL/(HS2%??@ N QM at耂vn E/(qc!:L}DPRӥCU'[ Sa^!jS<:6H wl*SkJ<%|2+_n$J eacʂ5t ]9M, 7 *!e0uSyd őz%'>+n#X*})HO-:xJ:*֋ֈ(O`G%3ZǕ)CaҵTn2_@W-(g함@j_I.qv_y;Qlo?&V*g+*jU>Q$ej=Qm_*0ë@:߰Ź[M)-OX0x>?ɯ&}m)Rp+$@lrarbRԊrf:`5#tT5ׯa#*ʌӽBM4ݡQDUbt.,#K9bQ*Ǘ:bKLb 2c%y>^x(T)3Ne<ٚP8Г_0;k p#tp*@.gJnakB&{e%u'cMY0JQ= ۰|Wr*Ǐ:f~jmb ĂNz7 _ݭJc:h&ѕ pXB1#ĩ+4THjUѷZ)U\[*7mI&\COD,@ `A_97%2Y{ E=͎' c鬍?@8@﯃zc#=0Ъ"M8$蠫Tn ɪ+'֝qKW2PO`k8jn~GM 9]ALc&Tu![gg&7b q4p>j~21=G9z'kMCh) iO/&a=h U@Cspu;3^a]F#fQ:0  zhf6]sG2R&Z欧1j3cw`/In*`@]#nr z 6C[*v`A`~a!)KEK)=Caި9"w;2v74a2*QtL^1A76(S>S*PtH]vYީ!ND({#6[4]<6i@b%hSYN)>3ģcwchJ& 7Ia 6h&E?)έ GC^#Bu$9Gtt).fYt^ש9RʕBUR+5|vei࡟@=!okIfG_amNP~],,4PڢXG ?L6&9^'O` *B*5x^ʜի; zӱS5 }3B±@F7s=JTʞ%R?fAoN*mY`U(c-Жt۳Qe}g2٪`5mI4M3dܹGn`[~3__qnN}7 &м6\N]0u>~rx{6tpNӱ W**nNB,Y_#y=ئ6Ƞ.\ 3SjPz\[ \,EpĖmcȠُ)nѭY2RCȠwlFWVAQ4VY/kA4%s~SASHv.yː7t#O}*lخVYTlsaa!(">:X+̚2ׄ*t1 lPƅ#`؁wR6]pP{?S)aljt$*KA7uTjT(T D~X |ba R܍ 9jE>MHZ|!-t%K' TQ?kqLxr:k{SXxM$%̬ Y? xлI Oy`>VؽRzt D]%>)J96"b6Lsځ F2&^"T524wc:^pKjS)"RL -G['2zQ":HľĩX`ЇSYtYΟ(J艌W QJ 2#tqHSY['SMZ(Bdʆ F@w' GR |Ԋ 4)㮇cb(dUeЊaZ'RS@\(>ZCV}[8Yr?t)!*@N)ӿЁ^r0 EnYp@]kx9umiz#T}L{kI;ֈ@B|xt KB}z-\%25U\n68EJr_P~cuY<:cԵ1Q*wyx]v~ʙs,]?x{\]n"!(>Y,HTi(*E*E ]t'cw]J)4)?@*!8_QBok/wx9v=J+@iMP(kS9-F ).))6v}Yh`RIb𭻎HJmFU.AUW]ʮޏ#5)W]D(_BUS萊1;G똘jT6&M\xPi IYhLe⃣8˕U8F¿3>P=H[On'm1dE@TOju@,O#a{ܳuΚ^-(9#ATwq׼՚R3[ITNc-O2T,sQ)%R F91V~/r#OQ ;)eݧb@Y*qkepз@8.C.so)Awj(/ZqTgNHP7.FhPK T:ʻG2:fÁ5a.g^0|*UbNe೺CwKkzz7LE!NekOE ͠l^Wrހ쐰:a7)$%v]\+sdpK#t[Aɒa x] p׽0w&t2C5|\R D&k!M?d N>?9V>d@8K2^\?\3!?m/HP/Q F1TV@gAQM ):+dbrIĄv4|k;>cV>&` i\-|_hgP:LOe,C^^**J)@LH06Y{LYPSұR^5) U[ @Sq'(}q/<݊Le "tHssII<:{ 9tAmhA_34S)8E@\TEi4ݜJ+u.SpЦxD T89xsGA13i: f޸:$>9dUׄ֊rHͿ> lPuIW7!('W#)T 0y 8kЏp1MTʲ!IAFGU-g0P{멌OQ1> Bfܩ8x]M&4'LN!H18tLܭcou  RaSj΅ԡW1os*b:1p]XHT5z X;B۟i`[Ot MeFaaA5RiJ2)Cb#A(>CK,{\J1ׅ{pkG/ﴶ1esMUT'*b2_\V/2jt;bxLւ Kl}̆' h:PgQ51Ё!칕:}= 놮gDq }|^55Ph@ +Dt< vK,HlBRo=6&|p@>SG)V|6^0:$>iaC86ٓUj*(ƘT]g\4B [5)L_lؚ $AEP> X-:Ea`4S1TҲH: Cv| Ʊe5I&HG:͙{OE:lS'j7A {Gg9ARslQ.< s2.x>J?H bQ Ѕe…|ӣtXʪ]>Y06HL? =DŽzع._mI8%zJ-v#Щ]9Du`$ӈ9_8m'ę`~ DKY``> R2QlE 6(aGHf'Q뮛@*(-5Ϣ؝O/BO:]؝bm NCVg/1)(ŕj2`B?9UrepaOUі,6\ VK%鴆gz 8JזmFק1}k (<|b] WrާhGpa|my8 c* .ɠ8P6c\^p];A}toÛfc},@#&QP KGwsp A׮kpC ]ũ1880M|ãayABoQv(HpKc5%;Jڴ[MRQ* [?ں HT2D?Z i񉭉R2Lš֋Զ|Vͣ6<౎p1`w T ( |'CWɍ* epjvPώvPz}:"Ɲ8 x!D;JnUe(I? '0;A77B5CleT2lfzSi`X ͍{]`u:}C^PD[AAᾚ1,`Bjhr-`B[ox|Y|sYXlf%gzW+mo%/:B2H< :_c-pBo"NfH'l^(|87(KI[rT e`Ӻ?2%T_:go] V|Rar_ߓt$-`B(w`[>]-^^L/%-hrKo(7tJ m,XqNcu"9cR65 &"AGߘU>MpaI'keq&-y!X“!8(]u\{0FWqBT sjmA Z[K{L>"U݉.I);#4&)G\Ž^:fl?4G&-FߠXz#C뮹`lvݨTw+vM;wC=bcj*Qfr2ȔU&#H.F):JZA7ctcw1nM淋sba $jz4שb={ 3o#obec/? JRB1\? @]}Cgel2 3ېQimPIڶ$P8: 7uݿ'5E bG0sStt0zD :M}IȱØzUڣxtտJW7(@%m,$ kKsM u;G]X7N&痽z堄Mܟl?ºK0z:#O,! Xoǝ0EP BEX?a{#<~ODrmDABOjV(QEF'V!5(EH}1>: R;{x44}E*ܓ? UQq6tF}R{mG6E$qPXބ*ˇ ) ! zZ@ cxqB"Oq llZrJЍ RCR"脁VxϿM0Ur2ݪlZ`1=xҹיSL(IaG9c`]G/AǑuݍЃ  #p=[{1l(>Cȶ /CixMC0MBO5? M;Up*`~X Ʒ?w4j (cǎȻUrf?9'X%={[޿AFУQAgDg1Vj j.(FPWˣS[Tv4bęT:?`Me R9Ѐ?@(o*#[N*䚆e*,q A0#Sȩ }fT2~~pr.s>K-pռRx{5mSw+!*`蜬3^VOWH%MiW.8B Jx)}^+wɇ&#$ װa ;ި Gw[* ?LgBnϑJ>uss*{^O):1#X/G*LhJa(@PX 秒 9;MqI%;ZJ+,6Si%23:hU y Ń F;9x%ܧiy[{STRtF((Po?]8^k KqNJ2fO*n,2o{7?e|CRi TXq+dM@GtOHbܟ<~3ber,Fg(ThN,_g(:qM40`A; ~tbƱ IM%SO}5 BmCi?$`N&q{Iz(O>$s tL졡7 I%3kwZQTejnBu䅧)ºg͝T2N7QDt at]Ζ9F |6PPP6 QPжώ sSqa1n Jrs濌*htlQX]_ڦ*xр=Ɇ\]=8I@A}V`V*UtNyid0 \߁d@v0AtRYV<:Y WreRj-9qb uN֪_p o3h@JnMr?gAӲ͝s%4IȶoΩ:N(yjEۊ6]J€"džJRc,Q, (*9qm(пf=-k+<\rr{Uk;pc M /zg3a@[J:3 Po4ɲ{L6e zAA89ZgBlIU?4 n\R$,dC!XvW>Wn].! z7xl!dr2֢n5јȠgRr8.-20,J{'?RArK٠Z٠[qq,``f,+6"LKcСdIBf] خ;-JٵC,,Pڮ`q;?u^61i3 8gAi~5-p Zb*}<43 O2c֙@DϦC 3s t=rdPfd5h)z?1>,2Y:fb1gy1A%/@H:Wzh6t4Μd;=LA֘ʲ{n>v z/ȠYˀV$԰&Kq$MA>A6&#뀭I4$Tcx5yN,4ɫp~"xQpϚ'K8I:pBi*&es"t/Ab՟BV`yӹR z"^Sɓ zCB󓐛t9 {NLF,*Fgﱃ8]]T_6=r@8pFInZtyo"?piOZ=09m%~Xv8=Ac5x2AQ!M(ƛF2޽qR 4drrYFoȠՑwdWFoG^xeT)i!S!$$ĩLQ2O|0,͉Dw W9X7 's%@64ݾRY)t6JDW VS{؊>s7ߛ,PE8Yir@opz,Pd /^8лy\McnKY[d>xPN[*w:5vg]iA}rs$āj#iZUjR(6?Sqlb-F g44'xb#b>rAs<3SpDSU8zd͢%G0J-Lm/Pz $hS nG{xZE&ÕjTT:FV>`pMQ# PP¦²Mg-`W朂"V5;i,Ru.5*JѕEº{h,9W(c*(+ v Ei.\ ]k(j:I{ ̐O*(i 6hi/Ao2Ӫq ta6 2qφ3`-Ai z‹xɡuZME44hӸhp6[ v,Az-JcWADAm@ zAkiT:"0 wG2mPAmsBޤYv1AEe{bעw$Cd*`T.nh6@7t zM&h{)ĞJ džT.u j]")E|tLw셻@g*{tszy Lv&悃Ո'8ӺDt'E[vwAA_Ƃdԕ2t$t@jxڎe3^*P<,HOa[tR+zz//WHP{9,G)~]8]H];s[md#~&cÞoxolqD5. qb- dءcwP(T#2r)rP!z] У nq!?{-QDP*L%[ꬪ\\$mk "hS9fF A=QPRr5:4[ 4رw*AP&@}2-" ן)>>CwzZ1^ȄӐCIS .cT׀rUY8n0 &2MaX):<1B{Cx݃<.uHJk)Q]vjomL$ʞ0^_ >fљ[C )]p6u">(8K ]KUdZ;ga<8;0ڭq1 "Vh> tD^=\9J{o!Cmc%sV&{-(`*>ʪ&tٷ=J`f*OQr(x*3 u%34őW7tx7ƻGW]xЂe  ^Uo)d_=JEQϯ)oQ*6aמÝލJY@jpBC"SrZ f"&x׻aU?Υ#1;:$4Cغ&1LbH~t̜ J6eNe$ b;~.-nN$ %%=I,SK؝[(o,a ݐ¥1P@$:r 1(,*3XGw$op--I@Sa Z>[$;J6jrSYXVtq T7ԂJf5Pa@[GhWPGql4l]Z& %ۿ1W(/xB*SAAh@ŭptSHR!oC2:ގRIЁd;%l6*[HЗͦdXa?$͸n%g6Z҅2);(*yI,oEw8Rku  4\\u̸wr1P(Nb:+]F< z]faQQ~Ңu@0x>J ˕D~͚}pSxt[9leJOQ6+h[4 ?pMPPRaF1.x8HP}"5q29p3n`ر =|7~:W0gs(oP] ]HƯcoz rYk|daA;І@#h+cq^^Уd}u?(VKV6E'TN(]G)uuVl9>kkGGQ|O8 %˘z-~7L0Y@eTX?gjWvnfp( &`e" * L6@GSNFm^AUm4,>; A3⭏%2еUY@޶@7_(c| }. =e!TZ0 VY>G1y]C: 2A -[D\oѨt,AGlg(+o(Yjܤr ,qvLa󁂔Z*|"62 hXW!"Ƈp]ڡM,(:ZrUޤ]%/uGp,VXPE\e?t`:N jK1 `Aitio]aHbhġCvێ[o4u]B:ԣ{-(m$QOhuSa=B,CG?z_!+?M%DVxRb[#j0(QA&ecE'>1R d8eV}BCB=@B`Dɴ1L 39n,(0@JSh4Pz95g9l p Mat{I 1a@W糁`%Um|wYڼ^T21(=iF:0_XGe:1}}n,>qB6RʺU3Kr3l6\mi(_7GA8tt|p=Հ qѢy6=&ŰǰnڽCF?ʆt /ձ\`\ 0,^ ŁeIDD 5@|.M  Hػ(>׾3d+f! ͮ[)XH* T0D8SDlNDu9U> gMUACOM||/nV2^R4?{b9u|2|P¼Gqni>ډ;TsZN#'@]C?^Rg_ xlc@APIL ɭQaYECuT>٨mOQ6!QU ,#4>fG3NCx8Ɉ4gNZ0~1, 8h߯cjU*U#N3sµfEO/{t ~ו1»1`6{u hښ]tTob6Qf0>tؑ9AS:{>} sո9*=,$D xkNl@{vv-=F۹A q1uݍ{]np%&MeR*^swN!*{% {\1\c #ڀzW>CۛN0y>srAlp*.ؠ];ؠ6o Crң4|9G`=&Nh'9`VxWL@Uj`sABTXM/6vs 5t?Hq~2zZ;ȁv_XQFu6L^ @d5c_MԛnF/kg.VSʭCS@"hTg]o҂]ڵW0:! dЮE<`V[US551T-4JX'B(ti˚]e` +*K!*X3bn\U R6Ϸ7ŹɚhT= R(`ơ}]H"(OOh 5Zoz^ʦy9vօCNj 3/Y kX6VnQ7j-D\j/bd[/g>L#tt|M}k+o97(?>:@CA+)tp4HDL,a.UTF:" .\opA~?*`XwU({PڏPÈlA'2).5 *Znb>y'/Y读~G20V|7?6ȠE9&Y[7ArƬo=@06XpSd 7iȍzwV-R~\=@w4]\(0TT%'[zߟι $A ',`m $ ,%%guKf?펪2﮻Xii :_g"ns&!{652lbHv:g1$lRz`^h˛ %@%i߬>:N %7q椅V%Ϊ}Rȁq)1PVW` % @`Ӂ忍F|Xˢ6@4l2h,Z7@{RDPqZZT!%`a<, 7Pb@ۿM4~jW:p_Iu("W5W+(-c IO0^"Y&NGV^ 6lqB(uolU :7t-M?dn[TզIvOWe"pTTVշ5SaQ3(Z< E@̽蔯۴l{ e8(daF@e;Q4ZLBíg7PУ-Jcvy\[q`U3+dNmL#?HmRX(Pq[k\½p#XQWRfp/0p+<\5 X a|ؤV7U*0 SU^lh\柲,eQcЏ0WD^Ptu'Cx,rCx{ҳ $7&ŀ ]g"& > NMځ@bWV tG]2tR7ٜ,[th@tEzez=`Ԗ$X(ɸM)˿ *K0@ 0{৳.75ϟ |]x PNO֩c ]c2;[%ŐuAQ:#UDS}@}Qj>=7}扸w1&nT:ljbYL5:ۄ k!rUi٦[7: ܣXc=$y萉bbqĺy&_rR= Pt2x{.'?e= WyIڸhA۴APchкi-I=:< y{V>ґtVp;jR>qh!#] vxT@ k**Q_27y@J`p $ܠW^隝9xZf${Uwh6 ͓p3xF(r<^Txbqͧz}`@ᷦ8,CV|WMo ]Wj M dݚMx~H:XuE%-2nR@oj?'٤747k0{ )?s7M`g=//Gˣ"S;ݥX c6v%\ ׯu]I \j%oTr[ڈ:3 smܰZuHJLnA;@Z(PEN(c{' s"lǵnQg4M_7vDW\\]0^;/?pϔdO@FK)F^d:A.QҚu8TҿY@|tsRT;^"z/v{I/j2 ;`_¯YAec sclF!10JG9s:z!Ik8@ ۻ]""~02`vˑo7w@Žs~޽1vzz7<1(4C;okH4A[wq9K0P-5֦`8 A5rGYU;z9kw@ ie5i.C #[gUnLcTcX{Pipг l! ]aT6r5|OL|}Jom y+= bjkT3_^ll4 CQ ]Fр:B*>+|;qW@ A'tf^[/S*`B:d`{e`!->rK!پ¹P291@ ׼DP*ut-A,^z}؟Y}F1{^&4%C}\`dhܷ:f~`-&v'HKbdNL蕾Z#tXVb2[TXPC[QvPCTQ} Jx|v% STzX}ȶw5] } *t/Tq$N/xQy6&iA8,*P =A1vqE_:dV!̑QX*A١a'jgnj4Tٺ :Ci IE`"4B~)lpF噌DrpJ0a[7,\}π]kpiwX40 dbP5 ,t덬ep">BzA)FW+(h(STP0>#glH! l ة CJWq+,=!8 PA Q q*RGIb3-ԨKPP ۖ TА;Lk:03GI*(c!^U<˙(P PXtȠS2t =m dt#2(E58}5 nAoK!H=رA_7rn? S zB0έh7ᮃ@ ZnTv SlcgGO6(˼)},۪G? (Kw(U`W_ dX}F.V(ڪM+(P+(kHӽ;N@Jj>ӀQ:&<,8MGp΂; Uxd)`-{ Դ. 4 Ű?zkU7 Ϛ^[@n{/@JΟ쳣d?M KרNGP'ؠq\,{=[*,F\@)6hbkxtMzpг@勛={qL\hӔD)T FOe8i?yX l|pvC ! YLYܡO0f%ބ>QKN&k~^3zأln^Vpؖ\Uj10ij:hrb@C?Pq6 j'2cŘ7 12D Pl& fR\c霊Rb dXQ)Y:d͚A K{r%XYD.TR1xmY(JX(+ J6~7ڦx굽q|Y9Q_fOMy[Y`Prexߣy;hzA{S8>e5\+/4y*]6:{>QM}Q:B y@0a({[ho0nS7.zd# .f=/8hNI bQ1]'m̳0y<zcX>G\r[r"8X@,n,o25.2* vN osE% }&j@HAH z dPo,3.D:>P@ppA9BM3(5仚4@@Wȁw˼wml%%ZzN1@+lZM7*(# zx^C ʬ#|Yf (RLP +5[ ^01&^H"[룴#؋ zKd_ĄEW 4a& 4u.) G'UgQjBg\ *]`^F`( \&h 5}ǵU,gqX`f@UQ'(ύ&:Žʎ]b4e5/@_?8G 8P72x1vGaʡ+;.\+9n-@%tx~(NŒұ}e"'JM c{!%iUkUWX* aӚZӘ4fW@FP*LύV1Tm7$_MH+P*~:~ww()rw4}-]v^T(ƥc&:.숆s. 諳.+pnf5xA{$ni WhΠ4aop@oarjzD;vq@_8 _=oN1 +Fs5€Tk߅z0{"X1,ǿUuOnFQu8Lo$oD Tv =GBJׅꧥ_zqUW#}*7vvOG3@N+:wȋ eWpM}s6WOțv@[np>nubz,t;j(hA(˜QixoۥC[V>(e?{(y& pqZQ[\(s}>p4i6pZH%{Fu6,{4}R.2\)w tEtWbFĈڈO~tֶ̉0^a- >J!]La *3U(c ^J7..ʖЅ{ecjo=ز TCWe\^ e1Q#}8`,h(S1B1ߥs賾NW{PISv0)s*2sԷr$)CPmLY6,վw QiMCjSװU}ybCYi0#:Ńvs:μ^9u?/# ZWR&YASqL΋t<1ĽxG IY\1Y *.WAm/( `Ux I4ote1"I3HwsD ǷE<j"MV`!m#d۟QщuTe^F߸?JW#]40{rѽwl>f6WXRrZVr`0€u|c,^:f~Na@lw,n54ƠZlyED+ =LLw.lJYZfs57z8zo< SpF% *8œ@ Pg=Cb#uA\ۊdjSgM8.}a. ؔ&^*L`t$g 65=,F z~IixQNe+~9=?ǵ{tr7갂)ıQ$ A3L[0je5 )&c+pn8[@_&Xc8TB4ȍOD]Êl:f ]90ZҀ^3L+Ys*ͭ 5sZqI54:uaPX5vѭoƆAƂ^T{3 ,%kɆQQNcP9~MT t}̙RY}g^ #ej @Wf@,1s 0t T_lK`F >4SEwh=Q/| kٚ;U-ɠjkAlֆ ݰ/N1[W1ɨݼQ6̺1ai ] }o@^8ZL2[躵/'ӨOyyazFDwL _1uEt=G'9&Mate\c j.n_3Z Q0!.ɀ?U -yTvfؠpɥN{`N-:`r=ǸQkpR^:ƣ-9XE:܎O3"N: K[^5Riΐ#h:5a/5{]c{Ϫ@ -[ iOk\ ʹnU+zh|7j} \fo~*dHbt1c qBcck5adcCW75ߖ0 &,ߗ ND{S(jcS@ggAMwX,[p WX,˕6 rl G1+f8"`Ό7>DE40͂#pX".31'caJk+}S`7ھ@qGjϰ>dw]8`ݘ~M X@w ؔ#W&$ b{vc`?&bђWS=Z؞!Ύa"X tj`bp@΁BG!* o0u҄ub $:1j*Qy@;iYb:1e" : Y9g4<>n:ٚgmȇc<6j1=K٧pSo|^ʆ+iV30ՠwwJ 8 F}9n4Ӓ2R" ?X7cSi쬐@>4(prۄ;[E(dT1?B8 ZDZ:qXǑR/ulum'Bcw?8>~[phk)e_dɠŠolɥgR6簍E͊2zmcn!?>'Fb?M, 7Zh :# ֿܙM02*=!dVqMj 5 <0Y7i⾜ݩ0 h@/NG3wfٰ9,]0=Bk v9EզhONٱ21ܕȄAeau9X YMʋBiY$fE49ơcoưsu^LS4ǔJWX&)Zaw64Cl jȖ0gS~{&3a2( ?p Iv,1^MǮVӫݿnNh:ːW~Vm̅1 EctIsz! ^⹰% p`ۮ_6X4F<<8sB̟ahqSJcu\,t[~2N ~׽B!,btH0,ZM(B?XiDFQttwvUm_!i=N?֍ j?B򟎨v&`ÃR48f&P{qHdwЌ7>DB3pZCk94Qzt ,PaB( UN=ʟfS?_X`Q[@R-%#|Q2eڵU,CB)q]`Ua,Dz+tж\eZM :cA(Gh:׵ 3쭋U0YyyBp9}Ga-U;s7>׿v_[6mIie6ڿ6aXEԇ™u ! S4 MhSucš|ɮ( /_JgvA` Ie"$mv* ^gc@!{]g5=B1Nm>0Tu;ĥ3wu8p( W){hG#(ئRex1l!p)om⓸;wFMe~X5GUtѧQZnQvQ M=0k#;==J61Qc悁"Z`ƴЙyX\e}ŏ'z{҈ 1?0OǰchhR?ӄ < J s T]!@oh OnN"1k  039Fa` Q!p%a:.(!cżצӕIJ(VG ̍[*NM9,2E@e6@j?  |֍UjT\ c YcQa=;pSc{w%@N2`ާǠwG.`r 11$p½hK >y h)8JYM T1BcN=C~3[G'x+*[WA(8lX:Tmuݨi0C :BRٟ! ؞ٺL`с(nj=JٶdQAe}BR}h>B(*xt@M¦ fu'[k֭,[E-n*ݺuրÞWdҧ]踫~dkOaRBOz;SwAp ( |DQcc*$h&"A1wߞ o˻  yŪdXNQ?rԁ{&h3u$!~Z#|7vFRS{7Ι5 dRguVFkLVI^H TTSJ5pplsk(4]M̺uj xqشƃ=:>>JGd1Qu/Tk`,U JF)mFqnڭƎ8 |)\)dZnG>p]?HGu:AC]m#ZPvr1*w*:h[̡lKX\ǜ([ρ)ʤPӀ,:kҜ+YlPx= IyoB#b6kкcnET&[(VcpڟXc;i>|Q`7} bB,csA.B"_Р < u0:ؠ'h.|(nU!"|}6ny1^?tdjT6xlPx考*[(U b0r!"zQpJYca!DfB<(@8H~Mgxȷ7u`Gs., y%*2w4YNA^y E>vgN7zPm5lUL-ACu5fE/#HU4,TҢE%>J/6 AuڪR2Te"5f-VUЬQ8v֓1F a6Uk^E Z5PḹSI?V2B_*FhVNblEG f v$˴tva`: j Q;Y³C]e >_N!Bs-c@SvQZUЬrCE :4 ˕U:غ9R1p.ǒ$ sQ\ޮ"i/gwu>YЭjWG%<>ufٵ A'TTl7j92COJ"ǰQ1UZ;N)X<j]US;>E1BsϧMKy1<]r\q#{5eYJGiꘁP yo [6桤}۵|a1S˵l@]݊`H/ uV+VУjBx)/j 4Psr.GOa-Rh@/Ɋtk(`dCGH΢#(`4NveMz(_fiTftgNumsP6&` l]XzE Ms lJM۷,$m(b 8ʁ[bE i Q6|ۨBYVE QYeønE $GdEK< #+h]U>t+YbⒽZţ &+Ph*f賙a#ׇAA+Ph&Ja`w06 drg65F;µ;if dqeH,樫2E͸ P( #2Glϧ=:AORwpNP;lTH˯o OX `*E ]'#eϠE {7@!oUAJ*226\0rwJ&HzS1,#sݫXC:}Rĵ[nbv׺ʆe/Nhn]>TI&-!2)O.PPA,e?}ZCEDtOk^ ;-d*i9YRP5SV -TB0\9OYtrd{B7O![4*^iBW@I]uBoesw\.kZw;KTȒr20Adv22^Ww=(紦 _lPʝʕJ9j7 z-xQ^F;6]@ %pԸc~B/;j=ϿWz)1+B%CwCa$&T` `yѕӠ] Z('&T[(1ϐ0QiTPyJ!,N2,04zm( 1P:2SIg ew? \ޜpz,8S6mFJB27z>]*:,P {Lr g+w?HAZ \GWeBCY{SyJKWfnT{uef" -̍J2wPa5t˩,𺎔%CTRA gn TL*a"C\1*+&顶9^pq %-WMLНCm6R 恧*a($dkʩ!&짿*Q9@ }h]P8&.S&Pփ{(Խ,"TpA\ PkT6:93VS~ ]moTY{ P*&Y(_HAO`/-5B?g1Y  ۚz~ʑh>0בp ]e ,T&c(i ʾ'v5B4 PsLDS17L eP ̐Pu6Vb^Pc4,Jb2>ƚ1P0iM reu@n$"ƌCJOB}} 9, Ő['gg0j)!H5ztWAx֨wjZ}O7RLyMQ-eiQ(0I 8PR8>3sZ^Gt3\za@6̡+w[#s#)(FtCAZ|Og.t+Jh`u;;M*HÓ{BpjІ{ABOןݸpykgP`c@ ꍔPwq:!{aY~za %g !},Q(Z C׵UFۣ˸ȳ rgTew1CYeSu@Bf{%ԦAݧ'/R.CJ61@Lo#^J8sJݽA ֿF^?A/PP|,-'G/HAtc<ڋ~.2B=^h(M¢bl1FZdW*Tv.eddoo,&G*Nv:@>\4-{{) J{B3>i:ejѷﮱ*QW/Rh.^^CB{BvH!v s+%Y%?P=:^Xg>ۚg1 Pz g-_۠[(Pho %Z~V!`dC?2ZBY`.s"} 3 ԅ[# sXۺ z(}u!llӥ ^(^ܳ3M(=Dž6P;m묢E?Rb6tL4=ERߪL) EOQ(mVSh1i>!GqB%3c'٦/Z6;QA3.QSwXL/0AqvQжe䎚 Z(0 ` *P~;5,0Gy;"<FGBx+qԵ<=73)XKs(62BcM-#@!J~אUF1=AB_]qs(PhX0C O:#7H ]?:g (t*w( m: |y_AI~QBVNRs|YF4֘YJ|N*o zT;1<}zQ33Q9q[gM[({c3*'3BI2yFڐR9)[UBol1kkRDH-MMU=\Bs1P`25Y|ЪJ JصmnNWAf,VhXb5Z;>ӽX??q5k&+NLʄ]EENʈU+osz8Rvz̍ %&5{jjp![k6 ~?bSx:tUͻ S\i>'vn/%PtD?UҢ} mBZl}{UfQ ߭H栔=9hfF% ϰ K.5*MbGVUtޏ~@]||E }qküߡ_0F=- s<*5vTX*|ךzf:8sQ@v (k)d߆U3k*@PK_fQB0N2bs5ꐴi*^XCǤt4O3٢|@Mӓ:fDc bIl.xhV;(˪X#.e^V4.SR5ʯt9N.X8r"44`HoNa 餉0텉@ v]8lf$X%-PU /p29<޳2QD%uv{: t.P*7V޾W3Ֆ2rc*[wiօA}r*Rh|ϥ2qd -Lw \E * %M͢U.F}õ^TjxM/w.Pr9\^@Y]%OgK@_ }uU*.ׯɧ~(5eGPMDx> sy3~jW=`V]:&}:t mUp߆^Kw@ޭ졡cʴ/ej&e#ˣxl)hs U ԖPPҴnOPж0~T~0Y Km\W86Imq5<,UGBEF~_]|W|>̢I`v"ڝ.>k)+YIuґڮ/)hSPҤ {P&xZA2n Sp^k$pkXpA͜dL96YeDue!lһZUԲr<7MJ*`u9 4b۴jy2#ec!M4֗VzsGQSpu⃆w қB5}І܍ƒB10 ?oA5OA{ۺăF3P{O + |j)C'Bv Z? yd,MgSp[K'I]I_f?(PHP:')i;w!0_N:/LC‘k?,0 k9j؏5{x MCOuv|PlbiX5?{ EvW7 %=tcH1Md74)>Ѯ2{KR)4ٴRCR(+CY(7{{tД4~h7Ad4XB鸟gQCe3lLh?F.O6\(lGh߷ScBY}QA=Oz̏*}Z$A2t0\Φy xp>A&'/UwELni wuR>{BtT6=fb`f٠Oph1l Bv* eХUb4PP0qQ,`RXNu~O!.c~(Ξ&Ci()fpd e嗫I`jt @=} v@BE(9LT^_{@x{PBVTߍPڹL2<1ly\e~ iwH( hDjU2$CғstVHڍP |P!w^@]D_h&Y<ᒒ.#`7A 膦^QA٧_7 ߶Wtk-WpI$Drv#&nu=0U -vTRuYB$ZHLc dЦ 2(KB(|d2CIaYKk2lT*dT%N!t{~f&w I8 Qˆ (h+̓쁆a* ܴ^aƻ !&k,5I :'BQj+ KQpr]ԮcNe ş{-PLu­vđ:kQQP6QfO'T *L}کU"lCuerp.{oʑuLs Rz/_~m4}$#)d0FD@WÉDZ˾yb 0lwm {UR{1Ao.S t\3nxJUv}bʪKeWDvHa]N+})fHhPkdscW>.?w@/%8fM.K?W:]g„j=S^T6R ~BP\by twu|&eW#S+8o7T4+v/h}&_Ao*.6ri1ef阜+3GF7vԛ0hgs6a+e)>h!A)]T14GHG#DT'\0e ;Lod"P߹]"`"A"({P2]^P*EqL 8}X+dg|֦ JGOUDXzcNj g9)Rǎ>5.%}'*`65K%Saym(t:ˣ1QnP{pH,fk!6gkJ6clLb8VWvm?QJ&[nS+٠  ~M.3d:d(g>!2\C =*9"Z+72y}UK%ԦxU첹UJ %KI7WC+`^ ɁV)=-eS`t,Jh N|)0P5sKдsظ1huW=i27!ECSư2j8pct7r[W)Kvs+L:>օj*sZK~bC<|~<\0RʤUc>XcQ*3a1 p+-q4F`V)dgqAsyB-2wF2Jn %+`Ɇ†㢇Ot kˊ-(Ux3=TPeIRpDBōYh[qq@'ѝ&%1Ѡ\X q߈L~? .*]B HRʜ)R& ֹ \cjfbsE8Y`=R 6ktkܚ,n'0q0NbƧ=v] bgT oLFP 8*h)MPAYI+9I\τE{̂ITE"!+=xMg)`*i;wb82Y'@F}z-K'd3; z7J)1Ya4-0Akq J6{m =F~O{ JlwnLn^d*V" ֣ݛ0pDM'Vq @ƾ#*/2j7/C(( /GXÉܟ煮e *g4DyV~ "m>r=&E(~}bX-UPP%bdD;01 PPv>oJPxh AvwRϊM-`A{Z2][*,U ª+ NsފX:{YTIo6|Y ?AY[w*hozeAk#78Cz !nWOR \PC Ō3C- GN{\P,pA_#7 ,e$:]N߂8h{_ C ࠢyHH*rhnZgT"@fs;Y_ ^*8h>XM?U>d :j}dz@.2P&QP u,T_mf0]O?ڭ?ݰq|פwn?FNr,*ۅKk}4.U YæU`wٴhJX`逷P ^@ۿu@nUPL@8TKcnIQ2κ'n$e NfS[`ehPmsJ6%P`v :˯eZ ],$똃>(]QvxG17Рφұn oU+kohJ]6f41\|l.<ؤ1RktKߪРs,ʯe[9Hqlif#Q=LarB=!RY3Tz&ZXP p@w^wPj{7ŒP7d'4+Ig|q j}ԩlPF pżt w RC)!>aLٍ@﵍MuLӰXzNGv0U! nJmA9|7qnBZShᬡ %n@bx`*P)2hKJ}cw>p7a7_Blg"8&' uV3z3B:jgZKgVP9 qwW; j7>eMca;j-LJb@ 9&Q~U3aۜ vOZ("Hr6Z>C%ÂPl~L.hR9xs(IB(.ǜxyKE{Jl8GXU]I82Lqm$ut[?L`8ET'4DZk ǵq&S4[ U=c(EX&׍b ph tԆ3 *b~($ mQ&9  d${BȦ?dj ~``M}`У-;h29@q;PʕR z/+,J4C8Ƞ>i11`*ƃ.9ja8 ".}2ɸP^ -:M1 uVp#n*VٸY3$Ff(`.{bC)73C)`P, ]ۀ,٩WɣJ-pQ" U1$1udD E pCTmo25\{e_9 GPV!hǀhy<Jp*4u aas8f@(v~RCixP%hHg0d/8ܡO(eq SPz51)T=P^J-m5d~|P37@}VtqCI!do\6 %BazQp[Ǐ }|Pg: ]t `:ɀjRqW$蹷LӟPP]k f( VTӕ7V\K'Cq丣w=JC(iS9[x(? 53JN&5/G7*T <,)`!lDn_IOJl e\S /L1Pcv~+ۿ,G7avzJ)&L6YWX;0$fF)p tAvCu᥿kUFb 4,vʢUc(%4Fзnƹb/$N#6~84Hw îٰʶ tC9;g }>@wf/(¬gB3& 6e"gk( ̱ ; KBi" @* P*P(eNeD.fnXO=\}x r,$Jq"Z,D5qP {. e|R!B(R:YYC9^ZŦlȵC(i*i S qkPX>zlSz%ž}4p@c݃B>Q+uNbU )WN9uw@eYwn\0*f2S { ~ ?NqLav +I %&j4Ao`[1Yjy[)3z#팅 7cɍFipFBnMPXb+6C#`8KLO;:,B{ZFP0 ?:h ~dcEeۡ x3$=$l[ XRϜz= va`۳# cܡh@6}Pl+?DUDwQлg(/5׃a<0 s Aa8Y(4ҏk+(:oZu(ek5  |?o ' (6%W< D<[M6lxنOD(!gC8aג3ͮ]`p΂fQ9LLeg?SCI^O}yb"x{ |^g?>:)`\(Z>XŠ:b &؟wd$T;'2@&MP7?g9rrgoNՎbz ֬\͹A3̥[@4 OP/tO^$T;@Yըc9w5'n'19G EƺTy$%=UE} 1Cy`M}^Asrw097 ǀ7+&}[Bxlwf"@oVCa LC88* ЭxS'%+c:.Е/Bd#=%K(o*hֶ4*C( t )eҡ8`$ 8 пw 4h@LR9 0 r]Rm5F6z}BVbA_}/L<,)uwKqT#5g$ }t?U %qxWCتiJňoJ%$--4>Ԗӏ럈H8A"yԮ`UݵlqpD̤ro:?J ,FƵ9U/?E6r`{(dHƅ Cqȭ#=JǡBX u˴G= Y115{L2c^wᨖ& 2(vob =c<+ر[4)ThZGAot?G~BdN(Q M^anL)ul@ eGe *:ARw(@ %A"tan@@wR({;# ע۠@0c. Òxϖ4C9Hr}eBq@L6Lkm@@}ׂ Z oVF5_7 mB@]ZN܀ۡ}}~@@/t`8l7(wp4oڂMl$aP߀.(7CpNKZ` ЅR^q}@Kzܾ3Gd[Ϝmb_aqS% Z]v}uL[`P^4 L'mzIp{vw؜ dl@@E|TZlQ:qø V>iP:@k(?E;chAᛓ$+;B]X(ϠpHRi(~됮  a`:w9 aEӜbie@2aetP5SлvU=L(JO^ܿ ک9Ppr[tFUKJ1b B¢%҅k]L~ggʑpUZי͚ΪLV %.V,BC?:y6oN.YH0Xܳb/,Y:֜ ;HȰWtcهLh |P6|Xo]]Cauˮq{9yPq@8|0@]1C7@C7cJL񦦏AA}d{ģ2&o(kN8P7z 2Ǥt5}PwxGYr+e2R@M}) v!t@`(Rh;!UiGlq@@?Jx@|LBcLw7D@| ފJo9.pNAaéy]x@ni"d,Z謾t&]Ar*Fh(  ]a{3 cԗq=Yv&>;;o7A -Ҥj}Q320~ٴ-=OFSp2LjݵEGA9ٟ*Rqeh0ݱx.wM=&g!Ӟ?lƔ.oA7)Tg+ YgR(Wn `:8Q/ONA0g#7ػp?'mЪ ·R,c!8XuO6Š; * S&/*9.PmFI(IZ #8\MaS;CROB14]ǑoxG>LP2WTaT޷i*xb(F&{*p:p3@;PX+nJ̓P =_ص8ڣ c%c,bSyaR!a*Hv) ju|v!T4C%Lm3}t kL ni!lPzeYbhE2C)+kB`k?P ݆0hsO㵻bYFtZ:@I:avVeI0E|VݧlX Ja՝o~'B|p riKdcfXv}?տZ?>|_gh`ij;z6)v,  !܆᱁ 2>%LL1 UeMaO-0=/guk9 cTV0' dP^ ɮm&0O4H=ia24H(7rM-_؎y{` #[PP>N/,h?cy33vl ) )w!k!lZF?PBy# )OVK MO~S9;,[Utxwۆ{s SхO{LC1Xݩetr;u{M =СzG?s2C9\:%L\nQqXϡ e`wS1PjxK^ 2M\Ġ-?wGTykʬif! 1 }jV l}j[TtS+,@~[y;&2dɓ|~1p0B~ŐUݷ6 {NZL$@;%2V\(u;@PQ/WdP RSa|b!{G?vaP'<(= i4`)7떡O[(@dQ(:Zhc𖻲,a0?E A: +ROP`z=0i@`cgku Ya:t(qQ#$hݎ=02}M0K{ N@E a bM,. *{} QЛ L0z N *G-` 2 j [(PU!pi680@c(L"K5 eaՀ N(OZ:ɰV|&Q\R6*\:gD(Jb`ܑr>l*|(I0P-R2)B 9Qs#[P[mCa4EnP C~g< &A4eW(+(u7χ䤭 3Z|2ǜ&(p eĆ;U_(#fuh 1{k] *nL8@]YJ]X@>uЩg1bSTshM!Y,I 2=+N(xj2$ H.pX@2?YQ19!ǿ?$xP4&ͼPf{#&r`N]ـ3 jcZ$ T.$ tbI6*:1$#8AUW(XXIǮyTr! t tc`ig8PE'p~Keoy?ā ELqݓۆC8 Ci *(ə`:p{zݙ ug#QI3tY˚ZRőˬG4\ 3XCL1"+K0,ȓ A<; pa]ʴL5dU||.CZ\@$[.UFx(YS [ itMUQo 1daBY$CYK;n)Lc NTOvׂWǬP~ *9aؘmZZ^@U,Pw:>8]1&- L1u~0PptDg˃'tT(sQ*辇P0G'M?Y|Ne#%Nn _tD/ػU`n9ܹ۰cMန! sj_Q+Ԅv@wv;N CecµI+M_r hf 蕻!^3.(ܵvtnR`n@7 q"SjT06@0L1Ե4D[:H,m < uݕu!b:0TJ۟ۘ%C Z5 >0׹ J+D=>'_}Ͽ {bB{TQ$Ш63qat"FýhN}BxNeUWwqvk4wрv[4Ǫ,Cu%)J2 ]zQHD 3iN|jJ95ej~6`@x~PFer~0У% uL8e-ʤ c)1 4e6h@,1 aHƞȹ?z{$@r08O@,=i&ު#5`H+t}M[w-b?eG yt/K (#ih_hwt E0e[O@c=UYED9uǣc"}ƫTu1>@=]Hd~ wc2EJ թ?a.b4ztV(A o:,1 ]8 J~:EեUh2rDORu:~96u>9k>ԎiԄe g2>B6@xZ1!n(Hڳ zqrL(=܇ئlkr7Mk(q){`)44@o>؃:kaƞ tWN` B\lk$b5 56+*о#4)e}%@P bYn 7Y@_6u՛cr 9j AaOX++ ш{i c,_Հ/7"ڀ//%ޝ% 5)؀+'HU|.I($y @RzWΌ`8-G@Z7@] 荃QZ2XeK0$h@s5>۰ u"qt4u9:(bЍCG[:xsP@o"w}tľ tغ2jQÄw) HDRC^8(w/UpW^PתwT(ɁE#*WP/ɡ8NC?eMg1 '+>>`N!>pPZb"j w - CSGI/nvbu׎|/Bz@j{\bp.-:^48xU4qP)Jxu)LJq YNH!{Qq`ڂ.enʡoo]5<|ؾs Dbmnk^HmRHPUh:,sD*0pYAU!22+H@yA'nJMStB17 qJ0x^ \'> b'T0k7""S8U(T%jR1t)sZ52CYg] x|Ry<,[ DF5; tkWPN>9P2P8p P0*9eB2jS)9k;-FCﵩ@(߬T[C|C5鐎~:&,btۜJ1z.\SVc( n]J:rv "aqP~mbJNMP41`R /P SO, Nh@:ҏ[wqڝ(c&Fd~^qmR1wL+5'ʨR(값B9 pmmC1 CTy}(0=cvS ]o0PQU! tj阎6 |C1OPEӝTS1|SeLmd9Ҁ%f7S&Ιm=55Vb@oK}%YYLGA8kPmϷЩtK8>!T!a9Q'G R HOnd:T@N6R0.s`nMeؾj.ö(NC芍€ʯ$(ݾlw&ۖ|5ͷj2Ϧ|< 8벡|18&01 +Hoۀau} wFR揩m0d RF>AZ:p|O te9(&Û˄ER:nŒZ/=0c=Dӊ^ X Q)B>0< | eRxK=gD^v 7G{ۋ`1s)2Ne  'G&J9s(Z)aPj881!7DѤ@&I zŤ|;C9al5ߎ;Ni0螽[0QܼuZߧ*3 -B)[$/_#xkt^|[(P&;xY4$u&FBO`PUu:0+eݎC٘wYT=[I 1O4E*PoN`a 4=jď_3zMT2EWK_7)82ШNSGT{SabL:$ ƭOCq20 +ݼ}#2Lo"˒%,db6]xOOY(*$]%Zdφ0 X:+ۿ e}BLաޡQd-v(~,^ih!eGb?o@ 0c#N9ȏ@-s۽^ѶQDWXlli("膉1zWjBeM v(C(ўǩG7 J ]e:+'zc&h 5\Dv,bM45vKX4Ae;(:c?ma鿵ݗWM*棆30?ӤB>Rb0]f@҅B51atkP*5 ՙ!1k'0pSaɹ+ȡŞl*R9R{;bURxn݅V隄l+W1ҟTP- !4ȴ @,|nr |Y_dP7,:U"JA\2^'<_YJ p-(1&Q>t0[^dS%L R2luHߟyrЬ69^ʞArqgލK]Ap1ޏNa$j(VQV秕4u~raTkM2G` i:\Y۪wƖ?;ev7fN,l]c`RO9*nW(Hm[W| ljהX.&yn9. P4U}/JmW&+n:elR,Ca#=|[D7@^`ɅfA^P*S< Ac H[{YyPPb,>SŽe܋77?7JM=PP73] M T|DE(rv`JN(6_gBS.?~gHɄs{!AI Tjrt %O e(M0S6@mJPŒ370@jk@B/z ۵_+Ƕ3v򣬃]HK HP X s'jy ~v~NjNTB(G8MIB!X8xiJ* 3 b&(@&!ڨ$P&Jt*p=jﵟk(xfPabH&~Gq7P%iSaTRBN  !:C!S r܈b=@ ^͍OY6$5I{7p?^!R!rEM2z> O՞zߙ'#!p+k ʪ F_Fn8*o2 22(ի 4r OM;~]Y`ȉ i8'&#cbT2 W{%S6X7ߟf6]儙G;+cӨTȁۺBߺN䘊!I'9JZe*^z2?5﬘F~*EZ*mp'e*L jIZ2gS)цT>@TP]ՖNJ3hH3t;KfM2MK/c)tLҊTj7@ _eêER*U`t?n][J{1uF|*Uh }OıΓJYv):7 1QH9/)~jI@2@ zZV6"@zi[c``9W T5d IiSx߶]*>$n:  dpԤšEU*s>U 6 ?O m lghMݨvbRp*U2*1tD. *$U] Í@)˹ yNSLE?t#sm L| Y da*D2+EQ7@U|$( \ZݴM*h#hr5C2]U:l!+vyt|֑RS4TBm〕^ T[:/7P4ؐfTHA܍JM" f2P~/ xn 4 T"x;0lJkX mWڛ]l=t%zq@ OBԟX"|.C͊1vLuAe*Ru@ ԮCp J'_jh ѧZyN|Or 9Px;@6b'Rvͫ|]Нyc-X_/Dj^Ņ}oEK: bKPTӁ$P' `X9vH4C*1hU*Iixwdnk=Ŵ ]&H(TQR鏎q*fW5@V'NVN~4k1t %T&ݓ̭ Mtkzzdm *|*W1\Ȃ2Gɢcee>n @yJA{Y95ةq6J2`2,;nXTj5k5gtLgJlfmfjg $\'g!A8 1Nĸ_R¤N?,Y]~AB*yL%Lv>R2X;\Y1:"-D{To+mN;*T|?;m-Id`1F}w/hF?gX"¡Qo]I4YP*~]BpX;PMƿ-s@+ (]QmR}ʔ]Cl$b(P;/%lЭUz4:P$m0gn"Åׁ%v|u P?q˹{@dz;@HCL!߯ғ ׇB>zr@EkNj4<{ q@5^xK%ø˞wسz'Y +6i޹v^$И|x'@y}4v}n/~]9 ygv1K'Xrfq֍ eDgVĩܢCPF[av~^@ri ijyQ>GTךé ħq)[s)@@92f5JV@;ҐdR0\6ꯇʖq-am^ ԧ n*9wVY`1>1[dt~uH:rҲ4§U7U, \}"fixrVUlb]Ez~}ysWp *PN^U^W( ХU* + S9`<*"\۝o* hOSQR2ktL@_IZciP( S!UP^Bk *hXѮjꓪdrC ~,:u@1Ha'*U J.tgk!GN3^SДw]\t$UdGٟQ9m\CE F[P䚶0P;* : @ccom.5i3L&?}8W8]F:{TDt!"Rm )lOE lQp?|wEI[h?Mŕ7@p] ml."?l7rc2Ǩ٭R30 Fa7t M+u.K)4X ִ w ˽kx?"݆QD]ݵWj*a+b꧕ )Y}x;V;D*x!j jkszx.mfo&qY`Y Ў>)'lxpkɞȵ &.h!9֞`g({bO@cIm ţm[+vr{G '< i_*T"v+^4hlMvw7p+K@K%w#l г4 ,?LԸ94bk?.gۇv[݀Jo1 vy*>,@RO:o]nJ G&)zަ>*ة-Sf\:0@lS A{=El~JH+xQ! (Q=EF#<-M.I!YsbFSOJgBV{B E*^Yfy6YbjYґt[J; ņ#gE/t4}s9sz*53Bѯtt'k:5hR*' TDt>y(1H%GB!t:X ց3lJ %S7Piu}r*{ךa2B)҃)(PTKg1wtxRH{&*6 ʭ -V0R,,arCe5Mg96+Q  v ΄lJVӣq$f,}eW231h* h(? -P2-ioX`WblUU(T~e{}Vųy{o@8 {8 Fvj6&;lk|(j\tQ@_@[ a[R 6m(+*rj7֊j/RX1J7ޙF+'70e?,d- с Em(dC$!G-Pп-jfP֊W(o ? PcBu(# Id%h̑Pң{2S NC<"B%{HmzRIB*1c+;~ctCI$/ $P#H{H!Ww|(?ſmG@mr5@#'%q\0P':Xٛ7@'ġx 8!,܌uW@Yj{C~3k%">̙ڴZ|)KSRxEld4XֺU͚Oc:ziR&n4|M+Aȯ3~n,\fvg3 P޺>0ekݚJ.vFML ?BaGJ I5?,B}H%ڋ&B/I  n0|jdua!8ޛ^kwjb!AB62r_RY4K^<:M`v.r q/o |`}KٝVPolSV2&EUT6[A-^LPuI! L?hku粃Vwb`w~)@R) ^L ̔jVTZ^ r(ժiӜM?H3( UgNwCVpdXaA;TҪeT|T_zm 4f>o:Zk-Ѫádkc/s$dOn;CegPdФ]G(Q)7S *^o*Y3ԏڭow*dƧ;x 4jr(V<n<JG2Irek(եTCS(j5\M#@7.r]70q0c33/Kx=k.Bq,ΉF&(CPeiK^n Y\ GRQA_(#THPWc*OI'Ԣ0>3w8)tk(v p XaA3La:b#j͙ Ld6\G(`  a `AE-Hx:g}rCaXQ+D(hן q[%bz=A"Ko8| Y>dm>ǤLLtQI%e謃aJ//=^ Ѝm0.L; C3B90ě:̫Mew!qe,LPvHt㩳Ҥɠx1co8Qi\P8y婆M[שm EGAA.y3Wp(&ef& xHpf֏8 WYoU_#j dD܇i‚C*( & dCix9rI*T Ac; zS9u\JqefeB#SxNfE=,r5된ȋNeB6A"z<lwC f>^eL u { 44I 6rJว ܌Prht&y@hftI󜭖w6f8ا ڹ@G3;Ȉ,n JjtLNfdr$zNS>-3f0 Ӌ$EzMf\P6H%ǿ`u~OpAٷ9jꭙ Lo *tl tH9+2kk *qNW=$-= NKTä`zTӱg}Ƞw ^gR(ֽBTE T:~6maA_Q͹ 0^X۵T^i.lu>^B^ɥe޷`PI57r{a•}FG[X ZBhvyU`PvJ5*P QN};%s ny;l2ʄCriWmZ(ґyȨ[J%l2Ƞ~{{`5EPO 'H2n{e$xe+AWl[,ۦ15z'O;jX ({&~'"f;~)|,ᏥSb( dq.CIkjsT;BY'LRw{ pe@u !/piD2.8^LP5(e5|`:B8p UPϢW]{%~,O`]8P7]/]`2}c߽ K6;@" m 2|ۑڊ(zط4DA@[3tau q ~T !š0? *pv[=W@ً5@1p2Qe_`VY(YG!`z Lsz{V qOJ\( _ j{bqFX@[L(m8"p~C@o" T'{8. ᄵ |J*˜\gdJ})CjZ&Wnl;-q(dJS_˶(U{ [X\[{^P>Qgq8S,<5ʙ wg rue8]O-OUoP:~evPX$_ҕӠkP Z|#g`6OPǛ `* %WN eZDC%`j ۖ^uBKpt׵ExtYZ\jC#x5oPwcQܗ ^,PAX[>~~/"x7`7¾ }\Dq{;29 M ta#>`czT-|cz2fv( ̼|J(`55io80ݦ} ug T( ؤԐ׾ 4mo&==ѤtD큮z6&x=ϓ/AUoVZjoUߴ)A=ʪA D=z;JgP:BHNm,j@ elt`n)b l<ʂw5h ZÈ* s;ݽ-}TwF "7m֞uw*$O qAa}uJqdq)[qr[^Ö]_kt5N^Q-?3. C'I)l#WtX1uUÜP:LX1P}ݝ`:?@-۟Ӧy/@vN&5Txe9_z\ ;RŠ+t J[}Ve SYp)QM)P 8x@jJA9x?<3:s3@բ((4llahMcxK!@QS< 9L&-n@&SI>)@#"Nc7}XYX-p@zq0th|Tޝ0T>-$Vċz]ϳzPjpWCJ0njzs@8di4td=aCxP :1qB@Pm+_Pg{{R[r|8ԞGd4lb?e'Q=sj2#}&{ LyB)?U׫"P2XɎ9 aJ8nRQH5hr`b$^2*eӲ2k,4~/b}g%)0' eMgO)i vaSPߺ?| ?9ڞčPuw*Q Febj5);e%tTGz-Prԃxo =>Rz(./' :` q=@(ltj*_C|hFI| 8[2i;y,$_vao,#>Cbaa:f: ~fI5r*>ͻ^Dл8EqBij飓*eg*y~5?Ϸ:LPdx=[ХdrO&]b%gBY< l u%I?P:=ڣ }"wk2΍b別ڟw :n~Q&|r1{5PEf(Abcݙ ^ .BB?/4yE\۸m›6(ԪT[`sb:Ybv/J> o~bkjovaqOTTMBaFu||,0oA aZT*VK?VkrHh :&">Ž{ 1@ C|y9:-e?6}P&R4P9^U}d?9Xn(iP:^nԚ~QSǤPV,a l1k!?cP:3 1aOP}f:tBy{WVX X7NaiwSnU`wV6Y¬{>$} Ƈ n ̻û }ۧ21/$}jS(~d1i.e9+"$EJ-쾙K73g5` @*$8d:rRRFp9 _qG1yJ]vLp&Hφ?CtoCاjf0V; ̖nԃ+ \4)y.X(&IB:&7P ڻc-8`/"F̀R3va9T3=tmFu>`XC)BhY6ZS_LְyBq8x0t ?ޝfu+"Hyաd,CP&\KY4gyw:r5lev7A[b֨dҔb`έJ6vBZjJb*ؠ ]x7 cߨ[N¼: !&`"J(Ia})| 44V@aeB^[(; –C٘nOUK*HƂ<:R4&ǡLeRs1:Y-U#XaO] Ö*jf>;P됉 Lꚟ0wh Q^u>!QL 1C *զЬP6:ިQ{ )aANSe.$v0-  3k> `H0c 00ˈv ^?d PaFK2gJ=aYX (h^ Bk 0A<[: zGQA_5kn*]h 2Py,z5]Cye|\`Hs 4@]:&osQ!tCdPeߥǘLYdWD{>h3?iY.oyöA@~(PcIHnlTPgC7-w]bN-Jbe_rxfA/<֜l }Rcˍ}mP̎ Q 6֏YhаaMi[,2M E TßP ;[U+ћVIICȵ=v(z^lP57,P#7^e(L;uҧ2 cª@]䏶wy z7S'@ %3+PT6c^kXzw٘^[tZ|}ǻ#]C,:h@uL1F3:s]z' J g[@sN\ʶmMDB 5_1Q?[L`P 5 zW-^)DWl %K mf2 ς]B\-~V :yn(BY9q:㡩᠃ J,u08aQ(:~:D/,Pr,:x\N;h o7KxAd%"EYzN6pA6BbN696ȕNc j`:08ؠC#MDRS^t8 `'Tӝ:oBL 98zXVØ2 /0|>:@iȼbfjҰm)tZmBtYv ?2s38U/,+ʋK]tlawYHݫTa,jq]pШ~mW0堃*@蠃 _]ʄ)$ѶR O* dx ߎB{Q{l˲mggpmjB͕W֨oK+U zkT[6:`ya7*Mpj+Tm`?:ץ * &z9e OGw5@WE>tj(D-~);xG<82{UXy%^'a< +Owu1\RbfJWduoB\Đo&'z l,kD`½u"v2d3>۳Yyχ21.`AEsD<8XM EHPXDuv ڹ(J(hP` .C<,:[#Y0o"t^oNvXRqSq=~x@w~u$V |E&w3~ C[(d 8u8Dۦki#an >FWht@_d7s-& L)_]HP"R֑U`'jhI[dX4P‚CՒv F[Jg:NbƢ01U{ڀ*CqJq6*n0g7e萁DL-c~97x@GcWP|Cb,PkAy)A3YJ8`hWׁߕx`߭S si~0B!$ܭӔp~=&@]I@5yps;@j=Iܬ?45p:\8#-te ˜C(1>f/ϱBt*#>u>ygYr$ ڲ<";gtqc7eu"9Ȁ}tXX,v>ߩ*RIx$G:43E͘jܺuLZ?]f[V p֛ q#{y;31$oq4tBBga+,VPc.;Z']tbs5ܜ t2~^) -.z )f`PH&L asُ툾%6aߝ \׃y=s6k?/t(ֵ܏R۬tʯ3cƂi}6۞eD~Su!\߳jG% s'ȵs`q?lh Ϧ?IN6=I^0#Bڰ&xyҞys) 4 ËC{|J L>2ߕ\IrwT6v) S"#  ɔLY7Þ 4'a9+=-~1|0Qխuf3:\іYTw1;x] P+Rw1MtgL: ~%gu)^we*Ş;뒯 v_]a*x E"Nmn{^@Ǡv&T6mS8A>i:h${RΪq!-ںAmʈ`|2Q=,P&쥲LШ-ڈ!G-6<&\7úozUwqZ2 цe򙂿 d1WD`rBMnL>2 T;KK ɳyY,,a PCMȮTϫCv~.[)w nv]d!bY1.1ZTiT 135.êp>zv8> y?p Ӛ?|LZ'9¡0Z:Ki"BٮZ?yҰvd,<:+SLaG>@ D!vY٨~Fȟf0WЦpjPT M̰G@?0tؐN`8&PٱtH'bS \Tpz% vO`4f̧QUɖ2Po y;%ո7C\^+@n *4)܁k:k|eopgԞ+@>FVuLl42 @7_8v?P8Ơ Xn?^DS2Dgy9: Gu 9\dΨ[%aN>ʌ܏d^N y9 XF9%ި>`aLa5YBl^J!zXR6&>~u@Tov$(?k. eS 8lPVzӽp4&kIaP)_%CvP,b@1z]?!}<+g&IɁ?=ZaZCNtc6FY yPubTۥ謃 uoy ?̆1Nv CHX:gr.sيzY;kiͪLm˂=n0Yq OkB#66ǝJET츛TE S =L!/3VvȣcXT$??$,YeDbHU!=oa6, lw -џ4}v107vNcR,>yx8VǸJ4g5x#nE8FVR^%;[A+gp7cQlW'!Y)a3t?7ݬF m^e8^1l'o]%2kV:O!l]RϧOM~|ԴZğ8uشKݷ.svXğs{RHlQȟ'(gLua2m(=XͿHmq%GBѿ ;3G?LEGfv|~[.mJp!;͏b>]VB6Rߎk3JgYНCqe$[CJB vݜ{^bf9$GGRWi >ueVي(Ӧe?Fa=8'C`oxR9Bi19!5#ٟ?ӸޢПuʊRYUtz؟h(v#@0baBf9Uy{r1S}߬0 {Gm֗ZU)M)۳5ݎd @)#IzVhKwVm3F`+dUzoXp7]F0Qk\1v O rW6=""Cь2ӓV5R)r9zf_od7?wvgǰ+{mZSY(1cU7vΣcªm8fPy^ƙfiQ̬xOgAп5Y`Eר똘ZP Ul9ih-Ilަfm BIV4P2XUJX(PuBdׁF%֏1ȟ}cEl[)Y); Afwo2 ,火O'b7}~(e`9¥>2:)m!gP hKm {7,7 Z6)iz@)h-۔阙#]س?m,U*=k8%/%~ُ~nz CIn(]c; GnOiit}k5nR¸m&krYϮjLFQ_ۧ2p7.?϶0 mZ \JPR+ـU-}0ύV )d] f?Q?;WnJFTJUY"pkGܟ y %?{pZw𯎏1w:%Z3LR9\Fx+Jq= %Mڵ ; hxMacMyAe <꼀olIC))Gcש(9[^bUV)NTb^3:&}U@m( -uFZƧڞ-@@ eծ ve%6ӧWaȟ[E$z{E.ۇJ9*NNc w2ѽz۩? \?b@XJ1Up}ԦB2]5CBG7ȟ{Uy?rb5˙PZ8 yb T*} k}u mTYh( H,p$'Ô8D2B;Ef ޭUȷXWaZ|VN*OGwpa/ vZh_ Eҝ{@](_K5 OgPE|둒УEq] CS~ Twv(?( !Z$mUψV^,?+ssshE[f%FSKZ@ .2_IGEږT߁Uϧ:4C2/(8 O­&|E٦$]5<3Yҗs"9G`LdQ?*g:;;/]Hgs熥?&aa.ЃB,I+)b)d Eתy_(?tq?^[=9xk9?]*m[z?)A|YP.j"(O~p?+%'ړ- )JzQ*C)1/ osUi(:hWQ`+<{$pӷ B I].nJ2 =ݐfo %]ޥvwg ʁfb a%.[!eOaHCmr{pD)E#i淪jSrftRBh(ahetK #1`7y?K{I&uatcne/_jO' G϶=T--I$[eBC%Djf6?f3v]d}5Pdf~gr3rR:U U +*h_WOL 74@޺FSP:)VXR7+KFʓ|(% mRiD pg4%ryd,jlxb`*?@Ӳ`lp=OeAG2j~jxJ@jʨ;*Vi(f {(latLuԟd!07e@N)gn7*J?T؛)XYXuX?+ݾk%5E-Q k@c>f}WQ93ax4dPV\P*ٖ#sy)z H%!l<5B>-gGU42`lM2?dI eg鬲g魌/1 CxG%| ldlַ>Wڱ3A{:e\D@(5ّ*Ic/TK;ZkAf|QUBF[1ޔ.ÅWʸ&;3vʷ$x7!f ^T?D(F(oFs!eњ^=hBӨqA!_608:d֤?w4pͬl$&MIuC>[ K^8 ,?\(ŝS[0gPL`(mt4PE;F{]*KߦR7A PʒM!KeM_@Oט&T('uN&Ztl^a>l^|yLTZb6XPF`=OO ̇$ɲɺO/;GReyDL/r<{rGrdz6 C)}geZ+zSAdTO(øPƛ hK‚Ѩ9si~* x;ˤA{ߐڛB;cjjΜ0pu~֤+Q›A`oZSq{h~0EXؘ:1IQdr$mov8Ƭ:Vvơ*x7 5Y%{R?+;(,؝CeƱÇf/FB5N'#!LdnTtMX7Osz:dJ4OB$ >9cEZYB ) j$ FS$IjҬSOO{s[1:Fz}i/]T8{5\ -X?6:ȟH$Pʛ#02oOPyռ9u/ڏ@|vKwY7I柕U!*:8y^K:&_=TΏ=ڠ]i]f(v-*w0zXS5~5Y<*9n?P 1ɐ 쟗 9`º2?E0ãqe``a)P\@4GJCHV衬Z d(7 XJ 0; 7 (Lcae 6*I̴xm+!aI&tOF'c}ـ5_g`F1kNΔҐ&zKwO-\w(? ew<:1ec_nq3?Yyog4,sߏ"SӼ50DQQX8D k5XX2X]tV:tj r&^"T?+aSTVH]}U>%^XޝVĞS%\erY'>~ 4Nu(F"[t*c*~v4B5X04o(AiShY6ǀ3'&Yj :+W8У&ʪekQMUc-TcVƱ?ja=878L5&j(ӡdQP{ d]Hh 9$UM8LZ(╁uHQ- ,hd_.7_%rؽYfB &@wNe#[s&gu5tt 0^с^  lg4Fڭcj_T7dPSlIk &?HURj?HP,ʟB@9НI~4 =fY_Myz!QCֲ7)ir0w7TP 39>d0ս:'Zޑ!>!AU7P:\ |7j5)!'e8INU\ϰ@XO3T5TL[)\>6f*`uxB1gY^\k8Ά롔Cw9\)ݱ\ N08_BGH'`y(fZ^`P/-9)4o(f0.CbeulAa`(thWG^f0:Н[v囌{ixnn'k:f:˟OBBQtϷ uW-c4ZE~И>wɱ \+?=& QG90ףhzPE*;QhdqtaG}#pփ{AR*VCJ(PᓺbY }OhJkhNpY_$X{ߝ!eh Gn*g.a-BiX`3`/AsPI`@ڗX&#r nS ukC+gk`BUTRHQ-dfj6ؾ!VA=VRYJWF]9|p#~p\vrtҪ\ `, nrx )I7wxsWAB*g-lSLJ2"Vc-v6ĺj!H>jk#eRwIMB!~ʘZ7s7*k7Uu$ݐVG*Vv78t8 9zz/8B*Rg5lwGbNZ2wA_;pkʸC-0=amHi> +m0tqPҫ`\:=:兒=iRPqt$mݣ|:#:ͻ=PS=|,}B|OApY]Vo]f!ҳu5ódp>܎L hm1 LCe&86]Hė:/KIJ~$%%Bý/SXWbj/ J9%KW?2] V{#S|8p6UFa tBYs5c㥄E{ o\ \4Q@a2OϿQ}rUQ+Ж iʠU"12d]Ac؟r  o =v7@rt֒3PE}qt@RL` ~HX󗑎C*C0ƵUO1r0YT$Ąrη0o#g+VsZa&)}ȩX()Xς#UwVmUߨYgs;FJ]xU}44\9EIφ9{FֽFӄ;=I`YLF#V󳱓cz1OjJèRP90XsV[Cq@:oe*pj15C!hJmŒ8j ec`0}4!5 $c:|Q!c3 rrn@,%۴I[@y]_RPR%}(,6>j#Kg飘kx  P,-ޜb CH?:$}gne(t0vCY>|\2$N}4x0S0< ^y27 0&^T{Ͽ8L.)6u9Lᓁòq]xagv2Mc:>E*MI >5 t>W(PG@Yg!k 2q e *s 5aJppQ900!Cs@…!#}:d >tdCt}8TXlX\k(8PeFj-*cP&@*Cd|")_-ܔ[b375::\흺n6 l+gbx?`l%N@(Kzt 8b,MgNB)QP(*Z($'Y06*хku{4/Sq#;ĠP|ѡ86.^TvljwfAZҮJ\1 J+,$r7ώE827cj(X;`T c!T opB  Avp@$* %xL26tLmHJጇ>8YLew5'J18"zU%L%@2TB$V@r:o tw C)tĪY{ cFpG@7:&B",>)ʥ,3.e#́D1f,ybo峜(ŮnBPIuN{Y5˅]ܤcҎu}0`:p-:0@V` ,i >5B;-h׌U-rXI!CDpt6ֽP@/o3C ?j֏rᶮ U熲^!qsCIj.5W'tO)cڦgGp УTWL(9IU !|W2{fL(SNʁeMr#To5l}l:3CIi $PW`2C9[+е 8RdXQ,:F B9cS janau5Sn ܣAi@vR$fՇI4Ƒl*9,6Pv(2a%V(mZgt݌G 2لJup=Z v;>M8rχÿG󎈇1J1DDOhLBGq fv+PR]\+SU4 O HP:_$ 6V#fTV`. T9mE@[W@1!ۆI˼Pkjz캑+Uix3 H $b@E[-y4Ԋd/ê:U$_Y^///Y,U>4(bӵ)V"z.aQsF:[<+|vH@!'/m=p۟3#$$P 8G. d/K@DAXl@ބ͈|5kD6ux,*hOI lv}a"wd̤s4No|#@hFNpcN2!©jyNH\"j0"`CRBؤ z1! "CH-) V$4v콰`B aKI?i@ʦ2+Z= vTQ@"43N.z+@v˅ ѩ2OB{܈dr+"zK,!ȳ|*H.Ѱ^B*RRU,aUuItLB؂I&! vT2/^.I@KIBbckhVT*Pr9C$[chYn^BM5\R'9 oI Xs nLiȤ|93΋ (Umb*ЙqDr3@ٲ9zvr;_,B؇a?yԫ )PX[!`ɷ+rPߝP7PVMgЀbԲd#8DLDi!6crst^#szHDxdp$L⭞ &v1.zg!ZWP_!$xDG7Z~ Ln#e`Qh h(\5djWMeȻ- VyV{\esFt>*`\JfpfM*h1Ѥ*gs֎qsFqR(3 =Nj}gp`#;;f p ˪3Qg~c$Eh>!TF~0i_Ue75FIoeTh4zj$ O&&+Qt$"b 9$f f;9QB2^졂neV, X@d-0oBJۇgH\j.kJTh(&lqH #%ihTO 0=ahFݪi[!>zćaT (eCS$b ))#!fel%%{*r. g4LYC*Jzmpı› TIȘN'929h Pnhj0 #H6dgmY(Vo"Ł! @tW73\@ZQlE (@B!֤`gN&5:NHZe\^ bC^dR_ )S*R]o(BR.8g",^U8@yP(KjsY9@Bv[@P.q]"1ƶQ/]#f"ʜG=-O 4dSDÿKtUPF$@` I+@cX ШZoVKGjЫz+z+AGToIU_WVԌt8 ٩6r֡Uր(l@F`*9蜪%NW,ׂ5GkF!,3Fb`WaMcZ: 5NkD@ҡD?Q"=$TZDBh2K4Zjhc%<@Lԯ7؃Uׁ9 vVXgU!<+A sO azllTWezJJ 4֪Zn Rt"B$ M$ÒaJPm6䌖hJ|e$D5{(C×QX+ꩽ%lp<"*:3tAd2[RH "9(0= S¯j* 0U=eY*,QZbJJ PrHX=Mh@'*!˪75hg5g׵bn)oBW+TЌ@$jQO~||vzGYz IWH" њ"9)!e/ D?!m`@շT|Gϛ*f]·yZ4!ƪG# WOg]Xb4Mi`O'D/g5 +hUi&tP!# FfyMζL] B'*YW6F)Y9lPnEҷUӷA)n 31/xˉ2g[dل԰+7+4Bj$m Ύ ,@FwLhxCW4 8H'@L> Ruf!1ڄTEiG;klBms@i#uED #YMax3e'N<"{Z)iy!ybڃ&D1xE@졊pbE҃T\6.軠ofeFL=xv.n _Q 2"ċ,WLg 9|btxCxr>;ss[~4~WrW#@c^r?|!%bm{1za{ϫg(5 iağÝ?u 7/BLJ4UlN;Q/%?T<!݋Ud!ʓ ®KϔvVMUO}Ev0V3`)ꨰOү 96HY>$]b7 e*{=5k п螺%woxڐ"U&v^$l&=]RF2V ,W}y-en/Cu^1ɧS:깳ߓË)3@%1c.kỗ;@~6u'ꆔ](%/S|GVwy\,cRjZ te[saa}{9,m0}nl֟z|_|2Xҗ>J-j7{dSH^>!D1>#6QX'0Oa5$mhi*{>ׂ#(ӠS ms۽OyHn␄L%IhCYc6MQsGk`tZ*>+c?1n[$YW<\Ibb(rK3rXIsec' $DtO[q,vY̙{{cmի<}fĞVJf<_jA[GKu /q.<<-Kga4FCcR֧zx'=TȺAϐrӱws&SpKga~7E(mOm}\B%x Bf}.rrucMD1׬O=YE|%ϛ:{FKޞVpmV.bY㆗>̤^k%&J?ҥ ;FH`)U>.kSv>>v$Al[vα;yX37խzF2e4[dqrIjC~l%k*]ƇI>jY#XRǾ#`I^zWq0Hk-,܇(s÷e~c~[(# vTcN<_J b9q72SW/Ջ&WzJ~!1 ת^9%?YDz1 Jߙup#5-y ~1G{m}p+F5sӧj:>E=_P Χru AZWL#hw<_''04~Sدg'wنz =QDU1O'0ۯeOl‰~8ɻbR.D"슜}3mϗu"§1 ^|x`٢v'Um:>Z;g܈MI*=aDWGn4wC ݳkA调\z=vie\t0պVo'}C6ǃػENͿ:Z[M|gC#Km"itjLj}b]Rhf-z/{3a¯ކA͢hstӎ_Xv:^X(XL&Xj> stream x\[~W#~贛wX/`" *Xa(+7ia3pnn(%&pSzs= QBւ1`xY'EE۝tptㆉ4 x/>{$\x]$%GK8 fqVw`|4^ʒ`TX mQ3eŕ@-Qb# 4E< ; $Ge5a=c-t# -p5 8YbRp9F?x5JwO$^IeBZz ^{]fcx; F18qZ[`/3GH5O8:>IF4O^]S73qA ZhQF>DQ^%:Ym5_=/jps2`ڐ W d)+z5-eY2@ĶvxC_0NLXE 5YOfأ ]bTھv&31gl3D(R%~[n@9 usD^P<\P7nrܬw$_}AyD y7#YB;9omsSD mk-lyg>^'@l%uoXb~ȅhSH /r!+|6-$VW4Cq%:ĥh eK 9(?iH L{f 퓃}+8byfg'ѭbQ@R[˓,b{f%*N`X=|[o-[u<R7qƶFEH'-YpUһ*فVXMiO)-#[ ]i}.R+^n#ZM~'vS!ƸU ՘f$kRE-^wi9vuD-'s/A Iϔ$ %)olcDRY6"Ndocъ$6f@pg\- ޢ pAGk줣X(כ?qlAF=Z[-"5Eӫ_fk`d="")e:~0}b>Z`rmF@Bcp;nPe@4* 6Y}[:{ 0t2)03 %Rl5,+Y<|;~W @_/x BlTE"ڍh@9->]%ƲlC^*] m`O̾UZo,\؄9 ޭ|Qi;`?%ۼECF>VS _b (K 2{Vh;Ďa{#(E{ove@@/ij؆Rc嗭 OK6+r~+"F!'" Fn'Q| Kd¬ ucwb ʭgvX 86ablܐ/P=%"]ej yA 3D,^X53e%YkH͌N;#.(d~.FO(b0"BH传u|k?E`XP;::pYgX--BRXs=*EY~X5).gWlWMmV**snɭj`ux^3c`K8({HVSTDT)E+Dí]֏;{[qMni!𥉉-,ܹ/V963,u`-p״'1oy| ZXW,_ˢ/&}Ji., ~ hʫf;Eם}[փ*R{t&~םm'5hdwo:i1ӻFwp_wyaܺbXreh&\t ,V?0ڼ>hf;˯ xi[_5w&|zV) )pbcm*{Ub澄v]x-۰p,ڨvͅ@w ]DNR*UEkDH}_-o2ҷZjqΤ3myVTzm꾰D}eu.ln%uhwZa XФpÄe]ʋ$_$.0n, aYy_LY=X9xCv* _At|4vF~mXh#8 bYH^ ׬ %@~>>-I7JZxE#G%0%&w/zE*2{4PSp`^Bl~E8Fa*0TFe] Q60 dkZm%~ORk bf?pem/y""5=^:D0=v"jV;~$?1eb M}UVi,G4Qlc>;@0 } brݕַ4V1l_҈D9ou*6A}s >X\jR?,wvvsTƬ$Q@(|%ijI*%uq[Q5y^JZrr 2/3.wsmQ&`d%ۡl=$|zRWQDP~έw0!‚ qDrW591ٔo^Q.XѨ.޶6IǢ`τX!?؋BSPAPeE$ ߸pXmxYYgqPp+. Uk54qkJi TmhzY z#Z}qaJ\E Z;h*},G~tnS.?R͂Ƹf/Dk/ X x2֒id:N}endstream endobj 409 0 obj << /Filter /FlateDecode /Length 20216 >> stream x[&$^'$0uc]`f0 vz4ZY%uIݳ_nn FfMj4O ?o鿿_?/KKϗ깿_Jy;xxˣ/~vw8FM?_/H6i_7nz}O6Oןſƿ tݻ/oMo^Z)/):j^ߗoR>_W_O?8^,+=o'|巜߷_Xf~J~-[n魷kCn[!NzZzWzۗ]+ccu(e_מmԲxkWvxW%-o-*wfw6aK}6]o,]7XvU:c_Y6)ms66ϖ[;oX:fgkQ/u[v浴R]Wޒ8k;\eg}ڒ3;J{&ҳ׷c&P~p ζ!?@kc)mzmɮ7obV~mr#QE3| ؗ_+4w z+mG  ?1mG)fpv^`}~~VeWnuxjuiʇ}c3m{3n5I+~Ԝ c_(?SS`3-o6|oQm"]lNck~'nsceFovI6n>߭;пV͖uh>eg܆mS_wzPGۼl8ȯb&kJmBo\cKU Ȗ̼1Ik_v>r}Sޮcp·y.(swo)~{/\__#LQ_ڎl|k;|l>ar^yxo'6IYR>U9l%Pb*ʗ굡39.C g\0yس5-ߦlŦxFon,3h>lXyg~߱aj)V.7mE~H6n~zn^凥,s;s5YalhLsm~tfW`1ӾZyKoxv^6XP<[놩6;*3U_oXmfۙ֫~:lLG6S"Yw~; SU7#;caޣ~s_wɪ5iϾ$wvkPScS<1CIuX+[&on3\6p:L7ϯv /DiVQc+,k*|baYSnuk>(R%7-Y>Eᴥ d |9xk:}ײy4d˩Hey[Ndy Tw\?r_ ![tXیj/4?lWz>SC?C'x,O `|ӷ׿7&?s>qzA{_ IְdyY??;>~es;z4ԁ9 fjͧ~~[͒8ҙ+-rrK6y84- ECFls '-/o[봨8]"2l妅IΪ-UNsud0'Z|LKZ h-9ϻL1 oz4.4 Ml4yG kdaր{9=2/(WϏc_gu^*rTNZJOXsU5Eei>T45-|zGx/kמlDK6Χ1 bCMsS &9ɫyؿC ?NWf[lu.mÑ/Xo> Q>hZusƗTuC>Vi[*-CVݒ8U3\{I gnFdlkZq ln:reob jl/x!,krÉ. =lf^,4L૬֫~akZ զiSi|^6Qu慆 LmP$k;3o02.!j1dF&~p2 &Ccm/̫i|^ȷ1= @ ;]->Oi3~B`DqK4ѫ?\1,rb_.Y3n)lkAsO2TOq !_6pq C8)\v +WΗ ]ZbRׅo-)I|\UhIwkqIf -2x j ZnDbwMKY̒y|/7t_OzfFnU;fIr :&"UDqD9`X+5yk w*raDɗWV],_My8g:z}5'.'ڦC_mh20^6 &e}@Z!n8aeK3*]'vUk83seGV<Η' X|Ϙ}-Pm ~;%lGt[5;o* A?0ÂP/焂SY/a3Ͼžܪ]|5_Ouda&Çj2-WD !C&Y|=g:S$Z|X+,ip^a[-~JX3-[i9}w9:\;!ԇewzEL] y$͉=-' Z'L8i+`ag>Bw  UG+CJzp]H2}FO37#G؜VA,'+O&wMxWQ'4IC% 7ڻ {{,r{wqU WMh\|n3O7ڳX+_='݀Cq\p_Ow+fnnhLp|N_4I"3gp|Čs{^֊x:'U)=`K({jsh w&pl€{uމ,u?މi|6z (!@=L\W [j>"̇iBw%mLwA}@IA*l!g8Ish\E\G=A_mp`}F/R=|Ԗ/1}huwN:"|apN9|6Jz@3b>$xua u1~r }g%e r u|* A[8 F(A-"!j!ă :p? wVa[ V A-i~0-BShBE-$ Y 7JpcUaiܿ)E @P.mjqm<q;OO=oO=]ᗇ]驧K--pQ#/([Quvcn9ߎYun8t|乇nOGQh#8zf9~z憟 ? pu/.`xݸ񌱤&2>^lucQPE^luc"Su#fVQV qYp)YpM0  #b'hYGC^w~/k=]S ?ܽ2Ț^wFY c]0IT^tucfX67F.aݸEG2n{n7xQGYk "Ξv}n7,rv(?nr3F~X8n\c+ @m+Л|lz8Ý]ҥ Wp )B鮘~ėF(\lFZ{WiSnXiq6*`ILk+"tt/(҂su= {qh10$|vs6miq&aa:fnUG:f9,,"9naOY>_:fm"$1Yfpzr1[.CZ,VgL,Zmd !']v 6K8 Wm8<q1np8*o+8K.݈hV |ɞQ@ nq9-^}Z0ֿW/ ٨zo_\`u{G}btZm9"+Kϗ<~ ?D}vKM>n8.XpLˤ/=xY|-G,nt:nÕg lJ 6Z|)FQQ'E\4Hߠ!lkYN`Ilg^ Q`K?U3yIs`qZ?RNnlvq:4Kw gXtˤ,_mQ06S>8͢%}SY)nx-PRp >+a~70.=48pq$df@`*Y4N7YtCy]e̫~aS6 2 u NS\xfŵ/?{[9ypdLaT&|oiE  oΙ7(jɾrSIZ.Z,<\w1+yY7w 3m>of # w^̇8 ԓ1 X +>8QOf)Nn8],'-|sGK>II5r׮6!!jC)Y䆉Yη4x5=wc 6Ňݍ9ݘOёFr@ͬr@].Si~fn~YnC~VY+GE!m+I}&ж$Ⳮ߶Qh_~ڙt|@^(]}ţ0оQh"am2о( 8pv/Կ?[~O+tgwsw?W8~;O>ym_7<.>v!٥o .@~i'y]{$Y;p΅ma<6;$.} j$(9m/+d@xp6$T=<#?y`u0U ,偶 X߱Ib7-1T6mP~vtT!c%O[= j>vf~:rnՐ϶7]-;~rɎJ@Bm!:Юآ|pC@X>;; vUW@XҎŁ ek=6Hh[~نx#aL%qm3āu/Łuā5|vg~Kumt*f|.I@)G熼U`sK[XG-n\ؙҹo"]ŮkMѹ6sK&\HNf࣫9hDG$b ^BAsHG疲ѹtLE:$BOtn  'xX9ԍ|HM HcC;#h[4vkح [褝nm حiHc9VU[Wvv>*v+qt9c%6p)*%9]1IaW|F*QU[vk!-?VRPPΓ5\$ ZL/']A%q=2nv;g?h+s&E vY 7 F3`G^>Er v$] `WNkb %`DJ]b3KK<ȥ`W@z&m29C+J vVCNb'qt1 (Â/B|f'r9 8® L3dw&]7 ;Rؕr D) 9B_@8pMGAn$Dr7{\q0!TsH](>u~N"%`#_%'jI$ BA`0Sҥh"U 1EUϕ0گ)U?2G7S"v9d#D & i񼑿5jiS7u,$}7UZkzί*ADΓ䕽K,5^t){]͓uXu4; {#ƙuN@M׹):dR"@>.KC:*^TZe"ے*w7^#}!<">K&yc rK_ "Ah8T:ʑnͅuF4t|EG :I]WMj~s 'wqm׭#yfy9D^ǜW%g׭iH^iDUD$$[Fuun@Fy"&4[KCeȊniRqy~p%w;$:w% %q׹sCcukry nMq4s ]4+w1!wתtHCG:ory.wݍn⮻;S A!聠8P8󎩔8 !.w|38/AA=qޡ9yGЃOwL z8g4JaA;j;Dyλ-l"wT28N83B1a!ywI_0oZal/n7["@A>q|zXVrH5zzn!"+pӫU:yN&yfSq^A34*EW23/K78pfZa~G8_U\>B-F8yh¼v*M:Z j@yc~7T^< uxʽ0EzEz%gz؅Ry=d1@ϙeWI#Vz^ZIIHY` ,^ =_XHoYHmWW*s62F(+(* 7z'Ի*?D$wz> H!!wzN |RLwzxPP@Z<#=^$z zCiP߀z ?%Q2vxp#bg*^NǍRO@xYz77=DeI/wM&ùUַ>)̾+&.Wm7ˡ;]6tAK,K Ien |#.Kw(& |'F |w7Eـ!ֲjz!'NX/`/3Wш1OBPq<(;G#0xػ.8^ΐR Уys*ccr//ZTuR63,?ܲjQ35 35.CW-*wr%mAȻzxBByW @y ۅ3k,P#w؇ C#<8\=jya+]8\om.XKr 5V!*{( k5@x@/ @YfkX^C#6Ҩx="yN17S6^)@xmD;^&CC-JNcP"wZ岿!^kYU@<*r(,jQ9rZҞZT~k0Z'«h<0BUART5]Vt[ "`%Y"}z̃散EPP~ ޕcf"p,*ޒ% %C#N9%+郀w&tP:F'P!g ! 'ow3;<4'xΪfxHfP |"[⻻Sݑwe@g#)»|wPnswWxǕP^vJ;$)8rݝ/tmyU" CyGUR"C>RtCN4w0U #6z0lafv'FUq+6۹6û9=n~r [G9XOY/`(wK *[|: *@KcC ~ Q*H, Fa<5̒-Ԋ:SpHJVgPr | rJQ\xFzXpy`P||hZd▃WNT,:Rp&ßjhQ>j\|3~iiu̠< D~>䬧)>۸sn`LʸoCVcƫ_W?; njI 58): yaR+8_)c/h@yRzfŨT*u\zCu]sc.rc |Qv[)cVfh ٱ ˎ9aKv"r$l|Pd c:X!cV!A6y%}1dͅIߙt,MIwVgC]7ɎU8UnTKȎ@ {\c^ ItQv sX1?NɎ9lcygRBNc2%e*nqWQv _Eٱ1R8sݱKP y2_N1+Ǫ[x̽zcc1}5r*U\~ǬxWh}qzeD1`mcR+Iy Qzq%z$=a/đ(F1Ǖ*y_QJc>KUz. 7-0o$=f#d(= G\IF4߅ؽc5Z(E ZdT2ɔ*c4('1HcܯclR'c*)R M :9cy ̢6< __3%tbi:Ǽx#F'P}`sNRe|"m/ؽK Prqi 񱻚|F1Y#;P.K*5%;j&Twƒ?Ruk+|sR΢aT@u2*y~[-鱂zcޙ_$=t1I#3jn1P0ǼJ[ZTc^fI{-s5(>cIJcRh.| PMcuj$]€3px&6k)?浔|̞?[>hɏy?v\VzYTӲ\ %UXT!61,k* -²K^V/+XA5[~́E~-i$5MZ²$Hi,²&¦k"YD*h)OajuEل3_^~^.oQkcDl_nG,le;;`=Ra9* ? pw^ k D.=$j!cO:¶UVaG}Q lg~ ]ֽW> mO^;U> ˏa;@S(ސW< +¶M/V_ ˏa+A*#E~緩2ew`_k[v8ePlpFj 2+wP+e50}żs[v(;(j~o[E~8Gl b^e  #Ďv];Ƌy%ڱQ- -Nm[sgp,8HK2ַ=Q uvUoCkػ=:m)nq*R: ^nm`uk`ۦyy?o7Ȑ8!-/%vTفGbP׶/-tՇ4./7xfG(M#l'iM#Y[~GP~S~ aޤAx ՗`'Y)稓l*Xu²ݩn hx?4eI% %մ,t;}I5-KʺNm`8]Q!EtSG|槒WXpenFeX-mv{h!>;Q`NM0 ] |%FCb$APV֯F0a_BnyA1h&`,n8VAtwE \dt˱zN/%1.qXݒ}g>W"AU,-P̓p(=%Zx[N"2 .R1 G&$}RŻ1 fܸN|\LR"#*Ts. w.\bp f ,>ԃ\upVx[Da\ڂ\s#`FSZ`M>K. ~lĉKf!z2q #\l%~'`3/  q fp5soehVՕKj'LTV.b'%VV.AKsƻ% G0q :> z;GdV_82AJPɉM UU*``)O. Ԣ;E(q!C*f$tj flpt*&0̙TP'`.xR[2,q,1 f\:W&;\`U L$ts%̸V"`nDV$ ̌+U|ԼJvMv{2 o)`t/I0$h WI>Q%&ABl0 zIйħL$/Y$"ܧhR5H$|g3",Ӧ]+U|m6 ` t`ѵʂe4$tF953.>8$Tu}˸-W &!`IE%xڢtj=3HQ8J }̠:W*!-+Y|5R fp*C`vJ 2 .og,Jw z6E&[5"t D&AϘ:Op; z,!*>A'iD1OBe,P0O ̓&W zTs z s ı aOOr<^ogKD{[e"٭@{}⢀{s=M,Ϟ$k6zbO%dM p~ MS@ˀ{w{3 Xn׉!^)0az%{cz}[3 #$YbzywQo wg@UBz3 'Л2b¼;Vgh0ny8V{z`HDh/Ob¼]:<FUS:¼"|< :<p Yi/'0wױb<*gl,b<;"Ƴ4LFg?2;zp"qk;pG#@x6y giJa(xلډ^_>+ļ= d'}(/.`6v'ѝ4ٛ%2ͻ;ca3ݴ@x"t sN%-`L(2dn0]xz S2?xe``<4̈́ =7Û #}ha<s WF ta@w/s+| ٍ)9]ٍ)4nwp; &h75]vq.vnh7BmBb͜'!=]FnjDw8˪{z}tc=%tjDw MrDwX٦U̷V= 92R;cxqڪ枠fAZLbx8$ep^p~opy 4cxӢr0# ZV=~JvBe!tΈiH:WD;r^G o "UϷ0bx83s=bxyj+0zC~[)E v4N3<8I LK?7@qU܎ TҲȃpD#멅,@^/\165„:[,xIb!\`GraDzȁn5z튭a=Eֻ8ޒX!?EqAa=D9M a.Ow0k~F:C<X&z`aC((#!Fu`>f`o^0Q^=ߥȖŗ ­5-k8*UC! R:!P؋af snf4>cKj`ŲZfi >[#}0Z.) iQ_"ya}D}07PH`|4|*Y|\Ҩ*ƳwIli,Ƀ%By\ZI,!#y8s գ$j/:Ēs˵ʃy_Ey0EE.ʃ-)y5gʃy(Ey>2LvHʃ1֒`fq360$fǪ ( f^"e0Ee0lÇtvPe`fɡKFe0 e05dž2_,MwQ̊X` NCe0j)*h2-*URreoe0;'e])@Q}Ja(e4|ʲ2UҴv e0_;2XFRJ`9SvN` AI̛x`(&i0+a<(iaǯE`VDm0keت b\QK&iِ E iygQ G`tCɲ6;G}JPI`56Z(`Eq0w_,Ct$u0씞:KCƠkPG.e(f(kL@/jل mxBᡥs?0gq:cF8Cc4r4Cg I+A(q:c )1=8pYs"8m8`*I,:l`K:SxR _h:XR`_,ɔ:~.LaGq0ϤR`9&2Y.=Ҹ:SʪvGC@`丨#m:ǭEu0PJ`f`cB7ɃRCI`L<R;T+`f9$vUbgT`Pu>7Rл%u`[H cJ!l|czuRD͡Ƹ5{<̆aV@np0Fi(G5+ XP`V`<8K`(y07 %fdI,ct4q,$y;`>JX'}0YG9yHX0j"?4y(컵2_7X ǩn};8Tr 1Ӳ6ВjZTu-[!ϓG 4S&WH#)^aYa 5,kYXD*h)O`XI&u0lXFSj>wS{%OjC2l^p ~冗`l4 [~Yލ Zdp#=fK 04|uu5[^Q/ﰠE_]c^5nCP-r^w_lz-Gؓow>  wo}dIY뿾5㜥d9wŝ˓H^t),^Wmiixx!пz};kxU'!r+򳑮/Vnt0w5UUR?bw z{43-.Y|A2WYR_m-weso8C*jxp(yTa(xaHn.Y3.Y[=89"^Id[uAos gta⥞lqku?(IsbFh/JKD̛eͿ_ЬC>ID1`m̱~3*Si6<Ejӹ=5uDG{a,/n?k;ۇCr{r'ʳN.Cam?>[?~c2&͈jKʯ?'w+lnka e89tU;-+VF_fqloqݣ?הur1sGUQ~Pxs^5"#uD b1NWl} [¯}XYvn}^gz0t{Pܕ{kF 1 -q5~ nkw-Q\s ~䧎CzEO;q1b]?S[>X>Kn:O^5/HPendstream endobj 410 0 obj << /Filter /FlateDecode /Length 6621 >> stream x]K7rsu/e{64؈=pe^Ȗ%:3&řiÇ(;3(ɕbQx&22x2Od?Nvw݃$uqsGP@ړ0 =z ~(NR7IeN<~<)D 7ӿ?'AJDu^l%fC.Mwj&k{ˤ.) )No0tjVTBf` gެ8pkN0[ɯHd0ګ@mpҲw?)PUԸ` Ӯ§t秋:?MwUFJxvQ. Sx ~( GhEfqtab,(Z}n#vL> *@HZa" [QGArU{6J*}U`>b'&]^KOM`Ct,Q)CL[To 6Gpn,g9!z;P2a#{KXlw{23 }Z~olbuC-W/p#g}ǼSPk^&r&bRZs(U8 8 -;"e]Tg[+DIsPsWi|]" 2dBzAJ]WG9Ğ -k6tJ-a考z40+_lUsD^zl!"6XA>֌Xvaf;5 G_G5uӬ}ڔ+]$ @#@R(mg i*XҾa;`Vh?ɢK kxpVS)^\4R+yr+@BY wj no|(C+̇mG1:lsF5HO%xrSsYOReoYք-Hu'eE@p={W"Jrjdnыw6. *m Tn%Ĭ G.eK C>Gb2J+ yWxtTr-ԭo6X|p$d4$K449I r!L)f;{c6 pwQ=6j*"W@sD`ü{VDtɤJӓS, hBOA,r5FK SUHFctf9zll[^3. {3G&V^\>LKlF(u06>pNwlۊfF5޸amWD«T~`+_zB8Wg{UQy 7Ick]o>etJlvJ-Lll4;&Xj1Рځ:$+G){`,MASPiʰp@{lFK%qXW?&u|̉(  /c xAhm#"}Aƨ5ʺ8!vXbVF?*̊o ޺&# k"Iq>,2 =FCP` C,/bqxLfVQBAhU)U/T2x,UK*WÕXeL1JPa}R3n. [77YMZi,AbOI^4RXp[rm9 ?0A 1I\93-3L/sig# L0 WR;_(Aⅶ [vtQ~~+.GQsFsTٚe1\t%S0-q+7 ǍϘ&Fgl3D&\aHJ<=-DiuJ 7;p˂ďaǝPR5@6ڡ₂ mSHzLYd2f @읓/X^k,,ûeԚ(-Hvig12an2fytN۞q<ҰA zW @޽8`8jd}OO_uʝӗոr Uq{êtˑ7<ŕ@V/LR62"iwHWڧ*Ӱx%v,GA{P\Hx,ladhЈ(E0)nt/pD|{EY Sۺ9-MѢY6K9K@*~A)Q~l45T!Lp YTsLi 4:E̅OQZD1]6g)Q6X/b|f"I&Z^H Y}ě>L{6g }>lAJjUhRhQ7H5g-mZ 4ֈun\jqyFdA M|BbHu͓yA~E,\tیfaM+Q 1x3[*e2[jPe㧱0R*Q-[VeT aͤj(x by9ј\X54GCVbz 'OGؽR` }9P VXPC:D=!>szC8e*gTdr% :O]kk 7&to]ڳeKgؓ*AF*Gɢ)|YQ8Zk!gEr,n"_g50?};O# wvao[0(Z}0i*-~Mt':}=Pv֪ `TO.2zԀfaAt&"J2ք]qɎE=fn#ҘS.k0lRzuINO$!Vp3{bn!f«RwAOnz^[by;Wױv9noXiI9g^={}E^zXB0@ "7뙎}a" (+-haʐ%gSFSAlC/n@,(_$c`|,i"&6B9'|똲FR>9 $.`aHhe&KMmɯPd֧2nZ ؉\0{ϑǣ&Ji0bRŴIIxF^:0 olF{bҞ%*D^X/6@e"2V^nYoOI(hlw! \hZVl㝻Iu̦7$"/p׳i<9çNN`dthwFgfnan>th2U^SBs e%eMvD8^x"cQ!Fm#صj(Us8``?tMh~ =)iPyNrJr/@̭6DpY"8MYaV[vTWLvD"Ym| 6tlٶx$G hRSˤ^tE^Hڍ`FQA~<8V`0[@v=Uq>`0Ht%l8Pyr&yH.zD"AN]pHe9;R9rd]Sdv@ "Xx?7Վ<7s`,3:-8};$SQ6M $R6β0_ӿe:zƨ[HT¸s,4~I:c%#>o' aG(?TTD4nPr2Z8@֘OD}qSjx f`Wۗ%B3N J0]ҧa -pıb`w_"H+)CigĴQ|e8Y\S`"HVq,r.k~ i=J<ΈY> Ӭ5R]qz-R]<#ĔPB)wctZ 3ȃ ]*@a4;s=0+Gc?yˠ[.`I}INRb,2a+]0UҢ:fg_WC,٩fX&]F?rZ١H*% ,s4%@{yyQv%G@݅i-eё:jiX?ʋlq\5̉,QGWcu1U^G*0`6ˌ d̄=MG?Ȩڵ+dw .ysTDvy*"8ZLJ/lhK"҅E;n< 35t1k-VSfP9;`/`OW6Ug3r dGW`lEm$ϡw0ۇx8)|?ӛȔ$'LGhuA$Ŵ\m>VTPXRQ Gv+O垾?}ٿ:lSʯ:}]/.:nMtשl;*>[37/vAjP`z 8U!W/kїM,U#)rҧXz%9sendstream endobj 411 0 obj << /Filter /FlateDecode /Length 5173 >> stream x<ێ7r} 6@iIyƱ;H *gZ~>U,6YdF0T6Y4 g/莮nMGW~z$GˣOaGa ^>őPjtYFG1̯Q914v2ó4iBd_p ' Z뇟a鵴v*l[CI LY'p' 5gxc&89MF| jxCpe~?O 0fǘ0F 4M?6n51L)`4bP KaO>*09*uFmP!2'I ºa,-ϷO . q!c `;x&NZAc0Fux2 UjpT 4!(g'kEz ,pd3\F^EIhuosZ*^l9MA@Kz0A80gbŬN<*>903JtP k4VpE9"L'|Xx I/i5e*O<c d,p| wi1xV`"V:2TB^挢~v߳uB:i BiԯLL"{ gtT#.z6cK" ҭF1Q r"Ikͪ|E@&we(I $B1pxn tKb<]-zAv&  1gg M YYO0HHo` +#x:$rz jB2žaNxT^ÞvX]e:o*"^@)D p f.6YȣgyңRN?t|wyoȿZ s}!Y^c:UP{׌٧xs 0Zw Sl̖pL@hvܗ|#ceU+81,lpuMbvwh~S67 ߪϺ Dҷik5>0>(lăi%"qԝVTͣ1Rḥ<<:;zY<eμ}wN:vN^uLY"[+{[^"vF>LY!u/vO:]ĬRR tQ0 WqF%,HOB}!:&:HliG F1o>%0 P=oĂj(x۵qp/.Т$΀i䨌t6?eD4X`@l`-S 'p蘒E4`'%칶]2Qj]r=}dadsBqOkF䌀_%VD,@. ,VTy#x`b2WsZ35,_ˌqJ֌dBO mMq%@Gyym_cLk oOkF8QȮrOŖQQvIǺ̝U^t~혅M.VXb/[޸Q}S,SƍA؍ s >3rpsW9,s[)Dۀ]B'wp#B[ "`q0&kT22\ n[~3\9^w7F9d2LU <2ctb`DŽGxڦK4&sMϭ~k#,eUr !,}̴rDک Tm xwcdH,KHk pVxզhrҰ3= ̘)I2ڀי`k) @@sW=wP ta:ϝ|bI}~8ofWƐ1\֢"6Wqp||Voqg@ͭMÎ趂YȥkݟK  ,o~ 7y|j]Z&=|_'e`zO%Dݢ|Sh@MUӤW*g?Cd#@|l#MBpl0B@dx)%,3 ]bc29߄Of/&M%g`ÂX̑ɬ{oOmZ3 zƄ~]k[Ӟs:,بI٢x pD*XF(*#Mm< #~^9!3:yb8}YFQBl-xLndnhD-H@X9K|VQ/p5C\O?̺`V\?tnB{EVY Jl,@ |èK6Ň{v;I尡Su<<+5%h1M-}ّG).;HRU)zun-N@;Ui wZ/F߈b)K0i.Z_a>xwdE}u( ']rIvߌK\Rg./ރ{R3GAˠ,GQTnR5hx׋YD4}1KS=(UucyNf5]'Ez2TߕZ#6ImQị́e(ycMyMdS"@ aQOpuc\=5,(;)*;KyKT@yCa$F!կ)Lx*LH,XFQ>ޯ.^*&Uj[Fs>/U(8F2۸̚%k},V2:+uFכD 9zD r&e늗B( 犀 (!&j M@=+|vSn`0d퇙T$&U#0#lW6DUtt^T5 f\bBXmjZcX&N^fm(/J[uGEN6aV.lމu(-c<wMirmʒ;cnԲ0t[uH֗u )\'`9=O9p[( ViEkRU̽_8<(:HVtE;}R\mF6\BGs) Uôh.%{6u]uU~i.O#kV g uԽh!r8 թ)*5UyHJ߂}L]ߏzGjl^V D{T)5#Y]$M= x@"=vVA_ٌQd!ŋN6 h8 _Ė77"r&s|]ng(;$JlѭoDH0<]+)^#" /nW%8de~(+=8QY/ L_ۀf9֕"HUWg7K ԟ &n [Պ03-nF1x9/B LEXh42)Quav]Y1ٺbNj7;Sy.׵ F1%X0]%[IŌ7M,16EG%嵚 iASDw$TlgmE@)5+,6bN.ST?{>y‰oi]=F,O>k'Bnu P}$I~IU-Zڦa kZ9i{?sl9S/^[oɬ!_WUWe~X'7T,> SU9aZpFlRy6ڴђ֧y0*+F>PtaLtFl1@.w-5?B(*\L"6> stream x\Iu#|'G̱ہ.8‡!Dq![VP Gc0Lp_[2_fW 5Y-?I(սǓ7彟iIϠ 'ysOS$8O^q<%6O;5uzJo$n!g)tI7tZSç O_wet 'ot6Gl]6NͿ[O[ԧYx´Oaicvgv76g5,aagߵ[\&i8;1)De8i2:4LxmVo;,ݼno8R1ns痢ݜ.O>ŝ%8cajt t"LyGj jaUl7)d# O,gIQs|^TI@k rMHta;/a-eԗ{){l}kZsCGЏ?W-pPBXyc"2`(41 MGqlb sdHxߴUQ l+I87'MhrzĀâJԧmJ8|fÞ }/KK!TZk|Ŋ40x&5K%?z2FS4&TLdh"p0S{Nza;-9YlJm09ܙj/0Tvߑ :_14vnM%lK]ҁԮ˥kO@!Gm|+ @'@2ŔO;;9 Rq{ +E[5<dmNgm +\6-Cb.G@DI~: #>A 3#tcf_0RWV9ĸp-F 0$\xKV )7+hI#”Ӣv̮qWYHKW~8ڀfԮAJ,N Pi$ӯ%Ȱ|>vZIOXFlvCOHa)㞖4 ?_8M,Rx/bjdyeϜx"0]GZ!搗L؛h`#ɘh[Ԫ\a?⬠YS-Nҁ–&i_!i $5/08jd0ܲz_([,|g ]="Ļ$+@g60Y O<&M=wiX_UYv9sJ\Dy$;Y 0rRۊG?{p7_ʎX # >) }C_Uq ijgfW%0*GwSW@RmW3&`r[g̃~ J|ŠVSDMwd:'}wEUUYYr{x'ў:F1HebZѣ3OwW}XIZ_^ǵ s ߴ)IEIqA{c;n+Kb`KtAIWm .Mxr8U6U 9<8-[܋ lձSi؉P&Ʈg'eخQ!@.Ό* -8`$̅6"Uy 2Kd%'~)U+:wpLpr >;,9н]t >sB rV/+nH y?6jJWrRM遮Rj: V"Řw$. h7$_k$xD!2#惨VhN6?Hvf7ߣr,E9b_ q>s'[Q`z) KFo(ϪX7F*rKx/q m4OLW< nc1d/8 \AXDAEi9X`ܤgڠrsT3]ϱS[.VZն䎿!D2?R׸F;\*\”CH3~ZV{d({;PA}Z#Yb(~r'3_N5xR A ]YOX 9 ?LiG BTA)Z_H$/`oiBcυ3]#]a~͖b;.93Ą 9ߟIh%"b3W)caخirlYryY*n@q@}0FȇFEuvt.侤E({7Tqߔa"8_!=H ĢW6KF.m)#?:YߵЦ1E3`R׌e89=A*RZ*tQ65a3J/H[MJO1@?vDdb{bg'֌'Nncd AY=J3Pd~'u>bAF6vQx;ncͶ9~ҍQ#MF(H1>9YaEO5%SA2'Q0[gRXO+^"Xf@ -A=@A]̺5eNiN 1=.cdv"8Q\)BE]V|^Xcb/:c`Υ\2]4$AEui Aʱi=fgǓe_ Ucsw2AM35҅.˨ŅT]sC؀;ɹ h{pfA~!ISY@qA1i%f5] Dg| *h[\A 5~VJ A#`9 @soB$Jj@sH$` Fz/I'i}86rDRcFP7YWbk^pC}~l-UfPY멢OX YyA5 ) 1Eڝ>&L3^Q~tFe"nUXάKQ5L\QBaY O(LJay-5g1zagUCxyɈ?)#.`+c+ő& =-VbXy0[vy>:x('κ|G-:8^$55&˞9y 3Haiʭa؜u}(@aC4QG/\͕p0t@[µSyM ,}7E"pPn  0Ct߰GA)POayŁʛKvӰ8w#]8@7[JUiD0/n v%X03w0720FgrE,okjDsY *yjpP"`ziu|}232|ݻρ)tK +uACW-V\|Nw`͝+BblhOU4tx =%Xq}_uog!Y/U[1ۊdl(!o_v@+/ͳYηKm>ŬFxqqqcu;gyZ5Hi~:4|YCnjn uG裰q._H6@VW/$j&Dm)g!ޏ"ϤPGG[p`Р='פq_eTTQ}g%3Y8ODJ P__i:K .2$+n>wm-GhHWvKGCPƗWОX;r]e1MH]Zͷ}Jk6F(bi5irhfohjPonl_X魁S?J#Dq٩IrQQP(-KY+ mQ܄?Fܛ29. wm[g_oԒ'߽kx⾮6VJ[z!|j) *$ł`tx^8hSZ@C%9 FiHpZ05 IDŽK=JPzAP~`ijg(^?.z2>L;БiҮR6F"Rd RhIODRު-/U[745#>KK^̻\:gqwDD` s}8g )W3X9e~|LċKl 13ҹlHӱ6Xa+#~.doxge}sq G}=q癠L j>Ұus|#%[ew}`šw9Y"6BN_`"?t1Ah&+#& _4JM¥.)w]rr쫅i$yx 82zmo'.f.屌c&z*AO'B\DzŠ(y&ZKB$SLjɒ7hpNl7RwۏBdrcz ,귢ʱ @4*i;_nVꓬY_&";)1Yp$Ij[ K5 nLؼ6mK9(ooysea$5,z״4:(Z gD*'h=ʝ%h] &UWT #z~/R 16An%>HG7vM D>N,6Y֔KQ_&20 o cc}iX%Z_ZqjtW{$16!644llDM > stream x\YG~0Otۀx 4xaz=?R*+S]5G ?Yy(O'8<_'p@n8ǯq^RѻpG~~YA)~[McrjCH8&Ji ~ڠv+6(s{yJ9XRvNqx Y1z8])?aV G4C7_4jWkM}>m]8?OʀlAK?X *!"lbZ~PaE%^^n\' 9wz:A^c|Î_YuKQp9x١i9 y# VExH,S|Qq oFpj= 02 z,y}Y's`H haO8"T!>{/蟿U)Mwb. ]JNٮoWjLt`_0D%W޲4* ..3(3qUF옎 ,ngvG;ǀ}pZ౲dts%oeF|74Kҹ2kTړC >5*&&`TJ3ٗP6,O^$&:i턕|/rj4C,'8HJhe02=N"1S̳!1;qIzc޳])Ӭ} %}Ừ>yoSdFX0gK! j=91 Uxfs̽ʬmN*ȝSD)S<#f(NrƔJip"鲩؋1 e1ꋘ&D;; cvItvCmZeLĆj sS֫[ff[ y\в+X9jꩇo8TT X!Bej* 0~XSęXc{x1ˍDL$ǖ̫pnHcmvbMYлsI)'$NsV <\w%6" SH h^\'m?U!ʜ+gY7Rƒ :})@-ejyZcz-3PGdb ˦k>K+:cq/@YNAhC"BD"\m^쉇l5gy,Tjr]pg1%'OI.gNm2܉)t]LXHmmJ\MI26=L}tyYǮA Ao[&{H֞-Y( .{{o߰Ó\κlzHܜc~y(#"YS–>YW(λCC7_!+ORD={Igznqu[~KW#7Uop)5eK: eK["MЅ&z_ VbZdBG&om%$Yw +{b,~(+uܶ,uӁM-& # Z|9kDI$+J4wN:9aY`қ)Ba(b<WȺPN؎ ߴ 0_FD U*f"ݭ˃L̀m vy"؃v7/BמLy[e~OхLn>J^dY7vc+Y\(s zWdοq.2 KUG WJ)'":lH$8OZ^bwdms;j 3~X٭؃紟u6J}YLVgYKprˢSG_M5HMiDz5c[xxP:=Nא R}bWp[)΅aҔ"m55 )f> #p5 /:|~s@t#_O%)H]Mٍ:9|Sr)A'DXRC2˼M8e2Y HR&O)1^K~} ٣"S`Q~;5W2}O74m'465X5 Q!unj䂣TU]E:~ۇ76Y2jk_%ּtڱO1i{i6k5'r6 Wy;k!>Ror|彾?i\BN;2J9G 2*弢2{}~D-R{*:+%C0͓HbI;$ apBRZ*-X$L~MF`1\:1W52Yʍ H}ƿiѩu_=XkR]?Ҙg n FsIP,D5?ąZ\H,% @,T"zV:wh.ےUWW>ph9[Ad,k`5Bp4i$ L "zrxendstream endobj 414 0 obj << /Filter /FlateDecode /Length 4386 >> stream x[Ms#Xd6]C7:V;XSØ(ڔV()|3.EŇ\b@nj=?M=*/cm&t|O}?|"lc\]ΛjM_(6qt:N0^9GcxVoWzhU +664\PeqyX9;hIY8\UmpɣcN)98(esy/k<͢6>Ycy, 098L)irqqc|YOy\(ͪ55=ZlHd(}[P&!haEOӲϋsc,f_k !axO|i󤘤-'ec}:=<-4>o_x呡eZo ѧeBڡF*هnQh4E)Tu {CYMѓjlH ނlg6' b{I$'rt9:k;abTVxR aCnrJ xƚEY[~묪[U8f/ƂJrԬIE5b&Bnĺߛ{~<::g2\\iRҒh e}FT0iWhrQ(VJwV3׋Uk~O/ܔ38Z!n󜊝&{<30W|~`/AA4hR&|l&.K#(DWZM.̞BGFɒDPU [p>HڴF<~b@Fs9~")XPZZytROɧ}Hu SprUʺ]%)1tQ%ɊL$2k٨6D;O$FLdTIKQ |#%SґhQmңHpĪd~+1-$AZcA#d4`[T~")Pmlm"g^nSCmd[]P^SMynPnlIPj=\꠹Vyߚ2ISҋHMs?͇;l8l 9=6=d- B)Tf28Hb^oE_~mq ='Te5VS%d1d_=^-ޑG'BiR֔;RXX!LleOIN,MRg uW@&Ա.S1:XTyBOoeRϼ_m e:?=")jk3" q6SQ5]8'Ԁ.!'i η}x=Yq@_a Ln_ }mt丱-r{z2 `HHnLӂ$\¯J裝4U>ϡV6uvjRsgď!9xP`cuEyVA[Ϊ%S2˃N~1^U %M i}Wb5 ;e- :ܝ\AXG{pHrm9F&ZU{ qM(U'ǃ{yɊ0~nqVf7-Y[۴/p.NˬCUIH*wKI:/,us¤?f+I)R"[;hR"XQ;#Nދ?T;ONYAWd tamڢˤbyà%͋RMՄuJw?tHnp͢Wv̷@\ŞI"Z,bp>ˤ&k/'B̷b !KRK=$ebh!^:Û/4MG]^{)YC1\<;5~` 'a7UM 0Бbң{84)Oy1mR,=R#Hd^MR4 Y; }WenaK?%B#[WD-xĂ aD-u)HRƳլg󮻄s;]ЮSpXjuFfǠ=./LU&*&3jtp(VƎ%P PUj 's8ːSīB4 "7!3 &%9ɐL&%Y.$rϡ}^btv"yV{-0@b^Wk>yE Bԥ7ͤ2E5{o@Zw01],e?kJgcvU-IIj \,!m۝V\/H-n7V4s6)ĄXF{Vwh/͛ C2Fj#$-fBZlم~@5׻b4\: >E>qeAE 7 d/Isw~qdz]^ˤS`@p[1|KnNk].&2~䁟G5 ,57O=~zT?og齭.a&| l6?y'wv>3(k#=߿/C"0r OpWsTKM_qZiVx팆H@ tU=zb[05H^磇GpEendstream endobj 415 0 obj << /Type /XRef /Length 417 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 416 /ID [<69d7df930e24a71b59e259454800b4ce><04b6ff52928850ed3fcfad22a78b5254>] >> stream x햽/Ca{퇶~DiP4b5$$&1H B#&4@"6 o}@{_N{,ᑅ$9oIFB4XI߬W]Owv,v5ug{e4s26T֬4z`d 1oﮐ{`tPl ض!X7+<S&~#Hj+d'WqYo( oT8CU}I*P+ ca撙Yyycj?^?]:YL 8ʮ=7`1ij[BXB,"Zc_E^`]SdX䧰2[P0q:wF+Uj̃9:IBY% endstream endobj startxref 1366263 %%EOF tgp/inst/doc/tgp.Rnw0000644000175100001440000015630212655414745014112 0ustar hornikusers\documentclass{article} \usepackage{Sweave} %\SweaveOpts{eps=TRUE} %\documentclass[12pt]{article} %\usepackage{fullpage} %\usepackage{setspace} \usepackage[footnotesize]{caption} \usepackage{amsmath} \usepackage{amscd} \usepackage{epsfig} \newcommand{\bm}[1]{\mbox{\boldmath $#1$}} \newcommand{\mb}[1]{\mathbf{#1}} %\VignetteIndexEntry{a guide to the tgp package} %\VignetteKeywords{tgp} %\VignetteDepends{tgp,maptree} %\VignettePackage{tgp} \begin{document} %\doublespacing \setkeys{Gin}{width=0.85\textwidth} <>= library(tgp) options(width=65) @ \title{{\tt tgp}: an {\sf R} package for Bayesian nonstationary,\\ semiparametric nonlinear regression and design by treed Gaussian process models} \author{Robert B. Gramacy\\ Booth School of Business\\ The University of Chicago\\ rbgramacy@chicagobooth.edu} \maketitle \begin{abstract} The {\tt tgp} package for {\sf R} \cite{cran:R} is a tool for fully Bayesian nonstationary, semiparametric nonlinear regression and design by treed Gaussian processes with jumps to the limiting linear model. Special cases also implemented include Bayesian linear models, linear CART, stationary separable and isotropic Gaussian processes. In addition to inference and posterior prediction, the package supports the (sequential) design of experiments under these models paired with several objective criteria. 1-d and 2-d plotting, with higher dimension projection and slice capabilities, and tree drawing functions (requiring {\tt maptree} and {\tt combinat} libraries), are also provided for visualization of {\tt tgp}-class output. \end{abstract} \subsection*{Intended audience} \label{sec:discaimer} This document is intended to familiarize a (potential) user of {\tt tgp} with the models and analyses available in the package. After a brief overview, the bulk of this document consists of examples on mainly synthetic and randomly generated data which illustrate the various functions and methodologies implemented by the package. This document has been authored in {\tt Sweave} (try {\tt help(Sweave)}). This means that the code quoted throughout is certified by {\tt R}, and the {\tt Stangle} command can be used to extract it. Note that this tutorial was not meant to serve as an instruction manual. For more detailed documentation of the functions contained in the package, see the package help-manuals. At an {\sf R} prompt, type {\tt help(package=tgp)}. PDF documentation is also available on the world-wide-web. \begin{center} \tt http://www.cran.r-project.org/doc/packages/tgp.pdf \end{center} The outline is as follows. Section \ref{sec:implement} introduces the functions and associated regression models implemented by the {\tt tgp} package, including plotting and visualization methods. The Bayesian mathematical specification of these models is contained in Section \ref{sec:model}. In Section \ref{sec:examples} the functions and methods implemented in the package are illustrated by example. The appendix covers miscellaneous topics such as how to link with the {\tt ATLAS} libraries for fast linear algebra routines, compile--time support for {\tt Pthreads} parallelization, the gathering of parameter traces, the verbosity of screen output, and some miscellaneous details of implementation. \input{motivate} \section{What is implemented?} \label{sec:implement} The {\tt tgp} package contains implementations of seven Bayesian multivariate regression models and functions for visualizing posterior predictive surfaces. These models, and the functions which implement them, are outlined in Section \ref{sec:breg}. Also implemented in the package are functions which aid in the sequential design of experiments for {\tt tgp}-class models, which is what I call {\em adaptive sampling}. These functions are introduced at the end of Section \ref{sec:model} and a demonstration is given in Section \ref{sec:as}. \subsection{Bayesian regression models} \label{sec:breg} The seven regression models implemented in the package are summarized in Table \ref{t:reg}. They include combinations of treed partition models, (limiting) linear models, and Gaussian process models as indicated by T, LM/LLM, \& GP in the center column of the table. The details of model specification and inference are contained in Section \ref{sec:model}. Each is a fully Bayesian regression model, and in the table they are ordered by some notion of ``flexibility''. These {\tt b*} functions, as I call them, are wrappers around the master {\tt tgp} function which is an interface to the core {\tt C} code. \begin{table} \centering \begin{tabular}{l|l|l} {\sf R} function & Ingredients & Description \\ \hline blm & LM & Linear Model \\ btlm & T, LM & Treed Linear Model \\ bcart & T & Treed Constant Model \\ bgp & GP & GP Regression \\ bgpllm & GP, LLM & GP with jumps to the LLM \\ btgp & T, GP & treed GP Regression \\ btgpllm & T, GP, LLM & treed GP with jumps to the LLM \\ \hline tgp & & Master interface for the above methods \end{tabular} \caption{Bayesian regression models implemented by the {\tt tgp} package} \label{t:reg} \end{table} The {\tt b*} functions are intended as the main interface, so little further attention to the {\tt tgp} master function will be included here. The easiest way to see how the master {\tt tgp} function implements one of the {\tt b*} methods is to simply type the name of the function of interest into {\sf R}. For example, to see the implementation of {\tt bgp}, type: <>= bgp @ The output (return-value) of {\tt tgp} and the {\tt b*} functions is a {\tt list} object of class ``{\tt tgp}''. This is what is meant by a ``{\tt tgp}-class'' object. This object retains all of the relevant information necessary to summarize posterior predictive inference, maximum {\em a' posteriori} (MAP) trees, and statistics for adaptive sampling. Information about its actual contents is contained in the help files for the {\tt b*} functions. Generic {\tt print}, {\tt plot}, and {\tt predict} methods are defined for {\tt tgp}-class objects. The {\tt plot} and {\tt predict} functions are discussed below. The {\tt print} function simply provides a list of the names of the fields comprising a {\tt tgp}-class object. \subsubsection{Plotting and visualization} \label{sec:plot} The two main functions provided by the {\tt tgp} package for visualization are {\tt plot.tgp}, inheriting from the generic {\tt plot} method, and a function called {\tt tgp.trees} for graphical visualization of MAP trees. The {\tt plot.tgp} function can make plots in 1-d or 2-d. Of course, if the data are 1-d, the plot is in 1-d. If the data are 2-d, or higher, they are 2-d image or perspective plots unless a 1-d projection argument is supplied. Data which are 3-d, or higher, require projection down to 2-d or 1-d, or specification of a 2-d slice. The {\tt plot.tgp} default is to make a projection onto the first two input variables. Alternate projections are specified as an argument ({\tt proj}) to the function. Likewise, there is also an argument ({\tt slice}) which allows one to specify which slice of the posterior predictive data is desired. For models that use treed partitioning (those with a T in the center column of Table \ref{t:reg}), the {\tt plot.tgp} function will overlay the region boundaries of the MAP tree ($\hat{\mathcal{T}}$) found during MCMC. A few notes on 2-d plotting of {\tt tgp}-class objects: \begin{itemize} \item 2-d plotting requires interpolation of the data onto a uniform grid. This is supported by the {\tt tgp} package in two ways: (1) {\tt loess} smoothing, and (2) the {\tt akima} package, available from CRAN. The default is {\tt loess} because it is more stable and does not require installing any further packages. When {\tt akima} works it makes (in my opinion) smarter interpolations. However there are two bugs in the {\tt akima} package, one malign and the other benign, which preclude it from the default position in {\tt tgp}. The malign bug can cause a segmentation fault, and bring down the entire R session. The benign bug produces {\tt NA}'s when plotting data from a grid. For beautiful 2-d plots of gridded data I suggest exporting the {\tt tgp} predictive output to a text file and using {\tt gnuplot}'s 2-d plotting features. \item The current version of this package contains no examples---nor does this document---which demonstrate plotting of data with dimension larger than two. The example provided in Section \ref{sec:fried} uses 10-d data, however no plotting is required. {\tt tgp} methods have been used on data with input dimension as large as 15 \cite{gra:lee:2008}, and were used in a sequential design and detailed analysis of some proprietary 3-d input and 6-d output data sampled using a NASA supercomputer \cite{gra:lee:2009}. \item The {\tt plot.tgp} function has many more options than are illustrated in [Section \ref{sec:examples} of] this document. Please refer to the help files for more details. \end{itemize} The {\tt tgp.trees} function provides a diagrammatic representation of the MAP trees of each height encountered by the Markov chain during sampling. The function will not plot trees of height one, i.e., trees with no branching or partitioning. Plotting of trees requires the {\tt maptree} package, which in turn requires the {\tt combinat} package, both available from CRAN. \subsubsection{Prediction} \label{sec:predintro} Prediction, naturally, depends on fitted model parameters $\hat{\bm{\theta}}|\mbox{data}$, or Monte Carlo samples from the posterior distribution of $\bm{\theta}$ in a Bayesian analysis. Rather than saving samples from $\pi(\bm{\theta}|\mbox{data})$ for later prediction, usually requiring enormous amounts of storage, {\tt tgp} samples the posterior predictive distribution in-line, as samples of $\bm{\theta}$ become available. [Section \ref{sec:pred} and \ref{sec:llmpred} outlines the prediction equations.] A {\tt predict.tgp} function is provided should it be necessary to obtain predictions {\em after} the MCMC has finished. The {\tt b*} functions save the MAP parameterization $\hat{\bm{\theta}}$ maximizing $\pi(\bm{\theta}|\mbox{data})$. More specifically, the ``{\tt tgp}''--class object stores the MAP tree $\hat{{\mathcal T}}$ and corresponding GP (or LLM) parameters $\hat{\bm{\theta}}|\hat{\mathcal{T}}$ found while sampling from the joint posterior $\pi(\bm{\theta},\mathcal{T}|\mbox{data})$. These may be accessed and used, via {\tt predict.tgp}, to obtain posterior--predictive inference through the MAP parameterization. In this way {\tt predict.tgp} is similar to {\tt predict.lm}, for example. Samples can also be obtained from the MAP--parameterized predictive distributions via {\tt predict.tgp}, or a re--initialization of the joint sampling of the posterior and posterior predictive distribution can commence starting from the $(\hat{\bm{\theta}},\hat{\mathcal{T}})$. The output of {\tt predict.tgp} is also a {\tt tgp} class object. Appendix \ref{sec:apred} illustrates how this feature can be useful in the context of passing {\tt tgp} model fits between collaborators. There are other miscellaneous demonstrations in Section~\ref{sec:examples}. \subsubsection{Speed} \label{sec:speed} Fully Bayesian analyses with MCMC are not the super-speediest of all statistical models. Nor is inference for GP models, classical or Bayesian. When the underlying relationship between inputs and responses is non-linear, GPs represent a state of the art phenomenological model with high predictive power. The addition of axis--aligned treed partitioning provides a divide--and--conquer mechanism that can not only reduce the computational burden relative to the base GP model, but can also facilitate the efficient modeling of nonstationarity and heteroskedasticity in the data. This is in stark contrast to other recent approaches to nonstationary spatial models (e.g., via deformations \cite{dam:samp:gutt:2001,schmidt:2003}, or process convolutions \cite{higd:swal:kern:1999,fuentes:smith:2001,Paci:2003}) which can require orders of magnitude more effort relative to stationary GPs. Great care has been taken to make the implementation of Bayesian inference for GP models as efficient as possible [see Appendix \ref{sec:howimplement}]. However, inference for non-treed GPs can be computationally intense. Several features are implemented by the package which can help speed things up a bit. Direct support for {\tt ATLAS} \cite{atlas-hp} is provided for fast linear algebra. Details on linking this package with {\tt ATLAS} is contained in Appendix \ref{sec:atlas}. Parallelization of prediction and inference is supported by a producer/consumer model implemented with {\tt Pthreads}. Appendix \ref{sec:pthreads} shows how to activate this feature, as it is not turned on by default. An argument called {\tt linburn} is made available in tree class (T) {\tt b*} functions in Table \ref{t:reg}. When {\tt linburn = TRUE}, the Markov chain is initialized with a run of the Bayesian treed linear model \cite{chip:geor:mccu:2002} before burn-in in order to pre-partition the input space using linear models. Finally, thinning of the posterior predictive samples obtained by the Markov chain can also help speed things up. This is facilitated by the {\tt E}-part of the {\tt BTE} argument to {\tt b*} functions. \subsection{Sequential design of experiments} \label{sec:design} Sequential design of experiments, a.k.a. {\em adaptive sampling}, is not implemented by any {\em single} function in the {\tt tgp} package. Nevertheless, options and functions are provided in order to facilitate the automation of adaptive sampling with {\tt tgp}-class models. A detailed example is included in Section \ref{sec:as}. Arguments to {\tt b*} functions, and {\tt tgp}, which aid in adaptive sampling include {\tt Ds2x} and {\tt improv}. Both are booleans, i.e., should be set to {\tt TRUE} or {\tt FALSE} (the default for both is {\tt FALSE}). {\tt TRUE} booleans cause the {\tt tgp}-class output list to contain vectors of similar names with statistics that can be used toward adaptive sampling. When {\tt Ds2x = TRUE} then $\Delta \sigma^2(\mb{\tilde{x}})$ statistic is computed at each $\tilde{\mb{x}} \in \mbox{\tt XX}$, in accordance with the ALC (Active Learning--Cohn) algorithm \cite{cohn:1996}. Likewise, when {\tt improv = TRUE}, statistics are computed in order to asses the expected improvement (EI) for each $\tilde{\mb{x}} \in \mbox{\tt XX}$ about the global minimum \cite{jones:schonlau:welch:1998}. The ALM (Active Learning--Mackay) algorithm \cite{mackay:1992} is implemented by default in terms of difference in predictive quantiles for the inputs {\tt XX}, which can be accessed via the {\tt ZZ.q} output field. Details on the ALM, ALC, and EI algorithms are provided in Section \ref{sec:model}. Calculation of EI statistics was considered ``beta'' functionality while this document was being prepared. At that time it had not been adequately tested, and its implementation changed substantially in future versions of the package. For updates see the follow-on vignette \cite{gra:taddy:2010}, or \verb!vignette("tgp2")!. That document also discusses sensitivity analysis, handling of categorical inputs, and importance tempring. The functions included in the package which explicitly aid in the sequential design of experiments are {\tt tgp.design} and {\tt dopt.gp}. They are both intended to produce sequential $D$--optimal candidate designs {\tt XX} at which one or more of the adaptive sampling methods (ALM, ALC, EI) can gather statistics. The {\tt dopt.gp} function generates $D$--optimal candidates for a stationary GP. The {\tt tgp.design} function extracts the MAP tree from a {\tt tgp}-class object and uses {\tt dopt.gp} on each region of the MAP partition in order to get treed sequential $D$--optimal candidates. \section{Methods and Models} \label{sec:model} This section provides a quick overview of the statistical models and methods implemented by the {\tt tgp} package. Stationary Gaussian processes (GPs), GPs with jumps to the limiting linear model (LLM; a.k.a.~GP LLM), treed partitioning for nonstationary models, and sequential design of experiments (a.k.a.~{\em adaptive sampling}) concepts for these models are all briefly discussed. Appropriate references are provided for the details, including the original paper on Bayesian treed Gaussian process models \cite{gra:lee:2008}, and an application paper on adaptively designing supercomputer experiments \cite{gra:lee:2009}. As a first pass on this document, it might make sense to skip this section and go straight on to the examples in Section \ref{sec:examples}. \subsection{Stationary Gaussian processes} \label{sec:gp} Below is a hierarchical generative model for a stationary GP with linear tend for data $D=\{\mb{X}, \mb{Z}\}$ consisting of $n$ pairs of $m_X$ covariates and a single response variable $\{(x_{i1},\dots, x_{im_X}), z_i\}_{i=1}^n$. \begin{align} \mb{Z} | \bm{\beta}, \sigma^2, \mb{K} &\sim N_{n}(\mb{\mb{F}} \bm{\beta}, \sigma^2 \mb{K}) & \sigma^2 &\sim IG(\alpha_\sigma/2, q_\sigma/2) \nonumber \\ \bm{\beta} | \sigma^2, \tau^2, \mb{W}, \bm{\beta}_0 &\sim N_{m}(\bm{\beta}_0, \sigma^2 \tau^2 \mb{W}) & \tau^2 &\sim IG(\alpha_\tau/2, q_\tau/2) \label{eq:model} \\ \bm{\beta}_0 &\sim N_{m}(\bm{\mu}, \mb{B}) & \mb{W}^{-1} &\sim W((\rho \mb{V})^{-1}, \rho), \nonumber \end{align} $\mb{X}$ is a design matrix with $m_X$ columns. An intercept term is added with $\mb{F} = (\mb{1}, \mb{X})$ which has $m\equiv m_X+1$ columns, and $\mb{W}$ is a $m \times m$ matrix. $N$, $IG$, and $W$ are the (Multivariate) Normal, Inverse-Gamma, and Wishart distributions, respectively. Constants $\bm{\mu}, \mb{B},\mb{V},\rho, \alpha_\sigma, q_\sigma, \alpha_\tau, q_\tau.$ are treated as known. The GP correlation structure $\mb{K}$ is chosen either from the isotropic power family, or separable power family, with a fixed power $p_0$ (see below), but unknown (random) range and nugget parameters. Correlation functions used in the {\tt tgp} package take the form $K(\mb{x}_j, \mb{x}_k) = K^*(\mb{x}_j, \mb{x}_k) + {g} \delta_{j,k}$, where $\delta_{\cdot,\cdot}$ is the Kronecker delta function, $g$ is the {\em nugget}, and $K^*$ is a {\em true} correlation representative from a parametric family. The isotropic Mat\'{e}rn family is also implemented in the current version as ``beta'' functionality. All parameters in (\ref{eq:model}) can be sampled using Gibbs steps, except for the covariance structure and nugget parameters, and their hyperparameters, which can be sampled via Metropolis-Hastings \cite{gra:lee:2008}. \subsubsection{The nugget} \label{sec:intro:nug} The $g$ term in the correlation function $K(\cdot,\cdot)$ is referred to as the {\em nugget} in the geostatistics literature \cite{math:1963,cressie:1991} and sometimes as {\em jitter} in the Machine Learning literature \cite{neal:1997}. It must always be positive $(g>0)$, and serves two purposes. Primarily, it provides a mechanism for introducing measurement error into the stochastic process. It arises when considering a model of the form: \begin{equation} Z(\mb{X}) = m(\mb{X}, \bm{\beta}) + \varepsilon(\mb{X}) + \eta(\mb{X}), \label{eq:noisemodel} \end{equation} where $m(\cdot,\cdot)$ is underlying (usually linear) mean process, $\varepsilon(\cdot)$ is a process covariance whose underlying correlation is governed by $K^*$, and $\eta(\cdot)$ represents i.i.d.~Gaussian noise. Secondarily, though perhaps of equal practical importance, the nugget (or jitter) prevents $\mb{K}$ from becoming numerically singular. Notational convenience and conceptual congruence motivates referral to $\mb{K}$ as a correlation matrix, even though the nugget term ($g$) forces $K(\mb{x}_i,\mb{x}_i)>1$. \subsubsection{Exponential Power family} \label{sec:pow} Correlation functions in the {\em isotropic power} family are {\em stationary} which means that correlations are measured identically throughout the input domain, and {\em isotropic} in that correlations $K^*(\mb{x}_j, \mb{x}_k)$ depend only on a function of the Euclidean distance between $\mb{x}_j$ and $\mb{x}_k$: $||\mb{x}_j - \mb{x}_k||$. \begin{equation} K^*(\mb{x}_j, \mb{x}_k|d) = \exp\left\{-\frac{||\mb{x}_j - \mb{x}_k||^{p_0}}{d} \right\}, \label{eq:pow} \end{equation} where $d>0$ is referred to as the {\em width} or {\em range} parameter. The power $0>= hist(c(rgamma(100000,1,20), rgamma(100000,10,10)), breaks=50, xlim=c(0,2), freq=FALSE, ylim=c(0,3), main = "p(d) = G(1,20) + G(10,10)", xlab="d") d <- seq(0,2,length=1000) lines(d,0.2+0.7/(1+exp(-10*(d-0.5)))) abline(h=1, lty=2) legend(x=1.25, y=2.5, c("p(b) = 1", "p(b|d)"), lty=c(1,2)) @ <>= graphics.off() @ \includegraphics[trim=0 25 0 10]{tgp-gpllm} %\vspace{-0.5cm} \caption{\footnotesize Prior distribution for the boolean ($b$) superimposed on $p(d)$. There is truncation in the left--most bin, which rises to about 6.3. } \label{f:boolprior} \end{center} \end{figure} Probability mass functions which increase as a function of $d_i$, e.g., \begin{equation} p_{\gamma, \theta_1, \theta_2}(b_i=0|d_i) = \theta_1 + (\theta_2-\theta_1)/(1 + \exp\{-\gamma(d_i-0.5)\}) \label{eq:boolp} \end{equation} with $0<\gamma$ and $0\leq \theta_1 \leq \theta_2 < 1$, can encode such a preference by calling for the exclusion of dimensions $i$ with large $d_i$ when constructing $\mb{K}^*$. Thus $b_i$ determines whether the GP or the LLM is in charge of the marginal process in the $i^{\mbox{\tiny th}}$ dimension. Accordingly, $\theta_1$ and $\theta_2$ represent minimum and maximum probabilities of jumping to the LLM, while $\gamma$ governs the rate at which $p(b_i=0|d_i)$ grows to $\theta_2$ as $d_i$ increases. Figure \ref{f:boolprior} plots $p(b_i=0|d_i)$ %as in (\ref{eq:boolp}) for $(\gamma,\theta_1,\theta_2) =(10, 0.2, 0.95)$ superimposed on a convenient $p(d_i)$ which is taken to be a mixture of Gamma distributions, \begin{equation} p(d) = [G(d|\alpha=1,\beta=20) + G(d|\alpha=10,\beta=10)]/2, \label{eq:dprior} \end{equation} representing a population of GP parameterizations for wavy surfaces (small $d$) and a separate population of those which are quite smooth or approximately linear. The $\theta_2$ parameter is taken to be strictly less than one so as not to preclude a GP which models a genuinely nonlinear surface using an uncommonly large range setting. The implied prior probability of the full $m_X$-dimensional LLM is \begin{equation} p(\mbox{linear model}) = \prod_{i=1}^{m_X} p(b_i=0|d_i) = \prod_{i=1}^{m_X} \left[ \theta_1 + \frac{\theta_2-\theta_1} {1 + \exp\{-\gamma (d_i-0.5)\}}\right]. \label{e:linp} \end{equation} Notice that the resulting process is still a GP if any of the booleans $b_i$ are one. The primary computational advantage associated with the LLM is foregone unless all of the $b_i$'s are zero. However, the intermediate result offers increased numerical stability and represents a unique transitionary model lying somewhere between the GP and the LLM. It allows for the implementation of a semiparametric stochastic processes like $Z(\mb{x}) = \bm{\beta} f(\mb{x}) + \varepsilon(\tilde{\mb{x}})$ representing a piecemeal spatial extension of a simple linear model. The first part ($\bm{\beta}f(\mb{x})$) of the process is linear in some known function of the full set of covariates $\mb{x} = \{x_i\}_{i=1}^{m_X}$, and $\varepsilon(\cdot)$ is a spatial random process (e.g. a GP) which acts on a subset of the covariates $\mb{x}'$. Such models are commonplace in the statistics community~\cite{dey:1998}. Traditionally, $\mb{x}'$ is determined and fixed {\em a' priori}. The separable boolean prior (\ref{eq:boolp}) implements an adaptively semiparametric process where the subset $\mb{x}' = \{ x_i : b_i = 1, i=1,\dots,m_X \}$ is given a prior distribution, instead of being fixed. \subsubsection{Prediction and Adaptive Sampling under LLM} \label{sec:llmpred} Prediction under the limiting GP model is a simplification of (\ref{eq:pred}) when it is known that $\mb{K} = (1+g)\mb{I}$. It can be shown \cite{gra:lee:2008b} that the predicted value of $z$ at $\mb{x}$ is normally distributed with mean $\hat{z}(\mb{x}) = \mb{f}^\top(\mb{x}) \tilde{\bm{\beta}}$ and variance $\hat{\sigma}(\mb{x})^2 = \sigma^2 [1 + \mb{f}^\top(\mb{x})\mb{V}_{\tilde{\beta}} \mb{f}(\mb{x})]$, where $ \mb{V}_{\tilde{\beta}} = (\tau^{-2} + \mb{F}^\top \mb{F}(1+g))^{-1}$. This is preferred over (\ref{eq:pred}) with $\mb{K}=\mb{I}(1+g)$ because an $m \times m$ inversion is faster than an $n\times n$ one. Applying the ALC algorithm under the LLM also offers computational savings. Starting with the predictive variance given in (\ref{eq:pred}), the expected reduction in variance under the LM is \cite{gra:lee:2009} \begin{equation} \Delta \hat{\sigma}^2_\mb{y} (\mb{x}) = \frac{ \sigma^2 [\mb{f}^\top(\mb{y}) \mb{V}_{\tilde{\beta}_N} \mb{f}(\mb{x})]^2} {1+g + \mb{f}^\top(\mb{x}) \mb{V}_{\tilde{\beta}_N} \mb{f}(\mb{x})} \label{e:llmalc} \end{equation} which is similarly preferred over (\ref{e:gpalc}) with $\mb{K} = \mb{I}(1+g)$. The statistic for expected improvement (EI; about the minimum) is the same under the LLM as (\ref{eq:ego}) for the GP. Of course, it helps to use the linear predictive equations instead of the kriging ones for $\hat{z}(\mb{x})$ and $\hat{\sigma}^2(\mb{x})$. \subsection{Treed partitioning} \label{sec:treed} Nonstationary models are obtained by treed partitioning and inferring a separate model within each region of the partition. Treed partitioning is accomplished by making (recursive) binary splits on the value of a single variable so that region boundaries are parallel to coordinate axes. Partitioning is recursive, so each new partition is a sub-partition of a previous one. Since variables may be revisited, there is no loss of generality by using binary splits as multiple splits on the same variable are equivalent to a non-binary split. \begin{figure}%[ht!] \centering \includegraphics{tree} \caption{\footnotesize An example tree $\mathcal{T}$ with two splits, resulting in three regions, shown in a diagram ({\em left}) and pictorially ({\em right}). The notation $\mb{X}[:,u] < s$ represents a subsetting of the design matrix $\mb{X}$ by selecting the rows which have $u^{\mbox{\tiny th}}$ column less than $s$, i.e. columns $\{i: x_{iu} < s\}$, so that $\mb{X}_1$ has the rows $I_1$ of $\mb{X}$ where $I_1 = \{x_{iu_1} < s_1 \;\&\; x_{iu_2} < s_2\}$, etc. The responses are subsetted similarly so that $\mb{Z}_1$ contains the $I_1$ elements of $\mb{Z}$. We have that $\cup_j D_i = \{\mb{X},\mb{Z}\}$ and $D_i \cap D_j = \emptyset$ for $i\ne j$. } \label{f:tree} \end{figure} Figure \ref{f:tree} shows an example tree. In this example, region $D_1$ contains $\mb{x}$'s whose $u_1$ coordinate is less than $s_1$ and whose $u_2$ coordinate is less than $s_2$. Like $D_1$, $D_2$ has $\mb{x}$'s whose coordinate $u_1$ is less than $s_1$, but differs from $D_1$ in that the $u_2$ coordinate must be bigger than or equal to $s_2$. Finally, $D_3$ contains the rest of the $\mb{x}$'s differing from those in $D_1$ and $D_2$ because the $u_1$ coordinate of its $\mb{x}$'s is greater than or equal to $s_1$. The corresponding response values ($z$) accompany the $\mb{x}$'s of each region. These sorts of models are often referred to as Classification and Regression Trees (CART) \cite{brei:1984}. CART has become popular because of its ease of use, clear interpretation, and ability to provide a good fit in many cases. The Bayesian approach is straightforward to apply to tree models, provided that one can specify a meaningful prior for the size of the tree. The trees implemented in the {\tt tgp} package follow Chipman et al.~\cite{chip:geor:mccu:1998} who specify the prior through a tree-generating process. Starting with a null tree (all data in a single partition), the tree, ${\mathcal T}$, is probabilistically split recursively with each partition, $\eta$, being split with probability $p_{\mbox{\sc split}}(\eta, {\mathcal T}) = a (1 + q_\eta)^{-b}$ where $q_\eta$ is the depth of $\eta$ in $\mathcal{T}$ and $a$ and $b$ are parameters chosen to give an appropriate size and spread to the distribution of trees. Extending the work of Chipman et al.~\cite{chip:geor:mccu:2002}, the {\tt tgp} package implements a stationary GP with linear trend, or GP LLM, independently within each of the regions depicted by a tree $\mathcal{T}$ \cite{gra:lee:2008}. Integrating out dependence on $\mathcal{T}$ is accomplished by reversible-jump MCMC (RJ-MCMC) via tree operations {\em grow, prune, change}, and {\em swap}~\cite{chip:geor:mccu:1998}. %(2002)\nocite{chip:geor:mccu:2002}. %, however %Tree proposals can change the size of the parameter space ($\bm{\theta}$). To keep things simple, proposals for new parameters---via an increase in the number of partitions (through a {\em grow})---are drawn from their priors\footnote{Proposed {\em grows} are the {\em only} place where the priors (for $d$, $g$ and $\tau^2$ parameters; the others can be integrated out) are used for MH--style proposals. All other MH proposals are ``random--walk'' as described in Appendix \ref{sec:howimplement}.}, thus eliminating the Jacobian term usually present in RJ-MCMC. New splits are chosen uniformly from the set of marginalized input locations $\mb{X}$. The {\em swap} operation is augmented with a {\em rotate} option to improve mixing of the Markov chain \cite{gra:lee:2008}. There are many advantages to partitioning the input space into regions, and fitting separate GPs (or GP LLMs) within \index{each}each region. Partitioning allows for the modeling of non-stationary behavior, and can ameliorate some of the computational demands by fitting models to less data. Finally, fully Bayesian model averaging yields a uniquely efficient nonstationary, nonparametric, or semiparametric (in the case of the GP LLM) regression tool. The most general Bayesian treed GP LLM model can facilitate a model comparison between its special cases (LM, CART, treed LM, GP, treed GP, treed GP LLM) through the samples obtained from the posterior distribution. \subsection{(Treed) sequential D-optimal design} \label{sec:treedopt} In the statistics community, sequential data solicitation goes under the general heading of {\em design of experiments}. Depending on a choice of utility, different algorithms for obtaining optimal designs can be derived. Choose the Kullback-Leibler distance between the posterior and prior distributions as a utility leads to what are called $D$--optimal designs. For GPs with correlation matrix $\mb{K}$, this is equivalent to maximizing det$(\mb{K})$. Choosing quadratic loss leads to what are called $A-$optimal designs. An excellent review of Bayesian approaches to the design of experiments is provided by Chaloner \& Verdinelli~\cite{chaloner:1995}. Other approaches used by the statistics community include space-filling designs: e.g. max-min distance and Latin Hypercube (LH) designs \cite{sant:will:notz:2003}. The {\tt FIELDS} package \cite{fields:2004} implements space-filling designs along side kriging and thin plate spline models. A hybrid approach to designing experiments employs active learning techniques. The idea is to choose a set of candidate input configurations $\tilde{\mb{X}}$ (say, a $D-$optimal or LH design) and a rule for determining which $\tilde{\mb{x}}\in \tilde{\mb{X}}$ to add into the design next. The ALM algorithm has been shown to approximate maximum expected information designs by choosing $\tilde{\mathbf{x}}$ with the the largest predictive variance \cite{mackay:1992}. The ALC algorithm selects $\tilde{\mathbf{x}}$ minimizing the reduction in squared error averaged over the input space \cite{cohn:1996}. Seo et al.~\cite{seo00} provide a comparison between ALC and ALM using standard GPs. The EI \cite{jones:schonlau:welch:1998} algorithm can be used to find global minima. Choosing candidate configurations $\tilde{\mb{X}}$ ({\tt XX} in the {\tt tgp} package), at which to gather ALM, ALC, or EI statistics, is a significant component in the hybrid approach to experimental design. Candidates which are are well-spaced relative to themselves, and relative to already sampled configurations, are clearly preferred. Towards this end, a sequential $D$--optimal design is a good first choice, but has a number of drawbacks. $D$--optimal designs are based require a {\em known} parameterization, and are thus not well-suited to MCMC inference. They may not choose candidates in the ``interesting'' part of the input space, because sampling is high there already. They are ill-suited partition models wherein ``closeness'' may not measured homogeneously across the input space. Finally, they are computationally costly, requiring many repeated determinant calculations for (possibly) large covariance matrices. One possible solution to both computational and nonstationary modeling issues is to use treed sequential $D$--optimal design \cite{gra:lee:2009}, where separate sequential $D$--optimal designs are computed in each of the partitions depicted by the maximum {\em a posteriori} (MAP) tree $\hat{\mathcal{T}}$. The number of candidates selected from each region can be proportional to the volume of---or to the number of grid locations in---the region. MAP parameters $\hat{\bm{\theta}}_\nu|\hat{\mathcal{T}}$, or ``neutral'' or ``exploration encouraging'' ones, can be used to create the candidate design---a common practice \cite{sant:will:notz:2003}. Small range parameters, for learning about the wiggliness of the response, and a modest nugget parameter, for numerical stability, tend to work well together. Finding a local maxima is generally sufficient to get well-spaced candidates. The {\tt dopt.gp} function uses a stochastic ascent algorithm to find local maxima without calculating too many determinants. This works work well with ALM and ALC. However, it is less than ideal for EI as will be illustrated in Section \ref{sec:as}. Adaptive sampling from EI (with {\tt tgp}) is still an open area of research. \section{Examples using {\tt tgp}} \label{sec:examples} The following subsections take the reader through a series of examples based, mostly, on synthetic data. At least two different {\tt b*} models are fit for each set of data, offering comparisons and contrasts. Duplicating these examples in your own {\sf R} session is highly recommended. The {\tt Stangle} function can help extract executable {\sf R} code from this document. For example, the code for the exponential data of Section \ref{sec:exp} can be extracted with one command. \begin{verbatim} > Stangle(vignette("exp", package="tgp")$file) \end{verbatim} \noindent This will write a file called ``exp.R''. Additionally, each of the subsections that follow is available as an {\sf R} demo. Try {\tt demo(package="tgp")} for a listing of available demos. To invoke the demo for the exponential data of Section \ref{sec:exp} try {\tt demo(exp, package="tgp")}. This is equivalent to {\tt source("exp.R")} because the demos were created using {\tt Stangle} on the source files of this document. \footnote{Note that this vignette functionality is only supported in {\tt tgp} version $<2.x$. In 2.x and later the vignettes were coalesced in order to reduce clutter. The demos in 2.x, however, still correspond to their respective sections.} Each subsection (or subsection of the appendix) starts by seeding the random number generator with \verb!set.seed(0)!. This is done to make the results and analyses reproducible within this document, and in demo form. I recommend you try these examples with different seeds and see what happens. Usually the results will be similar, but sometimes (especially when the data ({\tt X, Z}) is generated randomly) they may be quite different. Other successful uses of the methods in this package include applications to the Boston housing data \cite{harrison:78, gra:lee:2008}, and designing an experiment for a reusable NASA launch vehicle \cite{glm:04,gra:lee:2009} called the Langely glide-back booster (LGBB). \SweaveInput{linear.iRnw} \SweaveInput{sin.iRnw} \SweaveInput{exp.iRnw} \SweaveInput{moto.iRnw} \SweaveInput{fried.iRnw} \SweaveInput{as.iRnw} \subsection*{Acknowledgments} This work was partially supported by research subaward 08008-002-011-000 from the Universities Space Research Association and NASA, NASA/University Affiliated Research Center grant SC 2003028 NAS2-03144, Sandia National Laboratories grant 496420, and National Science Foundation grants DMS 0233710 and 0504851. I would like to thank Matt Taddy for his contributions to recent releases of the package. I am especially grateful to my thesis advisor, Herbie Lee, whose contributions and guidance in this project have been invaluable throughout. Finally, I would like to thank an anonymous referee whose many helpful comments improved the paper. \appendix \section{Implementation notes} \label{sec:howimplement} The treed GP model is coded in a mixture of {\tt C} and {\tt C++}: {\tt C++} for the tree data structure ($\mathcal{T}$) and {\tt C} for the GP at each leaf of $\mathcal{T}$. The code has been tested on Unix ({\tt Solaris, Linux, FreeBSD, OSX}) and Windows (2000, XP) platforms. It is useful to first translate and re-scale the input data ($\mb{X}$) so that it lies in an $\Re^{m_X}$ dimensional unit cube. This makes it easier to construct prior distributions for the width parameters to the correlation function $K(\cdot,\cdot)$. Proposals for all parameters which require MH sampling are taken from a uniform ``sliding window'' centered around the location of the last accepted setting. For example, a proposed a new nugget parameter $g_\nu$ to the correlation function $K(\cdot, \cdot)$ in region $r_\nu$ would go as \[ g_\nu^* \sim \mbox{Unif}\left(\frac{3}{4}g_\nu, \frac{4}{3}g_\nu \right). \] Calculating the corresponding forward and backwards proposal probabilities for the MH acceptance ratio is straightforward. For more details about the MCMC algorithm and proposals, etc., please see the original technical report on {\em Bayesian treed Gaussian process models} \cite{gra:lee:2008}. \section{Interfaces and features} The following subsections describe some of the ancillary features of the {\tt tgp} package such as the gathering and summarizing of MCMC parameter traces, the progress meter, and an example of how to use the {\tt predict.tgp} function in a collaborative setting. \SweaveInput{traces.iRnw} \subsection{Explaining the progress meter} \label{sec:progress} The progress meter shows the state of the MCMC as it iterates through the desired number of rounds of burn--in ({\tt BTE[1]}), and sampling ({\tt BTE[2]-BTE[1]}), for the requested number of repeats ({\sf R-1}). The verbosity of progress meter print statements is controlled by the {\tt verb} arguments to the {\tt b*} functions. Providing {\tt verb=0} silences all non--warning (or error) statements. To suppress warnings, try enclosing commands within {\tt suppressWarnings(...)}, or globally set {\tt options(warn=0)}. See the help file ({\tt ?options}) for more global warning settings. The default verbosity setting ({\tt verb=1}) shows all {\em grows} and {\em prunes}, and a summary of $d$--(range) parameters for each partition every 1000 rounds. Higher verbosity arguments will show more tree operations, e.g., {\em change} and {\em swap}, etc. Setting {\tt verb=2} will cause an echo of the {\tt tgp} model parameters and their starting values; but is otherwise the same as {\tt verb=1}. The max is {\tt verb=4} shows all successful tree operations. Here is an example {\em grow} statement. \begin{verbatim} **GROW** @depth 2: [0,0.05], n=(10,29) \end{verbatim} The {\tt *GROW*} statements indicate the depth of the split leaf node; the splitting dimension $u$ and location $v$ is shown between square brackets {\tt [u,v]}, followed by the size of the two new children {\tt n=(n1,n2)}. {\tt *PRUNE*} is about the same, without printing {\tt n=(n1,n2)}. Every 1000 rounds a progress indicator is printed. Its format depends on a number of things: (1) whether parallelization is turned on or not, (2) the correlation model [isotropic or separable], (3) whether jumps to the LLM are allowed. Here is an example with the 2-d exp data with parallel prediction under the separable correlation function: \begin{verbatim} (r,l)=(5000,104) d=[0.0144 0.0236] [1.047 0/0.626]; mh=2 n=(59,21) \end{verbatim} The first part {\tt (r,l)=(5000,104)} is indicating the MCMC round number r=5000 and the number of leaves waiting to be "consumed" for prediction by the parallel prediction thread. When parallelization is turned off (default), the print will simply be {\tt "r=5000"}. The second part is a printing of the $d$--(range) parameter to a separable correlation function. For 2 partitions there are two sets of square brackets. Inside the square brackets is the $m_X$ (2 in this case) range parameters for the separable correlation function. Whenever the LLM governs one of the input dimensions a zero will appear. I.e., the placement of {\tt 0/0.626} indicates the LLM is active in the 2nd dimension of the 2nd partition. 0.626 is the $d$--(range) parameter that would have been used if the LLM were inactive. Whenever all dimensions are under the LLM, the d-parameter print is simply {\tt [0]}. This also happens when forcing the LLM (i.e., for {\tt blm} and {\tt btlm}), where {\tt [0]} appears for each partition. These prints will look slightly different if the isotropic instead of separable correlation is used, since there are not as many range parameters. \SweaveInput{pred.iRnw} \section{Configuration and performance optimization} In what follows I describe customizations and enhancements that can be made to {\tt tgp} at compile time in order to take advantage of custom computing architectures. The compilation of {\tt tgp} with a linear algebra library different from the one used to compile {\sf R} (e.g., ATLAS), and the configuration and compilation of {\tt tgp} with parallelization is described in detail. \subsection{Linking to ATLAS} \label{sec:atlas} {\tt ATLAS} \cite{atlas-hp} is supported as an alternative to standard {\tt BLAS} and {\tt LAPACK} for fast, automatically tuned, linear algebra routines. %Compared to standard {\tt BLAS} and {\tt Lapack}, %those automatically tuned by {\tt ATLAS} are significantly faster. If you know that {\sf R} has already been linked to tuned linear algebra libraries (e.g., on {\tt OSX}), then compiling with {\tt ATLAS} as described below, is unnecessary---just install {\tt tgp} as usual. As an alternative to linking {\tt tgp} to {\tt ATLAS} directly, one could re-compile all of {\sf R} linking it to {\tt ATLAS}, or some other platform--specific {\tt BLAS}/{\tt Lapack}, i.e., {\tt Intel}'s Math Kernel Library, or {\tt AMD}'s Core Math Library, as described in: \begin{center} \verb!http://cran.r-project.org/doc/manuals/R-admin.html! \end{center} Look for the section titled ``Linear Algebra''. While this is arguably best solution since all of {\sf R} benefits, the task can prove challenging to accomplish and may require administrator (root) privileges. Linking {\tt tgp} with {\tt ATLAS} directly is described here. GP models implemented in {\tt tgp} can get a huge benefit from tuned linear algebra libraries, since the MCMC requires many large matrix multiplications and inversions (particularly of $\mb{K}$). In some cases the improvement can be as large as tenfold with {\tt ATLAS} as compared to the default {\sf R} linear algebra routines. Comparisons between {\tt ATLAS} and architecture specific libraries like {\tt MKL} for {\tt Intel} or {\tt veclib} for {\tt OSX} usually show the latter favorably, though the difference is less impressive. For example, see \begin{center} \verb!http://www.intel.com/cd/software/products/asmo-na/eng/266858.htm! \end{center} for a comparison to {\tt MKL} on several typical benchmarks. Three easy steps (assuming, of course, you have already compiled and installed {\tt ATLAS} -- {\tt http://math-atlas.sourceforge.net}) need to be performed before you install the {\tt tgp} package from source. \begin{enumerate} \item Edit src/Makevars. Comment out the existing \verb!PKG_LIBS! line, and replace it with: \begin{verbatim} PKG_LIBS = -L/path/to/ATLAS/lib -llapack -lcblas -latlas \end{verbatim} You may need replace \verb!-llapack -lcblas -latlas! with whatever {\tt ATLAS} recommends for your OS. (See {\tt ATLAS} README.) For example, if your {\tt ATLAS} compilation included {\tt F77} support, you may need to add \verb!"-lF77blas"!, if you compiled with {\tt Pthreads}, you would might use \begin{verbatim} -llapack -lptcblas -lptf77blas -latlas \end{verbatim} \item Continue editing src/Makevars. Add: \begin{verbatim} PKG_CFLAGS = -I/path/to/ATLAS/include \end{verbatim} \item Edit src/linalg.h and comment out lines 40 \& 41: \begin{verbatim} /*#define FORTPACK #define FORTBLAS*/ \end{verbatim} \end{enumerate} Now simply install the {\tt tgp} package as usual. Reverse the above instructions to disable {\tt ATLAS}. Don't forget to re-install the package when you're done. Similar steps can be taken for platform specific libraries like {\tt MKL}, leaving off step 3. \subsection{Parallelization with {\tt Pthreads}} \label{sec:pthreads} After conditioning on the tree and parameters ($\{\mathcal{T}, \bm{\theta}\}$), prediction can be parallelized by using a producer/consumer model. This allows the use of {\tt PThreads} in order to take advantage of multiple processors, and get speed-ups of at least a factor of two. This is particularly relevant since dual processor workstations and multi-processor servers are becoming commonplace in modern research labs. However, multi--processors are not yet ubiquitous, so parallel--{\tt tgp} is not yet the default. Using the parallel version will be slower than the non--parallel (serial) version on a single processor machine. Enabling parallelization requires two simple steps, and then a re--install. \begin{enumerate} \item Add \verb!-DPARALLEL! to \verb!PKG_CXXFLAGS! of src/Makevars \item You may need to add \verb!-pthread! to \verb!PKG_LIBS! of src/Makevars, or whatever is needed by your compiler in order to correctly link code with {\tt PThreads}. \end{enumerate} The biggest improvement in the parallel version, over the serial, is observed when calculating ALC statistics, which require $O(n_2^2)$ time for $n_2$ predictive locations, or when calculating ALM (default) or EI statistics on predictive locations whose number ($n_2$) is at least an order of magnitude larger ($n_2\gg n_1)$ than the number of input locations ($n_1$). Parallel sampling of the posterior of $\bm{\theta}|\mathcal{T}$ for each of the $\{\theta_\nu\}_{\nu=1}^R$ is also possible. However, the speed-up in this second case is less impressive, and so is not supported by the current version of the {\tt tgp} package. \bibliography{tgp} \bibliographystyle{plain} \end{document} tgp/inst/doc/tgp.R0000644000175100001440000005160712655414745013547 0ustar hornikusers### R code from vignette source 'tgp.Rnw' ################################################### ### code chunk number 1: tgp.Rnw:26-28 ################################################### library(tgp) options(width=65) ################################################### ### code chunk number 2: tgp.Rnw:141-142 ################################################### bgp ################################################### ### code chunk number 3: gpllm ################################################### hist(c(rgamma(100000,1,20), rgamma(100000,10,10)), breaks=50, xlim=c(0,2), freq=FALSE, ylim=c(0,3), main = "p(d) = G(1,20) + G(10,10)", xlab="d") d <- seq(0,2,length=1000) lines(d,0.2+0.7/(1+exp(-10*(d-0.5)))) abline(h=1, lty=2) legend(x=1.25, y=2.5, c("p(b) = 1", "p(b|d)"), lty=c(1,2)) ################################################### ### code chunk number 4: tgp.Rnw:624-625 ################################################### graphics.off() ################################################### ### code chunk number 5: linear.iRnw:1-4 ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 6: linear.iRnw:20-24 ################################################### # 1-d linear data input and predictive data X <- seq(0,1,length=50) # inputs XX <- seq(0,1,length=99) # predictive locations Z <- 1 + 2*X + rnorm(length(X),sd=0.25) # responses ################################################### ### code chunk number 7: linear.iRnw:29-30 ################################################### lin.blm <- blm(X=X, XX=XX, Z=Z) ################################################### ### code chunk number 8: linear-blm ################################################### plot(lin.blm, main='Linear Model,', layout='surf') abline(1,2,lty=3,col='blue') ################################################### ### code chunk number 9: linear.iRnw:38-39 ################################################### graphics.off() ################################################### ### code chunk number 10: linear.iRnw:72-73 ################################################### lin.gpllm <- bgpllm(X=X, XX=XX, Z=Z) ################################################### ### code chunk number 11: linear-gplm ################################################### plot(lin.gpllm, main='GP LLM,', layout='surf') abline(1,2,lty=4,col='blue') ################################################### ### code chunk number 12: linear.iRnw:81-82 ################################################### graphics.off() ################################################### ### code chunk number 13: linear.iRnw:102-106 ################################################### lin.gpllm.tr <- bgpllm(X=X, XX=0.5, Z=Z, pred.n=FALSE, trace=TRUE, verb=0) mla <- mean(lin.gpllm.tr$trace$linarea$la) mla ################################################### ### code chunk number 14: linear.iRnw:112-113 ################################################### 1-mean(lin.gpllm.tr$trace$XX[[1]]$b1) ################################################### ### code chunk number 15: sin.iRnw:4-7 ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 16: sin.iRnw:25-31 ################################################### X <- seq(0,20,length=100) XX <- seq(0,20,length=99) Ztrue <- (sin(pi*X/5) + 0.2*cos(4*pi*X/5)) * (X <= 9.6) lin <- X>9.6; Ztrue[lin] <- -1 + X[lin]/10 Z <- Ztrue + rnorm(length(Ztrue), sd=0.1) ################################################### ### code chunk number 17: sin.iRnw:36-37 ################################################### sin.bgp <- bgp(X=X, Z=Z, XX=XX, verb=0) ################################################### ### code chunk number 18: sin-bgp ################################################### plot(sin.bgp, main='GP,', layout='surf') lines(X, Ztrue, col=4, lty=2, lwd=2) ################################################### ### code chunk number 19: sin.iRnw:45-46 ################################################### graphics.off() ################################################### ### code chunk number 20: sin.iRnw:62-63 ################################################### sin.btlm <- btlm(X=X, Z=Z, XX=XX) ################################################### ### code chunk number 21: sin-btlm ################################################### plot(sin.btlm, main='treed LM,', layout='surf') lines(X, Ztrue, col=4, lty=2, lwd=2) ################################################### ### code chunk number 22: sin.iRnw:76-77 ################################################### graphics.off() ################################################### ### code chunk number 23: sin-btlmtrees ################################################### tgp.trees(sin.btlm) ################################################### ### code chunk number 24: sin.iRnw:84-85 ################################################### graphics.off() ################################################### ### code chunk number 25: sin.iRnw:106-107 ################################################### sin.btgp <- btgp(X=X, Z=Z, XX=XX, verb=0) ################################################### ### code chunk number 26: sin-btgp ################################################### plot(sin.btgp, main='treed GP,', layout='surf') lines(X, Ztrue, col=4, lty=2, lwd=2) ################################################### ### code chunk number 27: sin.iRnw:115-116 ################################################### graphics.off() ################################################### ### code chunk number 28: exp.iRnw:4-8 ################################################### library(tgp) library(maptree) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 29: exp.iRnw:26-29 ################################################### exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z XX <- exp2d.data$XX ################################################### ### code chunk number 30: exp.iRnw:39-40 ################################################### exp.bgp <- bgp(X=X, Z=Z, XX=XX, corr="exp", verb=0) ################################################### ### code chunk number 31: exp-bgp ################################################### plot(exp.bgp, main='GP,') ################################################### ### code chunk number 32: exp.iRnw:47-48 ################################################### graphics.off() ################################################### ### code chunk number 33: exp.iRnw:71-72 ################################################### exp.btgp <- btgp(X=X, Z=Z, XX=XX, corr="exp", verb=0) ################################################### ### code chunk number 34: exp-btgp ################################################### plot(exp.btgp, main='treed GP,') ################################################### ### code chunk number 35: exp.iRnw:79-80 ################################################### graphics.off() ################################################### ### code chunk number 36: exp-btgptrees ################################################### tgp.trees(exp.btgp) ################################################### ### code chunk number 37: exp.iRnw:87-88 ################################################### graphics.off() ################################################### ### code chunk number 38: exp.iRnw:112-113 ################################################### exp.btgpllm <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", R=2) ################################################### ### code chunk number 39: exp-btgpllm ################################################### plot(exp.btgpllm, main='treed GP LLM,') ################################################### ### code chunk number 40: exp.iRnw:120-121 ################################################### graphics.off() ################################################### ### code chunk number 41: exp-1dbtgpllm1 ################################################### plot(exp.btgpllm, main='treed GP LLM,', proj=c(1)) ################################################### ### code chunk number 42: exp.iRnw:143-144 ################################################### graphics.off() ################################################### ### code chunk number 43: exp-1dbtgpllm2 ################################################### plot(exp.btgpllm, main='treed GP LLM,', proj=c(2)) ################################################### ### code chunk number 44: exp.iRnw:150-151 ################################################### graphics.off() ################################################### ### code chunk number 45: moto.iRnw:4-7 ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 46: moto.iRnw:30-33 ################################################### library(MASS) X <- data.frame(times=mcycle[,1]) Z <- data.frame(accel=mcycle[,2]) ################################################### ### code chunk number 47: moto.iRnw:39-40 ################################################### moto.bgp <- bgp(X=X, Z=Z, verb=0) ################################################### ### code chunk number 48: moto-bgp ################################################### plot(moto.bgp, main='GP,', layout='surf') ################################################### ### code chunk number 49: moto.iRnw:48-49 ################################################### graphics.off() ################################################### ### code chunk number 50: moto.iRnw:62-63 ################################################### moto.btlm <- btlm(X=X, Z=Z, verb=0) ################################################### ### code chunk number 51: moto-btlm ################################################### plot(moto.btlm, main='Bayesian CART,', layout='surf') ################################################### ### code chunk number 52: moto.iRnw:72-73 ################################################### graphics.off() ################################################### ### code chunk number 53: moto.iRnw:90-92 ################################################### moto.btgpllm <- btgpllm(X=X, Z=Z, bprior="b0", verb=0) moto.btgpllm.p <- predict(moto.btgpllm) ## using MAP ################################################### ### code chunk number 54: moto-btgp ################################################### par(mfrow=c(1,2)) plot(moto.btgpllm, main='treed GP LLM,', layout='surf') plot(moto.btgpllm.p, center='km', layout='surf') ################################################### ### code chunk number 55: moto.iRnw:103-104 ################################################### graphics.off() ################################################### ### code chunk number 56: moto-btgpq ################################################### par(mfrow=c(1,2)) plot(moto.btgpllm, main='treed GP LLM,', layout='as') plot(moto.btgpllm.p, as='ks2', layout='as') ################################################### ### code chunk number 57: moto.iRnw:114-115 ################################################### graphics.off() ################################################### ### code chunk number 58: fried.iRnw:4-7 ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 59: fried.iRnw:38-42 ################################################### f <- friedman.1.data(200) ff <- friedman.1.data(1000) X <- f[,1:10]; Z <- f$Y XX <- ff[,1:10] ################################################### ### code chunk number 60: fried.iRnw:49-52 ################################################### fr.btlm <- btlm(X=X, Z=Z, XX=XX, tree=c(0.95,2), pred.n=FALSE, verb=0) fr.btlm.mse <- sqrt(mean((fr.btlm$ZZ.mean - ff$Ytrue)^2)) fr.btlm.mse ################################################### ### code chunk number 61: fried.iRnw:55-58 ################################################### fr.bgpllm <- bgpllm(X=X, Z=Z, XX=XX, pred.n=FALSE, verb=0) fr.bgpllm.mse <- sqrt(mean((fr.bgpllm$ZZ.mean - ff$Ytrue)^2)) fr.bgpllm.mse ################################################### ### code chunk number 62: fried.iRnw:67-70 ################################################### XX1 <- matrix(rep(0,10), nrow=1) fr.bgpllm.tr <- bgpllm(X=X, Z=Z, XX=XX1, pred.n=FALSE, trace=TRUE, m0r1=FALSE, verb=0) ################################################### ### code chunk number 63: fried.iRnw:80-82 ################################################### trace <- fr.bgpllm.tr$trace$XX[[1]] apply(trace[,27:36], 2, mean) ################################################### ### code chunk number 64: fried.iRnw:88-89 ################################################### mean(fr.bgpllm.tr$trace$linarea$ba) ################################################### ### code chunk number 65: fried.iRnw:95-96 ################################################### summary(trace[,9:10]) ################################################### ### code chunk number 66: fried.iRnw:99-100 ################################################### apply(trace[,11:15], 2, mean) ################################################### ### code chunk number 67: as.iRnw:4-8 ################################################### library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 68: as.iRnw:14-18 ################################################### exp2d.data <- exp2d.rand(lh=0, dopt=10) X <- exp2d.data$X Z <- exp2d.data$Z Xcand <- lhs(1000, rbind(c(-2,6),c(-2,6))) ################################################### ### code chunk number 69: as.iRnw:31-32 ################################################### exp1 <- btgpllm(X=X, Z=Z, pred.n=FALSE, corr="exp", R=5, verb=0) ################################################### ### code chunk number 70: as-mapt ################################################### tgp.trees(exp1) ################################################### ### code chunk number 71: as.iRnw:39-40 ################################################### graphics.off() ################################################### ### code chunk number 72: as.iRnw:55-57 ################################################### XX <- tgp.design(200, Xcand, exp1) XX <- rbind(XX, c(-sqrt(1/2),0)) ################################################### ### code chunk number 73: as-cands ################################################### plot(exp1$X, pch=19, cex=0.5) points(XX) mapT(exp1, add=TRUE) ################################################### ### code chunk number 74: as.iRnw:74-75 ################################################### graphics.off() ################################################### ### code chunk number 75: as.iRnw:89-91 ################################################### exp.as <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", improv=TRUE, Ds2x=TRUE, R=5, verb=0) ################################################### ### code chunk number 76: as-expas ################################################### par(mfrow=c(1,3), bty="n") plot(exp.as, main="tgpllm,", layout="as", as="alm") plot(exp.as, main="tgpllm,", layout='as', as='alc') plot(exp.as, main="tgpllm,", layout='as', as='improv') ################################################### ### code chunk number 77: as.iRnw:109-110 ################################################### graphics.off() ################################################### ### code chunk number 78: traces.iRnw:4-7 ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 79: traces.iRnw:43-47 ################################################### exp2d.data <- exp2d.rand(n2=150, lh=0, dopt=10) X <- exp2d.data$X Z <- exp2d.data$Z XX <- rbind(c(0,0),c(2,2),c(4,4)) ################################################### ### code chunk number 80: traces.iRnw:52-55 ################################################### out <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", bprior="b0", pred.n=FALSE, Ds2x=TRUE, R=10, trace=TRUE, verb=0) ################################################### ### code chunk number 81: traces.iRnw:59-60 ################################################### out$trace ################################################### ### code chunk number 82: traces-XXd ################################################### trXX <- out$trace$XX; ltrXX <- length(trXX) y <- trXX[[1]]$d for(i in 2:ltrXX) y <- c(y, trXX[[i]]$d) plot(log(trXX[[1]]$d), type="l", ylim=range(log(y)), ylab="log(d)", main="range (d) parameter traces") names <- "XX[1,]" for(i in 2:ltrXX) { lines(log(trXX[[i]]$d), col=i, lty=i) names <- c(names, paste("XX[", i, ",]", sep="")) } legend("bottomleft", names, col=1:ltrXX, lty=1:ltrXX) ################################################### ### code chunk number 83: traces.iRnw:92-93 ################################################### graphics.off() ################################################### ### code chunk number 84: traces.iRnw:110-112 ################################################### linarea <- mean(out$trace$linarea$la) linarea ################################################### ### code chunk number 85: traces-la ################################################### hist(out$trace$linarea$la) ################################################### ### code chunk number 86: traces.iRnw:119-120 ################################################### graphics.off() ################################################### ### code chunk number 87: traces.iRnw:135-141 ################################################### m <- matrix(0, nrow=length(trXX), ncol=3)#ncol=5) for(i in 1:length(trXX)) m[i,] <- as.double(c(out$XX[i,], mean(trXX[[i]]$b))) m <- data.frame(cbind(m, 1-m[,3])) names(m)=c("XX1","XX2","b","pllm") m ################################################### ### code chunk number 88: traces-alc ################################################### trALC <- out$trace$preds$Ds2x y <- trALC[,1] for(i in 2:ncol(trALC)) y <- c(y, trALC[,i]) plot(log(trALC[,1]), type="l", ylim=range(log(y)), ylab="Ds2x", main="ALC: samples from Ds2x") names <- "XX[1,]" for(i in 2:ncol(trALC)) { lines(log(trALC[,i]), col=i, lty=i) names <- c(names, paste("XX[", i, ",]", sep="")) } legend("bottomright", names, col=1:ltrXX, lty=1:ltrXX) ################################################### ### code chunk number 89: traces.iRnw:162-163 ################################################### graphics.off() ################################################### ### code chunk number 90: pred.iRnw:4-8 ################################################### library(tgp) library(maptree) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### code chunk number 91: pred.iRnw:18-23 ################################################### library(MASS) out <- btgpllm(X=mcycle[,1], Z=mcycle[,2], bprior="b0", pred.n=FALSE, verb=0) save(out, file="out.Rsave") out <- NULL ################################################### ### code chunk number 92: pred.iRnw:32-35 ################################################### load("out.Rsave") XX <- seq(2.4, 56.7, length=200) out.kp <- predict(out, XX=XX, pred.n=FALSE) ################################################### ### code chunk number 93: pred.iRnw:40-41 ################################################### out.p <- predict(out, XX=XX, pred.n=FALSE, BTE=c(0,1000,1)) ################################################### ### code chunk number 94: pred.iRnw:50-51 ################################################### out2 <- predict(out, XX, pred.n=FALSE, BTE=c(0,2000,2), MAP=FALSE) ################################################### ### code chunk number 95: pred-kp ################################################### plot(out.kp, center="km", as="ks2") ################################################### ### code chunk number 96: pred.iRnw:62-63 ################################################### graphics.off() ################################################### ### code chunk number 97: pred-p ################################################### plot(out.p) ################################################### ### code chunk number 98: pred.iRnw:70-71 ################################################### graphics.off() ################################################### ### code chunk number 99: pred-2 ################################################### plot(out2) ################################################### ### code chunk number 100: pred.iRnw:78-79 ################################################### graphics.off() ################################################### ### code chunk number 101: pred.iRnw:102-103 ################################################### unlink("out.Rsave") tgp/inst/doc/tgp2.pdf0000644000175100001440000220661412655414756014205 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4468 /Filter /FlateDecode /N 82 /First 684 >> stream x\Yoȵ~ϯ$"YZJHe9iuk)_½%J^-Omg?UNXS1,4SL'ifdb)4aXLԱD Kt%PhĄD!VLF(Ě$YlT()YrO *,C0%i4:aPY1xjII2#4:ϘQ(C0#8E43H18J CM Ͳ@4,Sb HҜ`Q*1O҈IAKL"2i1&},"5Q)jh0 B z" KI)ZZ 32Zbِ-P)m Ơi`Db)1XnT2CK,2[L YaLJе6Ӏ&|D晘2XEJGCnnv=Wc!M F K@ZE zZcY}dDKedycG/ ߯ w~`?d?YyUyU#0> {EH9WnF[9ggoVb7}X7_\ml]^W,{DzZQlZmu%ra<ݔy)\=k-$.lTԵاҧ>I|c} N*WᙐzƿO}vƝ\?XsJH|ISNv·L| pޣeU, π2~Bǁ }!_QYݬgEpnQ͎ 0}ڃ czqj}/hU"nz v_:9yw7hr|)rv.5q8;!5m &D欲 0I9. :Ti4П 8M0'CćkBv 6 ZQfFo_e E /yg|_K^__%_k^;mh/ /Jڗ{FŽ/Ĥ;̯>6,gϗU0l v Ps\W-'imn -?i 8@/G_޼Gg?hDw8z4X'jS=Hn&s w}EL=}PoUТMx-x_>5!?#~?O_A"b]n~y:Z@W!&薒eMObAVs^v/xq;[W|4wAX.__Kk"\xMvmsbMs\fݬb~)J7M l[YKuQ(hX:6ؽU$gOq{'w]§@~C}u9>>,tdHIөtGش6m,=jB@+nɄv @o&2[hIK>XwGޜ]SR/m<\Y9`fҦV`|q-;iftD^7K_ XDMMmJ>ލh7Jq`"B4P5l!MN;HA/͌e0ȔCFB]Pd4L> &YV!gd&Ңv=ջqiPJ| h-zpM,sWo-?u|vS< \nmźؔ0y|zi՜jteWrG|X˿gkt߶-DP.g]o4cM#Ԭ:0'_~_MZ ٔ)LdSzS0 0N,+ʜ+s. S6"#W5z,ۇ >F/O쿷Xt҈Dz JcFSe!lc O(7@#3HкXl lF: Qf;v8JLՅJrTDr 0=Ջ Ժ>ӺIAK?=Y/<.^M;X}xF[8[lն=D16{@t_?#*ac@kre Ę H]hZ/)( Ij׺n$8G0ϯlfe4ƕ;xEk!ȞTY\My1-"S3rǃ,ҡy9xr˪C]L!Ѕ"L8yȧLvq>>pq?L=wv1Jҿ]P,$H[gqίwY%iY@5T0^ًbކ>{;>SXMj GZ2DL>Ju#(]p,|I:ugӵ M'͢;c/i#,5FxSv_g/֦] /;$]-w*r> ?N^g#\@aE﷎s{em' aQط1]'ZifFT;N6NtYv͂ܰpnD!og&uc VOŲn),D1rV.ħkXpk-n/y2M\m q$ӧBm͓D= i(wy&g4)tI&nn-|zYWj68G?No8Spsgޞkts7<]:E,Ycݱy.gij{NpunZO4(6L]׆B]H..dUEa >d+t[ўhd}g%+t肮w]ߺnQslvV=XYK.^qG!wMau^e+4ڣM=w?o (43~u6C@rȆkZtp#uvINζoU15:HoE}]l|P%nendstream endobj 84 0 obj << /Subtype /XML /Type /Metadata /Length 1337 >> stream 2016-02-06T10:06:03-06:00 2016-02-06T10:06:03-06:00 David M. Jones CMR17 endstream endobj 85 0 obj << /Type /ObjStm /Length 1970 /Filter /FlateDecode /N 82 /First 715 >> stream xZnF}Wc"/@P v6I8r)ڌF\Aҿ(qEɥ)&h!93q3p,paA0 ynYPLp _XLoǤLjY.1s& II /f S6( D=S^`! BH%AA4F3,4 ôQ$XhL[- = !Hh5\<쑊aHJ/iwhIHO`C( yّa = ́SY;̊00 @#g֐:CJfǑh<\r@!p o  9OЁo.+ D A1.OM^a,404 Å $[G@!n`2. %ǏYv8\ {IJ>q pcxLWFbq~/9\xV˜F 4C|vyЙ>=f/*w9qmX} Xƍ"K$k(|h8|ñz8v0^l_^|rvp粣쪘^GnEyx3#W>⮜)A?cFv2+5{3-6EWv[k#>7AT@]ד%1Oyq}S_<(e7SqXFn@x2^hA#A`f]uH^y9[>+Ǔz N(GיAWh@EܳO?<9yfXaMm^ n+Џk"̋l4`eP`ɭbhp<ʊC6nA#u,uZ^r& n&) |Fo|s'lOfl+F;؇dԎ?CfaUmYu3ϋŇqy1_}YIsz n'E1ⱘ~\dw6O8甋o߈ʚUT5*)9uK8:mC @Dro{0*Xb͈0({Q]nT$ LErJBWQK:StP˺=2,r..Pe10B7t^˞Բڷf]KW _ 6^5r=ZߞyM:Io[4ո4EZ&HNeV~X u1 zƮTl4x^!uuI9ȿi R[늗/!x5 K 킺7l2ݡ{gqD$>y|d,qM :vJj97 F&0R|U`I%lof jATjvv00\ g?I$9 P )I%iZJ@1Ef$AU^r6Mۖ/~>z<ݒܪ]AjWu"+a. ܗ#:_;<+U}޶y̝mmx&=⭞!kӠ:4 篎/.Aq][rKڿDaӢ֕7T{{w{ KFP񽺢&I\F_)>X_Sk] 8L0\Ϣ`=m\X_7j(eؤ3:!6,{u/MX冀ʔ{j9l#c~Xѕ> +XrŨXg#xEQXw#(k~i m!+a]?endstream endobj 168 0 obj << /Type /ObjStm /Length 1299 /Filter /FlateDecode /N 80 /First 711 >> stream xݙ[kF)汥Bl[Au kK gm!H;Aƙp)#qXdk󎎚@ hR@pLS8s _pp<`)& G?H+tI!I4=T JM:8&&A1+I/0&%X"A4gJ ,(e \%AAz%(H0LyI4{,94EgZp#8OK8W(1 nô!2 $=4f/a@i0.-igUESHA$nM vc9 i%LaQRA$@s'Mh-ˬ0$8xpƙմ ,jZ O[I,փ֒?3v vQ!޼aiTYˊ?'|)xgM=s6zѴgwQ37]îK0H/ێI3`CFgïU}{OjُE{We+(ߗ KZGt4|Y:+^¥oUߣ򾞞n+ -.ꦁ;/ YmԪMW&M+, +UfuFo%Kk%ȮyQF*G(bΰDk`jEuSB\[U5iհꡜV]Fl?\e[u| +b>%^C|wjc۹>,o56ӵO D({QbD zCॠ\jiɂ'D}9I=!+&a>1>S|^|"f]ҨTRƾ>Kc4ޅ޳E?"{>15Ve돛uĀ5HC cWP[R PQnrqnfH̤}K7ǏcmSs Qŝ:~o_x/5IK#/e8(ޙd`@:;PݾnnXMoh5Ǒp2121fdVB=+>ǗsyP9?8+DŽ4 zfPQU7Ch j3""^HDdYN[wi$m,8Ğ-6AljlgҵU|g'~i Yy=` mendstream endobj 249 0 obj << /Filter /FlateDecode /Length 5510 >> stream x\Ks$qO8xvk~K[aQVvCc_|Duua( e ~9S>SuvM_\ޝ3?/3c8 >Oў]}߶jr*%7NM>?k[x{s-<Л>yo /S{?vJOA%ks!o:7,zs=dM ORT)-̌#s{lI&p6^);t*/J J`8DGkE۬YAes^r0L0KP4Am5sr쮈sA/6/Z>KAxφHYMx#l;1vg @ d>s wvf 4B3wF{YI%_РB0kM*:yplV#vUSL4|Sl4E!Xr ߶LlΆ:Oa( OO&T#ja'c§Pus V)#fcb r4P5HHDPTӉkWW[L1}nW#[4Y tg!&vO.%[q&:9Ir/U)o~[#  4 JWS~O !JYe8 +jE:5l㔭I )#IJâgAٰDs">,l$+؀RWh?(JR@4ʘ=b$)dy a+0Ydjg^x|  XT7:5xm4nxݬf4oEkDqHQXq--tЀ Fa Oٮ?| N^D7ѝ#җ؆Ϳ'Kd`ՙVsG;S+}@ ל5%M Qzۣ.%?]3x9h|Y\Eh3O4D `6Wz>y4ۤICd@".$] -v*Z,`jF^^9c8/ ' -J1g` & B !x[w9jR]CDOyZg <;Sr肥_32P6a"'\Ʊ@l]01u9eGF! Y 2>c4B>tM L^> /*N`+?Еml8p\UeiʳT`T2N6KKE9,@5Z z nr$dC"620M5T `U@: k @UL`b)AՋ,BS{g9Y Xm PU[-!%]Jq<o8⊣~,Ɩ7tӀ=ά\N(FoF" -^-to")XhDU ?UYD^r[mMQDPMYThpv La{ G>ޠBƉu Yw!R#YkR Ovuy?zarXC1x0*[\zc;4rPDaN[fP{l4k T@cp6`3ʥ#X!Q+zܸ{b/4Ǵd %(,A3ػq6I63G^Cu?my),Ф\]QE'ῷpj1-,@.]׳:Aqbef=([RAgWzً5̈́a8ȗrm I(#kMk-˽D$@}ؕ}T}5 @Fڏ 2308۷وb,G9dZ병_ P록A@3xꮤGצz{yP yz?25 ۚA8ϸ,]'0)G#3T4mKw5trA.hC#;|O>c(V_A8~qY`ϒdOtqU=<nBDPQyDlx*v$/H)poFaY6`aA '(ʄ 9@Y)dO]8ΡQF+ _gvc1&.6$kȱmw<$6Jp)=?%jHAåmh_XVzKLȆ񓎍,$mU/2kW,Bx㠅:O5g/MIEb Coginq\8i4hgHaN~y9V[b8%Y6sX-{"?a{n79'!YF#}GI(0/-I@B)wbE O)NK%BZ1V56HܡB]8n5B^8:ED%E<4F,2 ."Sɀ#7+\rNz +nArf{{GmGm7c:;rgqKg溥GP£"}-ǝ,VX Re02"*c:3Vr[+HRG^>JI>t;[c݋%x} Nzu, g!m#0~\6INb–)ʊDNل IoV9!/)R R$W Pk3>\3qМ1^ Tech0r S/,eNGO[N&H?/Xl^q+#ιg am} /G1fE(7z(0[4x+qk[6Y_x|΃a+*}։$jp;lp͊}.b:,nFҲs#d6dyt4- C KWKo+!lIFZc4qQd2NG6vJ,@s3GQq=WUh6J<) Or}&<6X7؂ ޘh&+f_63y2ρ,$BQjePv\q [` |qڈIRZo^ q7y.fNMW77ިb$Dfe%Q<ƈ(pE237lGRbrc0K-Wp0uLrd$G\  Ƌ']%zfcKwliӍh]0z˪i Jm9y]o $ߡx>0xWEM~R;qBq/w]f9h:XJ^p\M2]2 ݈DV]o|'b'/ %p­ҌUH5Hd*dwmBb+1aAzc{9߄ϽBF 9 4xTx|ڍ$|o/(ݱ c9lFw\uPM/ivc9w wFWrG׻J!FKЍux :g]?px+#3@G鬒?G]v~n\X9Hgͬp3aVeIѺ(vbb#QI{-ZmP/| od ϙbz 21qz^\ԇ;2y 7[e >p1hQ,%Y_jIzFSc-TG?uPYHd:p)xZ{wI@DmreyȐ_lHlYpC[_c^-D{-_i;o oF&vjغ[+euPHe6g"hJ`zXXuB?oďA{\2t_܊V>8ϧEOu _q-GǠJ;2@5>uN.pb;?\J_Ix3Y~$GLm`TQTӖÂSS)wt=A|K[). urI$I.p$N) $(^dPWIr~,iqѓf׊݊*tH/樗rAO 1M4$ԑ}HN<<,I錌;C?:]>泞 x 踝RkIk- b)`V ON[ՓqQwrn- fĻ9 [,>GI/ZLy+UƎ(CwJ#R+ƨ_[9EWCd9#jK(!oy`(CUt^'wȴǑztHc> stream xV PSg!{mXM_֮[~BH$ rO#H^DT-XWDݺuumkgg]vggv'9?|9;ۋа3<^G 1^B>/ckFQShJ($*x4H6^:uӦL)/MIE%Kâ(5$]%ĪuҠjrVHF +R掟$$ᱩ)1ŊdtU¾W2YQJp k4`UttAnz]"\ztV6ߡ;.B>g,#MD$98R dM3 ,]#) -`$Airb{6 wDT_39.;9c˅Շ(<8Ǡ<&Gm\=r={Sg\Gv@~|nǒ%LedU'?Z9. n:櫇w4rcWo%SHާ%|PV\tpI`g aъq1Uo%YuPN&}7nD_ h|`rVT59u֦yH8$a'y>N"hn7]h6tI;ha!z lf6[`)0&a ֮(9_nVVgϮK8&*u}Kwulz`౴ͥ̕lIYeCͥ<:̃v+eUH-֨҈E8ϸ+ha͆b2(pL7?~EhHaMփ0k&9썓,~67i,sP$$( M“[7϶H|HqHn4%B4#KQNd?&&c|F̹}7سubdSv+z'~rzƎgnxf#hX n=Qu@Z,B~>nzMn Z~[`chtO\V0nZ˥pZH]x0MlPA.ZɷF5B ;! iCZHB/ P%fh-%> uRi&~59H=FJG^3& xu'6EA*Pz^S\<>M%) >d Sx (mD3\!;?Q\j#Z2#X|VC|E/ʏ! /1s,"r>: 62 4'Ryuv QWZ+6G_E h ĿKb  )՚yA Lhڄ 6U\ĞcID 0(([\TDҰ1^2~ ?{ȻZk>8SM[tDd3یRlEcp.fMT@-\<(dϸ1>:v-{1My¨\zU>W/ #'\w~Rz܉!ܼ|#C"iVED \2\{e^JkU V/ΖHgIkq<*[Y2̄߀DAh h0ؤ&8DJ]MY@EwS ^7q{z[뜒*Dx8S ?މfʖf9DO r)Bܯ =p&D!NWNizkIi)RG~5^k#ZJ,++={p3hIumFE;80c>|i7i{W}'Tl{ kNWCUq`oL'ſ#O'VXcN -ٶ}DٷT*Sr>FGo+BU"։r곍}(!)Bt;] ;o Sc %ZTe{9w<0]> stream xY XWמSA V*ZWܷ+ IB$a $톰K**nXFQ֥VZkoiaιgV='XfgL=Ht}Up `m??I"8h{~g3fLg?i v}]}%;|%"C ۏ(fN J}wD8 :I"Q[$+}w؛OhHC) ۻ p^ap3|xIRI(o5zmy Yc&M2u>1sO0Mcyw@n bI&f(ƒM!kuħzbH,"#XLL g2b91p&.Tb1p%VNb 1L–A|b(1&$,ѓE|D&f}\†G'\p+"x 1Gr?SVNVֽKH% >$Q4UӾ^Zzm>z†i뷸~N7֠Gt>P}>mζ6ۇvC efaEÞχ> ӓqdܘ+hexu>=U{@B"%)oi,aau, VpYC#~[Y 9 gaB1JCj%+AI$5x4xȌdL3(gqb-xYhoX?|rPΠ?Wq*6;4@u"|<'xgBG벚GYՑ/!;YܼH5uR `xO0ȿAÌimu*|:PD?{8=Qz>A~j^[WNg0M pg0B= ဉ/Rb4 q7? 2hr~W]jXL;`g\w.ByrBR RSz AK 쁆4VJ4ȃcGxz Ŭ62OT(יCbF>Ab[jQsX+x2bD%JKkm5~mXإK? 8<8<>Q:d)t V946 8,{ x+A_M9yA9 2fXg4B2ݶKpx`dx 8RgQ - F}HgiOY\o<ڵ;ߴt5{ п#nk8rSAڒ@ʙ24O˯˂] ٵm]Jd k+a(\M?Yv@UUn\Ûol%=ߠyJ;R2w F8x6 6p}à]ڭ,4vX~Ȯn%>č|ZW{)H jn(O?^sq} qEV\;-O& ɩL|Hpf`zBÐ3r}`ϖCͻ+sLn~u$z2@(דƜ84>i΁D̘&b" ˺:P"t7D []]Jwdoܿ4g6ػՂw.o_WScW2?;AvJO!Ҳd=lZKe<Ԑao!޲yZ Ћ TTNa5IQr#2X)1rcja0) tiRXJ'Cnw>] Yv`ij2ruWᮬe(29͔913 xF(éoa%즌Cdi4BM(U`7h![:U1e;XJ}۳KY{O1iU]ml4#;uLc' Z7a_1{ԵZ<9]ع#f]UowLCh,xNA َGp4Z6|p4.LLc*ziϝF`䧖C72a23/gh>2؋x gYq7ɕ)u0ݶHh3AHiSbDצ,VfULD- h?ҹZNob1i]+*I*.\㩎ԴEןǩROKcs4 Y+=P%uWGhd?< {^]akk|~1Չ)$-3J Xjv \7f? Av6puac8g"ğO9^plC}p4*z9`%ps&lp]qY;_C`}ukITZU<;o֖I1+j6\:ő^J}'!u-, 'U{[r%"9-׹,~d2pIڌø_L6335k7ըwE5Mvh}P5 Mr`_6*(WN ع Sw,*쐮[)W+0]zu` F9|tul=zE;,<|$kOs[U1&{/,;+!URaԪqȠx 66g>@4UNŲjhVE,aAᵱXE^]ݫSEHP&E6X)(D°䏇<=7MjO`"Y+FRX'j4 | 5,^ɎHvUK%>sTJS*@BM^gk=[_[e)5|1Rk͞q2^^S<#C=3r2g\M:ճpj&P9Z5OW|A>qꭓӊ,#~gRf>zƞsWRڴO$A "& ,#4љT1h*ć-{<;nSp]vLgڮ gSmB13+nF-,Cino*nym|@޹5$됷otż v.e\wuTCn^v:rFߍ`_5{gCUM t-6dӭ2}򹍰jr`P6.ܷ 021 l bQ $R1+>37ЋA*Aכ%pJ=+vΠ,Ĥ܂n'+]@7$,# (R>3yysq_p5߈cȟiApMb|o))7 9]!М~4 Yftql1D-UDT, ‸43+?isWL_樜NR I:EhjKDoVK|s#,\7a%qo· IUjILJrJ2dQ%UNBC hj_x89 2- WpFZd!21ܿsv)n::;h/`7{a7zT!M4-pbA>E) KjŒaYz@ύI |bW۵Ԡh<4= ditZ9qQHWZӔ:V<8 ZNwPOiΌߖ0B)|6?>zyv۵Olgݾmشf]W`t[ytS»zP|CϝO 7+ UƕghyhR),01\1Dįh sC((pNl\.Xxf.+Q}=-a Q]p?EjՅs~p;v|ʀK }ob)Έ^5hHJIP*$7uAA0YiA8ǜy ss0Y )}ta$I S0q%9 ;}ksW?lL]@'+(yyD ,Z}K8iU s?vb_Xɴԍfn[_E )ϓXq]8 45ސ;@Hp9=Ƙ^ sr _BۤLUPrE@χI8^rrE d\)U?3|w%e#y^p$Qcbތ#UG\nĪ:,l5w`pGjы# `,QG+9 AChĘx*S誚p'y>k7^Kp㇜ϋ(jTdzͼy8 r٢~</}pIMD6(8 {_Jpb]uҝ_;x>~&蹡%>7 p˭.KR%_vjveqE11q yPiTHZJT\B,TrE Zv2EqNn6.i`+a,*JJʪR˕1 V&)Yqɚz?)BN?$. NRBw3pa7I(#"ЈE(n#A|㮎C$n8c)b?χZ:9TLMJ{ym& Ddd3GS9/& r@ݮ_4jh.I얃_!jfӷ.t7ϭ$怜RE'&3ۿV&&$2E> QrBs^L/+OOC>>} ?Oendstream endobj 252 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 329 >> stream xcd`ab`dddw 641U~H3a!O/nn߷}=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUMB9)槤1000103012{='8÷}%`wyV]پz>3l[Bz߳f/;a* r\,<'\azWendstream endobj 253 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8556 >> stream xzx׶a lz/`SB1b16 -ދdI[-\0PC $HB!~ψ3$$7yy !3skDTnH$89 i$?Xƿ.YςMV[ 2~+|dt/rGudaNA1~;F{2{v'϶[)s Nح =ogxxI&zM [0f]Nu>a>>vKdv=}̻hj*[IQԶE͎A[], ],͈+#X_Y0~{Cؐ~ZMwE6Gltxx! |霄snIݤҫvvY :dak;>_G,4^ģGrQ_nS+M`Dۍbʹ(Te'@8&aGPJ5#kԪ:z3ҞP Z]dktx. T & ,Z1 E K60C"D]F^Z##cgVZA$[諹R\M' Zm'y:_leO\Py5- ƜQTiZ"󯲈CʪklvU2l`X ZLF+ 3T/2+#tņfH ` Y܄|a7Zl< 5Em+j I&@r(T2l!)&[G#G=ՖUoA7H^ӣFn2=}#3WUO*S([1U$}\~d>v=iڜCzEmtfat4P"#ZC1sՋHJA/jnyE0{ǯW$o+ޅY_p/>~@+o<\Pi1uލ`Npq ں-~/{HA`z\ T a*eJx52!P)&\5T&{PC~ "C*]c#}(Q$EniS4(|ćՊMvl9RjUs~fY؁|c/4 OFѬGhV)jE4O̒,zЍtcRm( )L=IohDJяQ-1R٬tyh%`Ģn2+4 -s=;Cڵo`!Bh Jhɸ;lڂYQE4*^5Mb5*EX\*I2 ;h4I/=5*w2I:WKMIϋm~C񁿄*AAh,rF.&9R<$,8Irj_~x1/Xn.5;fE*%,wf$cZO/$6lDj:fU(1p?_e<0 Q|pMRkD҉QAb+(a|!K3U=..DH)-%x8S) AaV]2Ēߺh? x_$a 쓶jAťe!U%Eu g&E95K𠿠zih sZ_L@ ,QmW }SjM9 H9UpgME/Aۓp)z~FhasXs}d&Y|C2l)/H"eMTy|Q1CN].4j*+$"F1i42NڒVN½O'ܵ'5O00۱1#({bӤ@&0+'Iɋ4D#?sMR]"lZ Am3+i,k~UxI-MQ 2ȚWOຜPIe*aݩ"-߽wW.0]J8AF4K/2R)F,7b{*B7n7XA{/ގ@;<2".͵>yGȶdFIj6q09>o\O]U7 /2EI\OWn$B>yG31[q>[t48_î{`XU L4H/K9.EDbb#Sd>-δXKoYJ%240{b+/a|aGXYluUEʒcsp@Ęi@AV&)]]Y=|z:޻Jj}?i5_ŚƳj"'M4t07kSfkzꅦGA $yf w_|42O"Ó$VEcY׻6$fm:Ϗb b !WlJds-HDH׭bPɡD5"9Kb^ڑ ObtJχ^i޴\ʌ_An(.o^KL۹CL壍7 *Jmp cIc^2aC)bi¦5idPuL~Zi6J*:7 TyI6 u!hmFh#}lFI!=7k9mPpr2ʹ b~g+PWLa90 ي,y*i7=YI+hM|^^ll'j#L*Hlڄd#c4"<8<9eh4q6~6_?*FyȁzU镚$g?$d=`?{@>)oFW5Bc)O%{P Z΂&=4y37ڹC:T!DSi9eTcb&Ċo >Կ7?ӗ|ȜdHIPDKk#ZU˥ cj\'Xۍ=aͰ6 E6-[?4[ 29, OCp~ sՔHf@$V/S*HkkeYh>/_²\R(B]]f[Lļ&S03//h'k>t\ ;>K왇Y.[z̨ȵW]|VF nKmܮR]N+,]#AzQ-{Ko@pOq֎{N|gJqL^ ; lM7pnXQDwwʮhE/7aahmUN,7x X 4Q\X@\]ZS&Md:PgE=UYH3?3_3_FCϾ"Lt+래_7Mې4ڒj ;s8CL$7LCmɞ芠T\#I3\[IGZ"qu_|FT>T>Dp[0PC*#|Diqe;]ήzW&ݣ0 '1H}PXHw_.1_s}=QV;z5KG;jcceۥJbE =bKHSBR;dt2Jqk;?G>lWaџuz$Y}Wѫu`BEdu^qJ''M*]UMI L㤸0yN)ۏVw57[J̩ r Wy_V@GƄzϸ*8 Qt:РA 2Y󿰚t!,]*d:.Hr!K\PWTк_mEwD~ǢlԷ99K%ѵ5e%Ɠ>'_lYQoOc4NbîA)R_eWATCjmqn~׿+%L7hЭ~^n4+$^LdUXN>*ʨ`"$؍ E7 3hg~6"41G[gK: Q?ܤ'suױ[G#?}tx1y&yq+7.mrZv7t#̫=m.4w{}r%w/RwCX [*q+SqHmMz:d5DjE\+ m/3v`ܒw7{UޙT?A)ODuPYTxh`MtU]ߑUE@y2 ;a7*TsԣEy6+rtP Z7TOIF^wY'1ƍ3r6197KNwnyŔfi3Ad()i3| x9E"Ce3 #Luj6]~#OU)Aaq5zӹ4-bS_\ǔǖ&ӓ ur"[a+#Q0l+ѹG(^̴{_]9gDf6lwl@m<"̷*[H4ƕ<2p_p(ƽNڽ{]A&bNmFpQt,g,&jBZn~=r20 \ X#ـ3RNUt7ǹW! Po+Ezy;᧨.HT)緱jM8/z9/a'~ ?;\- Br 2<Onx-{.h+nK"&(ar%d?iSs"M" Gh$IX ;vO|3@ ]q%h9QZIB4#bf3bZ(g-c9C+DHl`/D~ѥ%9l.3SC 4ʐ5ۤJ Kc/b4+ ᤫ#ra"ӿ(6 _O:db^h2ԴزTA"Ȑƒ|0 XhmQ5Zv"AȚ- hĶ>sLóbꄗZ(LT&*8WGEܴ,a5^t'LbUVaBUFz,R%')kz4_hT٪Li E]V]$I/~y[̯%F̠u*)V(|ݼaOLX(Ҳ^ 8}RxhkJrA VEcJdh$.-bcF5y3ӛ`uXd!4w69Zl~\\N'@Hd0M[mTs Y@{^>S߻>w˥P!߻endstream endobj 254 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1060 >> stream x=Q}LSw}Ҿ'US{9&86dQ&6Е B)*"} / VLʰ ``B\2g#9MƲl lUs=ɽCSaML”ץZz5L(g`2P{2 -<Ѵla-/3ڄx]3Qر}{dff48.YtChUJNIZSuZ;!QیaCZk {-f5ڒ^Lf -zLQZmӖ(5*ʧ *ʢؐ3*"}/h؏$*V_&O "՜lmbLn0_n+7T;."WѫCĎ` `ȒTA:J2v٨H=EUz Y^̻AϓŌOl1 wb&^3Tɵ9N-xw pl*9*ŌDkPV/b4_;+\[3wrbtkpq\UK$y*='xq̹xU?u.4^2lz0qkiSVOD>Ux$ 8]v9O=2*0" [6iH?#<7;Ņ̾jK.p0übm.QIsQSmQ#j7Fb**յRĢ8M+endstream endobj 255 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5697 >> stream xXgXT>T@&KL4QiR>0"H0e Hʀ 4j45D˽c{o <7q?x{:ֆyn'M6?DbsEWB?=C:(?Z7 c\Gv4sq'N:'O;;*/;/*uԬ&L9>Lqۢ]WEIwmu];xya!(?[V?i(EQ 6/1n[Vz5A!'M2G߸O?/EISS#UjʝZCRuj=KmQxj3ZHMQj J-Q)7j.HA5J1kTjBSPTj5䚲B?mv 6{v>DOm[}k߷_znF?w=~8xAXm_yhN:/q}..ZSW9t%m4K 9BͮlZ:k"-v9foZ Lk :͑~FiI$1VS%¹`Q>8iS[+!>K^`#";|D|y6\@~ z2zGuU`"g9{HrK'Ν[ M-i U0<4& .fn8tm Y9oDfG$N=GRކE^Ρ -4 %ه̝ 7\MpN 鮠O`~˝0_↯xCU/A&1mg8*y%?(jo EF>x,1Xs8{^Y~P@#4UZ`?쓙L^ E64XboѬmUC Cz:Q$u~Si! +3Txq+s!`q4'7K+PLe!'q'ڊֱF]0;{FvrMz0 #t,ehN4e/>R/^5;{SLMƤ`M0Q*ylJ82)Y8`b*DYQ:@RfN6 ˊ靁 N8Y@LdJ\9= Lk֨CCd(KvlaKt ycߛGG խ=> \ <OMSj8nI403z \)Ds,nrH33ukhAbK縓54QFp!hYvN!6pfQjif?TpJ)BH/HԠP^ VDXS:p=EZXndk$ȳ3 R"D/ыS7/;C^*&Kz6LD8s]k Hf>glVf&TY\%k$f"zslB~*;et:T.VkٓnENHV+p3Eu\JB4(_mκ,+ 3uiP99Ģ:ْ#˱2r Bangϱc [괄8ySktR rjf:B &(R&d(BvNi!-ę޻'N%8 Oĩ5:喏\ @oH1֌4:]|͸ cwlow;0egv/9!uWI 6o, ̅KB )?p^0On,mP-P-ht=x2=!`Ki;eGm۲ɧȧm7LT™fA>{dnl-l$8B ZKIp:;x]I i γ'de@aaBD v6']Ai_ྛW}.Ig֚=Z ӧ@!k|Hly.Rps՞t4kj6^ 1FÍȿWڳ %NJZ]ΈGmvH܍~EfǮ"wE,yE'>ͮQgѯW ݲ#oZMDPbU@oc-^F㖐Bpj:{T[/#;<1C.GK.V콰Dh!ZƢ)h ?cn4|>%$蔕[F=籈gX?=ydFRcFAO6 $~3PF} EJ( Êg*7,Gr?A~.Al_&i?f7lo_kZ`ߨ΄<2&j$1R)G$\w9~M)l?sly2T Z.E7Mu  iZh&se:#ʲ:"d\Xxq}unI7ޙŃn[)\E[29y/ ŧj4\ gLW%yʣcjqތ3VW4jrS@;yXG,./^_̼\@'!׮l$o%7f"Z#i͊K[o8K^XݕޒjO"PYs ?Ki\d>Gw>YTA^f̞]z>L M VڻܖM A&*qdѸ;D:[ ',JWӧ͎G"{=B|}MD Mݜ ݏ!c LQFŕq07ָI]nX.<-FsJ ILKMYBl_V}+ې_?|$ڇ7N]k̍)'ƾw֘ ƚ#Ǚ/hS٤DOIm*&ENMq\~эEЅ^(iH3a/n `  {~pce=o߼B_zI܍lM$a@ъ66# [+E9ͧ=!EHϱ1 _B։' 9q"A}ev9Vƴu2g\nAp3s%HfB}Vyž n?5/dZ }dYxN?-d ^6'5NŤf(3򾾎kc#"3trY<]v%(^Ru #~29>mtݹDvtZ+R-w$&vP"dX_ xtJnT0.DAhw݋h`e3YJ"i",ۀmtKhٻ Y*GkJI(J ԥ1FScBOtefݯ3(GBeַ<"@}Z(ٖ1=lo3~ѝh}A7 .τ i옼KCE|SVCىn1)anJ(-//lMۜ,w@WX*YF*ZO%=VBgfr:V_CP"_h|%ҕ7|s_F+O Pՠ)\"S_fX%II*sQsv=:a$:?#X^8f>Fy{?SqMzLID::_hpNr:VmqVZL=~L2#?eE'6Зc;5cN~ )Zendstream endobj 256 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1526 >> stream xTPg%azy^E[-h*vh ީJH %Ux؀P[tvqzVec;5Wm^ճZ|L7R>>KSi2m~~zZ3%k:23&nx#?B=3$lHDci}2kC46͜͏k33HKd[iDٌz&fuIosh9=z-M|vk6`Yp<_t鮔t>iH+"1y3:\]8s_]vuaBx6׮C-o:v<CU?665ƣ}rySoiԄa$-goP. {/C|``44.w7yZ-YB.sN9v\vcaaa֦G&n[$sIĒ.x`¢GXQVj/'ɣ=gڌI+au?4wĹqJ.&:2k[%zT ss\]\R?IJ_ߒU@&"+_{zd ꑭ`+O"&Ҹx=YE?[#\V8SkCR\\8n*EhV> stream xcd`ab`dddw 641U~H3a!O/nn7 }=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUMB9)槤1000103012)ٽgf|;?̿ܥ;~3>,}} |g|Waq6;7<_s/wt\7Xp9yendstream endobj 258 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4274 >> stream xX TS־1$ My ((2H02BCjjV[kKg;z뭳Xžw;0Dz, 8%0gE]2pñv90g0nH%MK+)&<4,m¶n3<=gOq{mAdHL6u:.,$RG?Di%Mx#,.nkӧ'$$LSGNĄ9q[Bx\ۚؐmH&*m:2ĭwwzyi"wDžĸhCb *@k1q˴ Ġm>Wl [vgDWfJgÌbb<_f yˌc:f=3gƋ,b1bf:,a2˘rf?JƇY83Ca Ϥ2 3JK80iO"ݕzJs8ܓ푽#Wc_r O~9>p<2hN-N݃_9 ^8|I;u;z؅aK'4싅0d뒈70h1.I%?`~>Z;l<8s8k䗉lJ~ p~),'#m2W%0&A)Jp JAt 0b?9)SC|bk͟Ap]9Z;OAUsL.vn@w.JBnbu did,Np"=E'PeJNO42L! X3+.<>;uGE& uYd(j\&8&h<2Ƶ1/ CŴK ;)ϲd]ϕ%_BzP"hJ/8)@+\ ]5\yI pgq8>R=Af*@k\>XBL?182q/p FHikB^]%x'`܁Z2_%^I=8cPF ?]=Y!ǩ`[^Fx]NIX6tef(Vz;]B %T*[(~NsWZǘt5[tqb8Z+ܠv) cyc'cO-7N0AEYq8qڟ]\s#g:~')|*&e9K/Y:;Zou7]azM ,2;룃cJV>F)/AMxt$*E;]D|)8eye]`5,`$IHviP螰,.v.L4gׂk9 ) f  Q9R!']9[e_ cCO%67s_J^FnVQ,dA3.*1>ΰ@ǩ/'ZLZP+]xr-`ϲaPβI*³w?2 {PRCScMkrwVXU}ƒW̭D\/δVn/yMXk2`r ʡ# I;7N~Lt`Gť߀]UFU5:r 8Hđ/=JStsUžo6Si?ث!}&0( %Z%3_s}ц:cȴ]?R/lEUEUyui))eM;#V 2tX])}',ZiM6]b) - 8 7$NA^eԋHGaXZ -o=6;uoTvvNŔS!b65@+gՆo:~7NT>SUiH0ϗA15[Kܵt:Nw)o_2h0*dԇw״MX:⽘R=KF8fN S1IN8AaN $C1 8|٣V_Y8VHlnTVN8ob}i pKѾblbD`~z = O$Bdhi" vA +I|a1UCUT,?ZOrf\ Z! Q7x? +j)o}ĶM+:jLFF?|]ϟS; ,tիR!C?6ڪlpR mp"ɶsz&}SRwʧM 6VsqX u`U XL*զJIK7 yl]1dxUʱEY-׈oR!Z 7nn>Tuձę=8eɐǨORF/_]X#tA`n3i:tjߠ86pNS`,²'߉*)ʔN>?Vl6,ݠJ:`m);ھȃHC@u<7*}l>jI-R6Up쯪K:Viz7G+w'&QAPnk8߫Kq%vݛ߮n)Q֭NMVJRZYpI~xo ޳H )aas z2)D\ ø"E,w0|j [΢Vt14Y8)=u(eOH@cQv(?RM aV~-"37%ѨK1*7Dh5t2pCnF'gz5"+* A#.)߶98("<$9혭MAetr/]p>dQ/R]qRVOa?ayoQՂX/+=ޘPmplfҖM*z(`Ֆ4j Si 3 e*=HQ\\XZ_qBӧ?'z Z oJKꙺe =%wq p%U͏)k >{ dۯYP0xc(R6-)*..*x!C4[Rʡ Nq2A36EZK~&(#{*! +{ L{ssrs=:;zݛ쓞dgsp#KAY0nӒ{{.)[GkɭZiBD˵^Ia7`b "[HTUɏ9RJ*8EӾ{ނ v%}qT0NzKku険L j:'}BD6iŔ斚5y'|뽂TJI3h\w sĔǏa-/atp'vY@ uTzu&H7(mw2QO6sHÛm;22g35aцC1c҃rM-'{Bd8Oy1IHNUd* ]XkJ1MQ4e݉k\KG3[Rʲz/KJKwC۪x&{b]u\FI|J䅵[w=XY' m.JXۺ/`Yy)&~p;"lz)D-ĭE%r9@@Վ::qщaH!endstream endobj 259 0 obj << /Filter /FlateDecode /Length 7441 >> stream x][sq~#x"v3ʃة#3Tl?P $Eg{v{.JAОٹϦ:_g|nNϦg?SY۳y({19^zFoΥ0dًrxq~14)i N Q%ux{):? ۫hD}8!%N%烉=bZx! g>vKy#/"pL_Q٨*$s*δ!) "NetpF.~VΑ #捻=W(,S|>T >f+4-Tß~r#zsY>Ct y埵 ؟U)/YD)_2B8TgEvt+ڶ*D!3?_lXX29blb+hr>\*oX$<6h Y#Vy!nI˪LEx.s~ g^G,]]>$Mbe9©z6Yoj,SBKd ;Y]Y7ǵWM{hRq }$Eg;"X|YXY޸ïOL:yaqENIe>.tyQUj[G9%xߌzK6j$ArodKGjǙ+N2wN6B):Gw̐VH۵"'byf^UBˠrp>ʻJ-*KW d<xR͚(Y.|s&ZNAL=֟jqsi3;ZtHB_i(.tUj*^]M-ePດ/ɓ[c덭P#J% aCqs;Rc&ў92qMZm|6e]`t#X-H4\IfBpzt&LR>?]L'~GGL1Wv1O蟸yX+5PQ ,|!#E#VT:K1ߑ`~ _g_Y*8Qug~3?sz}+KC&zCkUD1 D wO!6%i &Q<¿R#MֲYh93/gZ(b2چ5*&k,5y7fRŀnt4JN/)VR8JTep2R;c}$Pe{oXĂ}]~%BՍ5YW!L}f}3q 2 Ι舨)ҪC7: l J.qҤ6)[af[5 4Kn5Gуd|ͦyzul]~uܳ\Hb8#fw V&`EH"ZX`啕Epbw#dR~$sMpc#P~7xxA*с2"O1UTvS=d>Yf0 gbR~7PH#ǖ.'xI,:Ը|p~/v>Fm3\6NbdXgm X3DG!b_cZZzC>L Z 3$%۽+SzcqՇ-KsL#/41lB੗V'BKw!kA ѱ'VSwũa "#,['$´c}JldșƷb+W oIq n;q͑_:py}oõO]>LTScJTt :"B/̩FyhEתA`ܑhwAQYC_Vl4n Kv8_j`VV(.SZA`1u#[b5 y43mCIJOmv Uf3L /h`=?O\)fC iCi$׭[GsXqzQLd3nOidASh="<6ç=򤱓tքw4$tz bH -aij>FvtXEm}gF)(WZx R~9Z^Goj̊a֓w3,P9/<9znEoҽ@BU@0;$0*Jb8Pb#ԱSшjV22KI\g( D[odϲa='O'ӭlhnTBii~=p<0g@`T9l)UʦZ^TUI}ׁ 71Mb Pd>QUE~i|DJL>Bn," |6Kh^^&+,: Y Hk2 Y0wW۷@RdWPh6W14aѿyi5V5瞴<&M/.+.(PzuDƓq.1!uP>KDcXn\D_v/ %4PW5X,+au%j< k-1[ij}|)hVWPYg?,U.fAyJcv, NxkT?^x& = T: B6T舎K fqWLme@v6jRo2w+d3-l!\}\g߄Dh[c/}E^dZb j"TV>%ף3[?/[m ~tEmޫx˅Ն>늀,BxPnУɢ)$HEpT`.VJCŬÔ☪8|ꪔV3WblK)#uZu~}&OcN0{؏7xMdtva`UN˵&W7Y'Jvvqꢂ8@ه&]JP5x;z$MNI5wBճڇe/ {Ur6xDJ0@A^#驹+4]y+l{J=e OzcLdv޾jh~c*UY$N5K7/<8^MҽX 1z%DLM-XME%:OV ܥ6!XdNRB5.J, WX ~mV(!zaዝ(M!@Y0¬ߞGCvNj֩'o~Ld:== .B˥F@lC%G3K( ޚozlõ)lXd9${?`^V*F0%A6C7DE_,'iLsOvt1+Q[kfslʅpH#J^bU*AE?u^}sԐg~ 2YAӇGDdL2Ů9}-W;6M׵KF{ Rd LYPԙi='ǘK|t<`? }΁Wee'~)~:+7툫oKm ~hP((/A \v, f }2 <mJ+:h9Wo׾a >- >u.+b^{\t'v u17쮘V[eX~ߗa[MXWqNg.ն@#6r 'RLtϗ둹 uhfǫ'P[ql|i1F(-Q(>6&,l\s2^aW Rbl3+p_O)u8cNkWKSZZ⩺ciS'N~hfW#!90-xTyG-/ڤ~E >ص{iC ldg4UQ㙽,WrLLbyv]MvMvJTGSECٓhbim  &wL95_>&tݸL{]râ9}aȟEMQ Ǥ(EЃN@N%7IKRej!Q*,N:LՁvAncC jL1 UҤ؇X8VzgEJ%sdkY'E{ZO ~' VMxҰfLU(>N{6 XRno.;mx,bwhPAB֣3hmG 묆K];#;q]9RlI(W-iW>.J/RtUMgaajKf`/iW0>5X2BzvZKՐGXH%m>GhfM[XbŢߟ7zD3&fDsZ.;>quTлaić$"uhzEyK82sXv cZzdlI){(j&`c 䕧+-Ν?b')j!. S]43 l XpOpT"h3 ai^:ŇYy(r fYub=qݓ|yI*{حbᓚϤT95 ~EqŸzDɪ^YƧ)/-.>-SG8&ҁUa,fS>b̬z: ;:xP"Kp`#(J 6A]0@)#/4͜%gؐg̀kZŕs X ;_+D w`+Vt3-Qaxd8@\-5L!d+^ןDE-ȹڥEwFNi;`%}:Gʰn[q> stream xcd`ab`dddw 641U~H3a!O/nn7 }=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUMB9)槤1000103012սgf|v[?θV ؾ^3+=lY#];qqr\,y8N>#xendstream endobj 261 0 obj << /Filter /FlateDecode /Length 6735 >> stream x]IqGյW#(CiD6#= @@hxgVUwe`$<_w-Y|Tg$f?ͣ^<^?ᑈ?^9x@3!`<{QzS9yf?ڜ=y< gvgO^m={-ޞ<;vo7*.9BSn;h%8ٚt I~6kܳ'`O.`/Ⱝpj3|γ6'jysc X^pRewW8YZ 3Z ^N yvC#540JcxWDJ)`Vuy.fyO] -yCu6XKK?`L}Y8X!]I evR.yQҫg TXo{|ܻeES3o Rhy,԰@FOyMyrfeCae 085ozuzڸBZv!* Id7-p*/va0{lmJآX5EEya.qD!c|ɩƙ!7+.2Ȅ@@9 ձt}`Qhײ>Ӿ+gsY&ygtZ/F{"rR. j 'ȑARR:8dnG4GephIHXp:|i0SFyzJJ͇Sf%sUL+('$ͨ@t:J?r9hmMgi~{ַ-"ާ~Ctύ.5JDdSp G%uk,D@@_\ċ+#  fd13Pv۾.{'x-WSBy ;G"(Eщwߝ{Q8\_KaY78$ "IBG53E&~ɖ,IC<I(uxLlj! (Nׅβ.TӢw^#!7+&Tk|.Dm89: י!4{ 0E, ."a6B ĵ[$4C) 1 cna ߤ9{ !<" m"g[ZK-ĐRg10,$d}pY[,ϋKgh)j#0t*U )(O9`"YP]&f% qĥ1;СmFF4f6I ¸"hc:"}o> , , 8{aT7aamq{ǥ-nd:r3=Tij|;MO[+-JM'FyYXcO[*{7#+iǻ0g!MTs!p2n2&T y@]""3R1+}f9acaTI s% c #%xSQEGlk_{a v<)<;/jZFт?ip'| Hrva\Y{yw;R]X7Պ$_tcFq'.RsNVvocjvuo{(םJ)M6]0'T Uc9cIA/ jUEM?,/Ȁ>_/Ʃf,RRDU!<`]A[EP) @oboDF, τC/Ie X+.6Չ(RJ+cxWT3Jmش"l/g\@ۨ`@FzX1p"{BZU0Eҋ10qKU9Hk'LX%LT9:sDڣWi[FJLyO_%'m k)@ r)IA&QJ ~#b9)݌݁ڍ̪h~Ij-t/ ;HŠTS3N&"hVji6:N8:}**)#:l#u" nCl.9 _8SBry H/F܈oRsrqbfY`1RiDwm~a?]g$2ew/qzA ,Kס*UǡP5q^m$-;ۖ~Q )&mm9 duؼZFQLk+ڪ )u~2"E: +GAC,0UGboVS'?j~Ef hGȥc)?GeP' ]W,Mj.1͜~ZyS[xƄ&Feg%*+3YYkwzȜjۇuCH!f+L ~hb)QHOWYB o"}iV~U849u<-qvw6{v[R3gp=![YSoHJҰP~σJ{a~,_ . iK4]r`'k=wVխ>Ǭu ݪ[ܙ[7YzGhLT==z|6V=/SrN鑲pt|޲3WñUJ:1mՄH+adO;QeۆQz0TYǤ}6^rF$}b3yF7v{JW@H7wTDk7܆[(E$<޶twiimqm]KQa5ɸ6S]Pbf5]M %z샐̉˄6f7: À+kN#%8Of2yDT'w-^8h+SFU"h,xhʚI98RlA$J ܝ vmB71[@tw[ w&# `#OL#s,=ǃ0켤ÿjpT76 x&{Iڭ#LJa]Nƶi\K YP⦒6}I9tU5:l8@U+775y!sMt&V8iP7=(>S*E] rQZuŢKRC%IqjTDE:9b<=y{v|Nj :8уhfzY0T/6HKkǺ1&%BmvV]qqӌ"I5z}U5m w Q qF[ *9lq[c!59H4Olqu#EUN^BR#\_^YPye5ڃvTUb"|sd(܁Ҋc?c;uKq?x5+pĂ[3ԓR+;Et7}8$y\֑5X<6h:݁*bU6(LIJPWwYshx\Ϸ Bj9Pm oRMڍV{_*,'|A(*VH/()1=Й~0'S'dlsRGuVwoVE`̋3Ĭ.`%9/٢ՠCgK:*,'1ީXhmkTlE{昻xZ.7qY9i3q񅶓:ם]z)).m$b:Vi$#?bE}\6=mpiijRtOL;+&ߘp}O4e>ONQ"֖X㓧yUgjce E8N+Ul`# VB'Q[S&/"#giAWhD G{F"a4/#T_p!6&d3.H ,xB̗T62.ڲԉ&AO+V둚4ffPT3q,Nzxs=IH~6M}",:g~wXnlr&! Ѫ;7RkdJ_N5[7PTayb[(Y2,.u<6~zԩަ܍Q{3enF7Z-/:PJHv2M.T^؍B:*v?)ΉLfQe\'\|*q - ^r6pgiS d ԢwS+Wtһ8.~+W#+Ƕԩ^Vrs}2167Y~L  ,QNGmZje7G4VTћX_(ެ'C v"/Yـi[#lN,sE@-G+#~-&_.L`6i$-dJO/ <7\ġU,PeG#֛cW@g@unah=2)O+t_ď5Sn|>ABL neyPMoڼ9Gۣ TqunY/ h,8Y^r}yO{J"sz'}>RzDV?_]W7_)mq^c$߁uܖw%WO;[Lendstream endobj 262 0 obj << /Filter /FlateDecode /Length 294 >> stream x]1n0 EwB7dV \%Cl > stream xX xSUO w+ЈsoA^: *AP ( "GRLi杛nޏiiB)"VQtAwfttGf=73;>ۦߗ6_=G(8A  'LO_`at!ǢB~'dLCǦr@#!(VߴT%ߓ_Xi /~zN-/dggVˊ2+?iJ*Ti-ͯ(]2oRYT>DsҔ{*^䕲%i3di![YRTKrd̢R\VYX-SZ!./^QR eVW(־NY/ېgS潅m]3KW"[ ! )(xE`Ul͂-?#G?$xBd#|*?"F5 F_Hqt^hx Z+h5O=Mު[5Js~'F?E OV\ ?]\ xMkcXu+@*(F?ĢY*+OK璈@풯үSϹH$0&ɶ+bORm; ěWeWSYk6d's4o|O_DEG6dAfY0do'0Z(ɾS8]I(=be/oIR9mP U2\d %+h5;BAoA Fvm^'ɷR-;Eg;9B芋:3D4tp3 rtƤ̯Ipm7=A!Bģ4 Z a{^6 *KY78'4Fn 3yɮg@OGZD _}EvmH#O+?ff&uܦW@<7OK]DlDĥs+%x̆*R5Xo7^';ooR6FD/RC#:]w u[ֆ:}Pg:;m6{=eEvU]3Ȫ>Ӆ&+{ޫ_l`,u(;Kx,E%6 BZE8s˨#kǮ"EfhF嵹R'%gZT>T_@k? R4So-xbhƄ׻&`g}JzPjX xZ3C[/s;D$Ç=}QNN|U]\g5+1FrQm2☫ir" 9聦Lᘭuxx1ccSך!fm›fRzX7L]u4SCOC;LKPѲbN,e3Jf"ZW*wnɽ }o7);oK]F~<*c*&o?0 ;,?-,*B_o:A7ĢafVӤjl_b(>>Wati'4>uQ.7-^c>2,^1}n\KTYHay,C/6ngbT􅘽ebkA1룚dGƅtKqo%|كZ  *_ V A3 IF+fD&gH4BGsq`\u-⺸;O'{P^zog.6Tx_`Vu005?itG٬5olҼ`m!]H{iݩ]?a2};R022n-ipA{{[T&.tJIžVf D/7ux8ne䟥t5hA{eU.+‡^*5VāoM[uofEe@Fjq[HcT~>"lq^!m7=~φ*=YaCĬ-4.K ѥhrBXxk 5*{ݞNuro#'z'8ۧѴmPO͎P=za1:zut`D )>qӹɒ*Cd֪P6h±};Vk&?c饷C}[‚0z=?QˀX9yVTӧ߁z8c&8o!7BO˱֌ G?H]]43PR~ɵ5+k,R8 O ثTm zNĿ^nxAfǧY|T67Bڈg^ s _#o:98r5p!<LwWA%hUb V_ihv; Q5!:f`p rlߙ5{n܍`^rl7j+|ƈ: {֘.VL8۱itk*_uCM 9AoM⥣4oWH:F44Nu:H?T5y}hw4os'g#PK^jkϞh>MQYs3FV|jAhmxrF$Gܯpvf`ql?"<.p/Ib^ |5_/44 2ό,^4=_f% ~# e pS#LdjMi)@ ]cYeVa((lV'g6@_9aucY(h˟g=_,ihJq.U3d FTA0/튱ݏqY5-3R& Wڅ5fNvU7! OcX-Z`Y$8fkXuTrk /n}V 1P wǴ Osu|,V);>> ^G'v&j|]]8sÑ".5+s2W;khvkׁP͎6kz{ν{6ҵeSb-;7yRɕb uT cDpG2jhn"O3o2w2!< ,9rlX7pI춪0%kK^AYՀaKU\oR)/J+T+Rf74d?+iv_™ߺ{=0F{Jn JjU+զ2lΖ^/9  ߚ-٤te2֩㷛Uqygx7 ѝ-F\^!  iu-B8Q{aMPuQWͷS&gmk;=A\T$#O/EGIu?| uٮA n)9J٦}]4DDW)B"Rl(tT5` ȟYb`PFc0@QЄ~"C h&Z9==iYn8~c[E \:&B> JW3D-Ѧp#lcYz>K4\@*q f=㍲⽯iFmv<)dsNX&__iIPQdvxdhX_?#sχÈ0Şi{^u1t/!4BJ??,i쿺@o.y"ϲH$++~=?By닡[Oj"E_ !U d]zz gn3^ZӺcPw0x ej&ǀi =(mW=w %%i+\? QMָ1DW[Jfo{u\V~T}x/yħ#endstream endobj 264 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2506 >> stream xU puS5t8͝ <PB)>Myy4M~y4M7I4m6(-O@ *y0sewk̍ٳ0'Xܓ?-a1bYrҜ|ȜmwPTjfʵVVWUT*K˖[HUeZqDY)(⭲*R+^tRYGjJIbL^e+*ePUr:YR/᭜5(rq\*/[.05ʆ UyEV=mǞǖccMX=݅-\Gg?>B_3%<)|ށ3w\<1CeMfR 1\mG%I7BF_w">sj ݪmV)& `^xJvH-^i5Qb\ xN$qAs Q#@477&H"< {ͫ@k A4}.e ,'6zXE|sr{IV=@+<F{ kaaO%sz6wt+AqL:0´P,>%VznfPV4~{%Q*$yc>a91NgO=0Gѱr*ZBfYj-2GkO䃈%٥])xعNsđ@G6BMST>ČJo">w+_:!L> 5F|4Tg14M1d99 MjU9Q8>V.a7ux4XZ[^-THA] %!h*~uYỎKh7&"D=%**,M_E9ЅSc_5># };CWlaCY_ihJ'%S|vFhxDž{7[=$γew<"aņZ5d?g.3N\'i8Oc.k"TJ}\/ސM9#$MQ['/LYGPf?q <ݲ(A7J_=w,!}.wfn1;mnqoUJ]v2sAghA?%hsFG98gsv6j =-Q?q@PASqj~DLq!$A Q).iNaO=A|n\u֔B'nE]q3>f]K^spvA}]@!4Qҋ}cag3۴PRz[<vZ |p֡@(> stream x];n0 @wB7D\%Cd> stream xytSu6y(D[ż0㔂ۀuz,0:H"ml$mh5{r/MBB+˴kZgTtpp~/ʜs$}|}t =M@Qxey;)~QP=WK2`,f~M;YUSg ;=·cuMmFYQ]DlŊ-[![U(j&RQ-בL5ίjW.]sMo++u+ MNY^͂^VT٦gbo^RZM>B**Fj=+JR ג/*BT)hj+4 9yRRT+:⩶FS֨*BӪJ@pCي4M9 K/}P GpFSP*%\PnE/'˼#D!,PӚ~[Zh;FzBgCq(ڸY-P9Glme]Z EMk3@+muzKʼpa8`aNXqoE?vǁ(!kw@uҬ$Ww<)9N!<mK,a:w>lFp FQQluS^ZSo1)h&(qChc]lhv:lKG>2̜{@'Z63V-čy҇D ~22GGC2?Z,N IJVP{m>;gc6h 1#[akz9u`hڛX4Sm^Q5'm|v?|y: / k{jVKx$^^ W%0GD|nt ]yVxg+ g ~ްUD{XQAbC՘X1#A>riT.SΪ:\x)x9L#Bt_r zhh~q4u2+*)̢lB__-E v>5m/~}jcdz/In\R5{'d#Ï걥uA?2O>8/ÄLddştܒovr>M)u ]Xfٲ8Ն-k`#8SOZGN˫jw0^ixv>]zMR+(b3d4Ϧ!$ HKdwڥ38f0;,`-H( 3G ?Mq=413â)9CT[{J4,F3 psXH|hӠfjTiBJCH vO)}w(˓?_dB n^[g;1_\gߜӗÓ|mD{'_ qǠw/4BKnR,m f;44tp~F}-mtKP>Zqbvg~7lvG0vB:FWf|ba]R[{-֚7aBuyyq*pt?݉oP|G1m6z&^_y(j~诒 -l7fP[vs/F5m`cЛ\f!S$&!dn Z ?)|Q݆_DE/·\Qh?OeD/%C'I It@>l}_yv<棹0>+6^p.n)RXӉ_"PD/39VjzK.zZ-^O\2K/_v^|LppO@gaUʍDh o&$WH1Ҿ=tltX-ҙW$ێsci7Y#·G#sFJRn91oY7oCendstream endobj 267 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1829 >> stream x}PSWAȊW돾*vںV-j-(b0`BCPHr0F( "*jZvkG<3ٙΙs=wν F4p釳&q4~:5X9X*Ta-㕎QX_aHi梅lSNF={fzz\l;zMNFZjziSEyS'24I=yVLf4sr6΋U3DCM&'_A`Rۦ wo~ 'L j1M^~MqԫhjSVj8AhY0FP,񰷇)-Ͱΰg3%{4K^%iWՅev0yNp'5Y5)n_WfB>P~z6'OuT!_q@ #fyvTTŻ5s1G#kDmI堫mWT+BokFpa}8ecB$)qcYQIo n2AI|B j8}pjz'HNdHAb3J/<+,3G\G A&K)b{׽/ ɂW9b慵/2 k1l|1>ŮIzz)ޞW]"KDrˀNtó[{l.އxkRK&ݲ2;m/ FsMl~}X`3M 7/vk,TC 2^:$?3D@1qW}yio$D57nåu C'Ww=ww2B ȫ"_9c$Avcjk'%,-A1n5dp܁=L J_|Vlo t@ l6lI}8.{/ w;g'|0?}׺.8}ӵ ƾ9+b:ѱYBֲ>_!)E&x#8T:OH ădzEx1Sqϵ ʱ '*kZ?P.¹RRSL"wGBG?j)ou]Up@YakukZ!w&[E&t)M`rmrC'hJYmɰҝ+ k iX.^t9w@A,Ѵɶ.V*1'8ٙI/ ~H}1ܭ='ڿtGy="x<5#{pT#|xY.y#Gnp+!ukPt\C7{o!VɱָqsִVv3vl 2t?2 "l!#/ېєl7yr-/.E4}@  ؚ 08h99cD+9#Ӑ<#OA_v2lc}w6C pWq܌$"ΊB@^G.NlHwSQn]^i3^U\“Dm @T@G$Oh~.Q#}cf/-+GU@5s,2H$W%62UZ]sbgcQD@+C؀_u-bD4rxLQE ǰ[Q~Q< OIҒ'CJa@u|T~ЋIQ"">[Wendstream endobj 268 0 obj << /Filter /FlateDecode /Length 232 >> stream x]Mn0O䏖 EQ=F^X&,}g@]ؖIs8O9-ƔC|ėMېi< [q]-^u!?繺|ao[Hs )>=82p ǸSn [!|'$grKHVr$$;BBtr"$gxB^ 76z_kPk`N-ee.zJendstream endobj 269 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1907 >> stream xmT{PSW$7XpGt/!lZtuhiu $BH.@ysy; XcJv(vj۝̞`$}^@ɽ(2nR wүyIAZraGʠ||\KeG**>5FFMQ?P.V@8;>A8x:4}وa mQV:' K'']ԡљ<~l^13bֆz>S3::>'WtryQ3G3f5u| BƻР. Us]-Ρw y#RϤ?gdx*?2ެL>e5YZ)7KSy|1GλCF94^(X4VnشqKtds+@jSsSvS@4Fbzh-vptNE>`V`*6ɩ*G20n{=uCV%}&/_."L]ѢJcRcP[9zt2t@vP8ɽUeyVӖź,=-@ @2Ite-ڃm{~A4Jh|31853V' êâ8LH8I"~D9Y)R _ :yġtAÐ!AUH B^3J 7a-N AEH+㯜le5Ick;(Xwi_)F]J8:ND̓?ɸoi I;Txu` {$.hM JćÔy4)|j+sDn EZn3!Ryk%~ Έ8..A8 b?湧 Rs 7n/+;涎EaHE,|I _+罉fLͬg9eMŤ?ǏW{~ QznK#]GAa2Uu49F=) aW)kW '[JL Q6(O UىtCjmXQϔrkG' ;Ȃ60항Gj*ʫU'X/U`uW L'<I"?tMaO=V d8R]sK}> stream xY Xڞǥ3(-}תu;  '!!$a ZkmU*j[Z\ߞs' ^ fN{]}u+֯8O(7 ½_.^W׺!7}ாD"T-$ Sc҃_ƠЍ0_[}<6M< e{p*aa_cicwFe`9L܉mr~U9󩘿+9 ~7_Zg^yA*#ól_ʾFnCGC0_!Xl_ ruiu΍"Q_.aO A/wncL ~:^<2م( feJdAvT;5 ?JqrKeOBZO"s Bɽ4lqbϹ[֠5eϷe( B.Q((4 C&B$vg*w$ɲAMFs5m`vu v)#DJ%EuR]p;qjCW6']| 0͛HNak-9,HX]!-Uփz=2@]kcor Io3:k*ȂҪyh:(jDU@L Փ>?qn[AYO-UHPz9|Q{9b}g*D+?xsBD.f^Pzp]. h8(TBRc)7 2*% H]|"U@鍅Xax3vS^qg)v"ʍD(UHQE'u]ĦMw@h*/['dO`k?.Y辗ƒp*'.qy7uo!lJyI گu\ cm* hZ@倸#Wǁmh4f'}d|IhsyQҒ&s|2ۜ_/LGaۓֈ( :&YET3Vпx9_K,+YR3pfʇRK1/?I@)Od[poOjEM fP_\5| p@]Ajp{qbzNFSs+4 ,z{n(utwN8FdUo5; 7+T* z&\<)0C0Ua8Cr,< '7qO|8K‘˜jA&GwvwlƾGut|iYQ,0ȇ/ݭ@PgSvoˎ9~aK階73x#MԚB&zƩ'h(B6. G2 9, VA()Tt#=\\b?>h( P6I-ۋG`Nd'`},4x𪻓ISk1T6}-({@Nخ("P; %<{XrpއvkPy!&, t4tVC$:_~F^%+gUR1Y`YV_&iYHΦ8ڔIc :%.ދӧԢ`\72``7z{b뉋]'ݱrM*6 L o;Xno;V68:V5}6D{{_ x78 hA˖Nqc7 ??r ZY TM+] d v_`*@hd;3%+4[ZPcsBzg7-#7]2y %&J.HMqf562hSEN#Mo" yW򊻌6f% 4@-n[oۘ)6*3ن:ٗsOIbA *|, dqc20JY*@֮4W0bHL /ǵ敲نlcIKՂCԅ߂|픤\RkTRT11zRojS;V'XLc1эԇ4׊(e?AuV}U>D`&wMnaVV?FE?/^ m}`Y z{ oa=H*g4WϰWm?7r;>2|8W~q]GZZeibe&Hdh}֛c8(^\;J*c$GTpOAfL_c \ 2yٳ6q;Q( F`qOU.-U$sD6HgXh0|OZ+ Y2] u&F v;5oVs%p2FPTr I_ѻ_yA (4:($z%@}7Gr0FTQAe,E:x3v5$ߢ'dKr1 "IP" U)h`oYJ0<)?BsTbH%*-߃F)i4[ᨸz\j~ 2u=e76iEy!S:]1y5Ե_poߣXc9#r&Ke zTSuYm`s'{~zFp6|?ིo@uaUްps\saIuMEUaZ`KI1IDuzRK 3< Φe>yk  PBt)\BD5·|[#RZKAQha NCs t@ERo蕔,vf3sꝋ&@u4oX?z ['Ĭd?U.N6O=/?\v+$y2cWC \*|2}?+pjBVҩtd kh)~բ?៮{ i1̷$-IFQ a3XGmW ^'d0O!(wVFL C'I9sQFdq61\ sݠ $ BDU Ւ(<; uzs.x<ޡ?y|J} 5k{Mj&,s20bl칰:f^rw]V/0%z޺o~~kΟ!EXPː?\V3#UWj,U-Ars000FU^gf\8f5Xb5БoLA mfъS\)Hn_x5 g‰C]g>z< xH~١ -dh]~_Q%%F|A w8w 8W <C.$t&` *e3$Jfzn %q .Xv27.' rPQWVkr1E7_G-B=􊧎c4f6 z͏NW;'kwt~> rɛ2bIJ\ Δwl?jarHdUNQKU5Q@?H81:VjaTe825Iޑ1 JJJh*ZP+a߁.LQ6z97?:yrFzB:X VݰPb0xqP=XAʞ"*4 7`M1Q]%jwp>pr0E6pfT4G^.cS--F2F1|{VYo*4| npJZ0bz2םfwnh% Rw|jTl<ϢУ0&PdbDfK҅LaЊ|8=)6nf8LN< $ne.xD8`6e-pdDR44N0iڢbַX ˿[pPq*cS`mAIh\)WLኝ ͺWs3ZTn=R\,r)z.MJmTEc.Xned E/Q5ydɌ \@J"(4^Rmj02ZlrG`AUeYȎh{Dğ!Ç '%HH@_U8O{S8w[544õF> stream x.pqL?cfr֪Q)/(b!1v;d؜ozG9pB6wD}:*!|&ͫ<8v=#"9 +[*¼laG2z7͛26痋y"NH6g¾1@R@H3C"^m0Jf͋Lx'|_>c'7@_7Wt6owWи:*7o6k($oȚt >egubV|?x =S+Iy f ?!y_z M:|:'")C7W";DYAr?Po^]G,̺ƜM iSNYPZ$D!ff $|ï,Gw:F)?Ӭ7KeH̒5l"iA|,U ܳB0?+T*w 7 16ٚKbD. |a& #sʄ 32nLoJm!Nդ%o[Hh=`7T3^A[.hjK:*Vq,ygNW.Hi|=ItþTj*(d*pd,ؤ-% KTj?&00Q&$)W9eD PJ6XjFASM*ݨWLcUw3;#pX$p |ٺao5!]Y/ |A؅0G)Sю([E N[Ju ; /5c_pS}:4/5U@_fΔޯd:x^E*Z^y&urhs~|,{G7)O~_K֯_u83Cu3c7VO_s Ujfhu _j7+ FψٽI%Ml[6N'%1))!B{S@֓v;u,9J@>y={q7qY̘7;Y曀tIB$] lnRӦ2C6dQuɹ?zV'bw:P1 v_P·a$N^]˭a.<ZT>xE-TpBucRÄH`Z6Lx Pcz>ڠD ȓ˹q[q=]s6Ң~q6cu;A]'xϝN4I'9i0ĸ6of-DA1A[G\ nr;>N7 zڡ3kCK[=J_PfMkl~??dnz`O0BᇼWߖs0h:\? 2rub@uc(h c1Vx#n# f@ ᇠgqr bJE 6Q:c[Ċ r(r18*/W,nNQx99PG7T 9)(>Y=>aq!xEŋ T̨fz,;;h9~?QIXvf"4@FX݁.j>(9[wKr<`{dH,C3 C:ZlO.vp &AIܕW a&D%1]qhBj/wtSyG1H'J3v~$z F1Q c=c%)k#eOQp-L8/R )ԇ#ݩ>4cC>H FPۧ;f|G^3,fm=QA`h=#P P3Y~!ujiB8:2Zege6 f 0T"h6~'e/Z5`jK-J`lSA֌(B9H9rDDjF'Ugs#V_訃N"L1E!vʶ)H\uzV)7RVx1aEG AB%8xڦIR\Vb<uqtnVA£uboǺQ^ 仲^^ tAOv3Ҥ{?:X_k뱋mm6g|&^ۛՎ^Bqjo ^}MRĵX=/c=p)8ڙyc5Jq8E!@/Z{yآw',$$H1U D&6Yi<أ+mw3{{ӻOES#=iA TR5^6}ڇ3eqW6@YLN1 > 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 273 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O0  ]ZUm 8ʀ0Ktpw'e?\#8|QcYZ`ɲ(+Yy!' dv~W3gyU!tD[]kL'tFs8/eT SIT @s$Lg)nSendstream endobj 274 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6852 >> stream xyy\SxJ[.Vjk7[w-(", B ,ٷ焐[Һuhi6:z7ݦz?79|CCp8qօtcc|OpE0 ?>ud߄~˄Lq|l\ZЌșA/~A [FR8>2"9h]DZ\tRDGbad|tZfЌWD/͝1'")uP̿eħmNKV ӂG$E<ݜo˄Ihq:aT8 H^*\&ZB*muڌuYQ7l%$!1i.~i33fNlٜ )b4Jl"Ӊ-D1J$ijD(A,#f;"XA%VU|b5xXK}~oX~b0mVnT!T8DUAjk:ܮb4t)e+\A)(d22hQ)>m MlhBS ;g4Vs@z:dVf4 קp9oscᯁ<;a'fb$dXCRםF4lW.ϨQx-@f*gM\iGnWl~Jߛغ E!+RU`;cOlt]t<[^QVj^pn/7p 3Byu47hh8j=%4COq^uY-.ˡX {V\=ϻQ1W<] ?8`2苨--]\™Oҁ>HИsקA|u6>`^Fh2zMX`+T1MomԷyf潩l@Boy8\/͸l|360v5 :P/' _ 6cX3=87[mOK> 4*QW9o9x-=J_,'ېϦ6(p\rEsG,3a*QRj(kkzh4xĝ2SXP0WOAn~we7ZZy(2B˦Odm oa"4_lt^pc֡M(Iь_4b5n˳6 مҡWr*Ϗ fO}5p\&`HZ=CGmfg~pM&T *zz( sQ>u3cs9z*cIfb _A4b>C+!C@֠-)CA!SUhA,jh;/kAЃ3}lץE0b27OQ]qa8̼E_؋ *sulUqYmQUV1b`p?\]^DX5ovy% V>zz}3;/g~diStC3Eko ]l- [ȥO7?~ߣBSzu$mc1tdb2]-258}JEDc~bX=#n] ]qhF_F\K%F\?Tl{yoLf vJqc6%Bڑ?~ d Z: -C6ldo6_BM'٘Ƅmrf]|]f8Ϟ+T1] Vpeoөq<{ m) +lR 1eu(She3V(= j4:_ ڔ*%µ1A;t~d(`nМѤ[\7$(S*)MZLU(?ddnNiVru $]u`pHܗ>󩽜}&btca00kc1k#1kFY;|elΠ2hvPR-K 4&TQ祖$tՑS߾q?u6Z/<W'SAE$uhsOɦ/.^p|.%g^M?Rl9JUn8k~n "#ٚ uڢ~Z_vT;{`jq)g>o2? X.uPF/PÎb]]5s}Iٰh 7 %t͙#oyʺ@m0HAsdEkr3!G q&H'ʦM-;|f+ɘJ hϵDZ>fP[A ڬUPH8R2E=]ݕ-&3#Hdծ@FhU іJG|=p {bЏ9׏Dgs|e$\aP*QKM z0 r0U[0\U_YRB)ƅ&J@"uArW:Ұ)cnU55AH-狍RH%ŕZѶ^ڟvzÇ[wYU6hTm^'=9Oj~ ,p\adhX?2H5yЃB8eﬡȤbMF}dȝ:̐dhLhѼa4(Z;.7Oax ` YV78>5/0nƃf ö?NU*v#-E3VuO;JWH"L(2zcӘTr^SWmBd[DE %y8zAjCǁί>PFTokUS]9Xj'ǝ}sfL~v7{ J#+.$fg+=_z07{Ħ@md9b?EuEtH9_-ڰ7Ue gaD>䗜鶶H|aB! єoSCJr vPvV[ld$y?^ J?{W⫚31~a`̥#n*,6sQ淠&ƴo|˧/䗼GyFyZ-n~'z[Ga|$`UJH?fhVlyTލm12UZL^=+>awv3vZva~  ޺zQs 6p}-eB4{hͷ3ʁU֘#5dZz6x ~N:)0nuͬBN?ص+cTE l8dꃃp燗9*|y,12 k29FjOGUx5({'*o.:g5gt^ 3 ``'|b[ttvo3xJ SX#߳q϶QԖL);G`*O.قmqݞ:UzSS^W,852| #a#6$Ҝ M31vǟYXVhG,JGq4ICeH&-ŕЃA %|AfÐRҪPzgЏ:Md*F m3va?i:[86E3`^­ta@eC^2X)>X#p8FK#[Րb2@7(U*CdE`ʷFcJŐY s_Eh{\=WJJ/;___\> g"aˍNtKAS40k)k6+cK%_A=_2ڵ])cٙXSYpu){cI}=4BԛQ+jzr𚣣etgOs,)\FuoFUD{bF9_}P{5V]~ et-c{Q|޾tl(dÚS^ +6BGZWӈ~kH^ =%yjѮZYM{O!{f ea@G E$eͷ]=rlU!Emn|.5~K񭉏ZFo0^IgDC=LkҙCΨg+cPǮy(\76?]pMn !oKz1/ 4֞KWiG]oz>Vsul;>& SВ_X}xݸS ~Z z@Y>>a!G(eepq=쪧kNŁl벥 ߝmM.:{_]&N& EM m~}=K(JL/ɪmn ۍs1sWP~" Pz|]C\lZwX&1@J3{HqphXNV=R\(Uo|߄-8 fElg;}k飊r wl؛̥<~dN}2}e[9-w~% ^6~6>G5WQw['+ڻ,)Scc$U5*|3*BkD h \('IKd55vk!g.*fu|0IcϪ }e;b `Pl s[, #> stream x[o.X^`m7Y4-Z$Ej$d]VtX|gx r >͐~ ]}ug{CwzOď]st}~wBssm6n}~s0g6uW[r$v/gj뢶z:d u.a<;әsΓں3v_6;j#&ܛQɣ8܌ ;s>_| 8g`]ĜwۡW 6b?v`9z+,kZ iƌ!*핵׎9=aNqyr Vk PtЛ{ƭko^1X9p,j}coژC:N}j"Xg|]Q*/eRl) iqwqM_Na?C@  6_&Oeܹ{!pNI.[&rlj!8S>Ӱ JH0(goT.څABh98hB)')Ws 8v4R8&K5zɋ/7_֣u85npp?v6J CQhv_"!(({7 ] 6M,yv-RwƁM=U*lyM+/,(Q˂ l1i vM K _LKM K=A `>SjX$i*B:,PK8:IQX55Λ^’TωxIѳJ #RvHn_c1#2:g 8 6=g30Ȧ-`aNRVZuX{ݜtv /c#Lbգ$ қ^ 3RFZ6/z})d%WۃS[ 1/(AJv{¡=瓾JITu֡7eڀٞpefą@`K!$W #64VEm`ݧ1S9](M+M/C*]ԸfyiU/W!|ޚ/ۻxrs~\ ۹ 4˴&i7ĝ(0Gbj-X Mps2&E,HG6X ,1P{PK{6tI ayJ4nSH1#}()"Bٹ,̚A IHIZm%+ȟKDRc;nj:5N>`b9yHEqP/,^G i-5⿲UZ1js66vޠMX͜*ki-@s$\` s)ȏ7y\Q<yLfN㑜Djϛ8n?hfU"$S?NgF%D|M9:p-%iu,tGnD~L<|λԖ,f8?L3cr5pH,cFT08 ~,[$u W?jG9$0X&|*=Z[h2pO YZ лMs7xiNHx5#o@H2{Dz3Ld_`\ҋHH &XҮ]Q^6$SC02KK$6fҫB"/*Y©4#8Pl{Fl)ByDgytcsXRO$-0 AYu!rkj>7d~r/)͢UjF+lLh X,,߷Hr2) 5ڕ4h1wsmUwc>N؞`ֽf: 叟Y6!/_. >$Akd MS W@gU{Gۘ+%]#O!_ޟu αZTves ` & %^o@$2 =ߍ"(Mԡ@HTOF" 2K 6!1!<GS½9^ 18i`J)%VTJF>Q.01g{W:Kߜm<,2ϋDzW,x ȶ+`jS 24,>E@43ZfUB^ZL,}iq~ HoB3'hpi]ڏvFcsMY{f|GSabۺZIuZV~"G&WC[*bYbr̋uƶwx]y*s͓!V4w)*6$u!peE^D.U)]Bכ /mGqv#U|-9ȻhPcAX[c<恙2OZ==)1qpGdX'6ǂb ks~UM>9*o }7i_~ @xpNҵB6pVxҥu6X$BIڗK} O3CU%0#9'8jO8 } b{Oj}Tڦ03Hel\@,^M/`sqƔk(`+یbo -:ŀu0' p͆"{,eAPz.0(<cT嘚3BrQMUJ]Jb}یgq+E8{H)Ĝ'W[xaDZ TQnڴʊJX39%\zal "1'C3pkakCHy26k|,endstream endobj 276 0 obj << /Filter /FlateDecode /Length 3751 >> stream x[[o\~#-'_8@EHb5Ze+ʉw3٬փ!987g_ lÿr†˓W'<|9ήOk-'q$,s#Sz8>nuf9zްQ0ƅ/0g,0 RkƤYO\278qSFhH JrIsbFij^ӲYw'7sü6V:3h{'aljo,6hg"g\ <,o'o2bu4Le؞jD' qiaraaja?WwJ0UXF0%69ܵ+ Wf(ɜ?PX QMNP):KZpփ>i͢]jt4b\o`=_BX-д_5X뙅@K1ͷk :Sk S񹦕%o_zVוlk1Aw6x`AyAMG#O567ΫOhQZѧIIٴ-9U0ڮhCHeۃ= }MYAa3Qa xhK؋?"ERP)y,0m*w &8~!Z93?cYܾݎV%kq  ?@IRKۘe&z)hV9 }fT$ QhET*AD::Hh%]{D\iA.VM[;Vi+I@i̫ҚNugmi&yi]}imG9 nLތxnDt6} ]ӣXɆP{}2"6#c=fg ,[;T[)GͤH$Ǝu FVǞ|9m!G>:=ʺјA(Fg) 6`cpw1}0s%0i)_BU$Q| _ÿ#=r 0qZ;AF>\`t=J;v'.B1| z= !U@ZBMTJV 5}hht}\' y)8/@85:NJ|!pfO Bj7ҁ7]ؿ4Eh Β5*e5g pCw'0SA^Zsah@Bpp'1vHl}o9oR 8z`1,!yhQھƋ(^"xr^:GL G ?2 T.BC X904VqwVLDi,|AK #mvxRٳo,ӇA&A>\,ElBT{D؄b6sR60LcІiJ,ҮVK'@Hr} y)iT^?|ס:uE_$-X#"k@b1ɡ6j#?uuM>ÉY/0꺽,'l8X1G=őmFA3K$,Ȳp_%j7Zk{mU* Rǁ`? Cj3ƚNC*XjP!.A0fDEPGu|cZZ݅{6|nF9Q3Tj9/endstream endobj 277 0 obj << /Filter /FlateDecode /Length 5100 >> stream x\o$q.2 B^y9m6tHm7aQ]pV/|'>a˲i6w~lF7E6Tđ?Kqf:y<,-vl/ HF5;[XJA+9 j,,-XB>sd 9aLдtr%4Y*Fk>Yhٶ%̄"?t;] sHXEf69{XNZ{,+f3^ti(uVr;e?r?_W[N{J3Lwc db8m>)Ba(F8 4BRnF6\vџ JDevX-J]]zv3샼 d͇Dl)rʋqr+ x5X"tmw8kd_}UU~#1jNhY{Rasb;P[wG*{ Hr/>3>էm}fSOrz%5:KG|Hǯkם!ke}O:YRUg;xOGOtۡtc;PO]Tl^} E2cFOd6Ī|oc;7RY ˭`k:,=]Vd䴤?["@`*mk HX;i±^xLjyXF>VF(7"W@G`3 OT36|L%g D"@_ASn>ShZ/`r3h#(Y`šHp,ˇF/덫`1BӪ8#Bb"8B5sj@^4tF'^,5N|׹u(ȕFZed&Y!$ő =>QCgQfV$x (v}G)AlB di.%!JYr'OQhW/63}cG7IS7t]t`~. ; Ut;>|Twh ^%7O a󰋹UyiM<;mw .b%,279Fdj>x@a k 3;\'vp6>_& k=u%Ăi7y*F2gU d+qHjy r0qa?PD"0eK$A#bEx?BS'<((?v]7dn2"rr^ƥň \I!g Lh1f: |M(AdSl6:|HqE ;gTQo˥iqᾥ* JP?)DT cOrGy%ɍ M"*5>]0@1Lmoa 0w_cЙp~ZObYЊ>?Pv&7!9=t/ΚJ]Bs$okϹ12[*rcgf~7F[)0 l# -^h(Ii(=q,]-q4 @ a\Zq `@ Sju#,i=!ӢSǎ64CVWw2_ixOG6ieC6c{\i=_ybS(Qo?%ݺR|`MV;|ԢD `3l中&s N"ma5R<߿c =Oe%r,P1{¤' aOTy:`C\Иe %*8|PI: c<.0j$QϙQҘS+i2\ћÞ!1BTJΚۭx-yr8zlah.%20=sxwFMe5Zɥibt mCMp Cu^5J 3yZ,䰌+Rsqgmk pB ȅu`xߓe&pH\ 0χǼ Z}Ocq3I3.Ρ!D`J&S)\h4xf6ڼPUGvMauH_PoNv\L9<0EOy 8 J.y]MJ=2u0;LjtM91XCG{d5G+<'QbvAuC H҈qnesJ$u⑅Me1^5i*$#]Ŝ&RV{ ҆S^eY?Vq?Hv&VsTJ@I@UM:9k#H,L% 0 K/^eb#岝o$|sЇDk][л3}]PqcJ^c?Ja6XX P*P Qb >䁒w7 ?͔%RT*YXS2=\`|A Y1el[Op0L Qkf+L&)I7Rt/zUʦzkD\t|d q|.Z_w.eӉ ږ6d7`Z$/,Z`u^/gd@U(aAu!g;]Ԗ)h01ź(fiIV䆰z܉EpKhLiB4螨7.B+DaNeg $OW֫t@^E.;vڜ^{aRчJ BF\lnSu[s O C(TrwfXOIЬPڙb)w @̛!oD~"˽Y2Oe8#JR|X7J/G{i#7/Rbq.Gy.A[ҢUA1pFNQ9,->WUE###RZ$x.LYI'HV&[G:)'Q:Acؚ%;Kɵ0W#nh%j ݱ6e&5T`nv:O,;tލdNf](/"|{uHG~kJ4Ṉ,B,?ehl-K9)ﲖ+AtZ`4.:U/"#vv&\O#|<\.~;Hn8cYAS s. L>@:ˁ%ݷF\> stream x[yo_X^}q6MM&N]>֓!wə]ZڀMqy 󛋣We''p$ˣWG2}ή?:)h_噲m>R} a6?^fW;_Ϋz(-YZ]iݖ֡1xYZ.'*zVZoJ*׾K뤴~.|X#KҺ+:4smiG8ww7nqOUx6ǖ֓JGN&>ƣ~q|w30wNYg `ź фg7 Li òN>X/~L^wo`*GS#>RQ^ҳ?nWG |t~P^κ[?CϏQrؙ6W$'}dĝBHWr$Q5H"asm+=2ֈF/pnк L^+TLt?Gf݁JT!$Nj^v) &"Ϗ6RA,"l̟Xeo5a.ڴ\^ 2O9c{0ω < 4s=ν,a1#,|۴U;>H<(3M l*X[Z}uwEć2Xч;<+|C`cy*5wɞ #1vgxr\y{;@de-۽|<7wϷOqBbki|Q  d_ٌ+Bƪ\D[ࡐBx?\\X΀ z.8.`p&` '.c*X\腳lu^%FDK:¨C˶:CAfD؜p.` +a8O [()4lZo2GUEQ:a zBNtZNVŀg=OuʀrWF?ۜv 7@"2X/ƀq,-a\rȯ |P)yAFQv&8P(8·x,4E[X,7JW6F燅t~5`h\)n(ptt0T(15 pxN8uTj@,@O{빩YZw)0c,菠-k̥`;)tj\>?0|t80U@ x8d2d}ʺ )`lW2겞j@d`,刜*ϔ7]{RL<-$38?2~$;m\]ӶW6{F,ml; 10^ a *nC2@Zml>JO!"e 1:bҠsyL2.^%)ǸiPs!vwE(LDCbK{5lŞnf=aAl"-ҍbh5kT_8I֍ڂL|nr8C(;x H(J[o`P67g> bg-J)fgH_kbf)+!J*Rٜiyy6}A"'(Pɠ\W9@.L>4@lN5mrJdfl&BqEbYFO&=A@v\Av"'w0訣7f[;qc`I }@RV\k*"loV&}C6%˿LaɹCw_F/<_F0)բT8ȔẌ́FGg$frq息-ͣ" /W a5BXi \7#֒xdjO'axIf7y| tunp)`#Ւ8  0+(c[k* W{Fj"N;>>4 4ՠ(`||{8HۓmeE#?bSdK9K#\}hJa%Iƨ٦~UVgb'FS&vE9ZxY.2)D>jyv~%MA} HӀkgdO-ZEs6mu]34{7`}#&Bb,_'<-epB g="1.=Z,耤&1#7#iL9SNKB7OzM|@uf+.rZC^Mo>>2BFmCQЮ!29+b_ qr[u VA?v%7JC;\oߢ4BRcβÚΝmY*d R*"13 ZFIN >[8֐VB^½"Ojs&1ʔqYv3 0\\**$7ߦ7sibO5jTXTf-TXI蠱sZ9FUs}i=aLJ51L>mVҥG`jhmWBU76[7$i%%"H&W!Ƒu_ZEi LquÈj*e-YjTzU$vئhݴ<5~hZ{UTصDH?KK>wTR3i޸X4ͳf`Fa$Ja`Kz-z!!†B/J+*^e%,w[0*79Ÿ#$2gK n\;M#%|T.F'Bʶ%iTov_ɛ`lJ\GO,vB{pODh'pO1#J fnDb ɛE*B_p} fW"f<bc8qH<9YP;\Xe}NY1+N*(8e ^B@ɕDW2`4OC޹Ԛc `~GDL,+QQWĭQnUH`剂^6i@BC /G;1Ir-J+E'3[m.42CaϢX׌) y*l IFLVE=/Pk A*Uݺ|hKR?" 6=rfZ @_3ZZgJIY=I:,8&2:{3']Iz.Gk1j=,_KTl>oΩnTgE_>Lʽu:_cA1 K˧FYMω@'.& ktSLKJg0Q쉿>b:LHMc.D> ROYHy??o_ra0NNC荶X݈OXNȣ62}th Nirxw$d*Y9yK}vW!0^x>la̒Dۘ_ur,~+)uKՅ|.o3EaG[9| )-_c8\xV`$ijs_de9,Z2bPta}yvQ@m$bRVa| m 6mT},&wC g.u& ^ +(3%ߓ[e]w> stream x]KsrGa<" ԽJbfc{!̘"eMݍt7#U)/|4@n|8W?{3|^? q a|3z=8}{8;pqH*”7ͻqpOf,/&xw85M0!%=~ᘆ0Wf)͹=kYG|Mo=.x/.K!qm/i"n8 Cp!:?S~̃p^}-@?ވ?ܝҘboJBFxG]e2=Sd?O\r//)6d2ϜjÒ@9o)ss^k!'ö%WlI7:-=Ϳ27g8q}-s]ɗeYf_e <_y-r,)>,a99/^sFs-]&$.Nyb_$8T; hFOsMە;W?1Z;lA;| @pxsdm6񏊏*8Z!jBuAءL ?mޏi^V> ,t㔜0fs+͕iC[q5Il,wKӠͼTC܏+ Kd$QSQmyiS\BM/I2y\/j2+p*? (禙bM@"TqvZIFhi*u%qyT!i y6.Z(9LVa+%)_*,ZiI%ni2:Bvc;+^@')sRR:ɻ5JJ;K͑fWDۺm)xZk5'{qj;C=S% :H~0׋l,xRg&\|!(k+sUom<Lj#O ^:?})[6xKAFIFPqSҤ+]mj~]H;O[y+Z׿ >l!|$b=([9)M}Rm3eFC&M6:cNm]58/D%% jy qqQb=R[VcBd g Ө/iĬ\cJx0lⲠ{\q4G3R^+1By%* 1bB `o6+])UW[@#~ZV,#( H/(, W3$iω+{C\'Ւ<APNO[MnE&uJbc>.0 q]Ͱbs8mbW~fk 8 ZGB]LD:ƅmTTPʴ̕>ts(ix@01WJ^~xm{Q ZD8Lo9/{D2n|wn;4Ȩ78)&ф ѥgAqm(µw|vy'a LrʹtǙi[vՁZ%w.mBu~ķ BD*a<\ }J1:l uoKZs5]V"R_dF1xTMу6PHBL5:4G 0}|" z_2G* 0!^5rǘk#ө? fI yXꮻt[UVF"jsZ&@?MU'{ИɻZbHsz5máAp)/E3 o6ixW /; T arhfʧZ{^%Lf5 Bԕ(Dp"o6j0h%dZWA$0;ynG py>mv| .fuM%.Ր€3zM6kmh"2{: ܒԒ{ \)*h7L VH!D'E'm ݦ^-ʒ'I7|u4fmXqZc3m|.קMw P%%|*Ct5Y \YpcuU}Փab+"]Qk´T/Qi!82WyCrְ$;O=,?|gJƖ]ct#&eF8 5(4xl+_` SKI?uJd3H%-ԩǷ8, #dJ|;tje jJKY@ ^v0j/Yk.զ (-U[.t2 rQu73sCwRbu|nGgTЮUJ{}źDە"X8t rR@/-?"IA ݴ^%I$ryKˀ R{WB\0!Z|+Wx*mCݜh&2FݦeYnH u=#}2jdns@ ݋5-*ؘh-XWa Qܵ5B½mXT=E>dx[ظKj}!ݻ0R;ӂɾ셴YYjMs)@UsSk7Ldi NPLE¼@ƞ i%;J?U:CEFAv'i6jе#͙ IXEjTPi~^o 02=`Z&-cT~̀O#%޻U'@mXiƞrY%{Q2u|Ɲ xX#&q^JK(<֘˲_Pők?ﻫ*ZyDYVТ; Q,YAلOU)@E*U)z/ '0 ޭSJQ3D7jo݁` ^ T*&sg4XlICyIedU^myvRް7yfui9b>&u,% \b[9?k-Z[E|;Ų"B Vՙ75t"m=f}Kؔ%RN/׍"cN@ʹnDY&?R$OsA RO\OyQkR,(y9rˏ`&f# ,Nn["/ljp*\F}.AJ5$6h~DLdvE< OWM NA8Q \9? )FHueU>CǪqfr*ʵ}3-fp), CR'l8y_D]7HMz_carydaTCYA'ĬSૃK;S<7 sW8e%gg4jXj޴Kl$xur1*m:楉>_0|P y{VKD_2^QkPnD*35JGOX1{mN\Q%#~{Mݲrx?呡^j7ᾜEVB]R֛ q``,#W?- 3l;>ٵI#uٻ(j?ٕk:Xa.pFK] 9FO-a&AcY-%wmos"d UMo>8W{dZyð f_[Z厽p)V*i L#މF| KCG9TEFs!CNuP$eKRb7ѽAr4 ZliN_Ɠ.=@Sq>eF-K&.ʂg`ViR'^N)M.ԓWu4𯌼s 7]z|Bl==m{G,-k &]b0P#tjycmYK}_Ks n= M=YIj%#44_JZOyದV2;q^4oQ' Рy|)\@&N֙捙f[<"&G7Eٟ)Wr-%}<$ x[ ^ ;>ۋ'.[AH+{e~3 ÓQuej^6Ǫ=[\Pɮw?q'w1^iZ/$H`ekXJ-hb,S) Ԯ"w̩N7d~ZS bJ* ɺB&,J10ZSށEA2*im>`1Eń}( Ҿ9Nv40-=sey2 eeLڟ(Cna2뫳R{{7=./+^-Om-D4: !3arPjD]F~rz? ;̲:Q©âXyVlˡefܣ5D[C$|J9DPic"o? hһY!n<1lcJ۶1}pj߯60fVj̓Jtjo`qAQ)f*b 0!`|V y3eLL8D[^g?endstream endobj 280 0 obj << /Filter /FlateDecode /Length 8574 >> stream x=ˎq::iU3w,ȀWe@ᒳr%J?Ȭ|TWPktW#2ޯb: _yū'ū'?QEś~ ({19/~$.S|Yxx~p>| ^we9, ̓7Z)`pxyXb[I|4 e*=Yx.oCv}F33uMљ$az9eeI߯~#AxJ8MN|tj =ٴ.y'fG^F 6--8_d9TQ^PE˴e4;ޖGg됯 ^7 ݈w?>?>0#Ĩ>/J٣.dP>e{z-nB8Kr}Op~fM#GӼ>L N-$\$x g54nugpk^;7$rgoژQDlI+}+` W_t!:h@B}q=d~{E\Ԉps_,9R0.?ܐ/+[&ت@Ήʫ3.DWΫ N[7{ NWZJFURN2xCGH>nPzDF,($ [*Zc?| `DK,`{u 5W-^kXE%3[Suڸ**x޴ӴkdTHo>:;d5EYf3>ݫ7z>t5~o dW\}eT9h (a·˶ ; [:U|8|vph5 HdQM"ў@ʤKq2R uji\:k|0ޗH/۠&STg6O.U8:ytJEaZ|^0NIwU @,v=YFI֒^Ax5B i],;^4֏w/.mC0 HUÇg7wPШo?ϓ`{Y` V˺d&hWO _teW~$ syYоe@?߹3#1 Wq1>ϠI&UL_ ֔#52+-:XF`ktűu$u)|δZ8R+i"^9AXӵ#g0judn ZdHȓ9|D.@a`⒲Rȿ5BeJ@cgJojsp#WH3l+拥Qa\mQG>ֽ>hc9gs`!ʥ42&Fj7-#)9%i+[h%3Gl'(q004v8*/ʫpy/oPB}_ܬ.#=5Vɳ5 dG$IaIyF [rq^"e[ T"^Oj:d샴$߆:!,gogڅ4n-| <[]_ 7Qpm0u_4~2#<ϠՀU_p]hY?Ag_4[|ewgXưs,82Fqs+=m nCJvd=M1S1F1ndpn!4AR&v$~_sJϺYLfp(~bd8\`S/xD>眈ݠ ƢKVr!VX`Cz$K  &`TӲJԅZ/{`8280o9G l@gV F0 dM)Y<2+%rQm3^};y0sEKdNGX)lYd֥TkVj;ll<|XhGxHBb-QPyr[fYg1yEU}{ wy M[sUzqcy`]m5^^*sKiec_ ,GğyD*0W`ұ=|q^᲼ ~ Լx*U2EgIٿ\*Ԕ.YE>[Iϟ.) M#Inr,~Wn=rO4tD3}+UA4,kHcHcէ)cߑ\FMqa$yH\wi>^~ALIs3F+|/./IE"郂12QnM_1`['5(X)<ԩ !im b*賂ƒ8š6*fA 8x%ß~sǔa'CfmiÉl*+)] ~29yzHcuL2jķȩsf| sq=b5 M&o1NF~E! .y#E^B9&IvuIH4V1,ON[ as2/ (>?8L쮓dv%? yF_Q@+bg|ek1"5PzR{фt0W YAZd!Y(sGOY&-cX vs ȸ*:gl-.׺=p*6SQt['{ }s5HH横viUF+esA*,?368+~Zu}_ғt kzb_X:b$T9I(-#>`@?- oUч2'nL 9]KkŜy&tX:u~| ¬Ī@H`繙~J,r[W^1y!vx̣߹ Ԉ%&l{3t v`TŔ2̟0r@Kgw;/Qz>+JmKAfN$]\&GFO$lO#bH!6ޏHv\"U$L0rìêIJK.w?#8E$1ӹ^{ dڬGo#p?=kxP,&i daf@퇯Ŵ.EGw>ҋL}W/صA$Ri:%>$ XK6ZHYۙSB\IzRMWz3 mǶ: ̶c n?KSP\*{603&s 0y_'lru{ܪ7?de$f)0zY,\ H\c%~{RH#%dI L)\J u͜c5|:>c84H6RMd´4wȨe%AFϐ *F"ceXJ1J6bY1 TPRΔӝBw>Y0F!NV uPi#kE| m"3hg9)\Fc'ElzJg3ey AMCW D^j*0a4;h ܵH 7gkQ8iGZPl*d嚳'1q%=k!e`ꔱvŨhn75htGVy'O8*%&zG*vRKZ=E&|)\ieق. t*3d:0k;e{3O >\-pH}x^'k oAܪg]g 㵞uyu ]GR!ue>`drNL)5T!gJ%8~tq.J#b1o;ZFq Em&C_zwUY;Z&*ە]y'k%Is|$uw 3.iɼ2ʦ׵m%%cAmt8 4o 4z8Vi_~|<},f޽(RVN.:֯FM}ɞ> ߡDA-[|[9%~~/oǯ-41jq@v ۆChe m+avF;S :E"Y< ^ ;QHh>1(mVuO{̛:ݚc&->e,Th#YJ_5zܲ7!| 㺧֣MN6F>Z9É{?sz]Hٿ[~`bтFLԤe */2[ ޟsa"&3 C#N˪g00啅q38`mTWcnօ`[AG5By2 qA {ѮZGI1rk|"⎺faA˫Mt O(@WuE\n,˺jLVe65v㜳_>] 4ꀣ;x.|3:0T8x4v'ʆB])ܺhOqv"i!Yym~u/Wއ%>e֞/U] +RHm6,0fTn {69Ix'D lbMqlvʼ&M^{/a)cQ:PZ](:Q&:ik $^*}&cP&+9S Pf,|:ٶ38}^ce˔2k i(ًB7KXz> 0Usy#NZH}/uuAUˊN?8X:kH(Uk޼ΏL'.Qۙ*#Ǖͣ6;tJƊ"&M[Nt:ef؅Nˉu&U~ZV5//8CȌ> >0uOt aReK|㑼KH"aIKЦxVnͫs[-y5tU?aᔄ_nP)J*1Xf'ڕs gۋY+!9!`Eye$jNqe0P.&H0b>ZJoy`҈nmbvDU#UzUǼzyW3%1S cȺ@M~֩|U|YYZ7ahVU Z s)'eQVէ1Ok@B m/gިq"Q@#0= lo(1ʺQokYT)@ٯLHs*5na;]\v_[o-9nQh0?ցat]_3Ѧ8)Ԥ+;Jސ0ߕ>N+&I[W $_(2^ ؛edy'r,'7|lM1ةh6+ Yqq|!KjzoaNDEOqBӲZ+@j*?3KDdxQp &nu** 0.W *^@PoQX:`9 lw} mhdl-+wL T}&6.H֧Xw>W*MW=΃!!tg3׀y*j.B?#N/UqԼ&(W:bXuK8zBJy>.SlH[k>ѩ}:]?EIk627%G?l\@JFޔ?NZ޻^Tl.W[źڎ *3uk;62{Zۖ0sVbVQqwd4'6n0_5n4&c8w=5ƍZYq#O1@.{hݸMVF6r|qe+|./!ex]?-Y(FFAY N\Fhs)=ѝF;Si0J#Klzs)gSer)K8}#H.TZldGr،Cxjo)ou#1.\N_ :"P"tۊ≌Z"|hH/Fjw^" oC>NPymVT݈V7ĀmFau;KfË0)c'z9&@bg斀\/j\cUK<#c{E]f46 dwA>W(PP"Hmx~: WnC{[+s[KeKP w7ѹxwLbrqW]{慱⡯ G ep uy vWUC]Aqa%|Be}'r薟:[ =f+RS?kx^ª{ 2Voi5zJ&2@ `_pO2O—F Į 6_v{Ӧg l$a L?l t_5T63p&$eZSDC=-8@oĕRUք"NWmŋ|`\= jÌCThg-Z ͤEɏ@L"]`V'#ENꉨIo4Qd. L䋒h+fNL`o9EJͥE؅|ޔ^V of8 R=%`^-uj%oէO)VgUj=; K-m/|ikz`lUFY,VmJÔ myQR06EǫZrKg Fʞc;Kï)ǃ)WԱҒz[f])RDnX&n~j@7fKBTig%WZrqS( hcXC.PY~uCk^ڻܯXzY.0r *UBN#oX;jGU.Xu +MBds\]֛;8qBfh57}4 14!].-YJUDR݅ |Ufind@aAk= Lfcgo>Oendstream endobj 281 0 obj << /Filter /FlateDecode /Length 171 >> stream x]1 E{N @ơ1L , X)Y-ۀ6RN RcQX f*SqHOX?Jx)frlMyrV/3s#[{a2GҊ"ΓEs 2Ӊ@`,,XmܢI VDendstream endobj 282 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 887 >> stream xEkuLʮWFMʊn݆[loM4ijrͷ&m,y.i,-XT6Q b~'aL\ve?; ٨['h\bP[K& y+)U¿@rdLI•D0 eVC(n`FC,lt~648AÄ~RϓO(~bJJ( k-S|jOL֛P2lRHn˵z9]LE)c2AiVTЇʣ*j_/lL_ veP%E(وd;w߽OaoI;\:Y?ccQsߥRMȌ6譯w;~zN/;g_Q*|ZNh em V)U"[Hk-  Aj* ahΊ1E!aooR#C^RwhĐ>C~$cb0cz:jD,ᮔ(ODVw=|1th!O$5BZie4jՀR>*-K&w9T!۝uCb0 ˜"endstream endobj 283 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1403 >> stream x[LSwO)ԣ%t+SO-3^Mqd.S(sxH+vJ{wZz 8 ټq &[m1a&nDU=l|/ CX,X,޻kE/ϣW};_R\6p39ߠԯSR!lYk+Vy _+ڴuuw7n*H!E:\&UO3e\Ekp\m^N]4XN2VI%O͸N!-_bBՂK5"R"4#$/9ه )CvCU>&|ꂵG:4,;ɢ8 O80 Wr(Rɪ70 A8:pDW9I@pʙv)kQ%ujMjEiz5/NQ,R({~)ߝa6Ιc154ڭu+=Z5w0 qv@'K b?< t4$Q4.~!P0{Ⱥ5Ǧί}!wY]LM겸GMQg$\m@:-MCq1L!1o3xnvf*vN'bz\ci7ua2]PL< ^p0in;(jZ/0sn:pUB۔C3 ٚGCǚ'(^ّϻȺ؄Ul'm`F˦eߤFbdt|Jc,WP'<!݅˦ Mv7<И?9@B.''3UZj7w~G5d/4 9ŧwܫ߼sR>T_ RPFu]{%8PW(&X^,=2ޮUljơkJk58^\Q(pO0EcK^oIr\ mJYendstream endobj 284 0 obj << /Filter /FlateDecode /Length 202 >> stream x]! w78aAc9[zjGA춻'8/xšhA覷n6f({-5_s=޳uXlX+e!=a? igRM. /H;*j1 ZaCUmRϓ|Cx4=J48c~ה\$!^ѭeendstream endobj 285 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 982 >> stream xU[L#Ug(g\̃k Ah ٍ5h ^¶֖Nс^NRnR,Ej &Ƈ&l4>&bL6g)7|TuEӴrVR#` jzﯟ'qq<i;v:d&J3{Ⱦn\A4nv;?6Yx~ӧ=Onq55+oa87Ⱦt&;NϹNEqn7wed3բ}^ѳqvv(yzFs>-:F=K).OUS2EWeU:%Oļҷ lxMXHooޜ̦d PͽcE?8㏅|KC*{x'3": ߺnd fĥA86` ~"xg='})f tTR2mž)B? xe{b4xQ?w1t8=_-A/Y/6b#ȘcYT~5m{/+ʳIue8&&m)w'5G#0_EF"Jظi}&Nf CkP g!)qɒ$gBI_9+51"v(wWgs4QtXy@Yyy%07d: r)q%(Ae+vy)KM4wR".KHý`BhFmԾPF!!DcYb*˛m\Y R:'EvbCdWJ(Wʡ(Ͼ.f@ب} mZANAo3?}4A}AuUJ./+< ]9,ވ<}&C$P{|~UK ]ңZ5=uendstream endobj 286 0 obj << /Filter /FlateDecode /Length 177 >> stream x]1 EwN H@m%]2^b!Co_ MUuo}~8eMůQarHZNCY Wn|U38jLXN@ ,2UOEFzm%➈5FT9K<}5P\42Y4endstream endobj 287 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 549 >> stream xO`ߗB^&@43Ə,6(&^![G[WPGaoqN6BK01bWv'ijvNϓszgWEw7_ہ}{{ a_yX 1)<9G#4QQPB;,i6BĄ(Tg#cH G4g6*TFqP(ŷ9?n701.!N0 ~B}m>r4[Z:S=k4Mm FzK*fޯϯ_ZqgҒRN^ДSx6 + =]I$SziJIYV~i3W0LEQ˩(~oddZϭIXH~RHyj O4z')endstream endobj 288 0 obj << /Filter /FlateDecode /Length 7605 >> stream x][sq3%w<؉e/ʋv$ReҒҮt70n 0oٺo^^^̓Izp3ÅSHJCe>9Ft=|e2vևxV5o_^P#eaFC+w Q *c99yo>yI 'pSA|t(Aݧa$Xf򳵇wKZ?fc y6)*F[!'{yסg g:+*|Y+{@75zM JkB8dWiA;97?C˅0Y 7>y*›J5G‰R%zYΪiek3QӹɄ*{k@,>)ZyzGv/%Ug:ɘU}Ѷ,3涧`]fV7)'zR+Gͬ6zٙAM 󍚨,塝xC{ I1k>558AE,e -L!I# ^6ncMLrv]#;l̚Fo"喸p_tWEG`Vjk@U#88/# 8ߓ x{fch\4ó@I;?VZ× la*h Fc3:c3}P[7c1O  .Fi}ۺ _envR/#S2\vwu1jwf;Ke""[ -hb GM"6χZFzhN=0m9"-h4%_dBGZ Fë_7L}\t!Č%&+PbќwYboq7-w7d v{К"i48 ஊ5jI;=gX4ۧ::zs|1"E)/,||Ȁ,g ToΦp<:g#dxFVha5!$i(&zġV*nQ*Я O.D ^ʝucεd ӂ9u;Hlfre¾Amۚ71\@|/YzcDEV cG!Vt-<T2yX/e{Y"E{Pñ^˟)ԉR%Z#JHω.O{ܨ;mPLl9q4%g W'ٜҨNؘ'ޭͰlELF {f8Z嚢$F;ۆIk|dGaY8@ZM xۃzj#$G忶 s/-mV-Q-QMvW!~ ?>#&+~R?3bں[;oV,K?):Tn]~x>-Zصl5(հ+|Ķ2hm -ejE1R:ZISI=f 4^ @ZɢJ"ѡL_iq%B0f8-ԹLO^q+ws!"z X7[G%+ YՍLJ)c.NpΛ٪+NɜF"6u t\CyEukO[ o8- pD"Dct~ή-]=Aq;e58Q0uf2wcZțEvlm0pآ#P'WyC bQel[Z:\j2A!&?NJMۻY*,7cVoB7bk(z$k~UM ߀aRՋz*-y΂;:2u ly%U笲#BgnW +t.(0;23_d]#D*KkM CMMk3nN[h XRJqx"c(6H0M|TxfQT NM iQ)#~]_6Ye\TR9;ӗ.5=oS]qz+5찣Ӆ03lqGrzc "k(v׵{I"7V ;$odX{5L >g%f`0Nop[~ޜ)=\éFxek@<v#9<&0_ ιRh#l 'pmM]55L#Ljt qX]ɝ2[$'պia\:'w2I?dtq[UjptFɒ,>ǎ)CSs*e\1sҶz,t[08ST'Y #F Cv V;sCB-)lqz?ɬ v !9LO:2U|Q&豟%X; "7qUΡ>} dacTΓ7Ӣ _c"NA_S˻pr-ӞYK_sw.*CTۑ|Rbv}*/Ҕ/#~{gC;yKe>(x RgLxUS/I-CI?r/D_Zi7B1R_S[ttt3 +Tr^#U`ߘ}2{EZtPm?/qTMY}7\]Td2:.;FrR4\ U\7Yt Rf6ȺC@)@oF@jGAICn&yD wM^K2NmXc :Xr,'^քaۀn&s[G_ːJ9}:9'vWyxgx.#?_8) RnF?ԡR_ ts2ˋiOplɁvU;ñyP FGy)^rݻA SnźWIŎ?u:vpىH”6%f i.e)oC )!I;|ӳTK VY6[$llnQwd/+ j-T&9\B^VXf5sKPm*AM5fB;?)JAeaK|aeyT<6le+DnpZw8.,3b  oq8wMfUx1u6os}^ ={D/Ě|#\t>OOWC%*F>=jzUg."%LgܓeNȰvv ZL)q{2ۙ-(z)ssC`x wsE ۻ{w3wxa|(m-Pr~ٍdf,MVk` <ޫjxB8~`zZ挻nWHqVl%Πp!b eJ&3L>>Ok^=FNEG{d=jY7:ƨkPz(*5ҩQ^t.zd.(_>wߨy@\ e[GԈ\vnu)dI\ɹj\NPałp3CZ7ZYwnjsOjE7ϣfohFr[ K5\НޱmLT!_xM (;JNbC$'18:>،ba,NkyŐoڽlŅfls7~' * =$>3t|˾b.o\F@xz@-#}\rM}52?hcU)t%!޽b̝ݎ㻋ܔ 0?yΙJTOHyy,bgGlnNKMl9ǎtA0w똱*Y'Yo&sm!)O%>1-+QVt  k{$Tх6J |_^i^`*TL.>?s:0>VlSUce5>~)?7e_# yM cbuU9)`͵,S|/8) Θ 7-8J ;@G9]-ZK$5).!8w!kE !dذV >ߋQEdyn, |FlZ؃"sSj/v,\PAQv7U)yeH iD1a|`>A+?K_ek?Fn65 GA0z~yOלGʧ\vOuY$fac~~񹞮E3r Ƌ O:9\ʇڢ'V6:{vQjw??jD5g%$uz_]jB)#=2BKu#n%A]Thh-8 ]v~h>+B1M@u'Z?ՉY_0.D]B})E^qf!(P+-s(r&?"E:_8*b- /ʗOgXVM,6x[4wb1iޯ⧋1_#USzi&X?&\¼WhwjILwI-6ujP2T>fq9! b'4YHY c51YC޿,Me䛾Uδս儡 l|8Sm|H d ul 6Gxnu>zb)<ЩG<ƈ*ꆚͷtJP8cT}2LYu2r6A4/ZL^Oi2ӷUu喤dsS\:<2tG ц )c+!|&;! Pp𺟊m6"Ʊ˥%['m}/P-c\XƦ\#j΅Sh~׻8k@U8?ݗD] a5.Vr޻^I {'1gw> ' 1|gc/+.n e^<*fN3/hsf . AP3_Оlcg.e6k~Hl|aXX[/`GI.N> stream x=K&Gq`' l ’}ij _̪z=3A3+ߙaa?yyb<)%?8  AYsv7D7gO 8>Nv0.k ZƁq>~I.*(>1TA~hG娥Pi/SϛlM˂Ny[g<>M}a9h羯/OrO^(Dbar9Ϫ]*)yet֟^~J@ ) eU[B"=f8sClw73hˈ cqX?Fbt"Riď[8 1Kxtr<,2nGJ#-48IƅIAk0^O5:7Ճώ ' G|vѰ>A`ɰ}żf&SLFr7qm:(/qf-Bd ,' c)SrynPפ2-d 'Q .Ys +T"7.b!h/o "#4yKC1sUY-p؃\hBb+8@)^1uƁLWqyxp/D?= K" ;QD+ G ;i bK =X:B?M>#c'pKr(q$QQ`eb"B_B{_HXw˒ P. 0_|:|%},] U0 n>o ŊG0׋]+NO5 / *t !XuB|Tyjft9PNKa@r$rRVzuQkԪZjv .7?* j~xg`i@DNL,HBZziEjx&8ca9E|=Ԁ00J+ \!m0$@$a/lE}[:kpvl]*l5Zh!0XT _ڻ( 9S7)kv/ ~C:Ӳu{WrUTR8;NYeBŕ>) J4:)03<]-7Pr^$yۥMZ^Q԰qU(Գ Un )Xde3@\0O$%sSCt5KwIE25Wsr9l̹l /ݎY w%1aQI\}vYoDn/vR.6weIRW&0N*?*Uo@ˠٹSݧJ0]bAIpꭞ[PJ\QR6lwֳ8u ΃5f٠ipφ=Q= oĉo5m5CGV9*Kɾ3͔.GvpXIeP';mL'\oG__62,T~#^]`mNUBS7/ީ.Rm{z )vo[7CzM  m;hw>6*S-V tVuOۄ=e@E̬@v2t`K]A6$XO7s>D:_ըǛ漊 B'p`H3`:/-XPF,C\et#uR7R;u\:tk mtrx1'IEY=.*Hq汧yC?UI+8__]N!C5ԽyYnVki>nP$ۜ谦ʖ۵٪e+5)Weu O-d<~%F;itaj.nnS]f~A09%eҼH=\enA TP^ߘ />ȱV g+C 4[gažkzNjXR~T.؇ފ;Lzp*&NVe4u˔<Y氶AȻUO4X\€M>qoһ^چ#X"Ө  hf,L\884׌31ry=g( mP vfAO4rq)TE}@e z`ݢrR=K ;ݚ{ҭ.k%nR;d2fYX#kԴ&$E`kY1īuړ9" `=ʹD*ZāwV!0GdvVNw8Ԡ$%)"8W;\ 0qj:ҮQtar4^X0Qtf\_%2CݢkjLt6B4-o{Eֶ&Zi|'mkm^~riPy+\R/AoR@\- +R`5Zb2Ses!]ό<sBtQ4^>ɷD LNCQGya\+K /U!"~U95{GG_l2QM%Ѓk}\muv$7oNtjmYm^Lv=>?RU}~J=d30$mУ+,m@Vb5oGa=9,tYuٓ"D1q TG\3BN"4|h,N~<Œ?N ?۱#p 2=X ٜ*G( ,T!BԢp { /Z IAxEޫBZ=2 j*tU2._m`J 9t't[`iE3G!O$k5ġ%LV=8b%_]|c3@{RX]=yQ(> ʟWJ-00*'ғқkѱH9 o@.B(s*9f&̿N^t6i D0BkNgZO2meq⥹ȐL*XK|1Av"֔`sx+#՘ cH3کBpv7YH C\2?FhNmx.J( M,Ō:_oņgMFCU],Ǧ?[K)o9'U~-@P5 ؠx -ˡ%笂]?:B fK=ݻ޽K;y[7|9X@?S?c CH+z&2K+uF.43 --we^ ^xfݽS<Y֔lz}6}_ЬM:y{U˗ RWon>}dΫP uO\qH5Pg[`q6*J@a!~9 5{";T ՗Yv#U'!*Q2󥁭J4%3suBGaHc뽒Li$G\{O3i C*ZR3ƞfDvj4> M,|^/c} uu)6 E`y'^XgBHbSƓ25f3a-n0S3zV>MP0 bo=xֳ$һ3CI|ĜM$K E^-[0F/l yӢ_ɖ2қ)}+HΗKkz،"*Tg!0'k#_due'?K"/ˠS;f!{3FT*rQ:cśޭtj[LY3¨$=ۻpP$3CBHA(^`,V0G;M:4@m38݀Icb#o-a+TLjBY |x]Ek{n';)^-\*=+-%>%~b%L~v 'Q7[ܒsĔYendstream endobj 290 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 909 >> stream xL[Uk{`?V3~K&Ȇ.,YJq{> aeہ=XƐmLh8 [Œn1s(&0)Dxaƿ{rsN97!FaTZY%d}A[}ffӫ'2PY{a=e%YolS|SkŅXڦj}Atk>YqkT㯭6) 5緶湕Zn#4i[Z^*+͚J~6Bͧ89 yT]$KH:1^HvC!dZ0qϰؠobQ^.tٳ>k qƻ/Se:7\WYX~pώ栈K}Wtl]n:\J0ӝrrkV6 f XerC;Ñ@8 SKSW~july䅳cc V> ?KO}6J( v.ihlt& 1ꙴJ 8 =>o7GCm4Bt.a:O??|&XcV\at|p7:.#Է>JM$FD8:>thY}Fq".0zEVfynh q6: E@  p.pAPq--zIr}O/% GiG7wendstream endobj 291 0 obj << /Filter /FlateDecode /Length 8427 >> stream x]I%q[Y@ʚJ:HlH݆k:%WwtubyG\WSc:53IK~u9Org /_](\) PR)9/Oˠ/ٺ˧o.r0OzNW_]>'y ɚ)xus*ﭱWo?IW_x?&zd`Ke$=t_B>l?浪h^OBi3/4kܖc~'9z 6py`O]ӿP;_ &W82MA/ (Sȯ+F`7̥x' MN/k΂g:>=г-#޽gjw-!=ZF9}ĭnI@]Z~oRz0}ߴҟ7o؉-I;ܽJy~(P `بs5Y@Yjr pro׌|/ǓI@(Hh!u1}Ckz殹^WlP^wzW`*A.%]NAk¥x7RS2/|X5+#3Tbr Pخܰ1%'8{$3AѬR!I@A-a.&Y4{}}T<DW S׳%iB$R 'r;\,xO/L+-h>\{(([–z8D|]'X(-QӾ\gzY &H!4[})kZY1bdeI(`aX ,18{\[,F5XNy^]L4 $<\9}n k' V18aa&<#.?^~s1_˅> | aj0!ՀO*xHX8ptC~8lJ^`#Dic8~(I'8WBfGN CV?p"c"ipi::nہXk)& ݍE\[x}AL JB]р 9:ʄ1ڡjiP0~ :Yh}w Xd࡞)O8 샕s71emG+,6ހ˯pxzܜɮNުEׄ}^ڤb JKM}qI1|f3÷#h!HtWCg7@8 53[oQ/&4k oq pAH1ڒ\ y\ |bK8kfȖ2^2Є.o(Χbtapxg.t+xGZ@APArfêЅjHƒ<ئtx[|R.{~wkr&&@/"a M"qYy4؟AYUPkX]1cHx\kW1MK/}%~-~Q2w U@6E-RI1 5BFC6絙`9PK(6o ׺x/ J@*pd9WT of=)a&siQ\hgVC>rxpz(h _"Qa __ݏw* c6"_ u"&<< { Y cfe;Dmy~y1|Lj^Fو_^mgV0Rm=q K$PXؙmX{ WsVN8?!|MTfu^h E pբ%[+F1V/d jϘV @s3]G2mtLi[؃,Oڮ+yqPuA^x7[j- G|YC6|}u ͙A{<~R.KT:LH'N<JPAJwԊ{E< ֱ~|ݎA*@`l_;.&n[b({.nϋ0T%0+sy6# 7kg rx. wy ,|tq\H h@5y|hBCҍ3|/ά6}74*_}@5˩@9)&PGkEv:_K)""B5s~I3TK>A%)a,%$c<ȐSL7 j[\,q#d6*iIy#^f!lY0S$!uC;<6<hCjX\Pd|7oPCOuD2nJ8دsjɚlsWEI)XՉ2-ӳJ،m GW0KG*"B].3"a3~z?~|_#c<<3U+3 sFC3͔뷗ĥ#yVv+y,"7 bfܯKm-19Ә$6;muQ!ɜ>; *hB=\M,=2J \XһveN+m@..֩*9)Z@HݰcNNs&Ćs!`y[f| #6)Us")MƹasTB8}:}}Gc_m#x{^͇tD;ʹ~OA 'mdEȞ2ߌwy8ˢ\[T$f,8>0e!ﮗd>ɿ.@@n4$>AM/ WE!EA [ ['Y-["݁bȮ V9 [٪~1@7rt14ׇ",-_-YP*jp&aysZm?o̟7 ^_ s3tw*lD٭ƍڋ9ͺi14҃|P0A`bN(0Jo@sNF7O';㏳' *-&v-4Y*_*A$WZ0LٱSgKٗ(G1Sh}c^1'=Yyr'nm&W "'Hѽ\fiAV׻ΝBL,T'q]YoKlE\ ?^Mm$I<*9CK+lX=VTuXhs1d   фTzF&-YqI)Z>E[[<&4T3fBhUN.?LA8΅֩d~۲T%-n!A6kE4˼/PJ˪]Vw\Ǿ=6S\޼w?saq*?]#u\ElMJX*dt]03<+omM_yPk+nۜЇ(q4}[jg񌸣{A_Ր~ݯR( O}rze|d.(*J->9\sB{Z]B eqLz'k1tݦ v֨!]4ܷl.$|w@8h7B ~+vNNz< cO8f6vbϟ^9@鵓 aaZV:7_S~+cKSGXn'~}fGVYAivyW^s]Vn}%_֥vU[hQ'H(m\TZ)YMYv-)Q#an⟋T[$E=@).VńgWy[ ,ؾam/!O,jGf?C|K?0hF/2 he.h,_~x]2)ƉuH>blZbf߫c?Ȯ}iTX}ڏo_~J:k}J9Vrh~'>]akeƋ%8X(AXI~s\9ȟG4% G2YØ=\_fkщǥ h]Onf) VtL*h ܞVB +1{5J ۅޮ iB]^xNQ@S5Px! ~ i)S39ij74$psғMޤzULsUT^~'8f֔Vu;fkmcWX⪰Bt~|Us.~Ai_@V}R'c;>ѐ7o{cwXl[+Cve/tnCn (ۨ_C:^Ua#=ׁzX4m ?1oTCOblҾmI@lj) G8u>՗ZR3H[WWUrzM *efKK:,9guIWcǹۗ 3g/L)ɌH)efQM1aCV_Қ00*m/`uO7K=Ț6깏i^j5TW~u'p.luu(ׅ__GxwqӺ8bSӉXBKO> z[BY2͗k6rf^u:P(B%2R4HKWQJVҘcd޾>! DL:ոrй '&INnQir =o<0_vmfđԌJaa}OfS:~:٬;h?3biNķٚ8EY~\E,{e0 Yfqhך޷ճ,¾pk~۹Eۿ\2*}|6VCx]YĿơmTn#xsJ}|MRu_Aw̃Mh[ Y!0qO5G36pj峺@r4_OםQcUKˍL u$~"2:N"a^.: nf*Mn'w]s~rO0I;hW^cץ+= wf~ãh^Q'7@R: ,K6@9s>-N;9%}I9ve1rE8=JJɆ^4FTeGEXnLp:ѷm蒛glz{*.|@` y0v5R.1JSXR9cT!btM!(jc1w[˺02HEDGƎr˿_ylW٬JVvcl=ܵ  G/XŝbֈkjU˻0ʞ̌{ϸf~XݎAh&}" ^XO$F5VIѥq>—2wȎn30f׍v1bB!q+>(vww;2r+q* ~}b'k, w 2kti6_01UsvZuLpdw. j(,fIxBH#QL0V5J/l^x2 n?i5%Bd)qOcqA%>,G6,zN2? &ia6sI)*!uW/i D1SE".k_甞,KXp)g8]{t5pj)|eޚ1]$`fLi>-3`gz;3DQ)AO;w8̀Q8.L ys̳Q&\%%Eau?pt>qb]˒wICuYpA<NnPln1;+{j3ln <@<5@wtqEly[U: ^uLfI<#Qendstream endobj 292 0 obj << /Filter /FlateDecode /Length 6438 >> stream x][7v~W#Fv4"(l] l?GM 9$nr{:MnNmS{#8 7w[n|/QVZ?nn ßfs&&c}@bsAj4|]lT{76~B[kc'ǖQSmA_]}(ߗ By6SqBoޅ1xc'`JLD+V}H8WQIķpg vŒJ͹*;i3vg՛۰v):57x^?4!7oګH󫲀TW4 ?F)So\R X}~Fc+ՠpIOQ5'B JiL֔ jҒL9M-l>*Z J{`6<7yEק{-pFҗ@^N]Q;=B)(cx[ qS]Lp!.b)[򗏅%<H&۲59 F&0:=H\(}4ڜi VBLMߒr("Phr1") ?_ÔN@rv?$7"S"Z Hf_!# ,26`:=Ӟ]G|w¹n!J#iAaF>CcEA8QZB8'TdāeҌM '$+wGӡulTg)mSD~resl2 f016wB,059FLO=ux|b} MH;9*FYk@`-ެ1'b.('Z[ ʂjW\;iX 9"It(KY.9HeuHn[-K.4k`7Y/9>0!ZqPI:n & AM5KXE)xχB>4tԦVVy*.( 8Q&;V"v9)ø/e șӠ%#=Q-y"#*j Nf n&lHD[/)6fCv]Cx|ˉ^=-,?"]T"1sRD& 0sKRFjNAH)K__sI`tMkz_s(y3W7-I<!#1qc65=>E$)WWg`‘ 4h6 BUsE\ڥ, W!գ&AZph`azU ĵ1C-d|9qP/Z¥C7?LR,0B\u0>N:_sΠ+q]Dcf_緲wnTfnH 4!;uvdp j# ~ AI1LR94b~m".I#J\ } ޖ"VoNu~Ot]~h5>VGt~KQ)V|Q:!={<1b|QD e,?wH ԱcR‚Λ:G#AfDTmדobp0^+g ݖbЀ.#-]̸g-:/'d! sS%)K`d|,>#Y(%ReB0/v1IsLM\a38~F4mʪz@ŢA=\ ֍agȿ7?zIzHOA4I,dm`` -^yM/q6jnZiV/D=[4X/pA ; llxF:2g}3B;,'*;: 7BQDϑ 9\IB:FE<%\'TfbXtFfDNiiQӊA:lKXlj@XBb'Ќs JLӵ 1:{),Bi]l\`ClsWx$]~z^\oO?%bo>c'^ ?z}OXP>m{xAo]d6?.6-_!?wi^'ck>?ec2ɏ*?=4z~jL )7Ӌ4vWz\6 PEƝ`͞?<`e_uk\; B*KTV]ܥ*pߚ[AWhbFJj٩;]K ̎dvT:AP(mC/QSݨ{F"fk>z)Y}~*tL@j) _/\"Ft*-/b I`꺧j $zb*,J?̈v"Kf91"C)8.1<|ŨMz>ӹ v׹RJİ⛄z դJini#["уԎ6'´q, d݁s䣇9'hI.gd߯2E}mJeaW OS"\0}0FqgN`| KPW=2 72A6R"Eo3*}ΰZ =Vhs o/׏yU't I,metT8J +>`;tEZUrSb;af8 ,rabs0gkWūGn[>##%Ia+7 {ΰNIɖ$YL3hHmp2]\]6Rl%,miCax]O\#ºFs 3T)*pp*h#x ̄=+"qfZ#*{v 4r!*'51ˍlѨ]bN: ZvDweDaYQ_gIW/]bQج/ӐI6MAtyw9OtgfnAARofu0Tx]@QSR1 F d `FO)ZXJ9mο0-.q .I˺ 6CicNhP\%٠$/WtMKmPL&oO]!C~ &舍~FXjtnsv`z#h~CZҀ8 i6/E_^ҹJG}n ~`=;*8iݐoxԁ#7, V3KnKIStuH_ߣ*sfiS,}d_՗?]\!)^t|x m|+7]ʮnuyo@d)E.[”ack^%RS&,i\ 3'Vg#T. \<xIyr!OeLd(RIeیH}! ;gqZ}~rg,CYV)#<_ӖKq}ss!]i&&rۺZWԚaڕ Ц (tޓ'Ҏ->kQE∂(fr*и| h =<_L-I5%3H G<ΣQbQ!WwŌSBLu%7|/̼2$`*nD-|3Xfw佑aK"0eyNV2Sˤd8!ˣBh7٦2HCʫz0$M;X~x?y=_@I佋 ˷Kl̠>]"{MFOn2<ײ<ȳ|5ǯ|v4J PN?Ls @ 2YWibYL,Nu:A\=ʇ,0Ve=H,x~.z'&c7NZ#Njul빴n/;M[U[7*R/X0h6ve_uU RE 9beJQg]s}^4/9̆ZYj$}VBlb ӎ15.mLalcXcꓗ 2P7a糇Q81S?%kE`:#&Mn=`[1зv ċ/1jS 7'`k420/ x(E;i5i:?y˔ >ŪU6}=\T}p789r"7&UHV:M$ҍɭ@; ­E#1tsh>x '|rnƫ$)ǮKi582ՉȌ}*0 Où:-~*=`1&!{E?"OG.ꍿo%ĭv;){P s2Kʰ|W"M*Q:T3b6;EPɔ@Rg*\kh͛MR<n]m\b S"cA\XUcmNb&qP쉛0d\aY=7.N胇&fIdJy1Sy9_SS .px}ǪR>G8 цR(Q갞!N{nT?T3s&Q۠;TwdflC?wLRpޜsBTKÀ^wfs)q (A-ƟXb,+1ߪQLJQt(hް/7prKH$tHE-yCW XbH8TtxՏ1} ϤrMe>'dЙq{h*ß8/c#%u>;}Wǹ vN.:qB=YC@2ϋlB/q?zꫢ|i; y+  `]ftgYtu/gοC30(6sg.Hf4dL̺vBAGjGoT~ʀ~#^)i5µX^O@kluN-8(-|m.-@ _#;_jҰ0ɩO> stream x}[qOrN`"ya6l DcקV]V^aMVWUWCć}ï~~?>|?e5x ׇׯן_߯j׸vuWz7>jj_Z_~}C+no|Í_tovo%P&K(?ûWWk4@,j{u9|7L'h5y IRH.>@<.cBR.U$e^ I XefH%Pc/U q)3% ~E,$'KbDh@e>)B_הV}*u^&};FAԅ% PhcԜv3RPMnR;$fvuy ֡R%Z&ԃzƍI<|ֈ uvCCz39K7,RZoeoa[97Ymsҹ't/xPsW<茢^tÅB#K!-!a\2W[^Z%yP ;Д$ҹ:ufUo͵ JD%I=3:i# ZX ĄzZ<иТiaJI$%Jd.WhRÖ> iȘZ U&:GЦ + ¦\HmL >M#m`5 KZVtq5L͏=]*O8DTLSc$e- O-N8MMJM첞hz"$CWhxeo/@bi#CJz V}A$]gjpdjrEAA%I6 $8:$YfЂI$MrAj*5AXQ/-f%̃d44KJׅI$[3Rgx$nI5f(ՠ(7gք7WEБE"VZ.yy$M-]f$*?Ɉ@sְ}K ~* \sv.,caEꏑ%-i=jT)2w4C0dFKǗh/ Hf)< tJ)>r=x"73lĶ} QM($|qHL?WjI\"N@WjI\NԒRWmߥ/k߿|QIKb4hr١^ ;_Ќ=Hߥ_UiA+G'ro 2T ΑA7I$hf&iR*ZnR&9JI#\ݪO? c]@y`|z,C% _==t{u||\K R&ϫ-Kx!z"#MQۇ'g~|{ҟyҩđ>|W_~ë^=uĴ c^Ƿ_ x&ay2fPed<XLhģcTi_Lrsclj,8(S=#SCG\<>-..NT.N#mqqU<8P9\>-߸x98M|zqAGԸ8QK0̃GPŋQ 08t|s,kSqSi,īRVĻ.Ļ 6Ju6'+E۳8-8N&>45&N)8PijiăRʬ/2^x8 |\|r!8xxӮo>n3J6t n>z|n|E&Cy" 2WcċwAqL5Oŋ7D0.0o'߸xz+Y\[Y4C..sqS<8-K9NGg'4tPăj8 OG\GcTW<E`z&3uc[L<Ĩ8e8w)Cg||^ E+UOÁ_I>6TnkQ}}Ch'= .<щ1u)ѩ 1Zmj86l7#7uAD{  JQ “t ٴ}N1P:D2|86du49֑/S hIQN-.zB5%9)5 'ZF{F\þF"6}0*Fz죵itHsXt}$)w>d> }e>wN}$Sڗ(+X+QǍ(d CYA>hGG33)|(젏o[>Z)0)45B_tv} }c9* i9WH7բ\6q6% m|LîHFȇ@ZC -SZO:&M "7&(:t qe hleTD2ePFCQA`LW(P1=v@`Z@,b=8;$X.h Dl׿@'u .hv)sTVl^r叶G WO:' '^^FWGDLX!`VNsp\`*f9 ) /r6+%Zſa{v"N?:04q_fn?y_5aU_1۠_W%uGNÿ>m Fq61v4+Gc7;>xqIr~?&~_~A.~,dR?D3WLv(r]:5D]PyCs=ok*( ~d2lzTv#_+t~X˲_WpZ醎v+Ӭvê<~5^t!m`=^ *.n>lM9 vf} &졯A⑯aVG>hjFԳGt;{k48ô0Yf `H ʲG1}+'$Ȧ>U상B֦a_Q= uztqi+,5þg~8FU:~P65BSbT?:4 a%}5S=\UwF+I 3(_Zϵ lKd_3T5'H:'S}7P"u}%yD,> }}nan_c}a79$_I}>Y p0.˦PU>`~uF҅}*lj?6Ty?cT*, rc^&Z\=` _@gv4S?=CrY _=_K_E7 4ѩeoc=AO%:WX2f &M/֭CIT @\L^"+B@8ENHYϪhi? M~`S*K]F{]yL4}!`G͝<B—9qûB˟@t$ P@yO??d}Aw(Sd$?ᄇ~ce'~cvUZ*A"g߀A=A p>IN'~=A" C)@@HB'iop 0$8 ~ j~7}$dOtP}/4hFpI ̿ t,[]0CӡQT$ ‚q>!Qo>E?HdA"gt^x X=$4'$z#S覊5'D}W}2o ,Q=>d~s>p-'+҅Y$,L (eC?7æ{JJͧwyݧ먠Ӂ 䂢ǒCɭQ;ߪo7o7%R'ǒ'~{Ʉg~$[Fa"TBGˉ(y0YO)d8g/Gz]ʘz?[G˘1*~YmNV~QFx5~_a2Pّ_#\}A?$=Wz#ZD<qrF\`G\VhY#^D~L'aS(&_>X=8]&Fb7[~يK6_])\wA@j`T;k@j2F+.:*m-js4:]/えٯ&khi,Z3zay}Q} v>wO;G'?w6[A?IFKj&5gQGV7[]u^tF3(BBO RzZ$ /׏/0PK*|U]+KE~feoPڴVMknr5"cpE~Id54m)*ae\ZH%RJ;)-q^k3\ voxe\Y wU!Vs@_lvt1kۓrnxAyWp$*,|恻Ek1.U"Tڲ{LTʱ?>$jU!c_RN)e)]ƸZ`ddw˷.bX/dc=ity-dh=yie.p/K >OQbM)z` ٗ*I-nEɬvxJS$!gס/_LJV؉0܃ X݁_>WѼG$-8]ֺ$kfk3QT|!s1X4MP JusdԚ~L?K^ 6f_XnAXP>6ݯL {V]݅Kl;_w3@.dlp5Fh:=tTn].]6wþ]Bz{}#;s|;F0E~oɿ^jKv$kRKK}qI\)RKJƕZWGcgfq,5"Et n52`E7M:|Zy &{2yLq]TrB|'Jėj>WW$G)ߢ/Ǖr= $VC+`5n0*,}H,+ =+lKCYyC[`I=S>{Wo߿w?~۱.c#/9ktM#SB4J~]Gi/Q6͵:H EwA% "mc3ʾ7[\r^2+%ު i\߶HN-R&RWmjIv[W%W_|ţQ=;5vwYpG [!"݁1 %޾j={g'7ZZE3mmy;l ޯfAQ|jht2Qe졤RK* uT;j3nw.<0c]!š܁ys_-J98C7 /3|Ƃ I?NdcY͐WlX-C|)(W# ʲsRN+)=ָ[[<^}|u~7[y"}5쬎Mڲ? Pg,ĊBEMoLΔJzdfZ4kOow}A$RrUj)p)4ڶ%7%C_>] !hA+Lj=+_Y^>rUtEkభO_ug7%@ܯ)'ĒZʻ$ fӯ"jPʞ5žܯ2F-)~Zd5~L:ūW}p{V5\={]+;tۦxGeݑ2vW OQh,Ph6fg&h 15>/3oɍB*9JuTJR|P%TK$G)+z XsPh8,R9'QWO/j5X!n!A f٩rh9Bg%?/ !{@Ds||KO{^s;bz=tm+ڕh=D)?Hv>ȃ!?D@]iqTA%"g COo+<j!׈ǶH#7O!+)Cݕmq4Pz=Ek;x . Ä]):ބomXYw}|ߢ?kOm46W7U p9 ΄G/2"wЁw3NV7?[p'*zy%F ϗӭJon$zw#o*鋴3IW9ZJx )o_oigc|r_X 9V )G $ZhAHD]WXP+#

B4ʀ9!_2n[7nk0LXE, d!X*HeEbE~ e2"6f F|&tRvm++2 aȑQ&[Rİs+ïTcð%ïVÕoἦ?J§ƏXǍ5oA_@OW&4T,HdR \O+F W.4|) +i eI庂KkG؏<^"Ye߁Ilõ2q@{5GVM\jdi (C{"q(tT S85; GgƍYlTEk`Dpt"T ě@Ec-78~|_ȋ N4uM=/%ԉ& R[KE(i \GL$ZW7窥4Sxn|6I &u$S(љ/R*9Jv]WoKėPGWHG/2gWȍ'Iq"b-O 8T9ʹ7%혱řd6xdE$~^txOZ@yYڦO`l8}uA{v8ڞg]=O5@o%&9?g/eqvb9;8;oZ@C8hzؗR)<H<zWɪǾҺ<>p/E >l)f)դnB @bZ&QCi)AWGPC_EL9V Z} a=>8[Q>mՃ_C"BJgE 5vZ@Y/c<+ n ^"_J+_(1͉@}PVC_)Y0C~ѣ2SUa׊%243C Y~MX;\̓: ¡Ҁ ~(cy Q5R~rëO@/1䋘*"V kkQ)N9&w$\mpzNNӅ;i n>], \([Xdx(S-vG`zH͆$ڗZFX'Og'F !욬q9>-"#3I(;WV2XYGԋ>,r5cKmסC8: { r}o!#CܻM{CMj#$jpVSaw2B97#ntSl>ɘEl>ueS.~Xf4@ xf.(b%SL>PbJf6 LaFU܇JJm>ɒO1|V!Y{& SL>8oV h6LB%RU.Dk $+7CxyAnD/Iϐ8Ybϴ㠈\o4AdsX}^}/E+2R{էXfO2M:Iw 1هi*f>,; ׀&2똪KY4ï%#Z1D6D x}MBCGŒ/-ZDV[6dlC&S2gQe,aDLV$$]fKˡD Ius2JS5,\xĖa 1I͡[Wգ("DZ|JRdz2^h zžĩW*3ǫV#qޑ*35dwO+:yhJs0Gr'%En[±,|0 '+K`Rn>\ ޛYټr凰>\sY,>NIg<".@J+O:>?/ϢfiC7AijI%w=}/h^ݍ7^J)g"Ȟ@:Mƥܝ[ qwG:I1dwzF#\w\u=+W,il6FܑYS qO(;$ifK =Ὀ|7eJ,=qXw͵Ȉ{[͈;~rɈ;~xۑyڎX;1gC9h;a+=UM|hZ kO[^keie4֞f_)kǵB(k^XkgY;nhă9'X8g"[]LF5 ؀`DR&u.Є%B ̚Cjd% [X!v0(ރO;E%¬|X SO8L q&UU '@O8&x8Lmjk 5QmA)6Us=RȮ:d ʉZhZhF!|a,v,ML6ϰ/M=aZFd Fp'3a'4~|<7J-3 aM1+B+-q̇|I\Q+$U|d.0a4#$[d轢L])Rc2QJ V}U\@$/͞¶<`jQ_U9#]dQE%ۄLrmTQLF#F|U>QMNsdLMN`dG49Z;)ܢs)&IY2 &%G%ǚ*KIK=KzFdd2’&Be Kt,9SYNneñdmϒ 7h^].I&\''B*e4Ji2*(WizHhz~h2MAYdH'(5=x+b),pl#>x5䃿p;Cx_=|?bq[΅{8w=ya/#2h]M9*T9 0P^|2T㗒݁^ìv z9LzDъ^F(MqoQpDEh5|*us]כ\כ]pٯGpO}Epou'^7BRJb|i{8Ӂ{fU >[{x,7ӷ1 |Bu;O"Q/ܵ%eAOZ|Ffd'{R1zB%Cs5lUZ)("#shY:*ṧ 'l87EbtJOj6G' +ѣN9d7K(OpLqI`W.v5kf$RSI$c(/#CSQYQT2w dyWr\x-bQZ{{/)y1*,2{z ,Hm"t^ȰS ʓWE3Ƭ3p iEy #hXi2v3oebKbq4H3;^KV9%]q`WU\yAfxǂ$>yqg'G.9jh8n ME6.  xF9:A ;-C~C3nsC~C3FdB~B3 lrbu/?KJgPsmt3xxپ mxgo~^8+$;;3[JUݸRKJq:ZW?w2@rôH˴,1WE}9IhGQ* 0QJėbQ])8$G)m+Z967i.O/JHHl4|2hW $Lrm?9&6ǔ 31WzqYR'ִxNSX[4#YtX/E[;b 6<[" #l;Ud5b4ϫ`ExuWcAiL[ x5bWPFPEF:sͬ>ڶ"֖skkΑ7 iG=qqk2m48;Rh^mzakșI]6iF:A>_} CNj'!dD #37qNɂ/:c_@G>}], z3ŀb , eh*3N 14::SB,~@ ~J Xx9wJ@B_zH=+a:cծзqՔucco)ETB_ZJ1vYJ&jJ%4?jϡid_2݅~aGWͣ_t2w~ *M~@ Q?DRTO 2>p`_^Oþ`+/ @}>& ՃT=2~̰?+i֌̄i>AZٯl ä,P?Ճ_][*YL߅~^8ɞ5C29 bG&D5}>Jx4R1CKe =wF z^+FbBLcAIFQ}86뉫\wx "3VPaaCf  m \HCff  mjke Rm+0J{SÌjaFu'$ijѷ!0S}}65̨qd8f<#(-@,H<2 }]N2_!e&Ȗu2SW͢ХGQC)`|P@9 PE,CVTt1ͤ 43SFw1h a"WI.Ly+N۳q[fB OҸ ƨCdLRRi -]@YUR@4hC8CCp!f\!a&ڥaHMԡTWT/ ]4@A$Af=Cn]CDloe 2LQEo˪k~W-SS%e?cQ@bZ@Xta9j mX.Ę5<RK/f~o+ȵJĕʖR;>hW?2pff4<@ /uKNbQ'l"*@"kge&eMeAб음hL’OPCa?Xl;33@\?eѸeO`џeyFefQk@F9EԚϮz<A9I]#^Rte7[]la#gl47]Al= s׀rkkhRs-z~01z~])pZԷ5G!M^2Wu5?EqQ!5zr#,z-UzݒF5XeOAk5H=F9sYևůMkDfjX=GQ/J\š"e|g M$tmLle?`9J(5րoZ|..ÃYƐy-iE8=zz%ة=ً=Q8>=֤`^V2&ZUpmQwL2{ |teM.C]+a7MCsPv|4=9 T-N䁏iPz%UGzdn^ )KJuBU/?ee!H;A![i<4>jS{}=h @C!ˀ*J,sE2뒌X5B~ -6elݢ6C|1E?~] U#j_RUcA?N}A!9RI0OM2V`Fjc5$pC4١Kƿ?$pCrOy}W!*P4l%C"XaS2H(0jL+ f͊NQ|e.]oIr>r)&ÕeUPm&뺨e%}jOH&Õ5HAd>IIR*x`Acp5湮Cj)$kjAc Q>12S[E*9 0m1"]gjO}njk ij|^Qeg%`M1U [ἂG%ُAx"rK2*!#=zvTC +U(,W$"Q;zDr]{J5M|AAcE"|w'vևU̐mwVC>j`<\Y]`lTܩ`|d'U-c<{Y /$I-µfL#qKPgę@{-٥*u-qbԒRpu^ݾ%!;fmAea:}e11حD%~j>/Ց1-Q =KTKhJIR Wʵs /` /0v,= .Z--1xfbgW^=\[Z?;_[Zii\d$+Dy2A 'Dd]Qy2LjR*<(p1z'sRO$U/˅)OtQoQ䊢D$Ȉr ǔ^y6SLy)DSEL2ReU2o@N+WF9WwDFsJ94ֺ(Q>r9Q,{J١ňr*6̂O<>q8L'Q6=Q e^pj5lk dТɼe>*Mhjlb49!R`ɜٴNGy ֔MKxdCm:Oyx2uTOcZdz W/Ъgʜͩwǔw<4$wFSqY^ ZEǕ9T+'td+f\96ADre&W*%| >),'hbdCp2+'5*+ɑl9dJw<#x=h̳Uc<ԅ-s+eYrӱec;~Z͑eIY<<,'UmIdj,=d%;,8:̇tK2KJsl9AئXVRA!连#BQU]ċtDK/Y&<1y*A_FQYk hkTCzWLEbM0XtDMoKERW/{+nS"jbV#sFDHx]>VBNԔDM iiZZVC>v<見f|;'R?_L"ZdME,RR49"ZΥ"jEF-JtD#BktQKGF'[X$·Fs跳/%þ4D-48D}r#7 '.x頏`h=q46bꈰU:",:LxIJMGLIxkEq}<rRh }@j"졏k9j"gZ!qꠏHNx=#;.%}!*dط/EQ˦M4E: H,5:PpǍ1z\/UMȼ45Q]DxF%D-25+*ΩvdǚꀏGRD+wRm[>EM>6uz|~z)?_z$y55>~þG[FqG$j}`18&(^_?vp.I4DowGP IAL G{Bujҩrl=zt?d*T'y>~V9|Th17?MG?d'.uw Q疆u1h}-o`'OXyFΉ#a|/O/">vIwE 3t"Q~Ư7Aϟ_:?C%&I"?ƱB~l-R 3&G;g <b5~gv~q %O8 lKa$1.G^;1|ӌ~:HӋH"ygڡ&wځ@^׭Wljo΋0jǕf|DTAXɣ> \#Ư2Z 9 #}=?q;pͰv٬ k_5_{/KR79v;!qk;V%~D\ƾ痲mD=-.c[\Q0뭔3>^2 LIXm p`1~~<rr[;US>bi1kb(3F w{d ^̬go>>Ṅu<وWra)^{G]ZӅ嶚MmHtYYWOa(+dpGyq.RCv62[kBkql1n=xc~;2&YwGWU^:iALK\gٻG||^UJ_oaN(?\Ϥk"oTJ2F1{(ը_Y~endstream endobj 294 0 obj << /Filter /FlateDecode /Length 7523 >> stream x=nq~ā1ְ A,vW$")קoS3}xH@kj^5O;1ɝ7'{{w"vN>]?_ ;)hڽ~{;v^?*5O$v]ݶvݾ]޷L]Bq)?oW?[yeIW[Yjuv5lWoW~ޮ~ٮiWmWշ?ɷOOM =y2)6N^av7'LN'8UvxuO/~TP.LZ'=C>:ӮQ~gpʼn"$9Z DZ⢟I* VPqr RY1h:jD`QBV]kᆬ vBV[1R(vSp'Q(d nUr_Y5pdnIV7ldؒؔC=0y+g(VVhC uC Dv%镛 ћ5)AMT5k!G* 8o\;ac7 ȡ- N "Ixd 2CVIliItթDm  fcXֺ VfZ`AVMf!X݊g7oܿBHְ H p::RBcJv ܐkK܅j= X i d,3U GXBN`U +O a, O&beBk򩀒6K`0XAZk{Z!p;KU;M|lp 0Lt;syaw{wABW?~}sq>o`Z[sn>>>~8AJdr1ӓdT涨k'-LhbCC6!L3 n$ܤPy XE Vo?}4Od囇k=)lvGM% ٓT\Ŭ"~T$+X *R)֒%F1gTIvBvzf@^cWV{ xRqfV „FIhD Af O Ǹa],e>1o l]y6H c <p76l }ݸt2jn21rA o!te't[Cܠ_23 rU3,{17Էk-ccb]{ +򠝝 ByC\~`|niϥ ѥ!XEfr^̳D8&x4C'=aq(8rlTNN+vrArtH˪/2*RG9_$;ƇJBu̎tg(?/Y@ >xG"7^3ɏs/UVSzT`Ga+1|OޤuRIB؝ πpn<Tͺ?YON1GH7 &/8jOjE%Da Eh@b;Eyi)+;|/\%CBE} A#}Q 26O.ey-P 䝭`LaRu^擒azhE69E|}hݬ<5 tl"d8زr"N-Z{'4B<~:2͕JAtb]אuI@Dm+h\t(^20:v;k6%DNG:(?|[La&<G+Q6IA:@W,$>qqC)řnj#Sч|Wd0V򣐱@]uuӈr4@y D1虋` -S_ t8²[ߝΜudٗq0R`ACn#6&JQzIzHHs!:ޙP0qP_'QuΕP{iL]YA[{1R//֋A-)Y;*xO:Ώ~cb۝* Gڝ{8!d=fZ$E?$\ZTq9cf849[Ǿ٧EȄc9I1"CgZTCZ2XpbU 5i$6Վc|12K*nkIJw&u.&fe n8P-"YhZbU )pPjPJ/|g< XgA,q:ui| $7޿颢w52`r`-RZK6]D;@̽7(C\OSѮ-9fBXPq'TE\zzA|Ȃ׏II-xV2'Jp{d~~L~^Q1%!R, )b0w(M8f̈́h$3}6|o^cGsЊģnaQm5WG#jXkU󡉠7 I G'twƃޘ6) u/T[ _)sխ+8tu}AP$"x[vg9ȏ{J6 Yyq@.&?уI8 %ȓމ!LI.CT2qQFQGSJx}!o_<BFRq}¤MB` [X#چ8>˒'M6I=<_yk8Zwv~Kvj艔YJ2tm-h9mP&$p:"eo%w:PwqrB coXDC\)ĉX[GR.򴎐r=[>P@tHD%Hmv.od>Zɾ VGf~e+0.yACHf0a fvIlaߛԂ .++ ;{]ÜnܨPẅ́c!!M#Q1x;~h +V)>@G宥끝?r>.$|EıGY" Ԣx!t.U^S؟NFUzxt}?iw̳HLy_ut@|OrJ)21|+qzf4RϻX2~-ysHzc'P\r0 k;|hmV7q``@G0 6WQur'%}Nv~M H+Z;E9D ?UcGlfz }ߩ"<ޣiF2i_OeQ-% ]sBOC=N/d|>=ޮ:=D%3ҫρ8cf&!ܜ8+e絡p-m3\c:m eX>kA噱ǿ'4ifw hhoL X7Q~JlBk"LܗOľY?-Ay/&߰"ņìSl8^+OV GFo. S{ȷ/5.Ƕrw1: G5;Վ) 1˅կո9!,‚Q(D:}Ijr$rjƪ|y_^o00n3 ַֹ?TOk iv bB뇪k,GE+T"y؝a6R;hn2 2+NX #IՄ|ۊl QLQi:ەkݷ v0f7yE Hsŗ"8$GMHOF7|d8SCBȯE+>؈瞧_~8O:S2a?<؃Ў%LtQ<$x S)[ہdE {Ltsk:>4x5?|RN\]tߢ>Wr͌6:.!}.dM)4$" R8H~,_lXW,寙_#9m3\il5 JƺNdgwSd翘1OIw;2dyҔrIQYj/ su& ?b6ג`χBi`;4+,|~Gܪp㰑G`>}hʮ_ǧ`}pG .2KqX~Mq YJYK}]o+zi2K:нȮYϷ%SMprd7ڭ'c#e endstream endobj 295 0 obj << /Filter /FlateDecode /Length 3787 >> stream x[Y~_10kއHF`$w ==(A{H6Y%#a9b]yL,8'W-́.򿓫ş BiX8p3\q΅n Kk^ ;3+-s҇878nM{7ɮ% sg$,M["q1thrZFAQaL)rfmN'g([!1"W 02Z'Бx+%D7hu]Io~K+cQo??Bד(BDٝ+:) %QHAK!LcpwD4Qd= R":-9I}.#[-g&n )t[ŨϣiBb>&ƪ1U16ws&Id:y]'(*v/TIi^ >ћ}W*5-xn kG7(Uh%pR5WG ʋIH#ѳ2N+:tt7I NQ0e`\FWUzEijrA19rmyg0gq9igZx0h9́zHm<țQ =QwchHjA|n \B;*s mҎh'0/1 "riF;s$ySӒ7gاqG˔҂e:w *9͔3L Y)fm2@0D$$er0PʁGH#IOR8ĎᵇҳD3654(:# ɊEV~/U}m8*D:qqhq?~ӫ>BL&baaE|_t%t-oHD=@Ɂ-%~ Cn u)HeܜCKs1q"\W6N QPQ*?h;V\0d.A)#)?IFPp䎖I}67Ô0`iȍg|&c G>OӉ`Dҏ47Iڊ)$H; i㰋4޶ 'i U\<y?a#J 鱢qA t <Ҡ,^IEҰJS1d{g9U') w" PB]Қf?BSIp de=xSlA@V$##֏OP3c2nda&>cۏmz(lyA9؁AA-YtCpnr%7767p|$N]_<_`o=8scV3o}#>}[Mp榾휽Ǝ ; u{s?q36Sn_ܶ3O_Fbp=[|Z":Z-doj;ުmU[f 2ڭ[08JBR>w9lXzn 6mܤQR S+3)LrOpAQӴ2~7 a_gmR i - SWn:\%l~둺w;`4tqoH~7dѝ֤{׶Ų i8.U &l:-a^kKn/*.á[r47m@6eP6n@V1@ebX7$/2Bd}9\Oq-DŽS>zV(*ؚ)1IШx̽9PHڧ9ihmcF0eKBά  PZC^Bb99 B=3V u3yGGi7,]jEGZu^|Uʽ ܕrR>~(B#՛XV#o s|#9D|YַOתm㎞yr/K&{q`5콯u&ZIs m?i*<0iͿ"}Z*dMr'!si;rΩ^i1e+R@Nradt.2/{+endstream endobj 296 0 obj << /Filter /FlateDecode /Length 7920 >> stream x]moq.G,%@LNw3``|@,Xwt$OMR:?{ggVN8TwWSU{?F{slܽy3?g׻_v 9{3y&@F{y'!bq S_w=}owihOe{mOV^25|ў4E{Yt~㛓o_o_>1OnpcޅѺ!Hob^<Fv?AY͋" 'b.xNC6pKCʅPP8d'?$ M"J( 8%`b'ab>aŴP9?! y4; S F iqg V|h,nGZ.-7&;3c&) X,o-dKz,!NLO4W0v2W6` $$d|̓ٝ )g ¹8+z`Nނ( g/M`[PebGL?`h" #ga>`1s 0Z%2`i"(iA9d3's4C`^-Lf*! fayFg8IW,61AEI*G%!@,0ML(xb.TJ¹BsZJGZ{H&GxBrc;kB-򦢃 k,:l! "l $,a ; x⛓)]c.9 M-dgc& K2)$osgFBS3)0O1iWuJy P&Q2)hȺ@HX<(C(▒38B˒Yq1pA)&H)WPX2@$J>X)8AɰBĕe}Hś&~boD.C`<drb4TK0H{1q/0cui 01$[ނ(C`e.bvL MȡqAAl"0S^p 츃[Otj#9R<;?!Lд?9~uP|M"hJ WF^uw5PQըBFM䧓U(ݨZQ볻뻳M$*)$,+]Nad'_t}3sB~/$Ӟi8 e׍)JbmlakҍU(ݨԨ0Ql|Qnh}5PQeGjÎQ%rpyaɩpi_|<#}/LDN5/iQ/gJ́D6}@64bXHmağq x#/%ȓeח7~ 9gw2)ݽ<;{}uqy_A| aw7w4e$ M'W  D`"p[ S%kS@$ iTl$R3E"b&m _hx9֪ u ) @$l T .?zGPMѻ$#Ga%(?:BFz$1hS((?Z# HP4$.qH  # s]?'M=de` d+@Nw @(&JZ2lSeH%ykt#taW0 cwpsb4⺂#NUk6C (D֦$$4YŮ @t@к!ڣͤ?%2O8hO&SUCAu {$WO"jS?l Sd73.L 'z_pg䏌;t `IN!ƔIA C(s GvKZ05 V \ G94drg`%+ʞyTIV\?׋l*?(qaF`h uq2 b̒XVDBa A+|Y*_Dӯ/ )җI-}Yy{|BcE |LZD-}w*1J(jKQJ(٪sZ)}EDEKmȇRQZ"A/(p|YJ|wj:rs!P _tc{*Ѩ,<Z˂ |jBE4eC,eCͤk"戣Bgai|YUԸg>ga#jĺgb-ؒ|6U_ȯ ϙjsUE[S#m$3ݯM}#םȗKѣ>b[ /I쪢c5QȩŔI>.2"Hn5 }q/y[%Md9sx(e1ɪJxPPK }RЅ/FD+jZ/\KˇV+/M E!L;u/>ҴdZO-|E[k{Eojj݋NU@{X tE*P^ ~o^Tս@[kZV'ERT%Iֽ&*DŽcSP,UJxSϜ̎&LBLˡq Z'8Ao}158B)H'Ѱ;!s[*7Ǽx|Nѱ1R}ys~OD W'\fq~P-JZvcVXuMk8Ͼ~8[)Bv`}R;u$F GA'-q5qcfuPȨƩnrj!EAKq@_#iM@Op"$i!]#iT$_P(tY)4UõQ(ۡ#hJ`Ap7FXkOb02JQZZV(m-Cգڢ5qd`@ ?jH:}ZARQPřE'P>C?gJFTH-0Q4~zyo4O<)2Rxl.f꼼*%Ao jTY=˯c ħe* iv9]8M%UGpTnbs3BF-3>eg:$]f8VE!u)X4JT: gBFMȼ*= yTݘN5H3[T ӐeQ Cx>JwORQGgwnO i?ݽw7g@$[qW{n~<]y;w'ܦvU>u/2U/B;M[(Z?7? ]9I=uPa&e" u^ֻM,Yt8A£FZFuHQ{ztֹ.ʍ%|ـl|IE*bUz=Sr,^4Z;ޫQ 8'ROxQ£^jkoki:]=(y!jb1 uc|ȏOBrNOB9UH3ljrYO.õ>pȖ"_D=+rY /RU f|ym*QeU)=!|y/~9T):heU(zԂ})32,p331fLb2i+5%R.XotBҍ*nT/ABcAzUw2>Kd7gdblkG1s 7E$1W|eÇChOeJ a}oD۴y몠w.BufV|&T'c:|'d OHύ Ҭ.:?zv]ؐbPi79Ԅ+"LґzJsR {Q~^wtÿӌ:7 @zJ)0Ng`[͑:K?z# yBh7{:it@F! (ܲ4Ib%%"&LCv[5uo>w8ؙv rĄsy7gBW-B}sk\i=:'|l=npKC媝[tI/dR(< ӈ>]c>^w"I7cʂ2q]isP+|"P<%,j%mv}r-[WLPrkb^"*'IMZZg*9ըwKɱwEޅMs_o{NzyEȵC?4~#&/rq+; EFR|JTaqq͇zi$'-{ @?­V,.vẝ@%!i!Rlܤ^8s=g-z?Z|*mF#jns3X-p~>щpY:,֩4z{A,cK?N9̎A0 1%ԔZ}gyK˱Gcgfx^oGu-B? u,@0V6Gl1kB֕q|5[ԶC̛2upvyZkKr#ƒ՚XJ^>QήԺߪV,ث;t.ՀoOLVo=W#wdkEO3 TE.lWR{QddNjo+,T2Fm)6#`4!ob=_{J]Z8m˹vL[Cᒲ3%m܏fx}/3ck6/zѯb|2q#n7wGJ'|d}_N/P3>@o=2V1Wh蛓YT81 ˫d[VvhY~}Bn%]irƲ뾨s%ǕG\<]^[(:1)/j{^Ry.- tՌ~[6r0G}w#!G@syO@cq~擾nF_x _YR[u"y[8ˋn>vJOjd@>},g PNJi8 ןr[K^'KKy)}mQ\).wkېO\9Â){*GW*(so˧!|Go5mA:FezL^{9f2 EXԉFgW .=1_j/ɳүyn*F}^5[6'Kn^d-c5UhU/')k4rΥgGbIq;%x$MljmO6 ̦X - nAweT:rH4\\޸> stream x\ko%qNG\rww "m>$WTW?pՕTWWTy7Oj7˻M}t2>??w_c;ޝ;;.]9fw~wv3b?i]p]]vخt߯sݮVx_v}\C("MzlW_Tixޮ~ٮ~ڮ.U.xH_Zk">5uoW׾+ b)tO8'X }ɕ6uzlW_]a4YLZxYmz~W_oWn"Çi0(JáS0l i¿J0vzI}5#ݿ)_ A)sAA)B[PLbC`0S2L1L(M"I;9 M1SyJ(aҙRnJ($S yr!S $%(=)paKPQ\͎fiTĴ'Ì!Lk`3f6,I8m'yh7 Rk\14&B\sehAIa>I3E1fwv(ZS֕юx?h9/l0 v<>g5(< )fqYv;yUVMYn3XhI15!804 Dq0 s2c'M+HU$Df5M<)8ˤi wg x`ͤ#Q|ϙƺc,t; wc k$-e.֖H87ee'Ɋ%7 u_ڕ]fU'H걆kȾ*E 6Sp'0lzF6U?]oHV{ٻ[8'ܑ+3xְ/T һcp' 2iD{}(ީ3A[tT)(J<bT ^PrTQ9QU)(U 겿Nˤ3R52EBYD` R<3KPfZG) .AjWPNyfJ+{(7k),{!fL6HRQ7_{w P\>?U/Kf;C8XKUjwsN KF--h -,R2Hp -XkZCX Z)΂@Q;eJxaV(PxZ e%4kR@qZTmj) 6` jيKBX8We pPKґ)KZZpSZ|VE@m,E mAɌڂٶڊTw m|,3 maWK-*<nnQlܢ [ <yk*ނ o*g[:ߐ )CV)l}Jm}P</A3d |3zϐ K[JgȔ ]kWAR)ংdM<F*dJiEpWAW … B&p-X Y1*1U%,]\JWiv@1eJ-KWUŗ_ UK[X4Q $)e.n+dJUȄn,/i() [@=߁K@*TntܦDße+7:]LuT$q?JdN:&2mj @/}jS5֮B5ծB wKtF Ǧ謉5CDgioLtѝuSCQ$,JVLtbzFjt4Q3LG'h K,)~t2D|Kb%9k])蜫8$:7dcQ629Wۓ5с" `Y MzYdqCOHhf9ʚ娯Xd9l5T]m8qj#(C5#I$_MIrnZsT ˦~M"$f,G]@94z NH_תU6RM%ۗQ'LA7ZL/}֘V4FYnzMton/Oi6\!G{suwD D:tЧTM;rѐ ~&҈]OG'l U>Si%Z4t@q 4gc}Sp:y *ON*<(kZ;&KEJ4(u7,\sQǓm+?!Ъd1"pD@;Ǖs05駐DQ;1)Uލ iSޛF>i> aDP3喃4:JQݨJko4 P>ۍ B:ѫO1 xE*=v"/guuwBGb-Ҽn 92kC WQjA2j%j(cQ2rp eQz&%G{)Q2*+&Bu3V6k踍NTNO_{4똏p~#p>G:yx\]?\?<|{q3jaHÝݷԋN.adZBEꔬS%-L\Zx)[ROZX3:nNR^AwFpm4OqQX/'ff?U%2P"XkQ,CXgf,tvZ2~G*<~~Wg򃿨G Ȧq鱵0Rt$ř,0|Tt Dqw9~Ҽ}F o̧םeFak];~HA pp:ϒ6 ],v"٤k&K".N@"l#!bd-ejDfzdkoμ [c_0ziᔞWؑG#dv`ӈNKL q^i`H\ΐ c&Ε|0q!X{ƴEL*ľGfI'v` ea BJ G1iɾ~Z!=][yhq0gtm1Sz3qAUW?VuśPl{Ԥg}) K{g/˦5vu:]/"mWåF jnW_.ߢK*{{kl@~|[M+Zd<˟X}]bEko\+H9_&r~g}o|@||xm]}{Wbk^ކ@>Hm\I |i~JkJyϧԧ^ėrifMYu`xg-[1N_x2u7v͊`iW$i__._ @\vWr~~nW#zv [~dTjzVo<;mZk] #r6}EzZa}2W&%N?vjHUC^Е[3gQ@wu2B,Ug0f ġHF(3`U)Qf5恀m~툵6b'n~K !y_Җ:ojW+QJE~Vų"s[Z}''IrIzw3fͨd&@cr^ں#QqV䬥WŐwLsʫB mnf5&ޘ[\N2lV(jHȏ~~E$ד z$yHHQs_^`/bڋ75}U s: ^|pqyCDzս<(qxxKrrłEvުY^zX|GjKaσEvL>GW.k apʍ;1Hxє.c͈w 7vl>b_(@yC "1=:дR95L\6A'C߽m1)B2콉Jl2Zw ȣA&[b  ʣMذ0Y~> Ec#+tޓ͞9aa@°_E<OE1lqj@EO7,m^j@LǟuHkA_44vՙ,1o¯p[tX >iwAc[jC,^ȧu BB>pCiȡfa<_~)uI{ CT V s٥8֒Bw=㍛9\ƈK U2FM3x{||5@1X h8CaIgX_Uu"ĉF蚦Q8,9>/BrҨ^Ly|Xv }Y^G>MQ%g{"cNlͥs905$}u >,'RB1l篤"&* Bړ^:SkpKG[m hlvtժDds8ڵ ſYPLm3iܠeHlA#?s\4-K>b8C<+E1gfp5Q[ })e!§"g75ݪ&#A[zBzĒ㪭(XJló+^g͜^f"v}!VGE0$3_3q+Ult-H_OϥESc[V8vcze&Z`%#o両|+P"99@lջblTD:>͏yNgOG1tQ?K|_֣B-⹤ ѫ}1-E )15_W71oj6ckz] b(wozC|R,AIn@,m%PH 9TWM "­Nl\ȷ{O7AAkk$]kMZ;rЕ=SB:8)'ˎXȆkg%?YO/q}ϯ9%}9-Ssx/6L(V՜xlb؊b v;rMq@)endstream endobj 298 0 obj << /Filter /FlateDecode /Length 8221 >> stream x][oq3q,'}$pb8ILF DR ޖV^ԥg戒a{N._US)_?>?N4qWs~WN){ovޝz.9*{uszSo̔S~>ݵOOc4Ooڧ}nz呟VF2_OOBe2}]_ׯNԘ;8))ۓb,Q q ,7[vI);8=Olb`m”#R¤ip 3<)=X}2a 4aʸ&T`&! eN/Id LO`x #! 6)p )Oy` =)0=㕭az8WKedCr<؁,>odݤa Sx *)7cy5yqr<'(rm㮣'|\Erѳfٕ8EAAÔaA)8HpCHA;XA!9lb9DtYMƊFMϠh)ڐQGX"|*",83yTh!a Fg`(7'x,!Ö;䌆3G3HhH1]QHAiS3¼`D0&bixZTL0c0*~(M#4AfxLGBc d 0 @!)*y<"SpA"S@m$-~'0M p'H`.0D*NMzTlX% iM ݠ NvB\#,|hHId+7Ia KDTd`F< h&G!*Lw?FD~08OAc1!E&P48)1@f™Δ3J;Ac&Qcܒ>aj?JTsh2eTQ+\*NBFx1 B NB"l"U(0yV}XVx~ Qw(J@8 -hpj ؊7=Iag AY{% yl ֆX /T(W\) y f&9i5w*L!9 U}~-7_`GfvQŚVJskKZP& #N^8 C$Hvw&vyH5 m`p 1yw.No//vW4PEwH:}0C`^tp++,K<4&z0O  'CU)hBwU? n=<1Ty5L$"$P`r x,◧FkNG.gX :y*bunўYRA:ش`J+AJT<JX8[ʑ{-nN {ombNAQ;'V0ಶy-x\V)$pI5#ye6bm~ҞZRĪzZk`.ЀkL|R4#@gz6b &AbDTDBQUxT%VB!26Fi-bA/؍#R-gRdקY,P:AVNI lI14XHB鸢*^۸ ErQ;;+㲖 EpJU# eWa>D7A%P~yxH+3~H&Qm'U};I?>I1/.vgWOW?^=z '{j,~<@=) 8hmSg.B^*$ K@ٟ.LgA{~9(9a౑st!,p,`Wn).L-srcdb3edV.!p qՕو5JK{jIjhofEG39i :<[ 3SRfhr (>FL^";fF)Lδ a#;\dFnV ,\U(UWZf#(m.%E}q+/aU ފ/Pw3lW-{%:+3|i/y@<h( 2](t&AlTSTR؛z/ `_0@Ri 8ЦJpϊ@M`4 %{H d1gp> rx;h0>SiO0A@|d k 3B5š]9,@Ջ%v̜b~s *fP>^`<-Ht#e7 zy^[T-9gT;}3? `mYx%w!|OO~'I9VQ,i$G`>[r=F,.xYsӺv,z u{NJ[J&LC7cҀ%/H4̲nڹ\[kr.:4/^l,) ]!+0pUHG!7Av~ZXO(7d*yGGݴAN15Uxyn@b{O}o{O0šC2zڮ3}Dn{ʽ 8W]\~WAOK( }NҰh̅ @L <V{UJqT dBhAz_tv~q~=@eʃP30 MD{Q6Bð6G҇Hr:eV5T)Z[FkHxm:2aU.B/Uc_ ~yG%c9_Vʵr@^6\+6lr1&/P29cr:=9m+d=*'pUW59&MQrLƵu[;8ܭ[* ;ÈͮE>&A?RQr }%B> %3}m+=y;ȋ:} GF0~l=_k \Tef<726[\MbYtHص;X2)%݊)ٱ<߱ }Gֳ3n)K:W4Rʻ`*B{r*Z7ArdaK$-76"v1U<;#.VcP}A+oenGv^" U)}xnYk E—s砸^wjzyF,{N#]oN^8'isM씱QzU:Hh÷kBHmfά‰6ad\~4j^z?|LhwUw{13,M@x䩍6$<^ z`ȼhN#W0mTb.^#)c&&<< ǝ7Y77Uw*大 hÍQlc#qvD z?̂ -g>sQ ž6xf:Q~-")" |MI/o6@2[}xY;_!vӑZnhC;cBPzbyyB/xR'ZvʪU} `3DHoGSJ<pzkAL#" A"9SOx>T>~-$/Xq}wyIN$DExFc_;e4ȼ\v_zM8"@%`렎~AG؀c4< Dmu֋>!ߵ.DhnuhNƑr}I9eXF4(f~;b#>~iߠ y0_uWn8o2ءzC& '՘b"U#^Rv-7 B!~1K{7 /. _!s=vr7mZn.NN[ IY7ilua!oK=w"gn[/8ORZ|T}ىb7Lϝ|awh|}zm EϙNLH9f4$Xn'.l7\̸7`ȧoGRp6WNGwa8P[ԣ53fuT9!R xG3%m"+Qcr.ŰΑ뎩A|-ڃ;hHcd(@BbU^lfH4PJ+OnDZs*w'g!ʪtpAi2%Kg ,F{Xj㾶Omnyn5_8va>}r+i|Ѯ-!["ӭK,\|[(;K'!r"1ů߷+RrcUHi/JGtط+w8<*ps.4{ TO),ZMݡ9F8;5,N`$Y;AA#-^t=Ak<3 XEKGaC_C>S4g hTjvݬ>|=Dž/+O;_~$uy=\ED!-7-w{;H}Z}׬n> ? j<^VadEaCi =R"Ca'}^>ݚ)}[CˈCW98V݊KeO(vYLRիηSy˵/}t8-n Rc telTxWvf@>G,xf3A0yXCaXwSi[R"}|EK~(?7s޴+y/Jx0:euܯ6_}mRAp l/BϢ@Q93ްi7^wAxwv NWñˋ/piPvAb'?Nu\?aBMr7\լ[9\\ߓ"6lEŴ}M$D$U#COcA5]qikOendstream endobj 299 0 obj << /Filter /FlateDecode /Length 8325 >> stream x=ێ%qy-3Ny'(@ȗlk h乬ff-mSE*vOٕCkU,~''?w'ߝ.sh N!#wNROsrF?ίO9P=D3cy+Ub 4c+ !(fѣE!D.8y#t!;aϏ6:C< ?t(+%`-`NN_;[ Aa%@7SkY Asz`+Ӊ][!"`k?6)m!1o%7e--7c.K@UOkXcZ叾]B5QxEy@hN١JWqÊ\U7dp ²$CIY_6X{ON4`GO-:ڨaKrYH": &HPgsi t&*GkF-e= Zh.f'!`RE @}c j@qR.V4+XqD qxP%6 !{AJ?Ġ9W1;$k$g-s/9j)TƠ1_BF'%mߕf `hhca͍ɘvKk1T9ڦJy}ZuizKӼ>M+i(̞ޤ . ξ#LEvuzكIe$mڻ1D5%)"]f=/dk&Bg^G-ivC"NF xvf4֞ryg3D?V w=ަxaWd ^vuΙbx8[0A:ՙ& .-tX:\G p5 w:G.mL`21E JP(ppzLU!RXJߖBF%g>7͢n[BA̸&=p]-LgJV5S]Wѯy!O G zȺP.&¶?- ඣ Ւ ꐽgm`1 УCy2R[l9{KF׵zJR mb27Q P%QY'l=  %#%2UDFEvN%WTf@ V2Cx1J "[i HW`L>Qn&)_ƒ+|&ʚ"mD]DV"/$ekɘeg50UfEQQAQq;*9zN-k8P#"R&WTMVdW3$E `bpx1: s 9%< ֠58una ܁(fP'b-3QA&=lLOEh+v_GIe*Qͩ' GԏYY1Vo~gJ?$BPU9Դ4]bc(n{Fyo뚭T#>Ú َ!#xTG#ƘM:"r&*dDP|kj]\ETWQ'̠!eRiM vBOeM}_S\aj4Eމn4!(F7rO)HMz~iU/X*j4d"΄p:L  DJy@㔨Xofr^ `8Ͼ*JjP޲C)=M =3g y`B4yYr7 qQ86E=!.X`x[gTdM@%x= 4$[9e'kЉֈ8 )l`ki7L,XT{Xz3~^}ChCGU՛6cxP^QqmyFVy\D?zHQP؀xFlgFF3oXkIHNTJd|yxg%aw4 ̘X.ҺLf6 .Y(NF?5[1Ѐ^"Uߤcx{\N^Z/FE[*n4y]^ϓ7\yBIKR1tl-5ADuK6Vag! *.<3iHn:/j&J$>KHLnɧN.; )$"qQ+X inY1RFДO-LF#6Be(-]gwI@3[͒OyI\P .Z9y/\|I[V3-!-ڏ >L'Ŝ _+#Ӓ7ipdA\ǯKfH_IB+7vis}vaa+WyR{ϔeX-qLqGYu_%}% E|g9''h2&ֹFx7)-4¨Vo6gDqM$)=:tvCk|vv1T?vz?̞ _o8zBFe}sH@[Iz虄n;:ļ/ Ƭ8b]W٭>V蠐X|퐜obޔTJJD8^JYIomF1=h~ F px Af" *J:!e5:P`i%H24.`>u鴊7:+Dp] L1~]]dۏ*4`/)G}B7 'lZV v+=hh~ZIp I\]uO$'U_aQ>F~ƝpLy \iomśQ G2.sʀAT4runHR~Glkd-CD'81Z2d ,}&<`ˎ-"v"Z̜?͝7yT 3&9`$&)fr|OKgGr}foQcV8'5; ւ Fl(2L7WSH*;[.h(|6,elKVLU>NrXT7{t_|6GR?y^UVz1U"LҶȬ҉y\7<;_RTLnd烫),ҡcMabVaz[`)}a"UF߬RE^(ܧmq5-0YlhKhI|"2aBL]I=Ev'XM)BpB4g:M7x E|EKv3hzfL7e[x`FueJGt)h D {lGd);>ţ'xdf1T>'-kԑlU .$]T潒1 @N8)p&Dkf=se$>:G]b6bEl/3sz[7NdPz^A]^AHmު^G s;: $׌u ihzT7' ݔjj^ZD':oPok>Śpӡ(vCk4F $u ?y))@I ~e\m(쑒Np':pIrh{$Mi0,8]Co38*OpA5S[)/*IyQԷSkQ{)a)}B?p+W"k#A󳘰_ד:cb&vLүdKdMy 0`3鴇Db!YИjX+_Zw<{'HaDN2OjmGhx+bs`+|'hr=9@[X!EަɽǨMܯWHM5֌ $4$Dm9ۻ33b?qݙƚ~ `pۋBqo ̂Õ/V CՇ_MlPdGaWRڽ"Sm>W3١^Xߎ 􊬤M$T[["gtyġScǭڿ@R8VMNʭ*wggV`_Lsg%SygT?t97Q "] R xѼ" ]^=22 `eiRX*(EDuدPhQ& pxcAAK fY=>*ueuThqY/[ 4z? ?ksg#^q.+.}Vjk*mՒZbFnN1.]xqkW x_ћLU@~\d)]BbZ!6˧&gO䥢& o-w"sG=Ժw~yMYsxR.2Ե_ͮVD`_oVU ;o ❄%h\ _$Lꥉ\êd QOu2عaB4kT"uMX@3/({Fs"6 Oтse'cEV3hgqe I-*;Qܚ3HwSv\aA٩3DeGKG*;7+EXI99Qs7ṭq@v7/ߵS>z9~j[rCЏ<*;[n uBvǣTxԣ#1oWk/Sd \ 6[M860nJxţ0v3&hSG O˔^;y͢Yn"G<Oa>Y|)?>h> 7gBڬ=:UX&:BgI?r^]ʭ?H=cM 7 >5bm҄6 a=MN_?zP2+[<.Yj\Buy)ul@tzLJtTӶqoh@1 4kp:z/GºDd#e㔛kZLͶXbj(+e!H C=8@didqqu6Sn|Sv옕8D~S$s!U\M)὚YԀl ը6[ K[*TBS5`°Xă֪¥ ;r6HaܤSL.QIMX׈Ȇ^/Rp#)H3K`m hkF+Z hL?ZrJMrѫХ:Ugjt|:?ZpCpL|A>l.+MV/,R ]IkP 8X1>\Z.0 bhjD'{Hm&xX ,pΖ^/$cz[\]T70u k/'?5?b9t5煑{]8Zn p~+:ɜRK5߁T"lǦ6ZU~ඨ& BдG6{ ?a\L01FGb}%=>Z?D;/7;d_jfݦ?ϯ'cMchdiK 7`n<&$xoHi BVt=MxB|+"O5ɱqNS"y@wU~ېAԀ m~\M3`sɔ CA7EJ”Wz`.Yv`gNrԊ#R:Ʒ7iyD%#GVBwD Ҏ; h])Q7"≋ۯ *_UFG:mQAWi<3Dhitf$OoJL/Ҹ屮9K HD‰,h8 m"+NVk,G%,¨}v {Q ȶ0Eo22=壍g|U["G{'ޞ":&^xUXLx`[LG|EeLR2Mdg4y)ҚG }((D3p/8}&i[Sz+z:YHe4pC d> stream x=Kqǿ綻i ɕAVdZAZB+cnmvmH=i؜f>sY=A>_У'}oޓ |xśׇ@:)ЧeV ꣫!5iXLLJjZS o2!6ȟ]@( Bv}\5HW)T9R{%\ a-G)&d#R!ރ>N@LR  %Aip0)9yGFC#)\V%V0ȅ $|f=0414ax!: SM1| [)(bp -pOuMwB'hMEx2<}p`>9 W{3JnMfHe 0` i< B)endstream endobj 301 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 594 >> stream xGCMR7$w,  ]VQmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR7.CMR7Computer Modern123QN͋oKL0bg͋§j~'eg #e'͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0w!¨oU CfQc3asloozb-N K֋06U;ixwlЖu4a}]qljeoYr}wCna  7 ڛ "endstream endobj 302 0 obj << /Filter /FlateDecode /Length 6199 >> stream x][7rď%9杴bE`@#it\vfIk$=U$]&{Ȓv V6/Ū.q3b3.N~ۼ=7/Ox"⏛goN!`ܜ8I_7afszqxv9B+|Gg$}a>I;1!A>7VnnKkz~{Z<}*p(YxS?x| MTۛ9 ^*h|]:``t4yqrRe"R0ERJިE";\w5x@syrQؐHPo`lyvz{,ns'崽=9݉ a0> .wq$FM&g@15d.^҇ҳt2--hE[bŴ"ۏ6֒63ZMb4ԘKeNYyV۟=c{;hf3!Iit k8)6{[Vb7-, $,I"d,DlpӴngEn|& Ō!\ [}څ@d. IܖR AMniں 8mdWsz1%4h1s?ck-*6Ow 1{i|d 0  `cHϱdC$O6dN'qID;%MS$GڐH GQxnW I4gq{,2V4*5A[=q[2wd+cA` zM̑ÕaO1LydAzF>%Z &VJڠRq:5O 3:S&:Yá. 5.G"tTW>{rU1Mn*Q_ɼ_~29pCʱ@ Aԏ^#)/h`YB,r{@2-*5Nvm}&a+ZzW=+"Tv:T &xD.ӗͳI4,rBh6+pP')+Nl X}a,Z%mlG)=.ZN7~S^Td$t(4l{%o&~)vhyz>ۀF飯@#X5חF_VoW8v`}É*тo p5a!`6ot$&03,@6ZAWAt/DZsIh1G9@4VnE֫>vG89 -lͻIbSIBbLC!X-V!TIc=t?$:4^LM"1Ef&UhoM1nUlhC_ҪjKn (nӘR,薨 hK>?&zr}L@BtqOYMЋd naS|T\n2U_ꭉfa8A?OU |Qnc-%,rlT0}V`` Za¾iX贖` 7,-&XybL cʼn1yRzS|0l`pب5"L6"POB Aˎ\_1℘~+`'M#Ly7H44 y?E}|}#Ⱦ},,ӇdHu.%i98PsIe p !y$g Z}ad)4 ʏtQuJ'K2돻$3ڕ a abc/8pYI*S)p#{xcewp *I+BLfxÂ_PxX_L$jZ@?[MջS&.LGk q{(o{`Wcy]dPAtxg&N}j! .xxBДy×B) Sru뤫qĭC|Z:F>9K/LfhǹvO?XÂ1E3 S$wB8.HH dY0YVeA<(YΣ0,UlaJkSylt=?$GPe9j.n2|J1+jSXmT|lƷ&DbiA62jbKYsbTQ" 8'M&?fh4|y, -NR.BB7N#4Ue8,b'kHCTDMwMU{93m=rt_$3a}#]f]mM^uDc rud9r/ dWYqài7%jpݟ#rVJJvIh]tB$_UUi\DB ;K1B,jLD{3XhkukwC"Pfs0I3EAwG]vNv~wՀq +'Wk#IĊgkXHN&~*i*߹ez)B("5-K^S+ݦ0^G~@X<=O` FX,sueoj8&PZ?ڨ*97 ~dϗb>V*)#\Rr81OըӬY뷙ֵ˼S׋ꠖcޣ;I4@I)[&&vH6#YTDU/vuN76[*TF,{qBrQ~'rI3W*HhLżv ꘱ݰfhx+Ey;)X]Tq}bc l|m7fŸqA嬒:-%a]kNS*{t v%H7$lѢ\4emefa/&'/U 4]Ivv 3":7_SbBپ,B3u64J&ZR|i t޶~*)SI!ˑKUs%,w,'I&,V{#ԝ֦.֝X8<D_WqX@ŜzhgR&W:]ZJ9zTqLڞFwRwݚQ UpuM‚\LXM-L#|ܞ%pz]Z?؊|5f@iT]4Q!>&oeydlO|S:+ћ4GOӌbyͽLe4ҕ\7+#u=<lҕ͏4lXpDAX\unE\bzP}`pAS&d 6u0ELP>GGqs WzˎVKNoޤnbU<¦}:CJ/fj2FMh+'NPG%Ny`Vm)^M d#o!"I.xѥ"&eg.Z@Kh%v\qr`$RSp"4t:[F֜AAܵMz*7TL ux/ԃLx/N ?x.=}E$ /Kp"3<( @Qu0%׏%(=k>Eq&h?c\ys̑svs\$~Co3;:녯 =m_{;/OhǪ$Rә7G5"k3?/8X\Ӵ41-628>Viw4M J#箓!JtJy^ͦnZ+^(2Q_OQ#JCZdjt[eyzZZ>+O?΃/_oܕ:çnz|7ܕǟ"nJ1ZZEyy֘M5K|zWGs߭uk<˓K*jDglUr=NܘO=^bI *Bx1,-lӇωem#gvaD4 t; v4v7~Ylb*`endstream endobj 303 0 obj << /Filter /FlateDecode /Length 5102 >> stream x|#<=s0@>9T'A9Nu'ot8?='=J+lspN34Ӈd2٪xxR쐬p!%,,Xt8 5u5T ~MktL xA@O`.Ӗ=zozZ:,yc`<ۉ-AħT`tOe8G]d`EMm9rpu,_I6A`|xdnm/Ů˒Fa]QyIy[4DfF3QU jln*jc=;F*/t q u`LZ *]˧4Ø38Rیv0eb/29ost&Ѩ fo=y]`&8gt[2fJW ʮJSv&oZ֎Lc|OHh,ozߪƨ u`} `2Ϛdվ5"Ȃ$,:S&&R% /i3ґijY).W\v*&Z 0iƟJz18*R)ҕŸ,K6)cD&/t )X(=iq˒~rɇ%9{lBv+a4ec5djk lej݅)#WE9rٺ<.Nѫf n)t@W+ty_9taKZ='HJ giD:AltL?ص⾈VxE|{2HѼ(F7'442RpCKoFj3'N~:h#pHF:l\G>kzZA؆tjݯ>+~>mǭ|КNu"=9֚qLbG\W\w\RYBZ:MUr֭U vl)KG?~G}Y(*EŽ4S|b4zQV쒹"TCX>=Z@$zc:-7PiAu/v]B}H0_wʷ!2ؘ{ 3 hwL[6xU L %0 ik?Rg*d?Yu.rk0˸}/P@a,wt &q?(+ÝSK+q6d7v!Ukӈ1WV~]F4Mb\-Fx'Eb|i~ #~رV[`g N0$hƑ]T\RhXcRڰYEM*e]r朷4Kaߠ-]z/HbKL'D~ /r`vÆsZ (<;A&͓%YH T,8ձxzll}Ì,a`$nv4tPǼ(c4C`_,X*OV<{SV`'dDfBb/"3`ںoq="@[ͼr&"1}[DNm5vmtZZ]ǰ#p""`9 cpsv\?.XD-EWV(Ccv}3+\/P7"Z ˑ@"hT~}A*l|X|{ m 43c=&अw`gMt{e i̥ܿHZglK 1r+%Wc7xt6ݦ+UhkW4?wPsflwkI_'3Z˛zZuZZ *75;t8 ؊|jcVIn!WZݍ˫nоQ~5D.EG|Wʼn93*f ј&d0ȓa¦V8d&nWL$[^5L%z"~gZ*n^y΋t*ѝ Mg`@5do{oJӬ!hkͫEl4XC .ȸmך/'oq`cا+d,ԱjhC\cۖZ˕8n6 \)'qDLW^6F7L!go(6H[ó܇sC^(TPוRWqYC14Ӯ#8^kWE+m<+M.:ɧI/y޵:!L?R[&@I_1Pvrq|ڛ\yRnءAUµ.ea,7ݕyGum9n={"_`~oאIC-E%mΰcqx%ynj]Eł~5F6 {C;뺛 +2\ZзL >Gқ3u[֛F~_$@H*vs1 \%7K a%X;%? =8._Ѫ.B.*I_޷w¯~'{Zo[ĥS zאobM#1v ]v.״[:EÍJy+M h<]ؠcd[ŚWSh#\6~F5Ѣj$'Ndm+Z`޸lfMdٵIqYګńIxY>H R8۴4|_0Sq4cUio{$*DNAdС^}MeAF^COGf鬄~~Ւ/B@(imnK24|'K׵ك~1MC$-LkIbE)nŠPZ@R 蓾̘uZqUBsD{~Q:B62%쉬+fD kBIiCjD%DxΌlN&(GU .Q,/$h//Ns(ρb:p4-A$`Uē8-݁)^"D=BuĴd<ф4W:?&]!7QFdFV3?0uJh }AEDJ"^{*(I:D0gS1_s Ud'_(ư\w(  @k')?c4ͣO{L- E]<+rx2A#ydSy&+_^*q]h7\b}`Eh'n_)'~؍Nإ'e \ѓ*HƱBae'^ ^wRr+ncKMQ>S)n>aTIbgr傘ƲFcʎ|qv(I XOß.lƵ+F@Z~5K5 T*_G#z(VRYnzYl?fxrl^|^vqxdAeeR57/@Q2,l Ar!| 7T-E_} [0;s7(]ߌ^~SbV}Fָ*s6t.5#TwC\ltzL^wKʺ6$>貸"Zj{2>J5Fe<~:覠0ޕD1iJYm]rPJWY~ģ*l}Wל ׉M:ZWŇC7K׮ RVby)7_U`Ϛ "!Csu/XTd{ڑ7hI})yCnoŤヰ(HFaw.bNZ%8 nV(aC)my@u>Ҧ*pCB8endstream endobj 304 0 obj << /Filter /FlateDecode /Length 47221 >> stream xMm͒տȭ* 6+GXth Ki j#@z2b\aC}~w2#3"Y~?_?m/ƿ/>oks_>mso~Yv??O[WW?B[7W{~ϳ??rSo4 mݺviY~o۲_?]<o~v/g?5y'}wslyO)msK9?~,?g3:ſϯsr߾ gy;Xϳ:n u_? k]w𯱈}??ٽ?kns\x}wYT3O?IʈOzݿϹZ_V>k[vc~Zi}/_?k98?_p3/觸k=)֭yh~CuR~K_*'/gEOnvO_!o]]_?Cs=omy~[ǿ҂ \ts߿俷HS_B?kH]ikY|TB#_~Wf}?? }N!N!ᑏ0f*!==/lX.>\BOl?w|"{.w0ؿ%1x)ZOYzfP=]~&S7y$SasR]خ2xJGs A|L OB ;/?)S]'2-T.q_KI]I CjDZ_xߋt2].i.qʨuVLzAg>[dJ::(}Q}Y`ML%\p#'통Q}ŘJ(o6Fb*+ +k1S_oNvY<[;=}+&SZ'6aZ:\n#[xLdDkyL)^u)aV+to;y,+2հX_2-nuSb)b*xN?nF0jVz}o}o%2/=sjV"-S evc<醵Z-D^)gG7׾hv)֟.sb2%<5m~Ї6P;xL)`9n7{[TLwѿYk>oo]~ŠQJbٜMTlZ&Ir;=7ҟiU;׊t=Oq;jJ1'~/>=T^)&SJb=kC{VLw#Gh{6W;F)Ovѧy.*ȼM#EkL?R,RżM%Wb_w7 㰯]dJyx⑏;ڵ~Mt~C;ڵ~M;~l;ڵMg ޵"9Lڴ8kOJ>mw4nl޵M.6?Ʈ6-/_S Op~.p8*f7Re߷AǛTBSN}M8"V7P'Uߴ+[dJyxy8*Ѿ2T+ۂ9Vɔ;=Ƿ{fU|}e2<+`xcJv-e>^tdkEJyO}fdJyܱs7D) V!۷Wbow)oǦCbw)!*x-WQ+sP{9h&Ssx/M%1:Wɔҏz*҆7XѰ!St"zcϼJ?vѹL"~rṊLO纏idJy;dJy.(6*7ҷJqߟ$?*7Ru-qU=o2t\ M%gZU,Y53"7=vzf<1d2|#x}\H0O9L5TQwssF8 L)O6'Pvg*p2Չ`|?\8rF8L)xSl?sҨ"S 廚x}ř釒F8L ߟ՟1kTaJ}tvKtcsF8L)]AW ?*p 2Rv,?6Q )JL%g3.1cTـ#ɔcoSƨG )euށ`ҳvcƨ S U`ǷsU.d2%|>#|Q Bʳ0*p 2R:n|QA&S}zMgU:X{<}u%!zqz#?-,Z S`4P mdz%bUh2|x{{;e*Cq\4R|8"Eq`4Pkg[YPMoY&0"EQ\4wʔ;PG3*?q2Rl[5*?q2r_Ou>CIPy^q2~8g*%Dpr>Ox2iQM%U78X8.L)O(iS2E);?mLcUh2|Sz #-qcUh2R?='s(È _p0N~K]d@ ]p0ҷ'^˟;t$.(yJ+#mĈ3|LQ')e[Tc7DI[p0Rݱg({G؂҇2hEcxK0G=Ln^ϳ ]]$>SW.R353WօRg)e|a _p 1R+m1W֙ !&Sʊ8F!aP1L,=\G3ɔ}ѹ[ A*b2Yc@#T|9dJY;lpo SfjHqg@!ap 1ҷf/oJ_R S aMy샊B* b2oWW͌TdJYGUdĐ18J譢u# NA~9DpB3ҷI<Ep^3272gVPTS }{lAӄDp1PkXo2(hDw8L)VgVƢ y8yF,cD-g( ^ܷ51Q;k@<6,RpoDpN3RXY#oi&Sz VLT4)}{ObĢz8J(߁,7􅑎#U9dJY٩IA#U9dJY7StzN\T1g5)eE^xwyKo0ӚȂm?bj&Sʊo*?~|䢊yf>%ç,wMܞ7ܗ=L%?Jd/1xĴ 8J(;s&7*#_ V!4S $k0 ~ 8J(+]XN00g&S!R+(әt{8/kx*[[JKD;P#ʛs:<)"0ΰ&S*{h} VgX)ee:վqDiq5kɻLRъ3^~* k2rrbDiq5RVQ.|a1QZE`L%UWSGH Woz*f2\q'ci`L#'ܴg/Nh&>ZvUψV'4),_] UdJ9 ߐҹ*f*\cbֹhr 8J;`=pHiq63P1v &ʎ=1E3L)0˝P1vь&&SܘO+f61R-l?L xbi&d•s9vEL%&Ɏ@ǔ)~$E\?3[Vg0Nv4{/DNz)bx)e &e_~;.NGίdJyx܃=NЯ TBw({e >L%n\("x)QΘ|.m}BFʯdJp@LN#T?r~ ;Ȼz}$J~~3o MLvxE#W@dɜ'1~LDjsAb3L)ql/[h/蝰42Ym4NLd"!7q|+rg.2Rvᴌ>wFȀRlsn +tg0PacW%Xwd}C&Wa2AT{N _;id goG¯TB}㶡5-τ_;3ɔsDMH3tL lrv;{ũOaj+`2}ʹ4ӳOEWNa*)XAWPپv&)e_PȤ+ng0vK,b3b*!}̯gޫ:}E=5̹n\m2U:m/'F x"dRo3W>3ida v#FȝTB99ag$2JV6,ٖdfL%]IO{SO@d0S ~9:I玦swԡS L#=R;޵7G0 L)+-A["/MfrLB&Sn{:F&L}RpoT^`TBoIzmTfI42%_lN4.gQy )eq` 2PH] 6*'d2%ҹxq'Af!42ٳբGQYLZWm{d4 d*!  Ϩ<CɔF5,*>DBŽ[suo`2v.9Nyk-)e'm"&Q9 4)e'sp`,2Lah7 +Hd*tW-e~D:Y`wd9*?Hd2oF?UGA42*8Qyyg`"2Nvar7umr`"2R}ӊq=G'L6]t2Cʮ }\K ( Srw v`(2 E?|r8*7Dd2<׍[ULD^7L}pgr`"2RY1d2`"2RE~_. !SdZ\ BB~";u9q1Q0 L ԟq y&;؎R0Jܫ/0dO76Q0L)~nGźȈH~}HS矰ad·\G(L ߝ'bv۾_cOT'J(Ȏ87PuL#g,n QvL6UTBb{qlDad3ҷ/ȒǢ+Lm&QJ\'=QxLgШlρ gWT96S eKcC6Ea`3L>Ȅcd*ôf2񋁱(pMQxL%~Wxv߾=LmrFaj3]_L֨=m&S.3 UD:{kLzxEad3Pv=uUևTBwx=Z >F?o۟𽴬Q|L~_g=ڣ0L u儣 {FTyf#)}#ϵP\ɔ@R nN;Q7Yf0"J(Xqq<:e0"L ;Џ@No2"ɘ142y&}Ay d ) #L&R F$)e'bC4HA]1y@@*wld2%8_UF%:OTTBsG@ct!`:2R xW^2ېbH'[r%̱LH0Lu4k<}_FR9 #)=W&R9 #)e7b){?C*ld"K{Y2`!Řq,-=Ad!`Z3ss=MW*uۚ703L)6/UއydJY߳s`*f*3Hn[cn+>*Cf*lQ_CΨ=kݳLivΨr=E&SWòytFa22Rvq.[:&cT#S e/gVwc**dd2o7go<ң<ÑɔP9'2Ї|H1LO65c0L)jƬ娃lD*Ad"%vgD C\H0LU5+hC*d*!=~2!`L2Xݔδ\H0Lw]!R9 $)+^D dTN2xg0"H';;TSir"`D2Rvx -G/R F$S am1YFTM|ȋT> dJF͏^H&S;N|^э`B2NLGdXɌFc>ΓiPvwi=o"`d3P|s*^^0:EtLf28<9ptHab3G:sW;qf3;J` 3h*f*<wh*Cf"OQ{L%G>tr+UdJພ Q`rFab3Rv>(΋FcT"6SN;3H'+|6Ú3( QewL󕵁ZPuL[ĸrh*àf*!\ϐ+f n:Li&Q;7Ty4)e)nWu#G?Ty4)ekwh*Dd2%*gTd2%szԤ~ւTB{^pr`<2ށWG-L:Գ}hGa-L%4ܹfˑIɔ{ <7]W6Y0!L)m?*khd*̃wp?3J(MsA[*Üf21}P|\U'+T5)e)nt4N U^dJY̓ޮӆUfTB Cp}4Da,2R?/Da.2Ptvc}0 FoYeYfXt|v.f&[;R=|ɔsTtHGe-L'♣ZfQ f#S };9k|TƂTB,"sxs7`]GQY &#S eLF9w`4 d.L#:'ɔ O'ne4 `42Pvs6L@{> gTd$~7fQ ""`-}K|&QX !S y`2 vۺ1|vTb>hfe;eTIL2Lgs1?6/8;j9"J(J.x?0L Ԯd6BaB38Ht\1:J(kxלּm*Ìf*)}WAa'Tb4㮸JUc42I] љtH{vTUdJ,e Àf*#gm PeoL#=ws*sÄf*!7ߖ[)!T4)3n I cɔng z8Q}!TF5)at U.ydJ:?__5Y0L)Is:iid+:K|0PauL#ns'SPtL}5|W!!CT"S e(sQY "S la;<}r`.2rGe+Lz+ս(h;*KXd*:V0J{nN\rp`"2 g;*S8d<01֯BQ/Q !df ό]vTb .Tj}e17*/Ad*!٢ƠF$L2Kvs]ۨɔK{i6*'13ɳB({5ok>g2ר|ᙩp>tԊ=?0kx3du^ Ùt VLw?a83P)Ol?a83"LAh spf*O 񙩄@qOߝb*{Cf"==;GT3+oQe30Jƒsr7Lh&S~P}/x?:Lfohm{027i&Z5j*wØf2%М9X7i&SB 9Wh=PoLg5>!N~۠0F&{F8+o=zAaH3RvZ^9!:E9-N3>)oG3Tb"d{Nr9LD&Sʞ;.}築90L){4/DmvTBp+ةzet $2 ~}d^uTx42Yyd9*?A8d*!arLC&S3Hɔ1g0l &2 ߓN2ڨfQ "S eg!Q9 !)egvTydJ١o_x42ٝyl2 C3^RFɫFQ f!S l:,̞C&S®sB8'Q &")Gɔ2(߹ly!˘42#}ߺɅ`@2v=e~MH0L{53mHe1L%+ݸ`FB*|d2of|!dv! B28>;\}H3L]yw-f`F*d2%VюT^dJy*}g׊nɏT^1dJٻ'LyfG*d20ọ#ɔW#m<ٓT~YdJùmg2N]#?x*ʼnd 3g*!P^_Oq5 1L %~yFTy!F8)k4f8 1ÙL)T`߫GT!8S 0tfKb3Ps=9ppKb3RVmq'2Kb3vJ.t frBLo&n,wV_L^An&Sv5O&T9!f7).\,FT9!f7)7ntKbx3RطwΞR儘LƻpjLnrBp5_1y1L)W9tJ bV2?6'v!T f%)a*̕٢Sl6hw R傘L}'J'WR8$,q-R&CR $S N=|t I6L7[9&ёTn)dJ)LWI6L%}I'vBg'*&?Ry $)e(2q'CR $S c &CR $S eH5LO@ù8 Ie6L%uɩ#[OFmH*d2oG?3H*d2+2'G2H~`3Y9k0#L);F {#`F2|LwO|–)k2$٘ac:3`9xv#`x3xvnON9[1okvr3L);Y׈Fw4Ib|3v#UdJ3O9 T7dEВ{{::0L 01u_.@LnN\'.=RL#^ GTyf6)ayFcm`?A7.2ևD:q>f|Oq#*f2_=uJu2Gab3y_bd*f2%ݍ13UއdJ v uʣA3ɔUh {Haj3@ekj=RLg̿v*Cd*!@ wjw~[0 JϏd+arH!D2sd9nQe}L%]qwcc|ȋT>cB$x?Nܘ6a#J$W֞ζTdJYk7|^WN\H0L'Otub3d0&J(;Do#ˇT9dJ!7Hq| D*d*!x }s;Rx f$dȮɊT642 '2_!|6"`42PVn1qlr"`02P,15)CMD*\d2ogG[0hD*\d*Ds`C*A`d* ?|àp}2!`.2vRq4>ΕST5SSKTF5S ejf?E)"àf}tfD!L3Nv܎ʒU^YdJQ}z={)Úɔt+ΒCT5)ewLѿ290L)Sm鐘>X0JNjŭD*f2%D@_Uy$*Y!Sג)ɔ@twݶ߱eEa^3Rv^-4k G[TY6S eOj'eve*ld*!q *g[TXF#S ao6gEa42PlڎUTB\Xٱ98]0H TΉTނD:` ӑɔP{0nTނdJ`߮@S&R #S NZTdJy=h-+<&R #S e=͂Ĝى6TB;=ҜH2&<2LV"sA*ld2<Ey_0L){>Wqt! >2NV@ɧ:цTTByD+cIpB*1>y@'{=[x-' R "6v^WV}w{cu<#P0:0F&kzxԘ];0L)NWr-QwLu=K fLQaxL%}'F[Bi4EaT3y40J({Ocx62Kl*ìf2%N|퀃B5deOcw~U~IdJNep'ɔt}FOT5S }NG.gDa@2(GCO>#ɔ@Q'OT#S aTꠘ) ӑʝw_+L0G&C[GapodA {Atd"\n,hfmA*{hdГU3k=gQy ")'ܚS&Qy ")e_g;]0L):18=z`0JU;\mS ɔs)it1ڐb0J(i_a9FR9 #)amgt:;bL.rG&S.Y~ȅTdJ.@cN>2LHj=ݿȣ<ɔsAgH)QNUǟ_`'7R9 B$S t)$=oԞH3hxRw>/9}0#`p3N{1;57qy_cy<ɔ!r:0fT L#5>˦fwT97)eҎfhGaz3Gl]00L)Nq< -RL#_ _1AC? nʮSLV0J(|oKsɔ7 8*f2%]߽o`*f*!;gX {ўLRL%;V!by?Lm&S1d(:1L +nY31L 8ٟ$\R倘L#%UdJo,#U)42`:7R~Lbmx;?Z0%L ,}=1$J(=cOvI&SY|>ުьTF942"3L=k?5>)Q{!`>281'Ry #),-!FRy &$)e~'s(`E d"8v dE*|d2פ{dF xd*!0q獳|ӑɔɋT>dJ}{.>|t OohVG9[<:e0L){=oct"`:2oёɉT.dJ8br"]59ȩ8(5>.gNrLm&Sym^vdFXr{u<ɔ5%=X0F7:u]z^gGaz3Rv.1dH=ÛgC Y4>n&SO;|_>Doy[uH2?n^3; RL?TjMr?Lm&S/~vHaj3RV,xw*Cf*CX?ߒ CɔwFy#UdJ}=DYl6zFT9 &7)a08%UdJyB}gZ?~ 6*f2AwS?V*f*Gƾ>yd*4AidzvUv5&T&$)θ55V=RL?k| ~HaF2R,t9Cɔb nr(F&?7+C'R $|ȉT.)dJy90@dE*d*|B(}ȉT.!dJnֆf+R $S O[MfH&S.5n=d##QXse%H*d2%pԁ<2mr$`B2Rv=;#)id[&7R9 $)&}ьTFTB$tG/R &$)e qĎH3L3nZɋT>c>F);A/Ķ[ɌTNdJ}Wek8=Dxu0L DwecgT5)eg"pP:X0L n5ϵ&oTf6)a9o ~4Gaf3Rlᾚ D*f2%ά_9#VއyD:ٗV=<p80 L vhvrGaB2(jVWͤ7|ɔQn/?t;0F[0L ݸ#qDLGO2(Py|g!`:2NRY2腚Ha4L%~rًT>dJ':{ oxH3Lj;~'/R #S e'{|D*td2%0?f9e J(?Wy,{C*|d2%}e;c0%L '5gٵ9ḋ8Gɣ Lcid 8Z{q/|*f2%]kx=«_Ψr=Ll&Qns]&WT95)Mm^͉Cƨ=l¾[bR`|gvN֨=kМQ<:0L TwcƎˮFkT5)e_ۉUyTBٍD";90L)k}S{VQe|L%.֖(&sT95)eG[GwT95)am8ߟ#''Lr>lJ%>炜s80Jۑ$Cި=H&SjfEQzL![I7,/iDa62h[wγhPyQo428؝dHZ+8VdJ=fPuL=m fp]N2Er*f2O H&SةoE/R #d/-}grFʾ%{TdJ;hs(\a)DFN>߻F~SBNeC՟Gv=Ge(L%Q?v`2ӿkco-G'L ށ|&.6d{ͻ'Qy F4)e.f]Tv4`2Jό=λeVL !Ȁ|qTnIdJ;"ߖLB/{zjQy 逕f8ǙcLGe(L%{C 葛~Dⳣ#y;D33|D%k>%K@ޫOd_P;t0Bdy xJ(+>#? `_Q;t|`=hM\_1pdm&N+݉3+jg2Rވ-gYdJ w-3 J({<3W$d2%%f>(3F7.p܉L]~:оvS ee+bDtJ{==0&nٙ9LuG61ufߙCL%k=w+~'1x8 }W0b2%PDн3B$p??bx)Ayt#WOb"87WP1R~A&Q ܘwY+'0ִC_1uE&SvDLeBS N)'. =eF)e!wo=uE &SʊwtzTBYѰ-U|茟fS a5G(pO5s7RVieÝ#Z̹TB F,9ּa"늚9כL |o 4S7N~H1s7d!cUWL9TB-W{^q83u̜M%^6&SL42u>'ӗa(NqBN"b{4QTB%۵GyTNT]3ɔ`$t^gNa`f&dX3eM63Fm;q_K'̌d]`3tC =;rzꊙ@Ld߳ bf0J?'hdJXnf@-3{L A,LH]2ɔ+# +bf0R=}2+`do*!^ fɔ>:3QuE̜M2x0qۍS큫 foP6OSۃR+^|o2%xo3l9J;3>͒KGy&Q9IxeNɎݤtkťM8lubMZq)'})-vʹ:kM%]G;z_ٷ0lŧMoW|g)TBwٱVdJbF柑d+Lo0A~.g؊Q9ۛL)8uv\ =rlŨMN9bTJ*_tm;qg3ɔ;GjHVJ42^01LR5PMvV b+&)oO9J({kbD%3VtYdJv:N_OZ#V|JiTB]+_{N<(Sid@,2r@r7ַ p=Dr7[b+Bidh[Ow[)g{)|"L{DcDr7=UPiB؊O9ݛL Tp,QTK!߷ [){)eK}9[Q*|S %.yMır7w&P~؊Q9L)P -or7P\;.О9bT&SNhh+@-8tWgw قR)͚Fӈm񶦎X X)a5KPþ.!71cŃfM|_uyq9њJ;36VTydJvAbt9r5P]vfsґ+.,k28ۖ;'NHh942X>yt`NJ 9ÚL)>"?'t-+ 3'p󫩄o# +&j2\w`BʯysePAΰ&S.#&fxp>t.%w]ER_Ձ+ o*xi_w8Ȍr7Rv%lц|P38RcńcM=> R5L\Ac8bBί&Sބu 䙡BίAnW|9oBƊ9L)'+ 3V<dJO2*"Bα&S΄eͶ+"k2M⍻W cr5R\c5x´+.Lk2NX"n>SxEԑ+.0Z_LhO00NiB9t]#U TBYlեߠVA'3{ŏ[quiq"3PN@Μi10Z_L%hwMV2S a}O?fL|Vg2)ee%1kzij (Hfwq*3w}@ *S3(JXŷ #UED:Yyӝy8L)+1̟G>ɔ3<TB ;?@'6"Z_aM1I?whMI429g3P8/fj-y/beNTg2)!|wAp&3V%4lc$FRW<#&"Df썿/*a*|ggu("&S*`*a2㎀ BP0;Ap0]KN0@|`o˗M,T3S e 9<aNhC-^ϸԕ UdJ6YUdJ9鈙 /TT DT3S e%gޥ;"Q;L%wzD"v(J(Ew!hxbi&Sʚ+?2 f"#7G|M*a*H!>'Sɔa'{Wp0wκ!}#|TddJo=i,/<?*b2}"ʆpG)Srb͓g/NQg)̚5lC9i7TxTBYyo}U N &vdžo{_H ].+Pw 7{kFɔg?'DȲ ^p1PvbsՍT|dJ!'&, \<2HAL0fx>BH@L% ?=B a*G=6]T|dJ+=[A*a2c\% J J[k Ɖ@* b*M\ry6  &SBKXnPWvRg)e}bT|)dJ47"bB*b*]O}9XL)+θth;ַj}LU6pm2m|lе.iU6xm2%D05Xknj_es&Sʉg n> ~LU>m2; _et&S < sl~9fL)WXw^9g*s6R]H-JEJm*!ւ?”!TB߾ڟIc֯2@{2~cү:S ez]p>*s1Pּm)4Cʯ9S yֱa_es&S_ȧ_%sզL |_r&Sʓk*MM'׋wDt9s~\ΡdJ*3L+\dJYky)Wɔz3r|_r&S('tV~9bL)^)WB=řZ%Nئ~>sr'lS e ՊoǸ'+ZeN&S=6x56&*kR6Pmxk^<*gr6ҷamxcZR&ES }p|3 UZL&S:koK9Z%M3'Z^0*erD4PV>ž1ΪUh2 S}Y;)Vɔ|qÙ{3'"9qX4Pּ'iJ`Erh*yxcGE) O9c ES euIÆׇc+DdmɆإp<*7QH4Pv-W8J(k8ۧUe&=&S>Z;sL_UnA9HczݘD:-D?stqL٫LM!߅M٫LM]=xW($J( p{)wU#idvq9S檲D)ea7J=?*/QH4PHOL=kB'-TQ@B9^ uaC Bh6X9OT9ɔ⢰"p1_ox}^YJxL%ո#G6ri3geD)`G_|@tMyyL?|cRS eS>*p1RᩏyS1 ͇u)ATC(FÄ)ATџɔushݣfEc*>_K^m6*p1RﲼpUc*|Oz ZpTQ>wOL$w)ܿ8*F7RVT}{`1wUn*G3n1&Wɔg p{o52\馑  1(WW&O1M%o>^{0caUmn*C}CDLY)Qʾ'V{]pˡTBq;)v!zL%mlzLMl{gxK[TByf9L[\E[&SyQ%?7vMAM]0Mow~Ud-e2;!j ÉWE6T&S s<9Um Sevv_ᯊmM#Ψ l)_xL)߽qS9Uwɔˆز(v"`xJ(r\CnL5Hwԕg U|]e2oq`-`6o,|vuˌW6W&Sʊ(q#MKxWH'*us" m*S m{5U=e2<ϰs`SES&SsA@VMIxL)Fp_kel@2@t]8~(pMe"<-_ş#MExSL;oxʊ2Ě*2P[;l@[TB9'ijMrs&` ^k؇V3#\ݣ7$3꯸0 |u"2I9 q& ,֔uD=ud!+6)֔uP=ud` k,9Ԕȵ ?r$5dc8GGvi^S/Gu_^.k~Iq35qޟҸn$.wi^S7Or&v ~|uܥ{Ou \viܞW{8|\M].ˑT*U<4 ځz9]>>/k:]͓pBj##4j=')N!Ɵȓ|dF ?ujnY.K~FRsXpBq+OaT#>ɏd[bX8{<ndlh*N4B婛'7n8иz(*koyI-k?l,I6 C]:O !:,zNz㵷Kd-w}7O<k kä~w}7O1a$}ޯo橛'Îf>MZ O<&tvzVS7O>?CV=)2V>6Q]< <׏D͓Tol|s,doVxI=q&3znD/ +d3܇D/t$ȌRh+{\/Ǎdwy}2չ5$b/|7? MO=+{pe sE?ʅv$h u,{Wya 4!l~տ&_}x5<}G2|ÿeq-SOo&xmq 뤿Ώ?]|qL @D!)v+fgL=/GgX]"ڑ 7L%chHr=Аt4$iX<'3Gc@~#?5a_/>~x:us|Gr&!_zh-uƫU[8I\i'y N9?>>=Pܖm5مSf>47x7FO~(Bl=R\9[C0`jMU7lm}tilj^pӅm?ixp6zϽf<Gx]2ۋ|(2jLSp`i{ڹ125cO҇8s}{7;kH̦?Ƹy)6.6z@hG`#uJw,8/)u݉AhنqbILS7N~!}-ĂWSp(ߵueaنQ{tiS8aMՌ=u93${5oOI,\M^\:'Mxx #k3Ђ8nZl?0)aZL0h&O 9jNkQXZ VҨL*fyއm䨊ᅝAUB>?hL΢H8 Jr[,Jj@(uƄL2cJTaPUB!1n R,J}2ɭ]4TɅWG'ALAZd.D}s|U W⢡JA%ަ meLy)wEvE_v[A5N0S[,CfMA(Ӑ/ː@l qSQ!Cj*XԘU20@n+827CEmC?%` t`NP :A1@'A uNeøَ Uc(+&4/HVLD!"ē-#1n0b e:lqZOC2lʊ} o?RfEȦ<5tv>ZB2C94-B]|jc7\`mqqA0w_$Oݟ\@iDfɷ\ _=`e;n KjdDE-04DJQL*o~p*'nH a6p1FJ>WmaFf 3a -E.a8@Ha() 0 0L]a(* ! 0 ˜sc2wYgSA}ySM&C`m0]lqdA6Q{LPcx$dƉ¸4$up(ᚆHF0Ch0(<ݩd^5]P;tr ~DI^WybnƇ(tM_556Q ޝꇂ8׻LW ?i" \#S5>C։@C[:ePCB\.mD)qT(_Mq 3 wgJ©XT,T> O4DF Qwh:(ի I4DZ QZ! Qehfd`7?,У\10ea&qR*>pbuS,$ة1/**2I4Ee.0MQ#53FyZDE*i$ڍ& b![4|qpeFf0[ I~[zs+ 3銲c8@ /0j tPBA(]azB!0]a PJW+p90|Ee:h(_Q%%Viss€,O4`t^|,08wK!G#yq>h@t yX[P8SmTc'5*f5AI`PcԨ$&5jUfU 8Q] ݕ0cPP#hje8}Q/S() tGBmQ0 O0S() SS()  By à嵕1yQmQNOW{O>pWn|܄`pނ6{c&sH[=i qBTE ܙy|r2FrLEM;1TTLEmLa A5HH H/讚35e.SCPڢjK5 BdI-L(%  db@@ 8Y ,L(& ' ۴ c/-{TN.wəpߡh0~p#`|qGE_1?wʂ~Rx_l!{؋|Oki\`,M1$ ט-{ ?@$j0MA" sO_*M4[ꊁn T D߆HB D߆ӷB }ѷ}ѷ0} Y^wQx s i=PtB$.D] h1x Z0#@OGi@H:b A s`z.%!Ϊ?5]_efA/uodj>M/,LBZ/9ܾК ,dn[ڦ'tr xf `@s⢾mxOS6:bήl5cHڕ5]Qfh Pۻxی1qjw+f(]A =9'oH( tG&^mB0 @H$(eBN0 ah䆴(O$BklJ,FPc\W j {նQ0Si(CvłJxTUN2YĈNT0X&DdNPݟ&n!#4f3cX7{ypu?F\W^l\qx/c@q-`eZ@5j+fjkGl(4{J*^W6b K JJ S-lX"h P"8r9aIasZ8odG*21̎Tamܶf S6Hj 6uXTV$UhWSxTy]LqXQRbO*0=S0%NT361E]mHƨ &JV*U atu* 190ܒwL61) LeAKlar쭚K-$8'SIw-Ԧ'd>kjcPo,Uήm=KSh 7AԍB>=s#0q J(ӳ6b6Um#0S˨1ԴTN1$3KAla:lQ>Ͷqw1tM91H)a8%Svar1RNŻ=EKi-nn.%VJb,i&8b$ 1La*뢴  o|JyuJYr-Wqw/|sR,9>a(|Ɵ^b ;s`à4i4́4ޑ9lqk8 S>f0FiRp߬phjɔ,ŒB5-Yem d<cS5tJ-"1)5H-raRm c1/œ\ rea P EB|̬>da 2zs3o˚FC`YZP&3b eMya e m5"YS^54[$k/:E1h 3/a dM]1;UH!roJ2|YcT<4$VPU!z1:2vԶ |˫1T|i@!wc$wj"Mlܩi4Er6[ơŪɝ_l*Pa¦tؾBT`E*l3 )sB%7X .Bך ,ZL YT˾-EېEŝjܐEr颚[i\{jb tT+a}ո.We ,L% UIy&1mHZHĪ%.@b+ʳBDCQUa bhy3Ɗ()*@EﭡAe(*lp*:-NgPrDS[,*ԌphE5ҩdϓN7`x?GK=2GC>@=0w I;BQI; }|4*?| T>lx*cP) '(\3.+m}*!v;s>`JN5U[(j<7SM1N tjjM Pp<y"R:iPdTCUj TVeXMʪMʬ 񅯋WemMmZ{*|pYY?)tVɈ-uV^f waVSjtYe~3;jW3Fj_~+;`l}A@pXeIlѾJT[q0; k t(k, n,-ZVޓƍe6c\GhsYu#ÏVMj =jmpZclkQc߭,6fUÝpb 5*Xe.i щ=y.<ޓ2[8 _27n$jEa&'p/ ZL0J`ĶC|ak;>t¯* մqP9mg0UYjUc-=WNqc\ό.)|spԸWl,UDㅿ 5n`|<+yU8<=vI*$S0U՘ jHW9 cO.f| MY=T{Tق*4S|'`H>'5TRzVQc*43*qw$3$`5zj4=>j5k{YДU+ J%cATN-ZGŧ K$˵f ȋ;jQeSCATI1DrEBjILs%\WX#O .  @<A0̴P,Wq}0xA3[UYUcUT-ZɪǨ-^*-v%\0p ~vp^ς 8|eu`:VA%i^Ъy…צ^^H٢ mAPEA(r4ŀɁE L4Aj, SE3 1Ne2f s@ߖh3 BV EJN5RǹZEmجah8Q2f O*Ԫ-N_T-*jXA)st֚X283)sHf ]>ٌмa'5.Hj.PjD RC@Xj(I @$5bPGR=#jܐXRXMj %JHPmb80X9m)lSkj/ P7k׆ʡ~  *5ڡR~m@4Tɩ)R qj @)cTݬ>8y!]Q5_dg3ѼѼ мbмb мb Ѽ 5[XZjj۠H0kL`|0F4 904Ѽa0m<W7hZ ؼ&yM5V#yv"K|E1ʑf <3_s[M- r`.W\\ 傁\\ \ ն冁<2.P,p".kɷb ++ ="{ 7:_A8ڽ5}" Ud@k8uvGB!cVN1[Ștc,?C@i ȌA(̌ AQ@Q0Q0Q0Q@ b@`T`@;0p) ] B%]A(`R^)NsGVmUc8E5Fո={-$⃧f BuQḀ@\D[XK9K1K!J1J1J!J1xJ!YJ18J!"3bA b'E줐;IL&5.fR;ILKżT*_{Hiob%AZR %`bRdԤM NO P Q$R4 SDTT UdVԠ+! &,pүjj 98=PF)L%15&J>ό;~r;1'1=g\fzqj{?m߶w 0@ @0@@0@0@0@@t?-fbDT$1"P#D="P\#E<"@,#EqF ~ "w@ f<7"PT#a0#@Q}[K T1( QHA0*Sᐪ UbPl  BV08*YPm` W@8*_#b`p8VAY1(. f, b@pVZ10^ l?  Bb`6 B! (d+l Bb`6ي!@(d+lÀ BP6 !@ d+là-  Bb`6 B!0 d+l  S !@(d+là iV يA![08d+![!0d l-B`pV ق![A0d lŠ-C`V ![A(d lA C` يA![08d+lC` ي![@ dS!A p#o t#op#otot^ `~!gpf~8a!f xZ~1ǡzau8, ?@K4q 8.@@@e+T>@umL]eTWنA*m L]eT>0@eTWن* P]eT>0umP*TUA>@@eT\R*[1He lAAPe+la Ub V B*[0Xe+lAUTي*[@Xe+l@#T`VT*[1He lA- T@VT*[1Pe qol!mURA*[APel mUV TB*[AHel@m TaVT*[1Helam UVRن*[1Pel!mVTB*[AHel!=C8d lŠ-CvCP يA![08d+l CbP  ![@0d+lᐭ Cb`ȎFV ق![A0d lŠ-C`V ![A0d l- ^ ?}[W/w~xlJN)VѷOy6G"w}_pWu\xvPp{8tm 7?L]FjCtǭC>v&"]4fާfЀqKai<19Tsަ#xY<Cٍ1B#pAx4{&xSp=^ NJy jx8%ɼ߭s$ELw\KM{ѬS.i^bm"Bh5ҌGBfd]4ci8z9=BwCڲ1wiC.f /9ǧѣp8S#]֡ڲ|J.ʋ)*~OuCt-LnHM'hjhAjpS-k5p5I Cl{&,#Ec\==LذOʶva_?6,uR\!B(p?OJh"_ϸ[q)/2Rxɒ_ ũLt9Ӑsu7!>|Lk]Pf^7#zjwkn%%9pzm2hqTl>3/{(l=2JC5ȼ01f^8{‰nl9ѼuQPvcعA!G:K1e 5,vo=*%+/aC'|H.kP1/4fhz KGp“^E8:V:l\@Og5ߣCCnanz̠m)…E!Kq c5Kְ%pK{6RbVtYZ3|v 'R^k( ܥ>3O.ښs#s=GBuI#qt5,(hA?؅)c^=k ΅M~u協=ң=JNѺ$^Oc!g..TS'1{DޥӬKX]:0[!c~C'.LJ';EIM.hx/SSC-G9C._H-Lڇn]y[Km= v |W…\Cjir $>!,]NXg_%;e6dqIu7ȑa"a1ÕK?ly:aCcHѺ;vޘ6B:o `U+]V#4Н1ᑿ.(윴^BCv \i=whҜןzDK8X۲p8q3pa* ˲z02WU =(BgmMu2=n᭎eq~tѷKjeczirpm"Io9pC!\G{ڱ2N%uљ4\Lf]:5Ekߺk~r}D"-Lv85xb~%K8zc~8$p=q54/Å&z\@Q{Zpk8|/) V]\mĝA/t7au5Cb 1l^f):ͺsˇ;cZ]nȦumVָWys놝qOX#^йpO*X2bv[/K M}GL. C6MvN!!x-L{W^*@e _ P5_=<)^q zT1%G}K.nGlְ-cii;QB_ڱcDXziCzw/KJ9sͅhA7GO$:ot C6.0e4@=LU,ϵәOE}X1?zO'o~o$-)o#3~_CқlB>4?M>/2A&ļ o0P_Z°?m<;#U93Mأ EQQopm<_u[Ʉb/酎%k7^!0?Y8n}5ai=y7ԠHj?] 7\<6 ݧ /|v?~Bia/|;uHo37Or$?/1=.us~OqcDm{5WP#=lxx?>~6!Mz[nLӾͽnI;FEz͹VM.E -;7P4JPnpX.6>z}=3iyv+ӝ3_)Kd\b؝){}}a_){?ۢQf?8q\XY|~S#[GoFq(N˲8CBn#<- lb=~4<8Pl_l~Bx j7#cL^__tcMo<;18=_:=j^cP~̺Zޥ>?^ڿrˬssD:ssfQ|Ta2>f~J/m$|<]ۡ>jOpޏd\ЬGĥWpg=0^Cx. _^ӻi'.8,J?; Fs1wŀ}8p]iFB->5]O9ǼK & y?Y4\D&/f%k۟$Pp#\N υsHo w}OqS@lV%sd'w{*.dfc59*՞ߒ1ďǧ&k#Q*7r\6oe! wcx3;=Itś1Y"Νp0_Ap=%Hߥ>'%ɽrAsةI!#HeTާ&I4yO1HK)ks6^V\%G#ivV b YT)J5B!I]dJ*7iEc8vR)_#)﮽- UL#@:,q|hC qДPwQ̅ c4|!j=S2b[8#67?g;evp$92:B|y $e4ó6QysÑr*F+8]df{Gzi Ϲv\>z~ߛ='*ʺ#|۷*,ɕL^EKȐb|]+g/_˵}:oʵ}ΖekJ}&oH=j| {X]?PR!{K%РD)_bklRD1$L_:>&__'Ұ?1 y|Np_+_ѱ 7;rɐ5bܸh5Dl-4.e="OwFpHr(&:O".-%ez|rUgoo)R2J⨟?ܛy.$!NxunO{Sd=F3/m>>Ű1qeifٖs9q{yȍkb;,~BL7qP aO>HU)/ɽS8;߼g.쾖C68ֆJè ̇KK\0 _c(''w=5/&r+}SY1#/Ŭ4)&išSޅN tR8e1:琡2ߧ˰Gó&XPeW <6 /G$28Y|M͂y_3&4ɱ5'}U*,D7FBw>}?"yɝa8'a>avs]nuXN'4Kfp\N-:'HwUqg2eybK$/;]rN,$`.7^4P)#Nr?GչZEjhD[9v|\&~h?2߹#/=޶pXq׼yR]Pbtn?1f}HŅmSB:QjX~k62#[ܤpMO!ylOfD} W{7y,2oUfDnDN)YlƝni\ x]üҴLse]rlqʳ鼓B< ~@D<tZXړ ۷0=bf>>6H  i%t鴷[ҫ/?OK4r;3>o^Inc[_}:(?rjT`h?Љh-'-YZJtx}R6J{Fէ. 7g]^Mk]2IE dq=Z$KA|$/,xgT+;)%/Ŧؐ9fn(}dc&>)l~lyOz2˴r?z!PF]ϺBSW|S .ӴnR! .Zx Ϩ X&gGS&~df:c%F1x/y#j`eM/m&3URdqY<n֨Fcetql:y4 ,Fe̵L֬OqչeҲLe0wAY24o$o_kO$7wKW,/ʐ38-ПJBRˏUV#ʭOeZ5m Q>&W;Sm|e4| $jk>O~??̞H(HTlq?7Fё >)hjTWw4σ/#./@[z-~*qU5I{Y0j^1hFɴF@e$MaͼR /l+DB#JD~X۾Z)WMUlrl=wN _8|}_6|8b/̘\RRVBy*2p6#ќנ]UuܥɲoWI@T3*xYL"% =Ki5ݺ]kLSiQ,)< -1#nۑio!{=EeR}guwOėEg¸!#J|q]ra\maQjxlb؆կO=S/ T'ŕ_>e_& G>bCyÏf\uzt %Ld9GSae ^CgpevP< _5oW%TymTr@cP姹HsNZ~)Ix+`+Y1\@Uc<@P[,Vϊ898rzu~endstream endobj 305 0 obj << /Filter /FlateDecode /Length 16823 >> stream x}m%qe,|;~Y85AxIH_UlV5O)0tsdXOm=߷^o>jy:ǧ S5sӛ_m-|x{Y]Ӷnv_wGM~~#~~{+=_;6shŸ~%}U?}rݿ^5{~[:~j.A?}~OO<K=}jlٵ_'2Anzͧ6oU禮qfX>fۿy )ƭ]\ϱ|I #Ŀ(RRM,ukH?ۏ?6i47KvݻY񉴽Yn뗡iG 5ȆXyg硙iDV1 LD?l#y!ӏOM,eD?xYbAjX*|KI/wycƒwSӍ4+! >S?4v6~`÷*04)|35}Ou"V_>tA}i`S>?~=fS??}?>}'.,ktғJv67[gɱ&}k"~؈5eMĎ4k;HϼNdZd&?(]CI[ ī]iլw+C&|]vZ#)7/ Nw,L7чޭ4G:/ 2bFeBܗs܅yrt./ Yfؗ}uy-ڻy! 4c88wzG:֤!FGᱏԍO=n5`n>EL#qi-kO?4^k A [xܭn8AP7.wۏO>CҶ|:6hiG঴TV2v:")Eњq#~]փs;m6qF=}pqq'y.*ĈB;SRFuq ӻ j Eו}C5Bm襌]ƺZEgRni-:eklؑHK?,2y@3_oF]SHn3#43y=ImLt`Nc"B;y2(`DF0'%6D%cs9˘@ vKDM=.u@Gg"q5YsqЅ{'&:-` qGP{\N]DJɲ&?əݮF#c{ܵ~1ם{Ø{$6&i\\t&g]rmz,iQ#q1l\ gܹ1BF vbrA"rWG#r`6f-)ɇEn14h1 rӨLMcM@X^4)v;yFyyDqK<L /fnhvBǍ Ǎ Aό%%  edBЫJS%w KV7E;]:]T;]t.r vp@o`+Q``M֓ . ãcGh9tT:tR25n,FRBF""X"cpB!,uY=掏3ƈ2F B8_0k0@`n#Bn#%&`~'@'nG QD|r͊y^̌ryQF' ^0/.e,aB"PAJ!JOOPV擻 ffǡ[g&3:zq# ĈT0")bD A 7LOt?aJg4̤T1)2|@X);$(8`` A0؅U Q``9X-kA ,eB)@ e2>E24'*)D.}}-OFpV!oJmIjq N 2W`!At9%O0yGi|Ǎ\ m;?EHA%"YC J*R+RNK%4)I)N+mӹH(SiH*rvLBF6]NR9xFPΪB*R6/Cߞ1Cfrn{Jb &B(l2@ܢb 8O2`xEP q_ /. UN0padM5 8k*1JJiAh $&P%RBc@;@u⠡-LR!\o߄bl^"2FTބ4E`Q!=~8`R)| BVTR)Eh ӥ7=-Nӽ 3<Z@XHs%2؍hn,i{Ǎm "9S9 bƤ _Df^ a aOe,rB q;(/zQFM1-kN`R ii*t܌}r,@ ^ RI[KbI/e1 p^D҈k Y \!w4 F&)aɌ6buұpZ.lqt{aMvU0BmŒ`PM 8̨03Ç^W^~\[AE͈5ĭyA,@!DsZ R5˪s`;QńakC^3v(W;Wj1"I@OЌ*@@u}FjCfOW y 7rB[{jkj2'MmLa({D**) )Q;BJ0 |P w"tq bE4[1`,E>'|Tu G1wbzTxTzR{MzD8wНnm =Kwax>&P"f06C1H "C*s $C*>dhL9ӗM.6dHd`DNpD.K ؐ"Nڶ)bA".0m B F0 ЊYPN7 r X ܅S4Q#)G2SZB7Tnm'AȭjxVPNBwn u3.G)0 FmYƏG̏v!L!-' m1/!\g(HUR޴aKߎp?I iE+佻Rs0Jm HPAʸB:YN'HtI J@`bc9+:ejJ8Ɛ ,H`?N/W r~Iے(,:Ӷs{JcHیt _JA3P0afp8i2^֌@]F֒EYKP;]V0%4 &`Xzg<3bFY jAYO.mK*( B8 .hYMdՄ\KVՔ5;baA1@b B MiI#N;R;1L;‹H;J;IcX J-HGR!pƙDR@`ug%a;8N$*p" DkW0pn@o I*cxrƾ[02ߪDTz|R%4]GGø˖1%6@#EVS!p[Md (  fu[MV +v;P5QtPb93j8fRUŽDcEBNJyKU0+DUrv2! C纱qsY b)@/ƕ}dHªNEέT`6]5 TtȪ}msGU,k!1Lۦ 'gY (u)DA~`l%6MZ$B7 \›&EI@W;bUAU)F^+1 s%GLJG T|[ePm*)) 2%˭4e7G |a@r9(q D~0qUA;*n' Vhb.mlN5m[P @0Xv¸X3˛9KQmu຿B]@4տ5Tƥjh|'mq0.ABc\00A|Dp%L'`K1HEro!/!>H^2 &8 IG `)$Fڻ: zA%EA4) )zOσ5%(qaޓ`YbkѶwdtz;2i e$m e46eLۢ`i,3F(I@KLVNvEQN1p#0쀑Ol0*B0B@Anf+6 %5KId)~nM@7SɌLKh[R}2`"]OpmE'@ s|.e pJ8)7q=i{#_0FD.gfqo foSǭ xOCvYa:^,xo@@DLQ)I@9 T()}23~w)xB!9W8~&0(7|H Vm}>CNRfȶAr#.=2àK+KL.L1 >t)1dBxLz;Ƙ ]/m!2ؠ>)>݌*E(I{A 279Okp#АIrv )j o9Z֐u(„۩rz%{[ȕ\iJr"p=|M7fG;_^uO궿o)=|D~ ]ӛ^=O~տBa$ ׺L9`ٞ2HwF2#W㉇f}j&0=1*#:wx a+ )M?{< xb+1Ɣ+=1'1u%%tLh{ Pijk/MWdVkkӶ,C?N^Y v\Zo{'jZk C [H+x]#+Lr?|mn!Z_E{,xi)Yz5 5 SpدE{8kFB;Ӹ:[!ocEfAkalF\VL=x%_?0,Y{8~ sЮ n;#RÙ4vFM54|WN9͹o}ifrmͷir4@RF9UqD4y' QL#ۮ:~e:lOpUXūfe;2 =rQi n! d_cY*L O췫7sLxVrH8bݖ_Lt5GXwmxĔ:ﴟ|vQaۥ-t>[`y2+j>ņk(M͸N1WX\LG6<n'u5JD׾J,s{^tD:djMJv iowޖ ֕JKc}x5Dk/6;>\sND=[exz0< Wώ𡄞k_8{WGX<?D~P3Bˊ?uK6rt~ ;/[Dl3^=q;BΗ~2i7^Ѕѷ5\텎#ߦ,Gѳ{n懁:G6ԉiJ$X Ae.Efշ[{lٺ=lϞfa'`0pH~|Λ5N2u*g;\)f߮^A#>s }&,O_v7>u\^:'ݢ|d-'z޶qed_\# C}{xyu}}a(J} ߉w R5?\7|xw.˷(Js㪝#-S_|G96^\p7s9.뗎^FpJ&fp3ɭnpZm`n'wPw>=vK2e5?7qaO(}%Qr{/xoio;sCR>~aW0dp+ qo q/QO$R3tD,ֶ&}lk_ڳmֲ.iǾӸυND+kE&bՅAOKTx A?"リ_<84zS5>$L޼еS{Of#7 mV)eτFB_a~sV ҮIۿ~D=ΑrB7:ry ryYee w%wp>ti[ جl m 3=dRw& i?ʇ|v6~4?{$ Cڛ} k-"?nݙr{]{\yPNiibMq ˧k,a_λi?`n^~V~ۻ9p$n!c bNv{v d̥e:ST+c]82O4k&$ zÈx |rX $=2L,<)2N}2Z2,̓j_`&PVGS7:[[vSqCBr/=Z!KMя;܏]sTI}JgL/6Ϸt~= hGRs||hɤ !!}zt8)HGzXÊ ҇mN>l紦>PϞ/meoOy\;Gg 'EڽsX.( 'z:Bn>e-^szBãɣXS,kgdu<xZ~:* ٵ?²Ӷ[]ySD;jԭE)w7W> Ds.1>\ю-cڙz?ᤕPt(2<0e l?k gD޹,qFjg'=bxȬ-\ǯ5J$.ͽ9'ꡎIU4ouKBl^א5_wqᙨ~n\=k*Eqʶ%Ry\PṈֆXa:^ߌ) :ew)f_SK!s-,ϧ C}}1r<gNٟJuR9d^e{H}{HG1>DF~D3.F9r r|L^x;9:&L/c{TsHm~?oucn!ϣcB/.>:xiJvx~̶eďeճW0ozEh6d'|%/"xLٞ(~DE3!q!q^a{ N*+&^endstream endobj 306 0 obj << /Filter /FlateDecode /Length 7173 >> stream x]o%qgZȣ<}LqA ;2ZrWx]驪7{Ao=}k?tܞsd8}vJ<-{r{@Sqӓ:0gg]c!wA qwàtܽ8ama't͡Q  {+笱<пGpy]^ k uFu  JjwMοKl㌅=Qy=f;V ֖ ]F0{ ;힜i 睐=trvJV+1/sNi}ޱn/Y?PcY7ߜMF4i5y5'WQewag}Ԟ"oRrn}G@^x̓BRƦ㫄ts}P+/!m])h˶)0N>wUrq{CO%Sci&+(^VJgat"ssp&쑪h=Aw_#7g9;F=ÌcriګK-Yn~|j䡻>l/_fwo˳;|@.1$ 1*1gfi'j5*b[Er&OŹR:;ˢy5se;qH x|ժPXYpWM=K=4X5&-F,t_Dya,Rn.N7m9dI:MAJ1)Nʬ0R 90ʈl>B+haL_ѩOt3Z@4J&#+(N=:'4OYӛtct^LI`q0CمaM_͚XRM촢tTi 3ѣe bl*rJw\J !0!D p7FMuΪ%='-Ϗ# Yloa'҂xm8Mׂ׆^kj *:hJ!e40~!yo'E|LEnЖu2 :ASnj`e>VAX[p7A9DOfjjskc/C+AJ (IT:VM>lY""%M9j[|krbi'eG -[5Xha\N 3 M0#B&Z)3'E]Ð{P0(Ǝ13hܫqciMPL<>t:|b/*URr^t0'< 7w0MNO٤ܠ! ^1xߜO+D>>eEb(rz6}l4G]VwӑjZk?JDFr%c4\@\z+"^0l`~ZbQ=-}bYzqGϭP4'7HxA׋| 6/2MlۡiIXc;渟A_2$QLV{ c2fLUY,43Ă A;_"yEw-$ g xNjyJ~%0FݫtYc8z᾽_jqZ1&0H$;xԋOYIǏFcu&0;  } "9":7\ `QE`A9Y3 fе&dW3΢M' X'xi%t@pC VW%b0 tY<زk퐢J%4ZDX@|L2Lו˪ռ0xDz/_ ,{9xS.b $:*14GNWZ2]{򔡕8%I]@A .pB7D RҙŒ6ԘKqjS*R4VWl3Ad<3k_V͢aږa)O;;tP&;}I&5u}RsuP=|?pE?'3o3R0k}>ǃWgƠCӃU5{ճ2baR{SZϳ2s5ε;8HO*2_~W= 4]$_6%l.v7Ȩ:>ƈd:#jIe_u6hRwa㫎wP.u=P(%%CFKvVvaHiC0=5 OBC a!%ؤ$c 񹶘y Doc%ȷEM<[ ҃juCOQhQzKDfHՓI ҞŸ1$sB2.e aM\cN3G8ݑbzLVar*rd8aI ji"M#aFZK:BߖS<P 7 =jq^M1)5BAejDO g>*bxM::.^f `ct,tp>zEKy|), }ߺ]l*X"o0`洫/XOOM:!; UID4Hn-d'w``,JXh*H?u {9 .j8A֬:CL7SrjtzuƎj^ԕci8 _ѯJ9nzMc$Kzұ-3ucA?T ۭ%%U(!Jaqq̶tjA{%=qG[Oцu1Lkηp( o.ōřvd; b/wrR^KgP>'yu3xM?NzqگuxL 34k_oҮL6Aor/FqSRѶ;>w~ݵ/%ie'E\ӔB'.Q 2AȔfl#Q㔼%>8v ޴@/0y#A Óeᠥ!Kҧ{Aǘdmy랶EʪBo9\$JO3x3*RX⍁0ǿ]I:~k픞in"+E;寓mMx*KDcIl5'kplgM=yg룸;za/fy8Bx=].|{4&~ Q`WV{YZ9M.,<8[0P\1yYޝs0?_Iܨb[vCqr4X Y|7t^O԰j3P0Oj$cDs5RҞ^nR tK{LR$ bSʂ۵*^Ҿl3 ȍ yp`@9/Y"NRBFt?k$RKSŔ acjviB"VªunJo(|&($S4s-!;8fti~xFq0-yVL={E/=sPg ϲY>#p6az(ݧTã`W2z&_JVU%@PA)cI.}aWJƹ{aO1wY)Ս{Oy:drlU#%b =K$7${IȗkhܼrB׷C.WIդi+ygkk.ՁlJJ_sa')Ԃ_q Mb4E*uj5-b&.ɑУ%6ƅꁹ7}\Y*GLeӗ\5poJ,o]'e ROu(kG| T1pPd-,itzL[ԯD|2W˛Uӑ[>̂L[vS1)q.@-S?9oO@s>,s{@/] GXG/8yD9O)%>~Z⸭’d 0E$`pB/YV| VLQD2YuxG銊]c0k:X1}jyGI $B~.OV\!JBY:> p:LxIg7E^d8RA`r&g?da̸#_"䒡][{q~ ˽%Tu1ҵ5!H>=|Y_Ooa~x6*5pޗyP*#n`ߑw~g͚q_-B?+QR}d/&5{lZ\UEv u s Vm_ t vx,IN.jWJEB{5tJof̱=4A孒G{FNJd*IY3֞DfT VN*Ԭ^ wOvK8ryBE g,v$2˓=wF>A8ĬOO2eγϮOZ;#?E^`ꜿ;4y?襰Zv_{ {&7,1Jk,r4gXC\OVJy׿ jvAcJә3Ñzs_!4Xsn"'Rc` cOd4orLs~#j4#AشYڳ6^[.!//qNÛjz ZZF7ob d=r%Wr%1 h $IE9%:~ Zl=endstream endobj 307 0 obj << /Filter /FlateDecode /Length 5020 >> stream x\odqN(؆;et|C.%^!WSgu~c}PM|_a7ׇ>yÏg0@ ZlήNLbcқrBL޹)VouQZu?hҺ)Һ,omH箴Di)-Z7&Ǧ%ܕ srk$4=&ݜ ۾|1]iFV*)+wS^Ne诿J0'2WNwlqXh3f;%ĝꠇS6I&΍QR< 0Nr-2>řvuJ[`5$iaW^Yqߴq0LՙJ7 +Xަ+/3wfBÝ> m.'XQp&ߞ <1-g"9i:\fk@,M1 f;1!q7#˔t/8 3nIk%ث1uQ)cҡ#۝z}`ca*H .za攟a]eՒg\n`YF'"4BrhY+F 9uwi-\K栚(Wut'v=ij l6h8.vUedAĕetqXvOV2hbz9e=j[:׃_ ~xe/?KUxɞFΡntO,}p_"|_=iƷ?/S^g^X|/ Z{B<8<"J뾴5f |?ߕ־|O:s/\>yC<Һ+K@p 1Se2 g=jZRd.4|>}v ɎV0oMFD1O ʔZft8KjsU`1mZK1&eΞh\I{I% O Iq,朡Iq{LM&_֋"QMީ^ #WR\>4P9̱B6ZjFT{V;묡}(E7ގš62%(W8ٛ7Fd;=EV#V>)%0IB9 : wT+uТjSҞf{lj縉.QVvV2^x>;U^W9vQQΌT,B:ވ= RS:@$Ec*Y,LcKլXHAl-^7R0D|MqwsF!`d6vL^k x6Yyh|:3IlqH&5D]n ]|1i;oURxRƶǍ1+a-+Huԕ$t Ab7K xI*ZhNa *Gy4k:oPsI4Z o CU+ޭl5}zEm6u$fqSM QF4~'rjd0IV"X` "Rz'Q$ʁ 02}LKV31RZN#Ck@[o]k wz+9Wάϥt5oRPDAY%fK$PJcHi<\>*X4<{@tCDΚʈ%Ar!rsJoz5P5 fA= KR^u+]ܫ+礿En}]Z!ߞU'0VJ}+ -C;E e&W© &Z$4鵥] ګ(1GEz蔾E !N\4IJviP<7R8[PxLo"ąAU`VYukFp<"`'d0}j ޖt;~$HvF,t=R T1{ dtn|(/C,řm 4d[GC ]Kzɛ̬NZB@GblwBYYb;y /Vm4=Lrg㰕}/eSYb IIW§NؔZ +[cQpGPNHBb2kMsJx(Rt$.!]rj2qrz_l ƀ͏>AXh,Bl Iu?4 ?/|&\>i[R@O /μ&k$v$9'ozKit*=PG ۞.3jpgJg*Jh/>{zLȋ;B } (  PF`wX x0h. Xxdx&͹EjOgkQy*z0e.,^mf[c ۯp@3C. dE?ن>җΟWrFM:_ފ|[Q2`i1 ߾bWP"RG8yC64Q"D?% %tϚVcp|mxpbBXTcj<$׷!C9rSD9\ʂC.h!=KKEs3aO; E3]sQڣ@-d _&ן'xW̑> r1 i^ MԬ?K"=6qn:djIT+ )|O]1"FGyLf6;9qяD*=HM0 ɴahg&akYd$gf" J\Y|x5B@ÛI=ZN/^h= pF`!vybW1Xoc8fPf ߈V 8^18yD-ˮc/܎xWJӮTךD+1nÏ Z}[R0lB4@{UF<8|j·T24r&7P?{m~wbm݉lKɟnvˡL O.!DrM*LaB 3 i!I jm^Pz8p'R_>$D@g L#c/` } s.ʓΣC N:!%C,1V3d"7KH|T2q(@/!XXĪD! H _)dNp3G&Ep- X\r_74\Z7uw: t_@H\-в1:\ېg\j6 k To0!9'rKK.4w%sqo8 :y>4MN(Kn՝-јYRwwb o;:5m"?/endstream endobj 308 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 579 >> stream x8CMMIB10$R  id`pwCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMMIB10.CMMIB10Computer ModernthetaxY7'%gyirusVNRf`y~rSRGj}өykx}Tgi|NgmitwzjhfnZVhİaxċ|~n0Cmbey鐛Ǯ|Ń~D#N<'W@X-l:%I3 ť橿_PLu4a[M7ph}v}ġ薶zP{^   yo 9endstream endobj 309 0 obj << /Filter /FlateDecode /Length 4348 >> stream x[[od~Gt;},6dIc?_<-9l6a)źWJ r%WW'buu>./΀`J!ZVg'y\y{Wg?XTBXoePF\ᾌ.;weC.z 2z[F"7g>f0oN9þs2'# :_we4rޏǧ7ev:I2.2e)}>]]u3zh-2qԿnvDێ9*et[F6X7~7{4et\] X%;J(x=.H#UF/^c'fpU{xCgJE9HÒtqΔљZ|Uor=B5ݛإ橈ǎrȤAxrE@|Yw6hv)AzړQꖏ{_ЇћC2UH AI2ޔIUEk49]b͢9ǿ]wV+j$<;=A4JzaWy3n߫7Hg]aeRVV_;i/>JA1 RD;2nW7'R0h ,4K+Xc( z N%A\Dք:h~^!qetha!‘ JA*AiVs) GJ6meDKp"N^AۼO(i. - 78@6lGR2(5=,}2hPAAfi0§H-$Nr8v":!cl*+i9?Wtmp|oZKV3 1 z(r9; A\ i4XA@e !  k4X i,fX#OͰ^%F&$?WPs9ݨa-~i~)b,JsT*"?~a1W%$03ןqe!K6:?2yup 1yy8UXm ܔ>nOϾ2QJ?Y?+?W^䫃{ R]>#!Ce@F0sC(fN0 J#7?u4če 8޲H H-O?i ?@9($P$( w%aH_X#5! C5A,! ie_ckbi~#(ȔiБi2Dʘ~M`cƎ-q$xRPrpfVs,BojiIϫ~JD<1(]R#swiY8 Wed״#6X/ o4D$U(>Bp +5t.SdB }\?Џ#f$^  b_??XiS3w5|&po1v Z9Div[o3jO%*+)}Fv˜q$)oǑQ68ut9N6\]1%/СN{N1}oC*FR:b$ BmNJQ.LyAӐFe.DD@ 崺RΕ)DM p`#TP""2 WF^hC)Ԧ\ ٦wTW#Jil(L3}$lfqciT4rʬ'-֛`IJx`2R9# A >j ʒt"uf솯ovOܫEF.7:I*Yn";瓏ZOߴ,z4)Â;P'8Q\<: lovhHC ׫-ұ<-\l䓷q&eqmxlcԯWIO eh%M`/#hSH\h3} #y;Hw hfVC!€-Jeg {-aA;ۀnjm?xHp>cdFr lzy|p`a bajlHYd&{ _.2.T8,Ժ6|-7cb02R%1V+5aS+r=Ej׬LSrx#1 32֠0-_/"$UUԌLj8OjqSDww@Us$ֹ̲`x)Y:e"Sx-I;eN )N'5+w[RzHDefz, Ccb/Z4Scf]l )}\s[UU1ek| C~mи닃MݐT6OiI[^zzޜ,% jP#뱰r!TkuP6(F> Ya\<̊MrҥNzDU .뻗s\[Nͯ3 oKnaKRJ7uȚCD Y$'|6Y!z+]qkT ٹ\?F1*b}_&rڶ:8uweeHƄtퟆFw^t_v>?鼂dOp{3~|,a]~Kݳrʉ~Q5Qoa29 ]o4 ¶K$+/WŧMkɼew{/Ui/] 5ˇ/\zZR.W7*kz>Ǚ@Iaf Xܽ*,,Mz<,x ?hB3:_/BgR`CuAw)yK!i5햶~M Xs$PxI!|~ɂ)ޱR }0~AwsW'P٠l.kx۟*OzYk?&:z)*bz,_ ޢضgSr:5( m׶mӼ=GˏmxRyڦ!5/R? $|5cZ?…l:DKׅ̮6beIm߁Oŀ@ʟ!pwqvQM5nfw #`Ug nmhҭzsMk^7eKZ>fUsmOb#g͆ST{=W._qwEDw/o)c:˹ymXnY/w銧}\bvhwxEr%3_|K15uoMXȏ˹4~#6U6O w |DЎCAU /Y¦Eendstream endobj 310 0 obj << /Filter /FlateDecode /Length 7796 >> stream x]K]qޏSY*UnGؕTٮDr*T6$h )P?n%%\\38x4ߜE rs?odyo/|r ֪ggMyUE{~ysՅXtprՇG8!w{xl<)O^{F=pNryyS0 kpuS|. |{a"Gd:u|p"Xj+*/Q&f6fJ!5$BFt{f.5^6s'yNx%|Ka7qjL sOҪQRGЬa·-C1vDCIU3ޱź?\|Wnk eDԏ(J7`'H;h^DuW~ߐ)=Q)y}$pیPyj'!(XToYwPI`JkxYuͪjɫ Ÿf{- 5~s:RҤ ɛt+q>`*Q6yI`8b QAJ(dRD5g[]pD#8=T&ެ 8qݶٓQ߲63ɽEt\:jR94yV 2,? c)VEls3nLLO~K6/ul齈wԀNk_v l"ʄP8YadM4TRrҪ3YFUAjn,/;﫴JV* yH:1BU2, bZAސqC(q#xEHzO6lLCcp.AfLoF @/_0e*h.J) hʊ"@5A{ŝ~̪@x=mk! V&ie֨Y dZ#%s慎W;,-Q~7bi7 -A !35iiJ{R4!4U!(y +9(TOe:glUPUٸI7%P Vv `4;Z/vX(PG*/b}@9(+Ύd) :{hmbI!P$9Yt,Z[Z %5 _PPOj]~U_޺gl9d"|U:iĥPqZM`u(eH]e^ :!"U HBhpP'v LɁ:WN%ml#%6qC86rCփ 6H@Q=^9vG{g;Bp__5Q]Lu 0AO"4o8G]dZY~\cDCU@$j{ *$bdLZg kJ3md/(]&/ +P$F%ȷ׭Üek)v:Q)OJI-]6-N!ٓˋ8.2ƺem\Q {:*w4iT?#}oO6iF mgˤ"q }`(9%q/, {2]t.12"ߧ)W[ }mBtcE6IWCBsM3ah"s/UvifyĥF(ą7N$5iAjUN`dxi]:Snc(+yL fЬJ; *NHORq@ߝNl4iӡBbTy |9]CiD Sl ~U@\M5YƴSI\*3)3&TW\)&aD&ޛn"IJ3x5:.qlU;Qi 91>G]MG6FHhܡ9h+ӄ"]lc 0 ya]s-ӇMd¤5m{6\\Jt$$I*)5:O<ŝPWivnwq4q4Eگ7.<CA.ľ_l6^]Lih˙:TG}x>KOў<Z- I񜐽Dc(bE@1ܔ]C/K63tq9.j (Ҏ?x@ƙj 3( ?qe/QY2Syd`oT)IqFrz5 P7om<ƹp܀ *m TIE&bl[Ф'"4"[湫—̐c`7/L @b[ ƸI ,YAuIju@콸y{iT~U)REfQ2*c(벮ԢseUuKD|N%//Prl.J|  R'2 st AI|d_ޥlЅy/.7;f5y@J4r~BVS^f{+sc0~=A mrҹi}v>9 9,p, jǘ4+3fqgSԕ)=cX(d̆}N_LeKN& vg4wd;2?C< P]5Tt<`@OJ\j=u VVnX-fj.5|D-RgYYX(%b;phH0Z̤:λ+i qVQ`ݒH+iY4#Ϫ"LPhDK>C^ұ+埵#1YYXҬf,VOҬ6B6VJ9_nhJ- q2!Crty}EEp&P^%su\"ۄsʩxj1֩֩)*CLZܓ]>,Gޤ6OqOox0 趏JI0{;ŪEخꛤ$#\S>r:؜jKWKM,,v}YR(䊵%͹ ,BQXtROdEOjmދYBkꎇR%L'M}Lw,۩ZE "-a$b(=< 9Vn1c.}35&I4,[<^~Q=.Pw9j@s7j,0؍U1*SQ J?\`rލ% %'PsGm͢T[n<)Dxk5q/{7? rJ6Yv*pR\q??9Yry_-;S$qCLy#ΫY1Koˆ?V,~&Dvq;<u#euGl2u)`Dw'hI[ bNnH3xjvb7g/FQE:я?9YvX!s0=q7ѥ0#[1 vź!1^֮]\T_םcD؟ s;I ƭSF+ ӁkqoJA] c5޷nǽ\n)WXIi薍쪵h9= ZT5W hߞvFD"(X!kUd\#ϛ5Yƪ߈ʛ4=BNӧЖH~ >7%jGWW46"'^YKkp6s.KݐM\W\\r+b_-Q)5^X)*dHx4@1# )FW;?HO5ۆ{j|%/ tƲtP6mS[mmrL*ؑ"&>xAff./f]nЍ@4, +7GlR $7mFAm7'-(I?gբ}Oa dppFɭ4V rIǒBl gwݏENs`]@Ss` }+'Q7=W\2gbFhd!܅c?xGKNsfW99ff^rM• ęLIGԂjL*b9&Y$sW'Wm0Of0<7G+j!<8fQ$ys#1ް5WrBLHN'z;NIb@ iw8HYDß0S?ߘcd7J02թw{{JO?.i,ݙ8L݁89 mϾ9ܜ^jrYcx߆ӋFׄo?PI^:4}W|0H(u4fJr]kZ[Yi VPG}j \7rjiȶ,JZ;fo.3l|m5f)CqkrB`IF[!Eqxȭ<Mendstream endobj 311 0 obj << /Filter /FlateDecode /Length 7542 >> stream x=[o&u⧼OZɉI8-Iz]+9H޴A|3m|</'Wgg2x=< AiVgoQg)B</*33 #$r6s;j¥ڱo^z惧3uN|ѽ HB8)0&/w<ͫQR7Js9q iax7G]2><~F[mav? - '=R I y"PA0_VF3"mzѶzAyQ~yY{ZeyeIqJe}h2\όR2 J@5h!#qJ0:,hٔi0퀨%B5DKNhDpF9| gd 9 {BZ+m[MZ< 9ᜈU1 T* m .g܂ ?JԬr Lcw[ kenpJ^F ؇ttL*c'eһ]cJ#SUق@!?TlPT*Y<1`D]xxGƁe򋸉:+60KQ dN*/^uiELdyEՆqp3|A;T [$1%FQ fyK'0zGBF ~VJ"a:pxT ա(PcYy,nx7˄1F4jW*1XK|`Lx(v{7LJ+&45HY`nW0΍иP3sߙ(Pv&ό*B͛ H.#_n9~}zYVH2+yf[Qۓku%#/+`IΏ[zYcdQeud4AW95&Ӎ}$\UFn2E8I& 83wLĸn gnk\.ls;+ȏD] ']ǏBDi)C' b5xMkA#^#S<9ӧFxQT*~|Ąh!d4 ]V( ⦿_K#&`oYD۠%zInDvc  +,LKAfLx%#|d&uxM? 7,QNH|-U|m`Ǭ#cAs!Ptaz6즵= W \6.fP^A{0zUD/<~x@ #oV 6jw+8@/n$hďvɂmtjK?4WWeE%*<\\| MPi"ԸDZ-JAC8ʞ0cԍL"A߭I')WHCNnnxF.3H=Y],7}7>j F|A@߻xUأ"d`6c#q4D4h ?ҁep!ErZf=3 ޟL_a.h L*̈́X$&cC|eD{赛*,ާt=;qƅ@HrX * Gw`9b(M5{UswV\(jq^ܔH1dV%R0Եx lHm{*UZpo"uKEHg/ ama=) DZlxD4l#&8 /%0Fe~DŽj)˓j\|%M'D )b Lvj"kF$ ށH"LGx,"o1D׋ {&gњ4x)ɞAUl=Kn, Vxlxz|ȴuSݔ+YjHc(̈́X%,=֩n呗efƴ۱?>]@J;fӁYCB;o`݅z( 30?ε!6 |{!x5j=^lUtld9"6qJ2v6sRRЅV95Uv1!}Tp=6vLR_e'2] .+`>,p٧Sne2T4.R֧(PKT{/EoO.MɕƷr"kн_f챸H5j"Hs٨pF )֘y6NRiwe s 4feX@z Zy#L-.8+'ړ:KNjyUҼ9GJ7Nh N~Xɥ鈌KukRHY7ѷ$,ft!\6*/R֔AJRprF8Gy,,xCяEE RЖH_b?'^NԄLDnHx0=p)~& 'v6٩Hy|[,D&6\yteMn+Z 2;ߦ)5jwXkz_,m"Voʏ$ 6]ߧ1Ie&^յpH S#I>s2lա+暩S).e)j,_FHՒA8HG' sT?,&$\%1a1D]bg`/ WS4I]rm Y* TZuGL׫ ᏿H!L[БybpuW*O0u.m~zduXƎŒ=FZGt4Tk͝UI}j #R"":(ZFKR!;+Gb.+8w"B 6+N[U}JrZ"bJ {,2mW 97T"Ɗ/ZoxYBKfM}y`* ͸tv~y~.@FimTJKZCʞe݂(H2g IG |< _)x Y#3 '\#L!,6DqXGsg\Ӛ ɿߋǑ -t$¢a;,^tUv Sl;)v1nFQQ\I뤐,2PbԜ@<L 5Os5M _T)ލP2U Y#_ݒ)i+n >pFm6$0Mc#!US6z&̚~'6@J#Gl].Va' V7_+HSdyY@qrT s+M7wWۄ86f16yF߭ ȘJ^|sAKP⋷2V6B`1k2e6u kS^'DBޕT͊:4~w͸M%bl Y9BGXa& 2"(6Yߋ.?OZdE~ EMT*Lkf)v:"p)!YeX'?i䫰^vC`һ/kҨZb+OhNy1K_s̤o<*S{Q^꼳yJa6DDWԼJu!NLaäLit6p |GFDfa6^M?i6cb53OdaFҘdF ʻѡ8Xas_,/t7ߤ@fmZr1ѓo{&\<(2pk)f. (?QcOLqr1w`6bu*Ga5٥,869:f̱w-"3-]f2a]2`a Pa.r֤J+<;=:3qarmL8ܞ1lm,]AF.AmR5sm;C/`+f(y P`OՖ tKM1cZ. fpK &Q/#Z#O`6IjRsk.׹;~dQp΅D왿B, k༪5VBJCɸ(F_78{ePq֤ 7NTz mٺ1Ş/%yW̛[C]4ГbZB788>Cfa$;o Gk3`F>Sa̮7$?Ȋ!)BV10]lMȃ6G45Y}Q',Zib`H_V2³7%en7T:Uh4d1=TylϋcG(k+WSys:Ȩy"-"]v;EpUoV&ڷq&]Yg6 l{}DMl d:%j*S0 5Jճntl=ײ_">8ՠ)<9~=‰0:eN9fw,{Z"]c9'v&rU3`\vЍ<̑[`zsv gD-w\/!ºb W#G_v=E"ēq P`&J=k4Az O*RNoQ2XYVqUV s`90m[%'+sX_;IAyVQ,z$Hs}>P-a(XN#UdRjkil3fD*B10(F MJBSmі:ΆUKͩq1GeR84)ZM?aoca=ŖmS_Y'6L '(7{#+8Uu:w{s~Mw RJ@R7 lebŘ'ceOa&;;T~OVnE-/<-~ƅkt%?NI5?LՇ&gFyJ^$c[|c%?y>R*:<aZ`UևuHDz]N.|vbn&nNwN;mk|\~Щx>icI$>hr|a>@jaoG^>%gTd1@WU>tObΎlӓwp.~q~a*~zDugEyyez^MzWru|[ޤ{4+Zw}\W^ίu\ Q~wY|݁ۿ\=E='ʵ wo;;eng2J2JGI5|sz1"ՌRCc4@SҺ_o+Hmro2UT9P\lkӆikR׫~TZE/5j=Zv;^9zl~rXJ5_endstream endobj 312 0 obj << /Filter /FlateDecode /Length 7265 >> stream x][oq}g@>&#Cp, vdI+JkIY;>;;bauL_ 1#_~17K^@ K]^|{#5%KosK-ݭ]9^_ҧ^{ ^^m)twd\zcBvoxu*_C87>GKo6Z৽w sSS/~Kr~^zlBhѱwmqCnjh{ƻ3F?/zO-1b.dc7y3Y!mFFiel ?vpoz 5c}x?>o~}3L/{^uh4ukc` c4ewZ'ӃU/h1l/:'l4'6<^7~yȆQkY\PSa`0?yJYB-獮0XSf aٟo2ԚӴTT(i<?[<,ψ&>MmƸ+Vz Zy;zXwd&.KHu)%hzۼ$9i;dok)Eb qBDc{,41.o Q,1,4];Ok2 j D뱔%-҉jD@,O 4 rl(c.WIy&,4.5A0PJiLgr l.&XpvZxuy 'x= /h5N-륆b#R-&⩲uf){X#F`,=.G:oAs؎7Ⱆ`cIyc8LZ_7ȯZr@KB7~-rFf-k>^GVx4Ͱ(,Gj.֐8]-z^3%~#H%H,ԝ#牖u JpDIt-% % R1JpHIkǡa~}`CooXk9"oYU a F9pai8;A#;Nkq~ZxU첒[j$yH厬 g c"ۄl ]KYUeFVGv*Ig l judMX Tu:@u }fwYp UKSu/W9(ǒu+@9jBBӑuBrqNg+[KCBzwB! #"lY~qm%EX\:-Hh<6!ZY'$v4F([HO}W$[uB[A"liO %t:D'ZggFp֒;:茝mZe+8t:eN[hbI6Koi%Y*t[E+"@VB'jud<{F 6i:F VQ`d@>aY'ΧZ쳕,'~膂$N75d\F.[ٵ] R:!ZE4Cm5X9(bإ ޺/ԐuBraG|4nA*N%e"\t܅&HŞGBC !H[XvRQB)dCg l+k { Y'D"u.[OOY47 ߑuB莐 ZK}-JĻTC ŖRDlbCJdT1+mVxFBl,,["MͮT`SI?R̓Z9 ?Q,:ےizv F Fx<<#@E MbAq T ԟ45L- T!C453m]fmLD-mL"#FIXr7dD.hZH}8+b7D) 7D}1FX<IV(ZL'–Lӳ6Z@FJo[/9Lz5WJZaKgXpy`x@Yڼ!J6)Vd#\1F7D?QWR*mɈ}+ے& ]tq"]:rnKķe~O%Nfg;llIz`IiMѳ6ܑdGRe92䬱!,Wl}OG&9(Z!|ijv&uN)lB.%gYLӳ6\g'jK( $:20=nJ]K4@Lֈ(Ij}l㹋mIݒ5LW8Lq$e)zt"J`S>Nd"%k~yKeͣ3`r-]+-t-|A2gm:D&CTAg/o2t;9HS4)-[0M#meQɃ |dCF -ErP.X赚k2P_ ݆ sṻ))?.(-ùpP~;rO" "ĭ7fS5kYN|{JfSyKu3 6 TiA g!u"iCeD>+S+IjUrBDTKw.d7+$YBHx6*ݗBwQd}iZx~VoEꕯF"e%8# /2)$ٌ1Y4=lW8^a4@)D|=m26ӖHS˴FRz-%@v+#N<ѫ,nFȹ2sJ:CvSֲj'e3zn[:B٤VGZN?5f9Xyߦ7]TVL9yE )^Nk)򣲑#3]w;'U񢬑Yn!>-gCsDYlIn7_>1W- } KzC~~/ۿ~z ,fV<*W8*s_+'3_ɣ6'j'WDo#2+FIkWoɼWsytH{s6 ';ORؙ(}6hWW{'^]zutU0a:Zy XN#5ҫNy Fz[D\#:ƜGmW?H+eqy/强DhA1^OhxUٌWv*62Āg3^)My*a6\R&ڶQ^]>986\2 z%6֫zޖWG 7wڗ&r )lK^'^"GXCKGL)r~m#ґ#ZZzҢ-rBh9j)\_0r@L?oh$4CI)t>?鐟fJw RZq(yجV`C4DYGm~;ÿ8u-9E<ϴrq5܂!"| ] }y~E(e5?jyWO ~"*N9hH>Sk [%uҀ#W/DUdsDk)r$a6"ˀZ#GO XE[r=MkuwUduR(UBTFwm:J}Up$`:s-VG_]WE 9~uDk`b"6۴VG_]w i*NH\Zaץ:!X« ZK#,XG%M .#ܤZ9…E P"넠B`j)r -VuBbm{-Epa]|Alpa\Xmn.,on*2tpi\.o։ :!1F|sx.:X:!'rYRօڜf*2ذ. v|P-S_\XMջNGpa:0:!y9†uMQĆUd"R;(vb*NTK#lX삎Uda%|\Xl:r |o `:6i:rc+y*NH5rpRQXfB"d'~ǨNJP"QN[iƀUdb9‰eFƀUdpb\Z9‰u|P6qbXGs̜؁:|BZbBQ"еbFz-Epb%D XE 8A"G8Y'VuBoDk)rr ʀUd:dR'5nCe*28%AZ:VXĉUdpbSrbՑ?iSviĎ]aNǥSb7$#XOuaz:Lwr)%vC9B!Rb=AwZZqbdLmzo)׻ѣ"5K5R솈h9Šb5ݐ!ڑ|Kh[2/~KWvf¶-s &fߐ33vK&>a0cˇH)rcc7$I/8'-S:ĎbdՓzbPIEQX‹ݒ5xpKS /v]Dn#Xԡ_MXO_ !22H[)bH?,SIͅRV얌 ihIXkBQbdLڻ}(;b= ﴉPKΡb4-GHDJEۙ` M4VHSs)$-ĭTR소h9‰#4ĉd8#!k2āqb7dXQƉEYE:'vC$ؽd=y8qb%]F?-s~4O9©4^ n8~RͤXhi_27͜ ';a N۹taVrc̉5G8$ۘ}CG~Fݒ=GX~?b)qNOv`X9Š{9BPV,6juiTR얈o~R7ѐ'ciʩX4Ɖݐ1e7 QY=QNLE6!lnɈ#XxyFz:_mT[踍TFDՒinXW)t|`W qbDDR+t9b].RrA2JUr얌~t?9|Bɱ|Xg+*cD|':' :be t߽UvLszbj_oXgkcGvȨin45ӥ,f ғ\Pb0?:-ݨBr}{KOv; '+1 %\-_5j0~gw)e3/Hj wh2 ld\u{X`=eJpzt:w=?ҷ2sM3k g%LbzdBxP+w{R״?i05>=ίr/^?斾6rBqg›9w`wTOs Bʍ=xhYjb yѻy1<>l Έ{0?흧ōVBeLPVGDbkߑ,\{[":~{P‹@TW 8),huǾ^TkfG>\ 4_=>ҋ[C 믶yBo{{ on:gB>RHB=H Q2vXn(i±=H]_Ĺendstream endobj 313 0 obj << /Filter /FlateDecode /Length 7381 >> stream x=ko$qm?KvcP`'@#yϧ{U=ݳaOwuuJn>ү.GbuyL\;YH֪\y"tWcDmb'CX_[!:o٬N/7S0B+n%o/p2{|c4k)\C`u\<(ߘ:!tp0Zk| L-βIÎ, G(|4vJgaҭF̡@#>[2EZSx<)6i]-΅1|:Àa6CUdMR/ 7srᨔs6tu׋DƟ}GZ;9:oHpGoMJؙl:JG+yvsM$xGZrp@$K۟Y0W|D$m,m錱>#k M}p3z!3ڰO~I;kcyyJrhBrX'1v;uP`OHs]K)!{B{LU l*%A ÍAi )!猴mςhcJ {\iՁ>׌_N$L%(8l1AP`2)GɄJ!:O7MYeC!@@C0RYr2Dƈ;T=-?/f3^Ci@+cQD(YSK#.Ʉzƛ%M-GxÏ"ٌIh&IS1t-#' pHP5]:Nw_a)^'DJM@̻1,rpp5c#I 㕷 *Wj1>a '(%QGxK 9#JO,$1|NfJXw0Ձ̬̀&yh]篌Yď@x _-b5}! DSZf߀ӀڅSĴ-9\~r_:v0b]G0q!Q18kLe MT0o'2wV(lx8}RРʓ"P$vLsz QsnmE_n@˗ֽq 3k0oT$,P]0Lg;Ph.: Te[ P}9*8QBvJUq;m]` <: ah>7I4&*GsKDߎp:t.3C y#\ޑQ\y\xrFZY[5 Q *m#}(d? &LOMCP`tA5]%bˀW:O=х`T!œ!OAȈ^7_:7kw| bAVp\U2H#UB6! 2N ͙. Fϵu6&;@ zW 1z^? ɦ6Bq7jqt .tMn "dnn=LF_9 4j=CrAJL:ޓ$jO[Sˈr[ t'gGk={ :30gRnHEhi ${Y]H^;8 t0rOAɀ"m/͏m~tp`[ #<{nAnw%r3AݿI&ǟj 0_#pSvNQFI봑d hY k-1Kdv8NA" c0f]!T\ ) BAG#z;Zy_>ʈ cw a;nTn!R"¤DK9d/8cBa[Z`zt,F +1  &I{S./' R tν7zD`m$[Tu%N_HƗ͹FAD7uQ33I(%leu-i,1|\2%Mq}R3֪PIE2ǙG7J\oTG0 rmREl|>S&8x9 aCr!n$ӪaIUq.|*[#JDJq jMӻ"_ir%Nb ^j:Sibr a%;DFSқe\& DZ 8+-c)K9H:fg)4\%WF1 ^V@IJiۢT{Y^4ܑpc聩[#N BE`4O8hL}->C? `CG"Mn"!]D;*4Q`!:[qa5VtorE-uquW]9IT` H'˽&g'^{Pvx^x7cOOL0Sf%h3`v`Z`Vwnk%ǔ;_ڍfz!<Յw-V%Ѣ;3.V'd05=: 5yceJn)PFkk>v# ca!Uf7,>ua6cẐ k|eJ]~Tȍ;Y7-\h|{^",Sŕ$.XZY#@IOjK3TRZI{k!>?CÔCbrkf4@zQ $Fd7 G$fҺZQUT7ZjFSxy?nD]I֠I ׁKvc+ƨZN6a?h l$@3YUS:J ʺx/k4{5^j:,RE"[=3kfDPo(--WJ 홨8;O+[:Y~_1Z{XYe QV xdx0wQ9eaL:H"b  WL҈u;KP5c5? `tm/gMJWlVG"/Wh f/o4󮬏&[0x_-‹*Tvˢ՝0 ẺϒI_΄ qLB-O9.Э2LYʢ`pB5-?Hhd>1guHK]ͣ%4܀]E0;Jdja֟z\R9ji x+ıW$qmaw7gl$ 1٠Nff6yɖ"}jѸLn2P =:_tY/ɟ:>EuK>*F/4)Q obr(fe:dS"xt3)ݔxB *4Nő͢&sU!Nz r%v8X5`&"7}'{yrSYql7LEGrP_\tJE%z̟e18X<@CCU0t>YcFv@ AȴTV5nMR)g=g=8a*;2l2OGX=?b ye֭nY\=mv+8te'WFOma^ ʚYs{&V&"9o>o:6'gU]?ξ)B@|RP S-akV\۽̂{0_}N 7UF1jDD`bk49#fQϢ qm(1pl1W$G0v«i4oơTTlC*<|tSЦ!UbtIgy^nmjVyk=Vxܼrڧkx?k5ڸl׈iڝJAGxʠ=.D^P@CZcԷ|8 _7i{M,(a0iQy]%0v27cҞ\ IkI?z`x d"*Kp <4v12mxEDyZ{s-3Hb/0;'zJORHUɷ*WsqSrF?{s@n9cvyr: ï `beA|w՟2i O=Ֆ8GFtr{#FMmt8~Gb&D:韬44쾯\hSY# 5wpNYR g`^Io \,O6= ּyzD}b&ෆ.v !|vQhm7v|~MX]n)Oz2S8a:ϏD4Fg}}=biƆ8p1YAљ]iuL%[ݦyu#.6[x1FzYwӵf>y͋GC[NA-vJFO\W95S-<'(kzн(h_A'Puo̷W?\t 0'{+9`_}&1 HfU#.Kx!݄ [v,ѕmVU: azASc=W/,O3: h"8Mƥ77|mrw=B,Ǖf,͂OvmB'^j?L4׹Ȼ;hC6Rӣu߻l75pl/=%P\xP+|(Oۼ 1+AZ[&.=ث?yO/fRoK)n T:C9΍FK#9vl%- asne~D 10. 4zÒv\ NJjvL4'$ϔ`ܯ͙}+@8, .{^=t *u2dx2Ң,d&ٲ*V=+EpQi"tUV }me.g^O4M:}$}rG_':ISrxX'f{" @^ ڵm0Y:@&:%VpC1H5*aշs lՁ/ӥe 1YHt"}Hl="nja[L-5\,o[bUx|7K"f0dtT0gH9 &R*uW8?1ӛ]*Ff7I* h″}$@NT)&M'di\vcU;R~k,T.z.X^[)D8Wu38 `Ud K!?kCvbVw:&Y:;}]FT0wgin^ڛ^-;9`7XnOQZi! XQ\ۋ2_ ( TjڮzC@uzr!Na?}fb^&c[ Z^l +? =e08`(= mV,^4X-E=g%؆}SZpCy螗Y^WSռ^oVtZV-w~`fr7^rWvaa6"9~erمY!WvAn+),!X e}*E98217l.b`k9pVllQpMJqU.z0ۡ&Z+/>̎P(TٰLьH&ݭ(uVؖVhT M`l]hk,6.MAp[n5CĎ;v I BTxfg;Zi_dJl>56h44N&hk IM+:uDPRlg).8 SLoy SK{r si3>CxJՐ~U $mOL FyQxVU3PJE"9&I-,$,Y*3pLsTW6hdE7 g^i/7t6>ݏOW] 8Ǖ*l{}L.gy1>> o'm758 m*0ooz Ox=>]Ot?>Mf|?f|Sq8Ӂo\We" IB'HǧM{&6 1論lף endstream endobj 314 0 obj << /Filter /FlateDecode /Length 7104 >> stream x]ݏq77C`?m6x803#mw`ݓַҝ OU]&{f}C=hdU3ug _=˷gzgwg.i}ޛ/,A9vqߟ﵏9|iiw?|/.~Ls>]˳Yxc9{F^wM޽JEohm.GuHSkSr)gκ-rUƁQa:lT@&j=?ߛD~bvw_%IN`xz>OSRn5{\Vœ_rP :XbˈF܋/3{]Lv,(/IҾuPb:d]/Cx}!gmw/oL-m;lۛ?~1]o8dq0vopBY{mo/Ēi^{bޠqzǛ?KMdT|o} F&ܦǭ^A05vHu[Cysr(g7 /C?]Ofa7>Pk##H&4*U4Dsas>WʼJߖ5_Fk,l]iPEH K{p>+X9:7>"+Zh\˨ Ź HI/j`7DO\\Ia2~ϑƺڝ6s[ gτ#QYǙ1;a_$9ϥQ5ҟ#U"njL 591"GFu!m.է/槏K}ۧӛ۟Yָge00uʜQA0kRÌ}w+o-GP6i/*p)tM.i4\{WuyyK2< lh veh27aY˛EQY["V3~E2F]֨,2Akd8"qtL^vԴ Aml">03 lu\YaȄgW,LC;w Л;J4nn2 <>aH{_/m#:/W s̈́ں(G|,c#ouv#nLU&cs[^aJB9/xI X97*p6͇{}\=gM\ǃ+rᄷHes)E9 -iRBZ9!u +dT?@v{]OY0SG>,{z./o< N{na4V+Ь(QEs*u_BӉ<,zǓ`Ԫ$%aI} Vl8h(\șbna砧 {3n\_8OU!paYz%uSluOmiȑ.Ar7ziF*$+ ˘I롼 K7`NFB~Qɼ-_2Y0+ޫ$=.RK=l]Yl ?Iu"v#sϠu xN Et? \#`lWw5mjya'Fw\(XnSHk~k~Kx-&!4c 3.T0l 2O3[=>1tʛF4Kz&r 3`['}$ LswBv|z7 sJmT3 -n#KM].Y,"X pXCbal'iI [iȵB[[8K]Xv7*o/mfҶٍ&_Q ""9,Lqcc*kbe- {MKҖ@NN75nJhJC) fI-d@oַ^)%EPLW"ffw!!M&SoK6,7Ne1]niQRY"({`LZmcPtK|q7{肛o7™|Y:`G*mf2.օKZŰOfP E%F˩RDŽlX I9H4i$I FA&:pD]5X*6 tEKp]u sOrI͂u&|E:o *,wC& ev[Ȳ<i(W 0};.S}3;٬fG3ؼ4MX`?+c uCp!(2>_g HGhڊ^f#9Ej%;RQ9.mST0^仌g2q(5b&\.} /]66 d.T, -r%cRgz}.d1W(H9ұ,0%t5O/ ^zZZ ''Q<"\PDw. B9qun [6a(G#Z]@qH2? e+l櫆3ͻq5U:u آۃuOE*PUq_CIKt7NSla !oY%CΛCwqĒﮙ20`1q3eb F=b^SҦ| 6S"4 U04qk#b3OuG:KJ;fR !p`?{,%ja݄}Ypc\?߱|y`{骐/rosg6NyTS4o-V/#b^c5jr-68 EJxŰLO9!êW"HxO ")F{ a3i+KDP4/=ՉV"Pv'S&s(o5s5:Y8kY,,\b*f6[if&Z*!bҟr>(15.]86+PG=ȧԭ-t;*tlnQo+_j(RWVw爁W+ Y9d1^@U57㪼W[`B2ش¦Rl=:#Dr>hlwOԒbZ}R-rŨUA R9kY. yܝ-jĿa=$\o}F>PqO@5y|r*iK,@uUxqURu8aV tiď[Z_KYq\ǡ@aFG}`<({jF-ָTStb=EkUX%nʺq]3E'۔gץ Pc(ey{ŋYq :xjgr{y9#~0Ċ+A0Mܯ)ף/p+Dz39i<zc =wX h h uhrZD8PTLf epIK6׍#Y/wOy06iTA L8|1{ta˖pMbض>lJ7n RVD%IŸ#$?=w];ʡPJӂ&.}x&lV55X(2FH||b#A349/hJ,H>6DxNyPWr7{DȈkҺ&ճ4gTKi`[KDoVQHd3 J`,4˥`'l vks8crC2S\c;"h0i,#1vmL h w}9Vaªcgn_vo0 o^H%@L)c0-Ȧ߂?vfL?S ͅsRƁ X vS,0X\7˲˪NC Ud]3$9➬)^ڜ<.<< t;0L })dLtfpbh:3נ̬kʜ:W@ iЀYK6B2.RG,Nѷ.%AAB&C3īD$ڂqbvÓi Szg``1HCyt-iDM t@C`VIYvRoc^iL3gc SਓXW-ӅhuŠoDu@u+2 7wʕ 0=Â`Brigƃ<ħtNA? f#krCC5R©l"y   $L:Cyŋ;z_X[Խ6+H`nz׮f~˾-SOJ qʿG A/7,^6`%xzɀd`ihEP *}9(PɗL.v@YCobZry%RѱۥZ$|e;/Th|,SLH7KhuޠGkSږ ^ -_Y'UpɹxxQZB5T{8Dʉ)rx0`k<]/FQI&]L;u`{ij-;?LZ>%]4rJƾUj%5XٓH@ڣtQj:.jB8پk{nf6B1ԍ-z$n8'z у<}~Eeo{4Niv{ bAhǧk{Ҿ/3@9F&8x$ E&#Gs@a,㊩!8U5 6W!L ʓ!Tv g-\?oYU ~}JɁl|XfήYZq0g#;^`l7E2z'Ndw#;z ̩h g4 5P1R#W&3W{U *q> C'#eqaBvqڲnVRa=z#t˟@Vh`]G|`R3j!pB,7}K#<{B2JΣCTysL ! $ ć0a#i1HjO'l΄6{'#4>Q{1nI (+v(`$MmLa0s -˓ C@) A *•n)SECO 2'qzx6i,Ey;E~lȀIu%FʔUQQC]5Q"JX'}NUrk!ۋm_i1-0b9Pǿ+tWyQϞTŢuB䴷eT_[Ch|V6 :́~}v. #L@6*Eo^r[FĪUu{=@*Ev Xn}W Ѯܺ;y@\¶\UPmr%!t\lJj0zHhʔ kqAT* y:ȯ3qPOppkd*C/߃mwuu-I6ɦ,VcIuiuP>8!upfp7']9J?TS0l9R+}ZqWweVX%>2t(S[钀z6 篑ی*br%?FZ.0eިm_j^()|~k?t>>Fi fA+<=d!z1ru/TYRi ]&ZK6)Ae rkb 0@SO] *ΏV7brլS7Qx29hUk]cI=DL(1h9G~ $)'SOW;0Huwt6wR`}y ۑ*1' U8];4+7;}1#|FbYZ ޫdK ҽ9L)a$\nojoFăǪgAy~NΧP,KF\-^4P~͘CszpڗL]~(xɇų4#pRgIendstream endobj 315 0 obj << /Filter /FlateDecode /Length 7453 >> stream x]o$qO70zmi2F,ǁe rw#yy!zgzzgx@\gu}ׯ{ލڍ˛>^=W'_(nΡ;ޝu{]Lsi8oNt2Vg0hG|?Z/: *y yܿFx?&zhaoN_H*1^!YvĊci19L_/eB3CI0O_|[\VJM񣵲wFvHlpN=FbR`0 6o)ZYxFcQ&&:iik T%77B*ض,C :=D N&E?A)}ɲјTz- v}IL⭱I@׻!+5=ڰe|m >>7]iYбʴNJ`:ięxy֔hZOZ hUY0b[Bf+8v5X8qҌq$hy5Z2N3I07*6` c-mjw&:Onm G=׸)m[ &CNVM2JgAxsvAUJyHCNx#4 Sgט0C r " "cU*\ ZVdV`O ZX^w&KP)x|oGu;tPuG YX :1>X;"qw_'X$@2w8x}'gAG+H}?4 x kr8lb_4ȍڍrDH-+09Lk? 9L}ĩ~,!v#q26,{:Dkiᵰ0X?|iJ,pfق^8V8G6#@SJoDR-ϹL8cG8 E&QqD=kLHc:1B<ϢxWQ'̌ȎzqFI/42Iz)RD@LLs_6H 2/@zA%\T7cv|Gjd0ie i/o[ &=$ʾߢCL_74|0«`p gH/e> =:mVZӚbni:y9"9y1XeLT>M}yeg#`'^ .:p& g3hiőR\9kUdXWpnjWbh2B7Z^~yӨdľI+bvD]tO6s@ YLz:0 8>Fc10fa{C)6T%1>?(JPN? T( <ְێ&Ef*8.h@pn#UZлr3fȦ `=)Q*$ˏB@xL$Nt"gTTr^a Nsv"vYu;O M6^gَ`,QԒF5'M؃d7r*lUE*g(VPAݠ-:A庫AH{r'Cnxnk~!L*ϻ;ÜmȈ/ҹg&@]DxQ)8)ۓL :|7mTy};`UW53U8V W'7rfY d> PD؄#dNRRg.=L6$LvK6L?r< R[Fm|.89ZW9HMpUX'r{2ŵcbuB- "fxhQB3?&/j\jEϸ҉Yo}5^=YVH٪Hf 0jmA$H!2N*"k%T=1xDt<kVPet-  W.d+sr,F"˝h\T= h!wȲqɸ<;}ݜ4{,ϟ\|޽G!= s4&x`hH"g53I(Dʳp4 1?^y14B.rB@*YqgHw \gw Osp$ErMHXﱧ_įs=QYBN/jY6< 3Rҡ,D4"cr`8^$T%*Ԥӛ)jIL6Qppi%k -#:pJiBG4;b`i6 |YB#ڦv.[)˭E#rbEZ2 nm*kaZߧ̇yOj:?O)GZ| Fa' O2Q H'c>`2VEq>2Wǡ0{8NHEN~@$لO Qȟ _~ Ϟoݙ6+oM9Isл*%ٹ wbY= =BL@p4r[2=*ѺzV 鍋8 ̾TG[J Zͪ`%O;|Q>]JGՕG @9-YP']U9ȗv7֠Ld+~@WcJURMl HNQ>bQÎr+pc MVP4lS/|Yiҙ^+\71KAp@[4r4Nb |~)Ja϶BsێCxƴeKFȭyuA7E00i9|;f3Tr~mF bƫy_4ɑfb㭯L L!K+=?$!iH~zu-(J\[cMj^2 |gū:T(酛iM:Mb/3]-2,YK=y˰B hU,x%Cddm{Curi|E)(A_xqqmw^sJ5%I2ѺE:2[ k0n #򍲀Rľ}7DzB"\Pu}w]֖GnЬU;KM> W"2J 'pcn`?Er9W˜ߟKrJIw{A# 7xf(=HjK fi# #h(FjJe|kx`|!k*M̫w<'Ty ƅ\1;vqag_55|(RV0*ldh<>(o7Y:'ɋ\o?oioIH2ے#xc/#iVCYs{\9o޷yvOjAoThpu&P^ĉSx<]7S f߹+YM 0+):ˌSYx{-*g~8nyIҫCϡU} VQ1b߲ImE']11j9jn\J#W6B賐I:R+?{/{AZVȥ2LGeZt:꬟:g8,SVdT> `(#+U,uiYp?HW*Ɂ\KM_.^ a8^EĘRcF6I>eQ*1˒+gnY,i>ճItY׷,7"Hmjr(/ ϫS>V@{M[u%"4M5~?ES%1CMf`JCLF(ʌ)̻pʍXX;)Y-= : \Uc-X$O6r?F[_`맽ozepmam zՓg"=cRs%2\㸈Xb-?7 .,UJ?l@Va:ppSyKʼn#{4\CurByhkJ*|JbO"zs|~bW2zg a;ԃ P9xPmۥ|;kViG9g?}&vv6֞G^V& SMKCpjIr/P4TS Gܰif{&jL9!x&0-7/ا(e[̬y@̖ySbTtT{VƞrR 7о+R_<{ыJc~3E2ve&!o QU=C/u7|%_JնbeVfn!mWn(Qa"D4ҧDo_|yhoè{m*ڼ=&VZLȑok-J":UMr<|=5;Ӆrںmdݦ'ڑ?pu cԽ8KpTy (G3W`; _ت<5x'Y+ .TylIRa5bmQFvڲ_!,սC` kix7.wak'֙;1߯"LSÞ _rą9*Yv b{/^u֜/JHrwʴlj!2.>Oy]#J/HrQ 3ӣCt[x.k\q?T-tƢC_qzaU;ZDž;mǾ %nSUۖ2ѵ\dv:wjf>UV֩c PZھ_7'e~a 56-rM^)+wX o;z*JW8w; endstream endobj 316 0 obj << /Filter /FlateDecode /Length 3274 >> stream x[Yo~G <8É]IlYثY6S$*{FXYCpx˄u|_ld&'[lwp6y pydx++&)==z5=1εt\jl1k(|0Jj_\w|X%>H/xIfƤ3. y3ep7k.a ä7Qf HXMp3Ω~Y*d[6V\pA N)m3r(f$k81=} fyVfG@wI|O8LñHdX&Y !u@[")ajm0B%d?ahޖ O<}iI>9]YAgs̋! xs개8&.ʴ*:igyrF A >% JzFS0+! Y G ׫%a(v-bO68lﭲ1sYUdE& xa:DBȌ}HP #UT*#8H"h/ju(H6>PH#4O2m)Led {q1W3@AQ<0(*ljv\d &izٚ_U!3_c*);GLK3>}jg(DF C[ 0Z%r0F~n]7[}=u[rs?r(k%/H} !EJjjL6I8V,h |W)^F)%uyT2labkc A/BnݧƄxDV*R}.#6Bgl#hk\!Ԅ,ǃD *uֈ\oP] PPwN!C#!ZBeR 2$`п.j*T5\Q3;nrJ/;)ՒX}܀H窇[zlʼE0L%-e(aBNlhȐOWnUy!/9zm (x 0aY2\W@n n(Z~)^W ):i%R_\5k{Uׄ=5.kV:",6ˡ4q4dA^5N /VAFσJV]U_WeX z_;T䁑ބ[#wAC ,qc.T=J1Vn߽$.< $VN&2^]_*`gSWq]g<.k ,2p[UA!*%ۀ3kif2cs= j\xqCln&GgN(i.ט%>nٛZ4v)%CY"ۡXꏳ-[uz_~ݐ{^MVT /k;^64e *NsmYAnnAkeDk`:&oac:2B/Wu[yn]n=˭f>HCsgs 4%̀z8AUZnjH;(|oAku.ki0e|T*o+.ޔiҋ_(9mMEt.,L"`45IY^G_K$yoJ12 FQ"\E܇eC4/ysEx[vdEV! tTMW 4@#e[`\D@yMSW'e1Z W?tҪwO ?<] 4Chh2vp{SLYb%&tMEp_ +BmP h Mb54mvh#I4-[Էj?6#ۿߴs>/caQ/<,NH n(ʼf(ѫbaA2>&j3nyI8A{f:PMB$OK> stream x\Is3R1rc˕T86S9:PjE?2@7^)9[t{x|_7y)&)ߗ|7o^nÍ2Yt_js`#ڜ;϶.I'g٣m19!w[ TVn 4*zr[{EϗEk~6 &Sq4mnSQ޴]xeU6COFC}ҖI4 mTQӖ'Mf>ζeMx x1vg[_hWuhitX=cq[i[u>l©muݗmF~[ɡڨc#yk~g6me 9Z>zv:;:zm;]ãu+r8~&,BQɕ|˿h $g+rumcu7mWh:q;mW$j"p1{a.<_AhU}Y%-Vt^Hgd?*znHn<@)m 4WK|*zE[w΢ ^e _auD ("3`y[=bS4mQfp2aoX3G>>\'xq:}j#N1GluF0Z$:ԗC\OYK  v ~#UW($@OV7xr(DvGZsBTWE {f*5GHWOyղs7B 0.YQ&@!!)ߓF:dnf;P*r ݷFBޗ.Yn}GL+@3 .>b~(i 8LWMb?IUp'7{HVLnyQ:~+ܭx_oAOU8A#yjs=b4>ޤL@A+#u0 h| zM@F QQPxyEBZwڽ{a{5m){obwE:_y<^KJB@{3m45^ 6-757ԱMHjk8De|' ~KͰގ~B>dk3"j+'% +B )y 2Y:m8*F A ߏ.Qth*Dn>5go@l8޷()d,mdf5[ $qDaANש퓞x0643X`j$ orPh:AfО8vbsgoq'ARMچe{w;Ǐ/wl[=vVz JN6!Ɵ&P0RlH[ 5N+ ܢܤO?QOO^λtXV@j 7rQ\Lb/¯%jY bh`@Ιt>R R9j0VZ@OvB#!!?k=Hc~X``-,~YT+A/JyȸPWJ8 ()Յ= 5FYJ%)JOx攟?{^(`:- LjOpPS.%zX)%%#|1\&ű7%D|#6)*WS̵QO76^~:JRmu( k!4g>;f>j1|}ٟ`?|Tp% V?KO(Ι.8G#ؐĜ1m%UPY 9Mu8ns<9.|ELA-cf#r]6 w^H>Bu1)=a9)m\G,VU) _<#- CsRVV uSDO;ZU|* %}'+Duw)$ovFW4R?aTKE]]d҂&Kƥ5Ϲ.]Rͺ<1F<={>ϛ_o IQQjGMTPZCx1h+_4_ΕJ1.~8I.uE'g!P <_qY٬:ヤR,5bUh`}VM3u3Yf8:Bc"Α!̹c2watiJd&|qt_(GM̙J9smn{DJ_[kY;H.q[> ?ZNWxBbՃofE+omH?AGcd26]<+$Yҷ&;{Q^;N rŪRwQ8 iqmCL³˨$H?8M,/2SVKJߌJL`llEԺ z̎CW'S+wWI;=UܡaLwۮ v%U mWCJ-w N" +wqwa2E Z=xݐD)辆͛y!;gP$yᕛi|ypmHz y߸e_9?ȯ %њ \2gkSf{hdk-c_9؃gm5Iwq\t}r(rB(O=$n'q݁5ܚ}ԓ:n){my3߽08Oo)^`%^{ i+Iּ>7}|͓\q鳻aa;nJ?|Koιg-1v:c||#‘bo$K#4 ?gWSl' $PR !k6uT#?jgo_4=endstream endobj 318 0 obj << /Filter /FlateDecode /Length 3026 >> stream xMo\Ip2o, H;?N6k.u?^ws͌!ru}uUuU=\<_\ѷG2rQ[_.8RZ8~wTNʅW /(]_~\Yp4hli>4h۠Aʏ:8~qt7BzB7\He%HӆcWulB''oqWI=:醀Цq9|#+VSeTCq9:~ҎcǼm4rjSҏ{հ+#J^R;رq+`ƮD~,$ \aYJ{:-Li| X Ӆ*D(J,B?N8l4Ƭ{J"lDIDX#HEMҵ*A==r{ 1B20ݰwADs+tj!y-Fk=`f%EҕV˧x|GIB<00W1 ؃7mI #+ܵM`T1Ni+^Cst+9ǚ^MHy"G5{k}^Pi 4 `Skq,x05HeW 6Buldᅲ^,lV RwZ9բSW,RM)إ2^&B8j" \,h (5v~ƞaxozYe4ܸ^ogBȘ -`T* Q{!bA?#i؉u!>KZ?UvpfTt25D3$ |^`}.ΖA@HaC0`G 21:*b2cb'rكiu!Y+i C4HN;+@ #<A:ue k(O}Y LKz )L ɲ0JVUsWNV_tocb-ooB=~ 3VL P5,py\ "EBN[}ixKLIr%d'J'd)t m8A޾00}54e55}\2ҬU5 Hny}{Wdy?ԡuH&5׫IjI_(^, !+gE*a)i,,<['x)ujEh||{;=[nT1.Mզ[fA:L2P􀄆-xu+BT -I[Ijn4rT}Cfa=8@n0'܅FPiMn躜2Үg?kz_@X&DKPvOtzR՗W}ύUSd.e=!^/LmLC^Z̧ᬑ&~..'.cp6wތ,Ԧ$$e3R,RrlT<-dA I]}{{'P${J /k"> H*C6ѯKG 2ob$]2{VDϳ-ćׅvߤ(MFڴSE=y1rNaE?]Z\bVk[C 7E2/L=[}>(L엠Y~T~wԽƇ*SuFzߟ=MIc*]ZK7iIIe #=QuE25@l{vwK6y@N#v?vc2U;&jd=s+fv쐯 ,<6M8{vɡ2]^)Ʌ4vzs4\|@j(ʴyB݄nrDLmq ;kp($#z!-B!և3Q -Ä絷K["z40H2QHQ4 o 4tYۘTV,\%|&PB!29Rj46LzFJi"tVLa@dcnu/@OS6oӸ`'ELL_N/I"/2(%"@ xǯmyr)S8'yLd۷x0# sό ;K+K,AaCKJhn/>?VW-~WzڲH$-,V:L-{?cGendstream endobj 319 0 obj << /Filter /FlateDecode /Length 5866 >> stream x]K$7r>6^dʞ+`ZXlR/HKUЬ_w$#dVV2 7E01/zL\? ?\ܟ w"Qz{ʓIL Œ'g^ly{:*5x6_n 8o6Kp`5 jggbb+FnO`nH=Xi7TOH5Pi@Ԫ\;ڴ8C+::18!q{%4X3ZJߞ9 #'H:쑹Z8|Zk4 ^?9ǀ V_?P]$VH7fio 9`cϞ=7^;..qApy2 F3zzוA$q}s%` E&9: 1:{nՈ2qFDnr,gc9NҐK6s*vtK-SY_倡'0r>=O K̕ .{1crOk7JvtK7"$Y\RdJ,216oL>1b˄=G9l%K UMRlb4ߖ%Zf8*}t=EYcZ-wF@"^"PXf>q367aCRŵB6ePkӵT ޯFPݧn h_W8)Z$4;TVJG5KmN"EV*%ՠl|B.Q4hERJϛv{ɲ6rQC[ Y1JŠJ8GOW4j-L_&Pc`[uG*ob< >$ͩL} ~l] MIuO5 d*?PdxڪoUË/c.iϾxŋ.S<-/c_7FiϣW__zШkx/ooʳ\Zzd ?sYjy.}eWQ"_ej0!_1(ɸn1"Kw``GjWmM@- hז+V =?,A?0szn҆Z%0! T(Uc&SpÀ o6#;l YL1$85mFa\10~!j%aG//"5xI^`ж+#ЃI =&9L8WKռf|ɒ ! ~Ԟ&Q+%4@2C&`#xu ?^'_s^z(}9p &ܸ^ZQ K k[ $k*nE)cΫi:&9el 2U k ' @IWoaԕ  Lq]K8m.A v|{зoIR:|3"Jv ?5J-a(1}[-u.8JehO'Ô%~rXWiW.xR_*[^(~+|_m\oslt++S.h(Y.}Kȥ/[A @c_B u>UT6Y^6&)}Ywzl>I (icc}c_SaBVu&޴~j%C\<*5a,@1G4"[хנEǹsOޥ` Ij")t E,BapYҹ `8dw6~4U*Ii!h,lW]׫0 s^b?Ĵ{)'ZRi8)Ka鋉ygcxLiVLdSBw41煀g^fFQ"uNj$QnKLS(϶N"W6~RvSC8tQ(`@Xvp=@w 2l+9?q*P!'aJ%1>ArIi'DDqJ[@*(5fy6Vl +9$y0+b+_ewTܳuNPjvC F*!(%hpp 3lNkk0LY-EbrNYŪ?JLf5CY'bO=C&>N!DćKP2- 1Hݤ+5 `}_3,4K5I|=x+|v&u㵂q| ӥJwRqiP'ݴNKS3`X_qz%0#>C!HL'ѽ ;Z!^,CHkϥ^q:$%o1lU~*3چc_n׉m~:6Krk~ZEI'L;OkMU=() X,eLEnnEcK%/M!)71)➟Y3QereL 3Ulce;|T RjBljVflh$f%z=~ qNU7 v̟ qMCY;ķLɓtCJ7ɳ7٬g1sY6WaP)}_%UUp]$~CiaS|kįHKֱHј4p܋EsRI;.8㴟@|r9ȑ>3@l{%GS*_15R{'dx5U1lG3CF:CGT-ťŕE ,I;]3_ Z@BB7"b p*ĻL9J<\d9m:@4닢<5&`Ҏ91Wx@Gbk)10%RtoqS$S]n/t|Ev<5<mmMQ z/ >w᝙*x^W=>-Mbn@ܬt>Z|vIG ![Y*3Մb꤮|O:۱4?|H` W*݂O*_/fDM38#Nk*kG7rчdO#NY{0&~QW{u!!Z {?t٫t`U rl,_XsR91vg} 3ܜżZ%ʲ|Oߔ )XzV_&f.+48~P`¥ <sE~J,&ƭx87ԶV~ N1nezj}EhNo.F$8\@:z˸\cP!z?ҒѽbI,sʠxgMyz]>qڑd4+ CtnmyqTpDŵco*%$nd0ƿ{u.tM/z-> stream xko#!*MHh"Es`#%?K\ɽRkMZiԺNT{);P8y8O/Ryj}ZԺOڦ>v ,< ˁ%RD 7kemC:>je5i%9|ʃܾABK:.z9'˓?ʽi,їٙt ip1MKLEf]\u;y3J/S x .)y|_YctCJE'{jZH(ZN};f+19X+:%g7-g+tP[mA48 RtjƙC>:ц;pT Ƴ˿p0 MpwV0Q?og{:!cԌuV9o{攰 :j*g*`<CΕ5Mo鴈4m:FQt%넬ń-Q&Х \E=?mYy pjb4P`\D{.\2橯$aa¥}gT 38LcRIu¢zz0U10Y FuŒ ׋ynܔRསp@VLkIo@|^nַ7l]?nB8(,9ms/Ecp%NȘtfJq'wSCdManqE(P;  )SJDf{pB綮ޘQR–kXUg`D6RZh kVj٬a'*G $- 5(}&?g_%ȀfA!ւo4 {@X BygaL A2 YB?H1%2IL$r \'!! s)04R:>,p}88LzR> <-{x{'Ť a([(Vq(Hr=@Nv#{ܚ):ঀt.TၩC傋`}``Ijy %nb쁔pS9l&ڤs낙kx1jz"Lk E$W]jTZ\UzM{T`2 0T%Պ0k}j)T) '?Kc &&{T6DP \0 jٞR%HT+-d0b & peMKqSE vu#@E M.EaIX+[in.\ODJGjRfL#L=i̹O Sh "eUʬU\g,PZ+r7]ZIQ$_*3א,Q46,`@9G vAv9+|@!8ؖZt?q8xxm 2ͼ"j쮑*MO#L/%#Odmjޅ+b_[5 ̖mн ZXC JsqiPp`N`ʞs_ v Bbă:fSzTӿQ)>> a4c%͏V@6Ae8rM+e6dՏ,o*,|*ń}j 3HfXˣ}#g`jriFJH7'Zgn / m=!woWCi9Bmg7ekx>|ggTԫK1š׏}t\Hw .~)B DR@a񠈕cNnP\:(x4LVrG̤SVpC:ʪBݶ8Op}Qzj*k Gg\jU*Av|BIɀ,9Ih]`]ZXH@e (g6َqlPȱj]u%Ř wBde]8 }@Ÿ^]m9S_ U@*K(!%*#PX]yAkN %.!^dJ9'H. :xvp*wYo6u K((}|9.w Z3hz1oLuŻ9k`(1H|"#Q:3V>IIJQ _WmQ0( Ye]mm;.E7pxw<:'!aQG*rR* `VfaU|>|/RĨĨ]yEWn)2mtkN_X Dq ,$jJi(i>0V0FWmxwPiбr)RhHQ9$XސƟ#:L)D2Bބx)`|ѯ<{Z|1 L.ݤmo&4ԋ oDRdBqEnKF Qz 4`X  x "r16rn=\CÑXO_,~Ƨ&2`~}/oK0Zߵ^o@?Lg,^O\Upwx?bMZֳR?c,k<+} /`(O䏒(]7>cn5֍>o|:MW_B:RMjËG# oPHg_8>Mh:*OI3Q(!J| \r> stream xˮ5r?OAAEFCnXpG a!!KkUQA_ߎ̺̈Ȍ|?_߿?O?OOW???m09%?a7ooO_׳ᯮ;m׿?9oG2˿??ק35kg<5ag /l??m߮7 YvX?7~oO__TL35ݟ)[o 1֕_kYşq{_='ǽ_TgO+}g?կgbe??gO?'˟[?wdd 5c;郪to_6oǯ2Y ~CwgN1>뇸iwqw^L绨P]J4> t ~i\6I_oaJpȾIARHknLy ;OJF11]^u{?./.~nwqMڋ =߄l1I7ej =L>P\~7 4J|֊GD ,vҋ\ܯUAcFl/ כ=&. nm] b ||nb|3!T/}T.{>]?AWzl-ˤw*?Snjϔn_MЬ?/KK-* fܯ4nZz> 6 G)r\gA6&DnDQ9zG7L) db \"FI,v~Mx,o1ZhX ߢCа>iA6!Cаp)Ʒ\ܣa /Mдj؅1xMnX4.id^Z, ctomUMvLiC8<ՋM:M&'fzy^mZ- ŃehaMqvE 1åGGS1Sd͑C6FD5Le\Lf43L:hnl~%FLYiiRf45shdpƖgnhlr&]< 8^e&2fխ^N}iC:^m7¥qn"5s(.j99\l:ԝo֠07Y7Aw#ڌh GP֌`2UgNۖR+Lo"ݵ1 b2{.w _j1-ϫi_X5[Sh4d,%:Yqʛ2~8d&EݳH&2wm/|h&;-3ۋrgHtw&h0jtLGnd0b7Yds;iYfxxSHE}_.Fʝ[_o'FḎx.]ZʅdzX\ i:X(lۤ3GTK5$"?k=##lv'9 mG,5jJlk)|MI%[ ecC 79 2f^:s_$l@:;>PsDb6[ltLRI@Bv~SuTb2 QR@T|N0lJi)5 &vg6Vl< 0N} 9ݮJܩP ^먛#@tAR$](7u`K먟(M#e a&oo\ _C۟ o:@FpW}դZ/$3Md0Ap=hS [Ѧ0AR_؊GU\GRWԫgԚ3bʈ6mZmĤh5hW:O(딂(W:G6̗ +Mv$f 7*Ja^Njd >D;8`)|STqsZ,ũ]Mdlj}qY_C W+aXc&Da`AX刁*5rX*&h J/G{0xL.!w]\HB:ד!088ja1i|!nS@Wu'C~  qhf*dΌ>e?dO'C^*7&n0~9! ɔDy~D w}R$%")"iqHv6 )m>Unvc% *ĚMׂ fo}fml~zV!Z Q檚c8@ u\/Pm:>QʍC bSW爡fH4BڸO)Cm-`mVi>5׺,G&u|:+z,DIڤZkNK0cMtD^q){ՃV)e_^޶ZF#dׅt눮0*{d^G`% S#G_%ej *Mu*7YZdeCQG-HLh6ee1 FXR 6õ@n*d,}[&.-۹jHY9(`/6\rB]J&-1ZW6׀`g@)3 2B4 nЛSG-oB-FXUp!2isA2[Kіu7vWsBiDBw X].>#v e\)0&I3{O<3c=ٯR6oވ"exse皆mZ!/i-%phi7k 0 ?~OɲKq!-¹aD W-H,nY QJXV*abב+%Z̄'}fPnWΐ<]#3AU$5<2p /~T`Zj./_7E5<"pI>GSVoƣ)70L m͠a :Lԓ<7ɠy<*o̎0x;0d| HsTkRKfA }-zeST<-jR;cNtJgpO>Br]̄ K\^m[H6dzpui-57O`κ֓ryG\f=ƥ@\+f&n|#>W˯ys=3BWb@3< tuhɩ!3B vD6 BsB31ZjWm->4୨ <aZjzLxLKM\X$AZ'!NKMGr.t$g&8݄uWkљ" D4r!̤sw4g1n9 MFwddeМ7 YȐkY᳍˵v4iL##̠ .)qU´tR@fULLRZf@*"̎\mZY2]  Ж9zFC KGVYQgA2!@ q&qJ?]Dx;3 2:g-t'VIе ])c [d3EH93`XWIJnR2T++dі7>^sha1bRK(D Bd]=۲ F6eŵ ԢF6e P3 !?IP_f S"#5/#h1Ĺ6riFiFsl5z+i=M5Zt]W3p0GYD.hCMƫ񴔢6-sTidN1 `CjSɚZh$!,djBRS&A3%Ⱦ]iR.i FN@1p-1,l*eMڒ dmtޫл9˦]|m1 +c,luI9z$T Rf"˲ApX oV3 Bm2TbJ%C:Qkt}&{q=i Ts0@*+\NY[JBƿYRdr9̾sQQDŽ̡6y´s=-G`T$ZG1ѝIkvFBZriFoohRf@ %B4KIZҭ뭭hs8wt|utg&;f`Ў\_ޖEvz: 0t83 ;s1\g{RX+&2a^G~f"#?ך3j]g!?NC[Ymԓr%3&5{q9NֺtdYx)%;}h`fJw6"O q! s;_I-©@Ƌ,gG./كdG. dୄSd`{]vd`&{s)%LJaG.>;iAs\j}sϕ1XŎx\kYuD^ɟ29p}DM[VX x>5wcG/3U={xdUAx8gqq!lR%9@xwk @1e@p"W:q!|@8;N|S ; GK~>Dhm-|%~M7)i 2\i,UT9߼GT ĸ|tRW)dWq-դY>:;>}nqHHROJ%t[mfD'22%7Ԓ DBH&Ze*6/rt\H*oGڟ:Y!NcP[9nlCpN,&%ql(Ge.璄;Z1245RDb(P&ֆp +靫Ʌ LlSϰdNVl֠\<=O CZ|p-sq-\Rƥh-M8Jq۩ jRhȦ6Km&59[R-(Ls6Ҝ@\5%K '?JjS } -fbZ)q!0B! O,Q˜& cv70N ExkN ~PwjbK@L 9 7DTxRqɟ\%;1vB\iɬCnS dUnDRW]F8;uUɸ6#ӥYʣ(<ƀ(PV)n}tjd~dl)8n‹7dUXs@nnQeʹ))AVSy{G!Vf*}PHΝ )Lg"+iRQHp*RHlf۸ s8WhʗMͥ£X8iu;gp>r3ýG5-Oi6&ŹYCLIq 6^J.ŭQMˋY}[yȚ&"NhRomڙ<*j%[QSnA2>:~ #R!>aŴ\(O!;^_I1$g$eG@ebg;)HJc) :HO+&%fX2^d™QXw#Vbd4Yk6w!rQY~QY_W4}dH$tFi(6I I> ]ԵWCjZN?'hYV3d6 h /}>Z>{ɹt ;D{ii[&G(-#)#iɽ%;Ho\jGPKj}4z)zJѳ\ꈞL%+]!zJ=w Zޡ79pJ^rz+<5ز9 ɋW0>a'.R]~U6YrZ&9=j3#NHAxCrJ SyO5V5u)[4UMBM7 ԘL]j;`6P}lāQeH iC'Cy x']i>R] "|핻:Vdad.*6zFOl?<%JC'2Ȇ 4۞e!2Hδ _i@hd֋Yl$./N\ ƥd#∮Ge{@klQHrX&sS9TLԼ$7ry2RIa?kuL {J-;7=V!Ymః:ęZKd(X߸b'gBi]5,xإR-t*DG\ irLK=]zJTOHB&w*Z< *1EcING'egÏNZ$!Ȥ9 j):PyIL$NZ:i%1)Oӂ8'] \lRVO]-&Wr:}^Ii4d%Yl=-ڞuSN0PSΣF܄I8ӮD?34Kd{^4?(-sGXpEP y@QG-?~$H.I}Y_YmG%-&R2O"Z49xS -1$iCKCXl3^6Frj24Z+N0b3c)eg髞m\O}};K{G$eb#[Kx9TRnon2k-dkTjޒĺ-4 prN 2^di- veoy.HȨw[6& <UE7_-%R.# !ӡP2yy ~tZ~tjrCS;LB%@hc:ȱts&ُ.|;lK"]ńa8l ~T&_ΆGH-e rs@\PsH%A/%_J<( /_ Rbo`MznmL< ԁʓ{J)OG}-/G|wd=a(scMK;)n99ĸdu1CJh!mB_ hqe^&R*p)eY2[msINe+'MY.=>Me5(?,R=E٢e} 4X"ڡrU W bzx{:~έYIǯ\Ӄ6쪔QeyAM.>>qv"3m,R>{n1#릳 g:;3D y9Ț|[j}gwM&W hY"{qtRri.J)VRi|gy/@?gD6u4U&u}9ETl !r] ٮ'ЩM`su 2 E=Vɼ ,ڃP q &ZWY5_4N=Wa4e B"M:KAF{|qG/J6+1]o29YJ|d j:Hͥ`)uM,P EZl!JS]d_&e&qDw7¡A^| E$ʛ*kG%Blo#¡>TYhz:=(Ku{׭7S ٛK<ORDKK l&/* 2ɋl-^kd %Vf.z ]RJ);O &}vqx~Ⱥ[rdM_KًYtk"6E(t_LZ&K+bxCEETKXx.դIՄ^FdHcgؐ|9Cw",3U>?גd 1iJ@?RӼu휗'2z䁈GSRK.K)<.L&ӀEW~n=CM=6F(j7_eW؄\/մyiqTubBv\1UJT,6eelBB+RKbR1Zؘ#+Y41lbQmv62/e2.-ljRVlbCy61Di)g8wѿY\sdsi2闶:Еߛ: +`s/:)4I׀M~Q 4sQT5`{L-1S(؋@ lBh*3lj=8bwFr.LL<3aMqb qq<[\&.4߈`& 7lBi)(ͥ ])I )4޼\EUGŤuG2Y~bA'3r452ɌK,(jU#udg:2q!JP~l\no˜ B9oO6~ARt,]7v/R3`~̙޸bWxMKݘϺ_ЍM ϺP’ %/%d?D32EC'U=^=G~ƎtF6fId\+k=Av^~9M\M 8o ҹ !XV +/1S#/  NV\- ًjRgdBOK I˳h::3P> .ddr p; ^ĥi脒tXow~NMLAƋP. &h 26JN" iǕq}G>~f-M;A?~wJDw9~ߌ5CDtAtYCB'E/B[j3"8k=ٍK|αYZfq: J-HhTi,,6#d;ۤW_lٚu1w \ʤĥZ.A:k"`32WP9Hn2Ԅ\彔BM[Ж ƾ_ ctPV&s3AL9Gs<)^7Yp=m55HL X4FSd m bw9M Cd2x_{Vsn] vi)o29w.<ϔnX.I]j3^6˔pKվ&-UKXllR }Z du~z-Hj36ճom) >W8$/\t+GR=_ ImԆa0'vGZɕdDn ^E f~W΅Õqu8QqwǗ ҥfY -lmRBڙ8扈4Ofy2Sg3HWf@zBT~ch ,^SETO ҆ nD ed,K=sn\>\ Bg&zj 6p0Z,KFHAxM̤ m).fJbR+BzFH32Sjh9 "RD"2ٜy&+) ҁ1H3eey deW2{lqdDCWK AD(JWcF ?13+JM-0JjZ.OS0:!L6wQϊΜDR.6tx`\Q$2Nh Eq+ڤt̏؎\I~9+O>CWǐ?/VzT_J)(ZCD*cڢ@kݮuzVK_.WN9JC#kq kGe2x,ۦ2Y9miVl"dYoKs@ˆS#֫rńـL};6$j^dӞf;υ)6eիr)Bx' +hʅs)*U\02BlNqvdlAij(jG-n/ׇkJq5]Ԥ)!5ߌo?INMtb,űr;"õzZ[򔴣ז(+sB<=7RbԈC)gqՋJdfrД E6a) iudH=! ٛtPt@^g# 2v&P KT.A}cPJ/Cyu%v=W$_Ƞ u+_4*ح3!+و>wd^jcrZ~ryyDvzk=KxcbVQYTLKRq8nO@fohO[7,=Wr6lI:mr65pkSx_Mu\o(3.S :Z!, {[/ RiZFB%3%Kך"AײA*.z!eDDf $\sMR !r@OApJ:X`bz꩷֋*d.Gxi/2(9) %Nyz`B8dOs-6dL~៪G|Oq(?/ש&s m6^)N@7R^~h.ɏSlR&A7R)Rlٵ Ҍ~-@Ul-{+Mf;\ :V9^ƕbsehWIUqq943"*sppIU<\z|W_LId<[)jFhSO;]l\fܝeIY4ЏtH4_^~DgvHdHXTg@zI k+qP!H\n厱qE|4>l/zZgUMzla⃮4b![5ISW2if)VdQu#=5G$ʕIR/xbKm|bG|~?Jg$0h,r_O#_2-/3G #ɤ.he hI>5 {L\kFl0ULx+ hy_FG{h xM )\Lnˢ8ފ֗FPvx5$Py@ 9hn9,bb;A;׬r>/rG&$&G&eAxdp"VRRJRJRR R%Dԓ2id6H\fS vbC?=&䟦W>Ha^J:-fGʕɥTJl8GBe_MI-{^TPZT«QAawY~б?;^kȪFlK{FէHZK n J͹H޳imUW#2tor@e?b)ۘVWl<Lg_~+h[ol k+UMV݃b9z&:O˷ol˻?]Ber(ԏ;Gh6 /}ROup #R+YMɦXPG_QtGObMK=_og|_ia"s`>J6ӉOa&oIk~@,x)B B n}s߄B `)H%T2Ԃ:fJ; w@ߣ=NOg2ӥ7R3%!-vMK~01cUAVnfx4SR+M7 f\&@:tOakKpJ5ߔe©6uBfx l:5GF#P\ :6NU!Q\kM'{ٕ܈|UZq4rLfݻ<.dR+uM.D4G e2BWn'-Iqoq;9hq;]> w"?oKy^\+z),՚g:.o,K=+"Ȭ6ҼJ|&tB)uРX*d΢*eLӹmb6 o, hdH= jkDEI'*؋q=z ASJ6#M)]{ 3n̹jhdd<+0ʄcaBdJ:L@8#< .5ZϖLs)\ :ߍ(0J>ZPڭ+[| 0Ԙ͕0J5S/.$k)|R ;Q9f U*afZoˆH;3l6<47SɜR&߾٠:3X{s!+XbK;u~)rK3°m}Jq`(G2KM[O֊wS]Rx;6{zc3X_]K稳\2o2]jD:Pci9ߜG5w[cن;kH '9)ɉgJȔ(6nMWg rtZO,> VI)<¡ c[*=&]֜,sFR=C4JeVX<|nyJ3-$Ezg/5B2RMht&ҍk)0IzΝ ĉ#>#VAB(zM#S`SK]9F6ƅB2~4_Gɴ(0Ƞ k+LR#6ҐɔzSNڤ[xrN5 BZsZ`bk>]I4gcەZ܃+WX}Px268R+9A%\b7Dv%5X%DX+#jrm6_*C@z{Dj}@ y7vZQt2#,BTe)|Z'Pe_+cTY/ Fm)p.1dr4}@8#!ZjixA&`K3+5_.5X!}tZ&FEA6yIŕJTĤu)S k2z)2zy?Kۂp~ەjjɏxM@Ml!;ªڒhzʩt.Z ª 41byST&$QpZ'T9*8hzj8Oh/W 2MK |(P\PKح @•3R^e0hM8̀#wf.J+kV˘Y)`d,<<9}F,˥ {n)6 /^V͍Dh'?) ADJr}hBC eIȪ,/i3-6+uj2rtCy;m\d XzgN\rSD>c d7.etj63{yJThkAB;ڲsZ&V*edP4ίTNRR*V ͕ kpt6 Zn,e̤U :OSb2d'H{ޢR\g+f8lZ^6.$q'Hm,Iܹ ۘ@/Lk-i@8 2YNJtGCK Nz΂J d -œh)() s $.Ȣ@ |[\OzgisZjɦϵұLR[qitV0>,ZQ;$ =|DxN̾mX-^Rm34'-;1-ZɖCAjB܋FLnF2i RB3xdlGJ! q)d'R'%MHt˝g8mIddU4r&2vMi@(K'>ˇ-OҒFRBfe8RBn͕lҹPScQ;IX OYLZBѥӥYʣbC,+:Z֔:F& '7?kzNKR•{A8F (BBTB6-Zb)w״eI%J!MaI!~IgS)) T "}@kR& g/ .C툜wm?gh2-inGdfA\J0(ÑN3IzI;H{Aj40,SpRRUKKTb{=˃@v6IşI-5M"t'@Le6l#brz!gN& Pنu`?WIG6-vL2Y!DS,I@:6#vC2dѪLK HJvrs}tb&V.V,o'J'f-5b)iZ*B6yx'̡S[KL@ɀelZxfO_&]p!jBЄQC,0IZXU/i_\GR!k tt9@KYSH c)5}fS9Z͌9&TH ""Ɛ8YK/F!{iRhb`8燲!hL:F&V9J'-ohT 4F'Wz{}qC`}}o*S*Dkf :ҊCKϮ 4tȓ 'Mm$RZ0XK͖% +U)YW&{\)YsWŃxMɲ޲}RKnG|#"H/O #%L)a ARooDRo&^jH>p@\ْşK6Lo*$Zj Lvzz 9MĆͭ0lZao5m!k[vȨ$EL1^KX+dM-f|x%]w|{UBk"2NLLJ-lV;9i9=NG6;&G.:_JgSB'⹅ qEn85Σ>lʲd)L=jr~ CB׫Ǽ ( NE `.`,Q![j߮ :v+/bʸ݀*#C{KM={A9̠R+7YQQ5[vZYBM(ܧvc uR#4Y̎Nd2 7\2{2#?)M],; d֫߷^6fQ܁le"J3$NEl" %78Xߡ)x)9 6 2l6ٹ1#=MNM4^;5Qq84Q2Id҈hC|ťR$ryT8\A> i2Fȝߐ<7`-;%OH&F&r[ZI-'wTΓ<˥%fc] V_4EA&e/tt/I:z ozjr5M$2Cl^'.QXKAa%dS}$S^-#j2@j58EkVG|0& z-[H֭z>zk 4R7N؋~}0dgbL CD>QGoebAo+;>WS2MKI5FM8PgHiF=l,}n&tZ k՗6f#>E l>n[ˤn[7IQ<.j;Ն+5Rhlb4"ޏg_?/IXdBZp.57[Hr~H3shC5 #֚gf ҥ`y?'gsj2[zfeXKol#Mrnjo2L͎h%\*}^kK}^&FzG-E7ҝ7C&f#>T>N d7|Kk\~6qWHv&YGR[~2^66Aml33 ΃zRݭpIiFV-i'(~Re"C'+ _ [=Zri8-G-t6T}V1=+.X9P3Y7kufbU`7XKm?R`G2Y<uUHzdyeB@/z+ČL 4Y?h/жYJͪk팙RʵodqJ]sV=#Zj>ky9ex-:tA즳i7GN%xwwɠ! i2 3(4?jԔyºB/ K?X$>kaHdͥbj-N t*U KL@G'}+K=SWVlk rcn)AnD7m4Z>A/y E쒆Ķٓ*#{ɢ#{>ݳ\L:pJ&m'Yԟ#>=>BQ3 S,tȠRhpd'S(Z3owԼ9_WOl\N?7s.89k]_9 R1~D9_'i4k&mȦ5ӕ0@x} w@6L(YL&ɯpJ@n8I}q%K~J,ڇEWi0lkg:R įe&q)}).KUҔHܾrFK &6-V|r"C2ڈO΄O/bCK9{7L1Qfe2Kdd*tK]6-Z(SeydK&< ?Av޶6mg#AW؋p^q?:%Sc@xlJ81͕iċ%G6=r[odvYml%Tr)񺟑JJ~.śJM*LR.d}&K5 xwMd*dj|/;%I6SMUɐGp \~K?c<~#}xO]FzyN;Num(B Nvx:@V G:?:d}f{"sh)8:IYuz?$ڃ ?d]0mXd(H[4<'_xAx #}~sq?#qq5 i&@:j›Ai=|(CCfө:)r+@֋xWd}3r N9yɏ8d x:lgbߏ8YQ٪ Sdz*[N4vl<刘Gg'‘J$ڇGdҹSTxw&}]uw,XQ#˻9j$I' YKuC H.?bdŏY r#FFJk_dhy1 dl-%G6&2| [y$#X2ٔ!Xr<ʣ8ru~%^@rbDrxc:@kɲУY2<-q4%=* d6-e<]<]$Gd蚵%@;-Y_Y#ȚL`1?&s-#spGԬtGSJy▾^sIQ9z^ -=Ou,#yS ʀ>.u49bu 7;F&6ҪcFf7qԐHGd39uۙ9WN(NjrL)w.'Ջ[ #27߲:!9vn%[o=g1W@2,X;k=BMZe8q!-ӊ?uZ@=DW='홧 [3t|\\ffm"+g8/9%gS듯*WS*L),rַaWQY5;y][ʔDzEd ko> |MjMJcCJ lجOZ2*^ /;3uE\C-I*Xp"bn Q73G Ow11 w) jNKR͡pg7?+aI-ć/`#Ϝta3dƤ׮ƤWFCH9 Bzͅ%00•BU9|Ą.BbF¾HwL~ Pa M.Q~Մ.N.Kw'8NZL>o~^͗ƳgM*LA'7Y͑GB%3ZYe;ix ElSB]6X\O70?{g9dSG>h摾fP 4WMdEdw򊃑Pb}Cz>_VDFz;R%2f}0|BgEh}d]5+6}|͐_]$B5w}L0jP` 7q@Zxz'Y^,83)׳"YX[ L}X~nPq4~曊;f1-jCM?KH0):.If-{]up 18Lchӥ8MnG8\PdppJ 1ՖF{Ҟd-qNgzK{g-eޟzK+|t)&rF$YjB!frx瞭M{}:T@$ 6ylq9g`wЏ ^rR9`R21zm3(=\K! Mn rr6/X'8鍥9Bv$MHs7Z96\I;J]ʋZ 624NR}hLCI^U*V*:AFC'HP#qb%UYx& ?Nqt)=A5"~%NsF8WnL-/b~'yydn-ldkrsG6)Z/r6Kd/.ȼ X8FQ132_H͡CM}H/m"qIQCCa̸+[ WL8)ɗYuɫ߁S\_rHØg)@#-% wDO'k|ⵓSI̩\qd,-ڜM)IP\u$ LnX?GXp˭?bkqmB }XA.T`K. iv'E6+}+>B;o=?a wR0EC~ ϔ&/\*!ۄKqW~+#a ̻pR΋RG+32ֳWiw!D OFJh ]`:ٝmHG#+n)49UrpBा,Fu])[ʇ&z܎.{02Ip~VxK ?3iI˟C&Gi& ef N||jL.nӏA֖Bc^bsyspFc#Ftc# #f=6af՘iӥd2b57HclGɹJNlL_ሎ6}k^Ed-'0'w^ => 奤AQ./f[ONG4X|fz1l~fiJSD?2Z|7:q:cpvsZd˦ʘEKק݅p |:vKE68Sm6'3Fx~N2Bp Gs _ |[M/-54Bg9r9!;zw:RKBɠ-^OɔzFdJd$'i,59/hpK8ϒIC?IaѨu 2 9||^nodc.~@"Yé!oBflo+iBrZؿ ұ(|=x5^4~Zl)b#63@Մ%.4bl"3=&a;/6o|l>+^2]C-y#EV9ոt)s|Q k^{kI l{a巑mߓ`ٓY b-X: n^kiqSk_DtY1WCMuB-wNX xx7uKUE2} -߃Flz~ \U"4,JT:KBMw֫βa|_u6` XZkI"zt_ƾȁnTm.gs͡ϒpѷAWHѪQmB_gDW%vZuS#H\|^R5"$n~HPln6Cjcp!٦K+K#B5^$c8WF,i*o+B$gM%H۬yLwfTln+D|!&\ʥ,[o"1[H)ޣk+> {5aT(W `$g v?0`F.In% ?|-{|,e=V.5=D ٖdJ͡K5XV2 2LcCne[-J*lsb{s9lW!X}`dl-8L%|T9p{p^ &kdM'ҦB̓1bbMC&G,p x)^6u}ֽ԰ =ЬO9^=6 $_>&Ȳ#l A#~z}fGNt'@*ǒ,9jQs`pbNA犭|ͽ= XC 6֫=Ig{N#:N+H7PdA155Χzjdy4UKͥ6{Fk;z%YıYW!Mgbm'ܻjd <0 2;"'>C+#+?#kZ~0! 97YيmdJS'@(y` "]n!Ѣ,.1Gi+]rXid.%{IVHz\re;'aLZ)[ "az+JHO@'ad 9Gkbf$`6hZ7Ɓ 8&k/NJ`!]qKZȮχ`g*`O3{u0#0cJ+ 5SZ+wݴ֪ͤ@#Lcdo^aHOzLMjl+VHf$F0B^1B_k mWXMJTZ Za PFd#5תjWfwYE9n=.vN 'Fֆl7+KMllR}#{ᒗU.y^j`-6]lI/e7юcR#psvri.ziylW0M6=:ol~<v䐽nORsɇv\,uzAA?X5T"ҥ4YBAEÝyE+~z:8P'< |Ƀԩ6EpS(9FRn'VmZȩo`Z?! Usxvxů1QuVtF&L٥ Wc5Ȓj]|%*p Q<#Ac+Y:v,md6ncǜ]jk˜P3Ivi VȨ0h 9kO_XR"1VPi!W-Y#(fuEqfeRM//Z 65clMdYӇUYYJf&Le$Gglj%6٬o{nݴi}k2-=złi9{@ITm]m6_ݍǤ܁IGLQ"V WVϒ?L?::K"\ҬΏpoM20Ԃ Z(i~k \J]+%\t;I"4r[FIVRGq\YfslG ? ضkdgC%e$02plNiCXs=z׉N^'κ5SpRڜN.[ d-KyWƚ|ևo`_q@lI1`dICrGzEɜZhC߯ f#G)HFH_bsfS 6r6m$ztA79u++f2yzn6BsN+k$ 5#?H3 +燱?rrK'tGV/uJb*Z1F%R$S}jHz#T߯멒~vi^Ā"MUH_nK5#_(w)ibɒzBr%䚟=&bLo#1Օ0M"rW%GKG-fHj=$XW}:*٦R` kx:Ij z ĆIAzHbiMS43rOejA_ 3Db(sy*HZؘ,FgٌZ$1YB?#<.q*J# C=##gѦqkFdX9B8EaR֏.9Ό0Ǚ8uHҚ*J PWq>qUmdX!+6`3# A#琄K*q&{' 3BYE[ X?BXϷ}%pe5(&N%Gh"ҫ¤ULZ E,4BZ} 2ڐ]FƋ?0nW!SqfJvJ+M]jΊaM&wnݶwe$)#mjDPPӆߛO袹^"/;BWJfG-nWL)e&P# 4G`bm>w`dpfjR0RvlWMg_yFCS;F0;-dR|FZWCZzA&jFd sѢc~>O10B=E!_+ fBFDT:h:"L@EJ#T! 8ƈ#6 9LjLA(Tј: 58KDRXwtKPj{KmNwLa"Fʑ#6Gxi ,LLQOiFLsLv=JM;F8>mv rZ+$)UI@$Rv&.-%ï|s.aR(u7ٞ/ sg2g=̙~@֗ȆV2M&V䫙 Azx 0 Z>x7NuӒG~|RNj_dAW$iX'` l$4F*S;LF}^3ß !tɎnlnynĦd6 yULBɿɳ^56Ǖ-I0]2P-04ʡ_u㋑pſǐ d-` `Fu!X$3‹s5գ*ybR:&YJ[!YzB͒C̥| JuAH6DIR+K |~ly4)f|$`t#_6W>J:Km1Ȍv &5Hlϣ}Cɒj+g 9ǁR㴑o+ R! R! g KmNX\7{`'dr:4B,XH2ZKmY[#|͸1p!ũJ)B'd@C5 !ERP#EKɛ1lB;*JL}< &j# !7FV7Kmmv$~ 3:Bd 3̴ws=Kԣ6es:I͹3t9c,l!cf3`/#zmIC ͐,QMg)Ida9Xl!Cr$i/2 qF${̔Fky%a>b#]lv N:]́jd_mf*+P[Wq|&", 3 A1:1FJ*5Ұ7}aulSdǺ$l+zem4Nj0BD-6z#Tz] 9.Ld<|bCN5ZWeM g2#YD*: "Nv1`4fDc~#=&r"ŇcdSG!RWDLulnX".M2pꖑ-JhgP|Y&+6D5ml wZʊE~[b*5$fvѐɌxM^B KN4"=I**f!8olWD#zɏO~ajUX7.F~Es)*3,CY̅BYsR$c]ƣ>#vqIp.7BMnpgbHNad@1^6z2E8ldv%z·IM#M ,87~|oa.y*ebt,T42!o,ȘJD'/>yT\ 9Ffe& P812*i/6Gl늉ɏvSo#Gll5n|pGݐj,jF[@W=H:sҘ~Ҙf< tx-wE&=_̌ sj=[b  ZNdZJ:+>LC]<A2”Fl17C^W\27ewȋB+lq=D.56R56RU\Y\%q 2=]MfM? :?M\d"7dR#jytŐɇ,YEm~wI 02ZbcqVN.pMB=YU 6TUЈ)"O!"qXMtFVH>W98J4]$&<rS|4=+q ~jNKr9UvPUuLsΈD w" Cx]&BN%L;gdlԣmX.@#jneJeUJ%*{ +B3H0!Fn*?PO)Iݘ<|iB])I<&|(I!/ M] (M@8hlWIF#F6Ku?GSɄp3DYJȉj|=lF7Ʌl87"CW'a@ɵ7ɇ`9UAZf6=Ԉ}tS +Nd16˿zZLɒBTWTN~#!P+_]dbU*ӝqZZ,\#ɥjLLψ{2i2fd4YW|7?.K4”&$NI29W#fgR#,aq8O ؍Pٿ+FvehdȑûI6O||^~GFRh#6E6T'R*U*s)Uݍz$1knn_a6e&쒠Ho&M 03dpzH9+V4F՚çH6\3b \:fbX_b+F䶎)Sl?M)53۬(`I !ߗI9+ŹJ/ B-ztkIgUW+k&^M6:yN[ ,1޹3V;W}^nWؕe6M1P1 3.6drbt:WM-1rqZՓlW>rWYGX*4Y$Yi742;&8Fa&I&Uei #zB6]2a#0Sy+>*F&"O[/=i)ɒR[f׎\|'f҃8"1J)VW#;8WbMpxrp[Zz ]!6=+f r[dA1rR]gIw\q6?r3G')\P2"}JREDcYN߲4H{QΜ+f#F8~dڥ] t1~ (2c`g,;jp*gFO1qUgMi1'Εg\y9z3#.zt*&\vtv!WdJsYLrW :SoAFDtI^6-jCb-l|H/jC O)xYxS3" ٦JVb#%՞D4Lg.筜9?u1ѵw9b3ey犥ѩJ:Ԇ>K4e0x2 U(=W(%1#{L(ń5sePy_˱Ӻ<H]F&T#ٔ0"CyԺ. 0Қ{j)iU&?1rLB̥Bhm_LK=9sǰ&8K{#K "Bw2tpKln索2]%k&mZ F\qF$B犌$}i).| [ Id'ȷndt5yPJ`}S^5%8HGGNt 8Y/r3|3ɶ|)rǮ N? zXLcجN6C~$2f'̮藯k״~ 5(r8𳍎I5ؕlTH"7d 2яtB9̕nbw"hwd+R&b]0 Ѿ7䗐ɇUɨvޡ_N]Sb&6L]0IFNf=;ik"4yD*d3cH,5W.WGMցɎad"Ԍ."*oruVW})rI7T$b520lv]! 憓׽J7ԽʏG|nzX`f,7gʥB$?{SbC%=w;ߪ81C͵{Y*05R/uA;6w+.Ȇe[p-L YʓLG$tR iʅTOu^!IID &ɍ~ 5/b.o/ |. ijy_'\6-m|iwSc0U.Sж+\8JՄ |Xgs\*hj>K9>/$&C22B>y^q<gFo-H5+I+>R7N&Lx!o6Wnaaʭj(BzJeSfFfO3`0R_zzjo!ަ'lם`W ZT`.-ï{5hJK"7\R#TC-dFwj2fdt%k=GȲE tv(:ŎOd 2Wd gidä|.=Pi2X$k+~JEK-xR uX![j`&O:5I6#3cd:,Lw]0m>jj1rw06GfSq=켺ۇ&ޏd*B E7p;d-aRg|*=~ 6&&vC D$Mj4r[yҊRL5 ̍tyݖ]fWJFz|1RqUl=dru-Kĩ0u݆GmƋX)U!ַ1H#r5?V+)ZʤAU ~~9M9,#E>IzS)51wL‡sS7פ W(%YR>FjS̭3Zl:NH?8$6^lR)J쾎@lVW#ĵ|=r av[5DgiR~阒0µj5Rhk V%7hX8@2+ۚqD"K&Bs[7}2qǽm+V?qNQd/RzǗq;@43ҫ&B4 סjiPRwBKj:)}G=XJ]-2:tYE )M/0}Gҥ]`dөGa|Q,toyN1Ip\MhrБu#))?ٺ:12SW=Mm]4m,mT/UUWQHdBJj2hdj!O_{e ^E5G!"~8 OP}TsQ8&a9^gcF 16GjILgDMȊzXtdI[~^PY6c,!קK.6UjV:Hnz[Z Ǩ8]fjk~yǼZ$9l56#SY(nK%3^vj틴['ճ|?)m\Snad/r'2*;)Z5HdaC eWmaS:.v:e6]wO3社81Ӏh3& ]N}Gɜȉq` r Bdžǽ?~0-ȉu ekZ.;j,Nĺ4e:-Lܕiidrvifx4?c.dqvt[gxP^ݖ)?ce 8\R%G8mnG^+&ر,92[g-GX&r h-x+ђP52!ًIzXs@iRs8ٕ6 .:32_`<ծmbS[mQr6K192;23=8;BJ0YRo8+k' !\L}:XB?1ҾG&[kB%!5e:REꨅ*+dT\_jW6 klMW{3FFgZiPBM}r V9ĹB$ {ތ^Lms`p x <>[ڊr[SL7 򭦹%Z [FFsI?wToHkwU㜠tW6i#;j``E# *6^0hMINSȑz5 Fؚ:$FV9RϔFU[K1t dA%yLd2-F[ȶ(#"3aQJÃlj-" R\5hb)8HBBE-$"[Hؤܩ6B˕R8Gdkzd3Lp-\#jq#S?׼qrɌ,oOٶWr{E#\FRȹyi -ei9k`-s8$$}␐Fjm~u*10T$F P#ruRC$򪜊zٕNp`Ƴm~$ly^ ~!qX*5Jo8kqqz#r>NkZfd~|+#KW"aQ#)ngK~㴥|='R.¦l櫞T-|?:aRj!oEĉKx,NcTIji ^is<~d3Fx鑔6;B%8B&9fHk#&Gcȷr.luRz?Me}W|۔T=|#3atdo:웦O B^/[!rջ'fbs`R-MNY/,ve*aJ;$dKSN2i֢Ԍ#lԼ{"a,yi'FǓ6%[j>< I,u$߮y䰭]s͡ yRFjgeGm mVȐ2L~h谹a=otNkrm,-WMl\qiŬm8Lb0prn&G2~ǬW ,s}|ZI3}jg#)azv]ܸn񮾛[/8l*S%qf3ھt!zMO6m=1=dO4wf )\ Ms \p3(Ya[ԘgLrt[2f.ً6'R% LBMRL|md#`3vPqud5Ex~V3g{n "8{*r}"!z$~  pO_;V󸮾 $,B~.mT霦av%$]Crx.#&u~$(߯w%;/2_"]G Vlx' ƫcCͅꡭgt^^a=8Z~ Ru2аȀKYOw`}.NqTȏCT9_A28) OOD3NRQܟjrFo $I[,5dH7.¯IbqIDn pe]ޯNHru NxfwW9LU/hQO8Lg@m`51S㮂t~5B#$!d q``~! H Y0ŔFȩ9Do&[涖W̥k7qFp\}o\/+&4rZ*GmQZ`z \M3͟#K$ƾ>hP5(~FcTZhc{O$~/"6ȐzB~OFlfe=+çڪo~Ԧ3Ү~[Ù9ϼ_6c)|=|}ItS[WA$|sk aãv&!MCIvg&!,4GUn;ʄQ)g9dJplyt Id~lYhDL"Jd~4BL5D(e~d#K#4RѸ.W72NP kDj 8;DT*dl mv'i0jSFadu-uؘ7~1%C-&&LHjꁁM d!K@XaѿLbi)L#tH!TFU*Ll+=]ry6ia9 I&%Gw3]r+8|/aHF^afS5W|r}WdL6Kr2YIOK[8 d36zCtJwBcR"K">dҧǤJșL &2B̿hȬJdʥJ=]?fBXO4-#|6k-&6e#.qKE3㏌H2e5rkޑ?}K%JLOR-|t:;Z`M?> vFFR3iaaJ1[aZfͦ #MV2gїmF0 ɑ]șx3FFR?3GHY?=c=PK$%SL:=lHVҩ!~z 4B1dA6R_쮓J-(C&8~ 4)Wx;IˤTNʩRQǔB93, f\#NZ7֍ ]kq ȏXp7ѮNa (E\*KҒ;S%gU]}fyev-IU#L>ٮfe^k-K WE< D\5H5e5Q9'H:AQfR]-UGҍ$n W $*r| f1 6ekGL5XQ)`W)*Hle ;dB$C!dIWI8ɄӪ:-ɸENE.iRHKiTE9U6U 4sx,@ Z YJN͙bU@ LN#7[lѦ݂cNwY4`D)Sb\g"dȇ+¹aj@/UMpiHV=H| 8B=ggHTb3g- 6B>5 |d> a] 81]ȧdaBwP)PB9 SP]b| L>AU>[@`c?0M';ε?e /RLy2%Ozw[ S91G̓ e$|9?{RH 6U |*>&3T:U2+U]s5WoP,PM4B @C3lzEue8%A I2[@*E=_ ȓ!48e$Hu} OtQ+3_ M'AT[e𣑳f HhTɆ* IfϬk͵@Lqo0R92 -= ?JBH^Pe3H+"D_'E ILa#|{+c)-SeypGfl46l4D;1D1(ohHF#4).nDI)FLf Hjܬ$c4^'xȊ D)#WD(9["I"}SN 50B2x V*T8Un |E4ψH^BR OuaHȀ`Z9U{8W2$TN5Q#S#͵uy27xsLYfSFCZ7Hn*y$F71J9U@dA2͸NӮO77)x(9 ĸ,ʮ9q;쇲$2iRiMTxsTޮw@ro:E*''؎^Om*`(d( fq޵b²}+ OT@5")+̹X4HdIxTxꜛْ,T\b *cR$;7dMw3d!"ȓT=2[ޣɓd=Kve("A\-YKgG@2=%!3d"c,]l.8\L(0k\9Y% sI~$ q>ԕ4HGB'wM&Jt B nSO Jh|$gS5D9L5'+T;e: OX5ojf!- Rؤ'iQto]s[63םt B^b2c2ǫI%8go~^{/x,$RM1]MHq6UciZf; ,@9eH~Ziy`8lN`Lf i'вx%S\bLrr>; )r"x?yK]𖌘 &lm("ѯ2@~m PM"8cEL$U27 Z rHc QH(hG5*Gs 9e@ R3Jceg{K2P }*+w P=X̎\,~Y,iT($L3_u i8:Lu~l' X''klo;eҡ+E UYk 3 ו/|)X& f㺸q$6-ogi e'榀! 5b4Z~'Υbe&/%œ),٤Yb>/%Iʔfrvc2YTF2m$WNX"x#8gy]`~ZЪ@Jc0@L>H׎31/#麾_PZywo'H͜JC^_b8Ъ(6#p6VD&! U&AH*6ɇ*KVOTP捯2RNş0!;c d͗.@ i KHy0Ɉ$ TN"(#| %nb,5Zd2^c$ES R0"Z"@*™ѡ%.@gZ,GTLLTL Z Ri?D/[s[ġiaH!5H\z":Gs1l:q ˴5L RHDF9Kw[D MERe)rq@4Tr=GH5z *mX,';.*㕀doD\9H,ɅTxs~T7jRCA3]49LT$|rv*YRHD%Dn(I67Us/<R~O%bǁ\@k*W^L(\Ax{H%}ywT<|\O~pvf/q  =Z !iZ%@aWQR^Jjlϛ9ͫ_<\O{pX}1D.ܸ[vFՃr=? =z}r m[O?<ՃOq2q^ȶvx+*I͍ZHie٢&,7#BRJJz{nv8qlLJ]^eI>_`k|;\-oաNGo Rk<^D& Zj]uӥR+_g/YUoDWڅǥFG zau6X feWrZCBWԉ_[ oVUx65$pJ8faIwhםXvx*"{GAuGyTh} _|?TPh,.*|=Ǩ7g~6@; f8.s{M4uOx:lG=Q6׺ZuW2t}yA*;N6;eh|>jOSjUVD]` pW8tO?HWQpy C5%p , U{`n~?<>vg,_a޶xqi\3FgS~B*r!_hV\J-%)).);5LWsmQ5ux}m)g>ߨ^CO 𽒸i,f(S?WNAh0a3,X/ O5;(&| f]c+FMg#J7/΂Vz&:8v4xF_)z8ōv6ދ&$&^vǺ*|h}&Ѕ/(b g6؉OfwԴ1-`ISX{QCt_PwO;l%$u76߰H_I$} Z+G1e2ڼyHA=fG_%̌AsbҊגwf[{N!]u\&y[/^Yo e9Ynnø)9lFXӷYTz>v>2`:Z/Ve<]ŧLhW,f@K]V;pYjIۓ8Gv:t]?:'Ry-uLOC{8PKҍ$8؋8y`( zkKO`(SեA-]b4ّfҤo켷LO6ʻ\OvS}q+ "}FS:7സOtxr{ 蜴d6Z [Oq:{,iBIizk5$n^[ATdkbfqRcj{ۻ[+/C]ݐp.4rM^ڙ5KkGa9=n`-(ZND˩Ěf0F/ijieA{.7RD^*ޖ>Ogm{gvPI~>u<ѥ݌ GNvG>O,!IǤC4+َʼ Rg:݇#iҢOientz!O,2\$,;fzs*9Ugdw#vG)sJ{Ř9u9|6 ݯ}v NGAu6ЗuM{yP8_^"xAYn N0SnUt}P'GN=(i9q;ZW}=g7(dӶWxm8ۇx8O@(R։\qNޠ8>%Uoo<ꎹ/oG͞ٶMX:UvG&5KH=/eč2y7AEX"H~/dGYɴDic\y>+|h4_.pK%hd}]nIy6 ~>Y:>iRV"+E)nק,7{קv>˟#?bMG4`|>}>]ק;rjΦJӯwl̆cuO֧߫{W{ =^i~׍['*|w~SNw~-0wsZ=+u'3Q=|ʹ7y}>q!`/=ώe}Y1I$> g;˓ŒxPE;cbّx@%3Lcu_==TH8*6K>{s>(ZzͲ֧-XW;ޔryKlf/v >Z>IoHvJqm;#[֧Ծ&/q@N?^~}ڲ^v|T:ڥTy *qF^o|S<·N{Ԇdwa/[ոzteqQ6gQendstream endobj 322 0 obj << /Filter /FlateDecode /Length 8093 >> stream x]Y$7r~_QlV>{l, {g ?H0G3RH{;IVge4\:|{曇͇?$Z/{sxJԇhQW_䔎֋R>JkO]}hWߵvUzx}x7G 1]}ڠ-nZXt}lWҮ]]hWnW\_]i8o^ISMij7vv~n #X[qCʛ]}x*3}Sm\v[o\jݮjW j}]=r}kezٮ~ۮ]]uF^bJc|U e>Ǿze6:nNkX;VZ];G};ߪ~j7 Ю~ܨOUJ~zsxߟWn.8/6*qu_[~unUޗoN<etp%~!qCV~/$F`Zl^%,#wsw}mWvU8.\_6$WlW]}ծL/\TK[Ʀ pxćo>^ioby&.ڤ|ІWܢGB)zQտ_ GyM#/= Q2ϋ Aŧo!-UEA`UuWJKOߩ^.2 Eisw,RO%KUEQgjvYz f:/aR64۹;h-u W9׉Lf9Es53R2OQN/lU>-?iЋ9vH TK]f4ZY9wwP~RLviԌvgsycj]!"sw j^-.3 9}_4?5mraͼɋ{f;wG͒]V,$j]f4 T4 -w@=*"ӨY6~ƚj;"1حp4]ww,ѝayi,QOgAᩌS^"ϠWag{Q!azͬ"럚eQmvUQ/qüpK.񌚑=`&T6ې6Nit"n{ ar|]b`t#ssȲG$VEA/d>5̪Q3z0SviQ Vn9 n#0:㊴LnTn{ݼKr労LnssY h7B (O]f4 !oUۃn³p ]ft.o%Uۃn@ΛEAdV"X5ۻ=jF|#j;JR'en{Aue*LnFbXuۻ=F`oȌ,3hJ f{_l([IB>~ RJ#Rt$&#yo&,?~zcOR׆8TOǟO:_?Y)~NrcI;Xꈔ9q}y17n?|wx@u,]%><'T7F!$} (5z>xLፔ8Ķra53Cx9b \ _qJ5;J?ev\2p$ٱ*Z5O44ōF2]Jj?B# ;jEakp.9d: O;|<`j@gj"oC4fڝYɢUϸ,Ki-]lToNc9;bM Am7SHOpȚ񞹝X²uA,+>Չy &TVc:,AXV9bMUB \̮2ud[%EI(?(*mc_I1BUF7n.TKy~҂kF6I?!첣RJ%/ܥOCHpikb:We}*@P+ 9iEQꦐ$&HĎˊ 쫡Tl{tcYSVr -C_՗qDj &H}O'ݾ'~lwV$r,OtU|ʻ6s_ D&cZ8F+[9QT~o3䵗uKIk~[%܋N$BbuUVlj6Ӟ@n'=8%*=QUY3NHg^uՈŬш[')> œr˷I4ĹM_$͞Ws{2w`z{,ω7D9Ǎ[)ֻ[' vיz;cx(uQO@9(&PRр!Zʶ )+aDyD3&LH?[\qJqMS26DyD#7SyK֭_,/#sW"nv/P1Dk dBɚ 'y6ɳV3 Cg3řŘ%k/Sdɛն-y!'ѾU+7G81Gj6OT~q~yLYba~aeQ[T24Z3%%l'SJ>)9>2ZxP0OBIBL@A:TKr%V~'$UJʘzS@=@`wWx Ska%Jk+S gJɋ TVL'=NH#T W;R B>᠁J8D\zy)"^ ?O2%8c̤L#1xupJ<jX, XE#|yuQŀuH) 9345fRt8`WQWXO(XgJ)J} ; Xлx:ǽGZ_8YǮ:!dEedӽDcb1gC ODT ss 3'-F'qU0V](@I8*S8]JRLi(Ѕa7d\F9> HFQ3~2{ r"ABXH2 *E RyJbƙd+ @wІ(U6Cz`*'$)؆xPL( QHp(,I瑢JPK@)VzO7C!Pf%BZ N7  xg;ok`ƓuQBn<{tll7=8&uf"M=7@M7`iMp%T8(FYT-`|EVROX U+xR\*)VJ* W|du7|$W񍧧͊oxTJ tVx<3>QlAT8p`8b6kQ m o5J*ٴ16|ڔK ;%HS0ebX azpT/V`S l*Z u5q rE6ɸR΁hrIhqgUhCh{hӄTd#C x BF6u7&=Iٜ2vA.cHKQ T], 4Au#KmE8'(95IT:!HB^q ƻ*l"U X*Jvs)V7j@LO) 5;y̶6B1Ν8׆ m)uƒa (\pFSsPpñV:c],c8N2<\pIjiښt'&DV Κ6= ^`Pr"n2*H 7\W(i}+҉:@'Q/𭣔FD>Z& @eLiPi>V%A}k T  :劘XantX̂"j_Rʊ},G!!ꐏժ8|"lpQˆ,=h‚Oc{49HE>9|rH~8I:9ԡF:8`x-?tjJW䃮]0LA>zE>  E:Y6 t8ME>b9 )q|#gdL S [ObB/>0;z{]<18Ү @5|vӉ87pi'\&!6:\0YJSsHșZt F%Jj"_S8)'U(i/I0) d/ dѫgl{F!'7$C6f.,1J{s+\-a̖ ih'ejL,Wr*4#ŖBv/.gVSp=ܼ_\bJЋ!?P|cSOE86!fi )sC*>pЋ ;a1BPjwԄW ٜ2pBV'1z A0/bl*4('hd>)&oq Ls#J~^^ ȊLq!QLKZ d+Pk9La)ҼIʶuQ)ۃ)Z_>lnmSd&xew|Us#UjG yUvwÃb[:l`TC74JwX*˶D`NZkJJC)7FPwCVLd(QBJ!匈MY,ɔ.R7NG+E>Oaz*[3Q wp"X,(6;8Wk9WfQCeT1EQ+!XAl4sI1gDy-{ F)ْu^`y.xAxwKa1LrdstJ%0HW(["^[XDCj +u k;@29ğ~J蘊yL1jzOZhɍ++y/.TŅ-.ǃ2p[=\2paKPzSV0ZPx";пڲpq q1tt|ޟ-"ź|^}tݻ7ۇBHāءHKNJci#dqM~iFӾ n[?'>}픅pmo/o> Q^ yp8HiON^΅>9ӊ0GPwǫyoN:R->)ݱ)g^_3|4`z8a!w&v;}ƙ3=9\*cyßck(%Nvϫսo }W:t< x~{ b&ls2|97E"z )5*c *{k~櫵U^=|dH9~Տ => stream xM=;ܷ⿜Y_6^XF j!̑-ɀz&# ܧowSu_3}?S?5/<}_C˟?վ,3M?ӏſ_c}u-Y?~o3?ǿ:_G7_ۿ{k?2g>T[Y?9[[Ͼs?qM?RiwM蜯R~vlg\Y8 ?>|A}k> ܗ?[R~sZ?gYs^Ӿ/6?vY<@-=|X?-ks[K_A/˴l|e'uʴ[G^wy{XWyC?{ӵ\??f϶g>tt9Q_jOy}YDžs_?/ge[[%WU_ [C˟:iy=jٗ=~~s\KQ8߮OLsK'e4owOy@g[_|-u| 廙uV\0)?)~ Do}?>Ҵz/en$TTZeV{o< >>UΒ<2ogteg:˄JLJ!{Y?&|LO=2ȺqߟyK쮦}|kXn¦ę7cܕ];| w&|Jk-e.;͐Z"TR|@t >ޯp 3MEas_ L>ZQ¼KDFN(ڷpɒLk #\۱F-,񕑡ߺ~-a'Zl4ѷɗ_Jg"u+"Η,t O&%r/h͌Ⱦu^¦D.؛p1vc# c\eA&Տׯ&\BˁoH WO'{ y0^L\LJy VE+aS"]6 X6%|w5vM7`_Mț@>F~/a[*oq!uq0l,o>W{}&='>r>xƢ)1/z܏l$P FZ>Slen.!~8':R¦;?;f0=ܚ(mMj?h J-Fr0O28lJ0Mdn %CJxdH+|a%CFJtH+3>gQ1ٓ 'aSzנ,*M&›Ϲ͍̇eN>ٞ7Q"A5k1͍qIc^ya@ Ʊ񪴶K8~æDX5~RgsVGpؔHu~f'VFpt<\źyYaS"M|bZaSj3hڶSپ3"K.}Z's[筎06PBlfv6kuM9󝷍ȯl}hN-6 yYaS"m݊mq^gsVoؔZ[_ٜsȨٕ"W:|` [O8¦hUaSB6BF!dDVؔβZT`unPS+\B T;dDUxd%,& $:%5y1XaSB:VԲ>$d όQ!:VS~:qk5Y6%:چXSaSz͗<5Xőq^IQG}@VVϮONp -LuwIp]Ωp a ڊVSQP+6Lk$s*lJ\?, mD>fѭ0x>g.%'r7, ױ`e>QPo/Zg, h w:&OY.!iLӹ~%QdI@#PXݶG"K~# x2X2, h 26쒖C(,'lJ:F_!SdY@Oؔȿw_Mkn\*4'\Bo `^Y+"{¦ !hhRE4K޾4Zՠ "Kq{U;P{Ok }Uw% K+?K!G}|ѥ,- 1,*{+-؇V4K+>8<ۊ.ie Ia>ԃ5:Cʲ°);zp?+KK äݼp֐0lJͻX}r°)!b*cw;ѧ,/i uW x.yei 2 ֳfgZԊա9 gH^Yf.!}rH!}KrİpsGܺ $1\B=9f +Læ]hmܫW4"MlW_IrҀ.!DMX)S[}rð)q%jP>}eIa3'@L=W$K>ujGwh.!)lv>fR"b? }62Ű)aDկ>frN:(P 6>&R#utk} F e5˘æ[|GVq:\BܵƑk-8kOY0.!YXS/R;+KaS{|1f Stx'mǐRt11\Bܵ^pHק,]jH nZRt1\B%lpLאR|!1lJI߱XKay/>Ζ.fRbؔڧ:kL8LpLYkfoTRK]>͒p LC>r)mv<8&,[j{!ySj.5LKvL5˖%DWEvvd 5K%XH-e*};ævQ=|5NK:Β!g9\tؔ01 +>æJd>,.:\B8yeMjE\4:\Bo5D㍙>æB($fE\<pt=.>S<.#\B\wP3ji,#lJϸyWϒd0& t,paaeƂ3JewO!:\Bxڳ.g\#tؔXqWzhZ``Y6%Vg|!g9\tXѹ`MyLY.!i`?cp 'h4\j[1:\B9gl)>æĺ9ZvY06%| A,2gĵ͑~}5Kk>g)\GXa~"P|5{If9' V%QH!uK*# W/p&0鰲fm3gXqf)-дH={d\#lJ\-iU {d\#lJ?ѳG;¤VZӡG8%RC)Pf0pm;U[=xdTI#lJ\Ft,ydTy#lJ9oZ=ydT!#\BQ+]Mj)syF,XT]ګ_ wdP!#L:BZhX# aQn6)EOOhwشCG2% $ȴ!ݥ:2Ф6% m--;2.!V M-R#udD#lJ9HǻQGF9¦ĵvM ] *4qKC=xdT#lJ/GIy=2.!3.h)pq)qiQY# I!beOP0 (ծ_k|g;p a9 pBg ;sIE= 4f0~lk7Hէ# v4G# e,\BQ9,wt4M; S],?}h(#IebX# %,\Bk;3Gr?NӳP9%Nԓd}H;(GXؔ5UvݡP9¦1F2\.! Sm@s4oM5mw+1~܁2Α.!ִ>J(gHa-d:GFpYPPW5@P84%q[@G;1xK;@yռ q4Ku[;ƪ2T6%<# ,q0w,H(daSFn..> $P0鰶Aei,\B\-Z ( @&p xAh 똕砌q4Mu'Hm(t1 hpqțNHMYؔ0ʗoFHfui6 \vR<;2KKYtX5HLKXXTiv6i:,.Icblpށ2$.!]`1 e5 ,2ZZBϩ,.ͪb5䎟^Ijd4McLSY\W%PfwTհ) }c{.ˠKjzȍ#aCelftIb W.W2 6%̜۳sY\¦jH.q\Ca=e%,\B<^'\@fp1:x@eqi& W0Vm^ph@eqi2  $I5=ݎU2l6%>Y^¤Xff4I#|cvJ2WZdx֨kҜy`fwIb EĈC{0ˠKktإxQi#e̥y5lJ܍Zq[Heȥi5\Byp 4Ks.KKktxB85t ̣MDƼ6%\̵j\X1@ͫaSJƦȊJf +Xw~TL0PkXZ 77+f$y5L:#[@ %ف3.!\턟*p)#Ō5MgP ֵg5Ku;{#+f)6lJ3=GV

?a@= (8JiaS,+Z-9(K!J|NPbt%g\Wo2.!VLz߄ enG-lJ \^T#܎2ZؔX;9o8ytDQF HMkBS_26%^mрzK!0py_6`.!v,^յӻ(I+7Vy<23PxdX/`tmeGy(lJs3|_<Qxd0WQu.(8Day{[OGEmdNB(\B͖=cǽP. f\>'ۍNI2>ypGb'%S~P. 詰D]W\lP& ۛ]qo(L:I[Kފ=8NI>fvDFÑqFţ>ɫl\,Gf'#Gq3#?@iaS˝G-[XbCeo|2S\.!3$]ĽIbYثyӻ(Kcր+'5Bga` cP>Vϓ岰)a~mvj9ҙ(Gu:3Kyu8h$HaS+F2Ȋ\2Rؔqy1Ίd6C)\B9@{# Ep qEFv4m"P< efdщd.C(lJw n*1vF$3 Gb^3zцdC(\Bl5Gpu <ƀGa VЗxdB(lJ 6[5nQؔX3YQؔ2}ឬuy Ƹͅif4I\%hA2{.!K:vY^ű7>Ϭ0Fp 7".;:(K~Fc+ΗQ{¦u6NeG-lJZR8lsGQ` {Dۙ?Giǘ(s>lbE2|FQ` ;DY%g@pgC'yN,=Qw¦+#ݶ(;kaSb]^] / {7KǛ$GaSb&t&$1GbM͂迣 Qt0ߔކ0 ȩ0܎,XX?8](M s϶΀dB(L:ۼꝐVW<Ȝ@Qص7׻{W(M m/%nعG,¦ST3#FaSb5޾Wt# GaSo9q}:rg@w1.>÷8tɉkr暣P]KTW"WkZڞH¦3=3J[X島q0\kFQ` |ŮeGy-lJ[Q/cdqNgۣ.!0݁uZa3zkŵ) y`2#.!H3%Q{% ss?]5l[@w3ŦsFQt ޴Qz¦~vQp&No2ߣ6%V j(q>naܛ6pAJ [0ȣGr[ؔ0< p&imWIJ r[Q[)xzE).\(!EΆ]ZgWQ{¦8~#L.&(=GaSb.bEr"P< +jVJN$sGaSb'fROgzroE26%VlXKR{3 !0 Oe\D2|6%̾ZUY;o{+ 声)fp Dd>C(lJ=ar4#PB f_Pyg( I5[WNd>C(lJ\>U|RQ*w"PD =Z%rρމd.C)lJ/Hf4%~ 8e(ʂތdNCI)lJKcc'ʷIӛh((K+NtތdVcX Cݞ8pNWH4¦{֑qNC岋wāRnbj6kR~¦Nw1Il @ (+^5w9%)ΫE>(MkOYQ}¦z^R\U:=ʬ[u U|eG-lJ0Qb~%i8q26%v^eG-\B?eSy`eG-\BP?5 (֋8ދd>C )lJ!Z@H3¤v1_H2%ꚝbшd.C )lJ 1= z' E)skt+sg)l"RޮB2' :+ Ep ff|9e(#IֈQ;f($K5 Nר"s"H W[?h;9LưUi=vBu7\H0¦иSgyèX^~-\BBEpm&kEp goU 9Z4,؆2ǣ6%VLOjseGI-lJ@=jv.hg2ϣ6%,`yڃ/%VG(\Bl;|_fV?zW(M駒fG6YxȜQؔ9W"#JGaSb- &ngw.$qFaz;#;Y Ep ׳U;4 .$s GaSbQ~0|Gs!PH +j:=ކ$C()L:D*: p fYpRRؔRu0&$3 Ib'٧s!PF Yٴe6|H1¢*nخ/ QtoR|1x`(KT=]P8ރdB(lJX+ol^K=՞7SYȀh~LQfx¤ÞSϋenGH-\B8{k 23ZxdXd-Pbt%^ө:8(M5= Ps¤l{+)tC>-q_qC\ {Mq_t,8~tDQ0 z'(It2IΰeG(lJySM zz[Yp }$EaSz+h#| _~y_(Mk%odC(lJif}v 6$Gw=3y!< ڙU[2Q f]%25$B(L:oOg$}rтP0 hpWн܅pQ0Q7Fy 墰)fI*2v P. WQTC AyqٙK%]mڭl; Hb.%_|M#)Jz;|]Qx¦P^7pa}Qz¦eQz%nӽ ;_y08?7(; j0ʬBZ]nܔ^@5ʜBZؔXӃCbe^gȀ 7 %>G1-L:.mAV[(K-/{z'E)gLO26%F[#X V(9kaS¼~ ۡ&̼Ė`2&v^db\vԳsoVu8s PT x^D=uqQg+M]-`lF_ye)h +(s=jaSѕD;zg)UwGy02(=laaeTau$|Qyd [ShbpD` tqufDo2.!0]sv\ ~(: laSzI"jGW Qv%+6UzGeȰ)̽%[ؔXσv[p:[y%)ʼn/<[ؔX3#_3ۯk9e)qEClM (>mgTPO;a!7Gb KG;w(s=JFaSbmP͒eG(lJ4szg%)*; YQ|¦ڑފd>C)lJ9ɻu4ыd>C!)lJZc3"J +iZMKywA >$HaS+!NwއdC!)lJl3X{/' 0鰯ظ!N9qHaQ*iJ( IQt˹bt;7!P6 Lk Qؔ@P'/ݰ6a(I=WkM/,ېd(K=K]/f>$GaSb5͂;qgW|H1¦WH;z}H1¦j d%`C2x.!̽6#b<eИ{vv^sGD.!0]- ӵ~ph ((3=GY9(M=w;>s:cţp _opsoC26%մXPHf2%#mYLRtXQ'[xo ep%?2oT&V̸7xz9 )aƕDSfdB(<2eKh#EbW'ZX68xY(M482V9 墰)q5 ȜQOR%eSf>k`.!vw.Փw==ȼrQؔXO3W|=E0?$sEaag'+pQ\(K3fӺӎݛdB(\B\[<IwG[{#0鰖gcS{9ų)vt7AQB L?ْ2ؠ(M niot}|Pq¦z8wB, f^ɀ;|kzp ț(|Pq¤nλQ;12{ϑ )ndߑ Ţp ʯ5<εw_ 㑹 %)Eׯl~yXI= aW #JDaås(ppP$ r 8zdbXeƼɳ瑹 崰)OuNK= 瑟[uyȰtm޹8aN(s9 iaSb&㳦6Z(I6*zz3Qw¦l!̎bZxdr'z7Y0vg( }BQJ X0QPft%vYu33CQH f]i\3/e);(7CQ( ]^z"֌{7yp v%ȃʜ`QNeލo.t #JEaSb A/ȌBQ@NeĵS)sG+¦Ċ 5~sP2 wΐº?s!p&,3kY Ep g{ p fƖ1`P: 6Wt7.G,¤Ú ]fAt#sJGaSCˎsl$sGbHfKo@2s!lk=z4G+¦S3,׷P. 5ώI^|$B(<2iHnj㩾<2WH6%̶ }U#J3fE2L3G 崰)aYrٸ$0[HH-lJ!]s\y26%Ă (OeGH-L: c%vGA-\BP\N,Qbw%ѻMubwDQV xn~evGQ-\BuUkefGP-L:zJ'Pu¦ĕS;(K',Qfw%֬^ P2&Vky'U23Zxd@t}H+V{+0ZmΉPr¦UUcBQ\ ;H/$¥(IEXPr¦𴊑:η e^G(\Bs WeU,w(;JD¬3F<{GE)[lSmMȜ2QؔZJi~=Ȍ0QtM%`ݱG*¦vnd{$B(\B 2fJ7P( ߢ0h, 6:ЦBG0ȌpQtNć[J;ZW(M}Cy G,¤y\Cڟ{dB(lJyͽ]lQxd0JhmV`<2W1QxdسycwP0 [30pWk0b*#Î˹"rw$B(<2$;>sd~By(lJ*T.?Ű bՋ:[̣ߑ e)ʃ+]di:iaSbik[>*}enG9-lJaQv¤.ҩ w~enG)-lJ @:c<ɽsDQL hZ[ [wDQT 5o q9G&v8De98Knܳ9 e)s^`P6 gv,n3JY p qE#sdb\~撴E3O<۟ʗކd.C-lJ`vqR-hs92K+NGf Jdv!(s=laSzz07_qFh ;Ky_=o e̽1\2[ؔXٳQf|#þ 3~tFQ\ kzdxFQ\ Jy3n (=JkbMfl}<eGi-lJ`iGY7|[ؔX32e6Y2#.!;|kWQb{%ĺM9hpFQj ft_qFQj +{:u=3\`[v׊S2(E]7ug!EQZ K.6Rk2ۣp.!ԳS' (s= GaSC](=JGaSbϊʛwegࣰv8zȼQؔXK!b'n,Hf/#.v6k}6Oz z~=z;O<&0ӵb%_ӻQ( M3,93|Pؔ@Mg[s)_N=2_@6%VϬ 9 %)J<Xۏ[(M54G{u4`qtP( ע{ow#FaSoaE`98˦7 P8 ;9YVOU܅QXIjZbP6 ;:WĽ Hf.%Jc5HQtZ'?]7.$33E\WOkqє $JlaSGڈL Rؔފ4sB26%vvNw!PZ kjfԖsEDe()E|^Q=]H0¦Ċ'r!PH :7hF|Ҝ[Ut^$3F?΍og^$JFaS?Jog Y|Qؔ@Puݳ^ɡXH3¦j*~H3¦ĞΉs|QXMᇅ>LQ@Q%qC2!.!̾yǾhy<܎1ؐc(MlrYd(K553碅dC(lJ`6l|.$Fa=͌9m=\Hf1¤yˠFP^(\BY\zu#g$?HxdX+T%|3 h&-7=G^9$lJ[^Ž3W /[Ͱ3~F!aSbr3W XPs83W Dxqr6}D¦Xc-T ܟ1Hؔ@, +zgL,6%-{~λ?Czep Rd7CgD,6%.nw='D<&։,[ INv ӈ Ώkp !֊,([_!救¦v0NgdȟbRؔjOx]̟Rؔ8"1]w؟!RxdR#infGG +$Kh(Ѓ3WB ;2.qE܀ "amƉZW Hk0 aSoY.:0 aSbJr+M;ssψ^)$lJ\pψ^A$lJ3䄁3 fă[ =g<06%f,3NO?yp a盙0i:h^I$L:X9k"{X^9$lJp\G$dLZ&TRtp"HXT؋waa~_:eAp mJ q:Ce%\B3涳ΈYs}ؔcEG΀Y}tXeట'ꄖ5I+ J,Og<.bУyW+Vh ,+K]f3{pYq$\B1ཾp_!ꌖF¦.3RщʞE#Z9/:T C#RxEd Y2+G/h3p~:e)Q ,dLGؔXas^#:΀Y#\B^/t{ΐY#\BZQ)\޼@1kw7Ŕ3bt6%ݼ5#UgĬ>lJ w/'$EwX!0oj_#ꄖ%ՇC;\,,qf)Ζ ER4&̸/>zPyaQ \gó: kƣæw%ί@kFC̻?D7;\PT}0'2ͼA~֌G5χM{<2찹E qf)=6oxN_M5هGݏne٦E L5чKm$7kƥæ]V:tMT|8D@ńVu=&L>L:`ٱ*]lZ3"6%BoV\i?RkFæNƓS5CRM քI5ɇI+Z^5#!χGg 9#&04<2W=\MPTsi:aN٣a}Mæn#A3ӄ6wW'1bT%ijoj+џ԰)qgu[xFJn 貼bL WCװ)+cz;VFP8Pkؔz 36%;l]xKO J Fz%fZGjJz {2V^ =/f05\B<Յy%kϋ J wWͳSGZHPlؔtq 8q1cay+N!.mM>^hP3ؔei~J{h Դm>[[o1CBM~5P6fL5lJHZxhǍj~ s|#ƌ 5M3kf_]_@p 4{6+ܘ1װ)qw7M:2:HLSZJӝOYhiN Wu,D(-Cq-+!9Ҟe 6lJ_?0==e6\BG;FRK0Llw]zS{R(LlؔopCjVeI6\Brc֓ZFacæSj[ji2 2^m]b䴌4M cF6>w_1p ^wco$K9k|eh~iJ P8}u4t-/ha(Or@KYؔX}ayU=e&,L:n;F, -#0MgaSn4 eM(-#0gaSIfDю$p 6f`Y 2|6%o" Dю&)aj=%(gaa-}F"hGYؔCtsz4"N(faSD(Mfz+ Rw#2l6%zqN4QF;%zb򆕤2|6%m4c+XGZؔX}!z$ChB ^{=e##\B܃A[;P:<%ēO}l= e##L:sZ {Bha)7n' e#lJ/Ze# MaSbM֖V{>2.! Ƣ ,4sK{kX`1G8%SXR*{ȨBFt~*Jg<vȘBFإ7\8n@ Qh: Vu5 ȑ0TP&F4¦ͽWAG6%ĞX\A5&9/{bB<<3_! '4eKŨ>ފ|1G1¤RWg(ͼ7rd8 #\B*'.zqd4#lJGF5¦jhBFt؅ZSZG5%U/k`csLh$wONMMh+$Old=7G3¤vy^+ eh=od0#\BGfS=q$4#L:C1Ҏ*ٞ72.!Pzbf +sXBRF>>c1Ԟm buHY.!v0x6l=!U zow|%gZrxNƂ_+RHCFϲäVm ,YkPq[jcBϲp q=|p|agOY.!E),;=æ@z>'ZrXT؉7h =֣d/E Y]felI8J.!' [3E؍w^WjLI֌.!e۝6wI=æ8~ϭji=Iäþ7UߟĞ$mj/Lt)=I#_0o~ɒCFl9L:o-|<ۘϳdQ9\Bo/YeOwKI֠.!5Ox{Lz5&K'h|j aSb5.g [crxd;!Ôg5 KNH9;[ܙ%F b^s',3a9,*\;m MCc%D bъPO`Ao5a0\BA*J [̙FQO9ȻyϯeG aa' GaSbЂ|SD9DgǼC8,7>%zy1,%GbsqN>Ԩ9\Bw֊>fQcsؔ؟!n+{)$eHaSbNZ'oF:\B쪹`Ujg/LI,9,*^yl6?]Rp 51ml[?8d,EJ( {VpvD0\B\th#5M ^hrՐG0lJY'lr$J Ş֋g"I+KH%Į ]+[# ajBN}rF){B5z!_eHBaXqnjeե,i0 {Qx@J,'I8 ۥ q'lJ8V}=\IV&`5VF+26V=1,I( 39]Wv +KF äúU)Wd#aSBlEj̐0\B 'xkn0L:!.ϪL0lJ[N\-V4Kg(E>ie IatX/VA# bK>ceHCOؔX9pP:Ș'lJ\ybv4i"I|%ĽzZ~.VIӯ~q0q:æ*u fNVؔx*aà8XavC Ϊ)a,}}LNp jۤeC ۀNs>oHjYty6% :֍G,LXE7aSb]UwC`tK{GEj"`tbM{s;Q;, m! fNgVؔ[!u> f!N'VVh_N,m"NMt^M upo8Y4.!ĩ*o\v&%:¦ĊX, ۡ9E|vxaSbH۰)Z(E X@bQbd[?.Z5G, eւޅ, {^d 8Y4љ6%`ị8I4щ&g2xۇ, 0XgA:$ л.<է9o!dDoXOvifՓw::zæv(SB;098lJ\mk{ü欎)q۴xmk7ic8\B\k/RϑΦp qųPPV^7Llގ+%-6/Z 'w2quK+@?i8\B\Wk~7{Z 2)+7L:ܡ\8N*3Nl һw.\ah::|æĵjWP6?tMkSmem'RneDK2&5sAD.!L]ua%3DJtԕ.lʦǘJz/3(:zæ~UN f)q@&@~ eCFKGtCgfO7ɡ%<2\giEkKf)qO9Hԑ6%vV`у~f#Q)ѫV+5ՄKo?Z8Hm[=fqf#PGHؔ[wCZwQ@!aSz+k)T?H8|-aQ\kuᙍ=N¦Do q}M=g- R]lP" N,dž|ݔJ&A2cjy0"o[)*O-Ⱦm6¦?Ւ{ۏ#7~?" &f7d "Ʈ(H֛%MfTU/0ܧxd=O죧}P^jHow,S7ᨋED1lQ_wf-t[~z.p9&ECYC7ᨋEDuW G=|/$v/rGs{/$kvNxjwG@8ܤ%Y1K}#<~E,oO kMGn7mwo2 ]>?IBh?̗1kkftƩ_g|G)jCdP~viOse*4?8>^zo3M5T)~x~oo~?t߿M [1R/=ː[RvD6 n}'s~rŻэ?|J._ƏL4\T3|}pZC c:Pro v^Z~ѾY];HW@:wy&Vi˻qZ &_0ɕBLPU仴ҫ1_!N~]IaXAu cwrA'  _p\iPL"unPiݱ?҉|xMb'CW_8EHS?y~s>qct„x8]q>-,@1!iC ?i? 3'P x.\Sx3tM` ? Y\>b{ {b{( {(` {( {(baD`5b@PL= " ,e8 D+ 0{(ӊ` (ъ` (L+FAo aF|#7A|7|:} Q `QAQ @  @ Q DAeZI!(b%AAI`P d!88(Q b@P b@P JHt@ղZ# `S A! b|dP d!Pb0 b!0 ` 0 b!0 `P dD1$ʌ{b{` {ì{b{b{&Pc{ TRc) $q= C1= T!C1=CA=C1=C@=C0=C@=C1=CA=SjC1=C1=2b {=b{b{b@L $ I(rb\ :.PcA\  ₑp1pb qpa(qa(qa(pu8ٻa"0 \N?-= C1Ua5f hE1V hE0ufFAu|cրo F1o F1o F1o @o0%Q@ߘ1Q  o9 L6\1jF hƀN;S^:4W銷yw~<$+F 'k :*2kyt}&h[[kA 'YTmΆ߅Ԙ!1C0/ Ң`+f$E911@!fCѡnF@|D H2)0.O00.S 2 dLa2Fā9!A|Of 11\7qtap{c\#GuőFٕ1ÿ|BسDb}+UIj\Ŭb\GjU0\U0^UA`V1E@Ǫ1"Y  YUlȻm!b ly5"`À0gx0gx05ޏW Yyٖz5\"҅?)^O?-f3bb *݌KTh@ĪH#֐^фU1XUA(UO T OAT O@T ϒLق80p]Nxd b"-h1DZ"%<dfl!Ύl>FLQ0/'>5OqصBbn aj9Qr~2r9GzrW脺]wddzU=j(0{BI]5 0%>9C Z!f 12Og:SGTGj @ aJJD @n@H#1b  b+pSi<1dlc\Tr"j ) csS_pj32~'|l[>~YlO9*W[C:vW~. Į;X10a}r_qb= '>oo jñ6[ YXy-Vy ExCMx( qxPc( ăjă#`xP0@<(A0+Ń# ,ŃxP Vj 4Ylxlx(j C8{T.K h,6M><_ϻ6 2FniVUd}Bݝ`td|?5u1dnJJm < UBAQH1%5PQĻBEqQ[(JBEUPc tah'ZCAUZCPLQkj 5֘Of b0 BZ05ZÌqPk,B f EBRH-!_\mRC] Pw3 (Ers.ŭɦ!2P(Wʀ6&dD6M`!c Cr-df]XH2Ҁt>nۨ!b{CS"fuIؼ#951cC 9ftjlm9\4S(C:!O+eY#bH$Cda 1 !2@P_0<5F2D0X(A*u2Dd20kXȺ<[X\5u oLZ@*7M)9-]}ضZ &;ђKՕ&ҟ=gwMDmO6߭*X5:5:Dmk(5"bZEԸJ9< w1j*u 5.*@UĊ`ZQP\q.r05rE\1+ Br0@U3gt1%[,KJ5~,,<9q]k diK%N˘ MȒb$*PcܫAĉR4U>MmT߶ebY23};[(K9DKԈV3%f[!JԶB5%f\#JԸJq(1QUČKDHQ(J T'J‰(QL(c,JE(Q %D@5-UD(9v3j5qPf8]ciQZ䨂Ӛ8"%taz4=mqK 9 Ö& *7&"mgG 5am#wDNbX/-#o3*9bf\'GG0I"b*9b%9$G aQL1:92Q #YA! ˦4@9" ,GN:ˑBJS9}%֑PDJԼ?&1hF8@"B0է/-|AMj1[!XM0-OrW[,Tsb\QaZU IOmP*a!ƕBPPc(,SB1HX(e!SP*aB1PX U 3m5٢섂W݌+baqxRWeEL1w9:Z,m<.bA[rCC s}:u*(P[,3 l+vI1-~qͪn{%3#[(@glXnNǨr;ۊz Z 1u Ĭ1PQc@ SR @ 0@( !$32 @1uClk$B1@`8_', KcX0u[A ,ҊA,- ,= 1`2V "c`2V$cA2V 9W@sS\j]0A r q +*R1Wt'jSc#V,*j\E@;:\_P@>1<KD!ƘKƈCRTA51$;NN1NA~pB 2b B) V)@)IpEcVjR!eTA@stgrJ-:0\ڢc0A@!8+ E,'Hr)sA :!2Nx  Dcd%UAT[DT )єBK)@ G)RT.ɫ HJ0h 4`A U)q` Y)J_)`0c)lzR 1&}NF$$'(䑲1 K!֘ó{fL^) 2 d)  )ARPS1*JJ1JAx0 B/ 0b \ Be@XA DXDX!,5FGÔLf K1 K1'{ւ'5Fd= $|**3F DP!/DC bb jF6 @lc6l6caL';F F0mF@mF1mF1mF1hKAU  &! 0 " ŀ$@.P ₌5\  B\*.cA\ A\  \*.c)r (qbs`fewA\  \ A\\\ƈ$HB0$HB0U6fC1=C1=2=0{(b@J1$HB0$HB0$IBAM1 S@.P  . Uq[A.0 @.0!.0  .P.P  .PP1.P .P  \ajJj05b W= @A 0 0 0 @ @1 S .0 .P q_cQ @0 @@ @1 @1 @1 Tj@1 @A @1 Sb @1U\1(r0(qbrbrbs (q` (\A\  şpb qpa(qa(qa( pa(r(qa\a@*H0гyvAn `/[!qSyGj)ÉT[2E-I/KnH6P y}Fua-Ocr6M!1 -r:2&#i47U>1 x;v4!" cC4$GZN Q$ M]$ OE. otyͥ>p~Kh9H]:=4G(>n:ҿg▉M閛C>c虄LOCBpiIָ0i5cd\$ -6Ά➩E>$9s 0& yyen @3E.Csr*& RPjg;p޷֜Ǵ TqaM-%M\׾Et|j(8 [ 뤔5xN6Y[^Dy, 8S\@xvj!b{[48vtm5$2E <$I p`4bl=1Na7I}Ѱ!BsbI`Ik6׾k1>  !O&ZBj,\:)uM8oWȋ} IS8CE;jJE4cj0))皈W)#͚ #dRxUܘo1I܌TkviRt6 6:}y@,907y%OK@i&Xey[ogoS3{7)d ,MJ;GXmq5H5PrՉiMVhp#/M>)cka"V]\ \Jo[BG:L8_caMI(U>/Z \75R|fx!4]<gS<vN&ug%nSG_eШs!3]bxũI as?H&5YG&{N2lDs}Zj QEeIރb'U8y3q@m,yݎѷp6WL㍂yfܵx\M{0$xq-3U ɻ6Ǻ|©EGqnH -=vulL305ק0tM-iNڵΧC/};t9N Ԭt$FKyqgL&ڐd6)ĜO&KH-20uq!-(T)OahT΅?Ôi=Cƴ% (dlY?(@fsh[(q N4Y.bZyr_Ȱͨ|/[wM WNE&$(mnV;To¦&E!gywnJ_:Nsݤdep7Y6)G[5ə>-sMM9UG@|eM)I&1-7rI|_t\-OG'sIykL6 & c흛a $gҩ|^FT &u *gyUI1w"Fu\+6Ҥq SD&Y\y1a?\bțڔ۹fmo UlyoC(9uIqDx79b3bDDϯ-6-xdsIu'|FbBgBʮIM8Шn4q9r,o-F!QR7mGG҄p&t ?9/(DH"xD|oWps]m^wBbk!m]ױ$&knmi 9Y[>ޙkf4tz91Фp"Ȳ+nڑK]U?F{>K b.2p$;&?9zP5F&i] H4ƴj9&_8NDMcrC:K:.tcJ\:\d\f!W4uZJnsHKVXYS1GoR:6wk\D OMNhc̯jR7X.N mʧ攽mMʧOhv8^)4Zta:-mۜp7Ll'yE <IM5W Oy5 v^l&^rSCwMsi0/4Ir$Z11Χi&%]$MHx K6{=%+=$o\]D7֚Mw T/f0ڦIOgQ,6)M ڡFR:g&Gyfv z$& G MV'9MS\֧fi:EsN]cg͹D~O7q}Y.߼^yP/櫛oiZE.$2S-]3L~ Ֆ&o6zNϹ(K/>RKCo~̾uǮ1k7\]=uHo~վz&WW1~m}}an"Y=öZ~迗ѰmO7JJiu1ߘ_7=_Z}o}Ǜ̔|=Oyi=ŁQӹ Ӷ7_}$X|W:f·/#뺺v4 v`ߙo~Qp=H'Cw=7?-_D~m\o+&n%U>[;WlBɌ3|}ЇW|sw?g?]~]}tp'fw/n~9=)bw?rc=d?}E.r{.qޮ;r|I=wRISMR;aIY0}GrQz}7mnGa 0ܽXAn_!#b7ML$}\_u]rwq-?9z3}{uw n:R^狥Wjv֦2h޽I]6_V?5R_}sOܳZʴ{};!?["vhB 6ӏFzxxOfn'˝kgɵ3vV>䟙2o~5?@tF?ۛl_ 3n.yF 8H8V=ZG?'iބ~&Mn cE.G3L?# cjf{4Ǯ;a^_Ny5A2Rvٱy G/m7,2-X>>:^tsLُzhVS{ WRHpF8?k$͇HbA۞bG iBAoϛƨ^N>9_v|}'rvҿ.xOiŧS+ ҈/f\^t3\>g^pטޣ]V>M#]ONJ`f$fw2G$=½&elƔꁼ_>8>oiى ';k7ѹ@sGrM?n!HdU"K1t.__-D>oЯ,#w~IɌ/ۗ?ۧb>اG@}>Oا7}>y~F}xpl_c߰ݛͶO=DTM&buat4x?@s'kz6jK8>6Mxr#s3ȓLާjZ9>𐳉▗>gd!{ue״vzn,%Z]ҋo/Hf'>b1&)vsرB|6,_~ޮ`=>~j|ڏ~CXu 4:9B k?Fܕha4냑juskj_Qmþ(VWoW20>ͭe)nTcr?>Ьa\$t2 jүgVԑ ۑӋY,Hy3$.Y?BX]@vHo_8E)8GX:Z^oDIz/8RbەZ|V?+_˓8^` Fޱ8NM䯴mjpVuFqyf{XS|ۍIr'sz=XBp}+>zODO6N 3^)Wz3e9yCH&iGFҧSno܊Sy1U?q&f2zۉ>sáOa]3C䥥 }tHzaȿʣ{_:5-L"O3j`B瑐ƣn< IEFOYUNҸϳq4TIcy(4dcvιmiOyFZQW4g_6Mu>jJ#muW՝P'7q泥^n{\~.p춙2/kVTR+AQ_,KbYETZ+v/}[&^d5 t]}ʐ,\qj]3~ NGf8櫦7rYAwi+.Ѳ])Zj E+ylĖ^<2%)6xWvVErsY2鹝n^G1/Roz*mq]2^Zq݄b4~qmL/Lc<qGUB-.~KLoh5a/X^5GWߍ}"~$o*՚so52МHoTwz9 t4U}>7娔0;\,ۋ kʽ:۹GlS^n/|(iG+Q=O]lggY n!E:|jlA}a/0Ͻ\!Gݾ_Tۖ:WdNm|a潢yl|&CRN,W[ZCe^6EF~-6oWUטw_%nUI!賃}>>` FU?zͥ};.@\cd{~f7 :ߏ/ا/tѧ_ا l_uwSf2+$s~$f\w?ڧSw_H C$m K2?(^`[u2룟[>} #~dG.Rzs8xni ~`|wLa{ayCxWEplNڇendstream endobj 324 0 obj << /Filter /FlateDecode /Length 3562 >> stream x[IO. @ubXlAl 433G",2r+Ƿ|o7¿GgN0b!8b8|uŶer88alBL޹v'ƴi^]ՔW&N:M^=;ˤwtIqX;^ՋΫB|_|'rjZ;c&·f8 6G;`&&,O.,>1l^ݏg gޮLXwxkcbų/~ dFMRh;Ywm*T3i'i{tΔ"XxI pʱɈ{JH z2r5IIu wVg)37dpe'o r?DJnܤ |jre,dfD2'N#TpHX.}}2&!if魛f YW? Hh9hq]d8:>9;}}>ίNWO,uTp8Pk3 3Bǹn<]`ΏoWP43~ Sj-Z GQyY~ZBO9"p1@,5Ƥ3bcz0fETmybuN9HIKN:>,L .*0h[W ^bw WuQFh]X ;[k9 F}AX?/ZCafjs{,n<0`] c}U0`WJYMF%,񢝠LNqT\&g9@jz_xZ"9uZ)ӵ[p4&>(n- pԎSՓH-NA;wx`AB&]KŜb\VVx߄/Qq? K!G;^EuFF&ЧE2rvp7!0|H!n[Cp\G$Lx9*_uc(FeHNpF@74 RGƆ9Uѩ^^qZ%($; ѶSQrS!W[2nG9jL 5xF(uYju}1Gq*Q"ڕ|j^k91JDX|[ӘK"dD' G]-$Ukz-'yn݀ e8ڤ"޶N49"࣫v[) i*u8QGz$Mڦ6/W!ls w< 'y[zS\boKRn*'>5,E|GkI왽PKi$8$)5/QlWW!A<]@#)Bw oōvP< $zSW'oHn{?&nCdV. Ck'U cJR]̠W Y$?#I2&= Fވd^P/6BNЃCR!d薼xe^{,!&8~k*q]vg_?Y'g kM^P'wvM^#+ֳ:̫wHnnzFN:3lre|~7ʫCrв2uVeꟓ˼!(DRB>zLk)|WyQ^7U;ʫȫny53T5+Yi˘~EW;)nX~wK{iQZZ^X P qRi^IM[IϴM]1jiV:4N%}M=%jmendstream endobj 325 0 obj << /Filter /FlateDecode /Length 4771 >> stream xSˌSG휊9Ďza*p~J~,]:Z )=BƤ3S`8༅cf9.c§JW! q%878 p?vL.AF r8#ȿNJ ͇2?r47Pb+ ;jDÏǑi!"&$iꗑIkR {Z\lBi`9B0&ڑǔqЋTتsEh}~zxdt5)5j'aö́4JUY l^Nhnq֛SR)wV ?<5ǹ4TJ_> HvH=73޹5N ҕsI/<~8J0- fG,6G@5: 1{Ŭgv^L .Oq`Pv㔈eNX jd3'|Npjwy#hlD*tq(.-@m-`z)_&p4E8P2gQ<8Zn78*ڣcor?f0WDOwx5N.xUYC`SОS6@2ڇDs|N+ km-@4X㲊7ҌĄ"uN+qfn(}y8 ʸwcu-D$0)sg5KnCDA9H9L 0}9gw2:j#p2PlQv  +\NR[TL'cm j.ykS\ 9D^cN<2 iǠA@jbAc`p*E1W.js`AxQB*/#bd[(i'Sc: I薳+\,eUW׹p`?Òb5RZXeV]##kMl 3!h~KZyZS֙Sn2dZ8em1c~_TY˜ZK v9`R,YMX=@pZܺϭzέ܂|̭:Mu3W_LGg]ͫtgCni=uuZɭi]֮Lu<|[w[)_uMWq21ӂ:ur!sU ?6SV&6`.F_WeK'6s7E7u[?֟s5&͘)ԩ=\4hXb"W5XEKغl;zKGcGGJE;=Y\t|ᮃngzWQqOH=UUKH$:F ^u:q!,~݌b4ʩp/L5qP 4^aI<=KB:[T3B8Wbʽ0qk /?&M қjv>/@t;=\5IGK<-C(u zf}nV&ESM03εdJ{A[#yYpO$Mqg<;n3 ' P\Ͻ-;a*_{[MY:On?L5e5Z]+o{4"\ wT9ƌLXr@~B8>5Jj+7UijlLyjK_RϠՃa0)`ڄVa9'y_u^$8Dy -Q R6YN1/*=P`~T@MO*(eB'T@T g0&oT9ˁ3w|4{ "tK  ?83Xj` #eŇdJṀh4l^G,ٟRXH\d '%qS9 A%M =%\ LA vt\i{yk4&I÷Xpn4lwAÛ%Iy*㢮CXUR9 0QB38i~ nP,C5Hy#=vJNKwqxuU~U-g㵕:8z2Nܺ/Qc`3M%Ldy8,y]:gJ:r v:33ߦF!chkV7[bOuuyuK:N5Ԧf]UARyGdBԯvj!-1æF^ oKuB}{5}{2c8(uȲauT~q誐6K u )F2Z*unMt5nR A+8T-uPL.nKdX'H!ÈX'e ㅾ%NZ3DUH'Մ!Oew"QZ;? ,J:vybҝ"܇yi"sb4`E"~Uև\:aS.NAPS%-hqѪ6&UJ=/=N`|;IWfIUxYָ\+9H, vGy.(ͬch"ؗeV]=uE/XS?|~xB20X/h4mKd)J*e`Ѯi2C|!;4bdfL#ZZ[\!.vUc(cak"=Ey?J7}A4 f4*F {Hbjm? <5޻jzMPׅqKwh߃8AD1vflq+wOe.ZVul:j@wS]M;nlx5w-mս@JrDx xA~)`*i{k>^Q–紱)n{>ɕ _X9]eS(R?-lR#8P)ă9hYNTEςt.&GJxN2}(hų{0 aδBq:~#b^dgeC@saU+5S,Y옣k_ݺ'g`1,dw-~4,ƠaeX±N P3wĖrݫMYnL^{yya7}v2^_G% uX3-q0pƄp:HTLD@8,3S%ҽ;;Hq.Qʪ8!J?rS 9#%sRVVU^ f>ofTxŸ+07tRG<&!!{@4ϛw?'p%gժp]w2w#'$ܭ)qxKVbV!'?s 4!Bζ> stream xŝ]eqb~A``Ngۋ_b083b#:ȅ EjImZ$1|ڧLL@g?bHḤwӯ^^_݋pӯ@Շ.K2='GyxՋ_=ZΗrw׿^W7~r/\/9_?~W? o]}{&q{ɏ&O;wwRѝN¯_"K^ ~+[}̊nIӝݒwwSSR|^?U7x/7#USǷVPS+o/_T -ܺR_q"o(')OwZ-[eJَvOtiwVS~q[uH*;R`[}zŷJUYJy&ҍj{ur47wJ*ĻgSQ2o=ه_|Pۃ?cgUy;w둷*cJ/+1 i|z|84w׿kWӶw4+HPKKJqTorғ>qlS2>S PZ+ywb2Zەϔ//R/GT#"$B:IRT1vɝIhg2^-%&^Z$RHR](JY~$I2a i %sLfʻTOL:I43J,AVL`)!n݌o*4&R DPj@CKՐNN>IDzh @@zҊ, 4ML{'5Uu&HHtzHGC:J42Atj?RB=hj*ex3C _mĈ@02BX #!SwiZcNkiw$ˋjDP$a6v5 zU($9IVuʎp]]EyޘW@PjZ2Iu-c˞ş&Ψd&dw*AV70">Gұ)F:L: :GԘj7I%!ތ4l6;#@/#OJH-L!'oxkCBZJ"BJl#X^#0LjI*sLI*{#(Uhni#8RR1AR:9,vLݏ.15!+~&c}L5vQ V,SS Llr^@'!y$t>I;$ M`'`;H:+7Irn^> D&h:IϽH)3oJ?ѐGDH_dd&d໥YdWMTS)D*:&N6UbJ5#AqXC&@d[m=5™# -ʬ2P*S_4fj (F "T$]1(s2Pb$P 3݅JµM'?$jqF ~zYH?gF@/ε5k$Pk{0I9 -NmRfFHNvn'bd$J褐PBSY~W z[,#2XJC:ت}bF4]5rB! f*w0!]tLlZ1 P#2j -HI$X5At(7I*4rZʑt4J@C>]'Bcr", Nu!d^;ADMN0.8'Y]gNJ3H'eF掑@X+LŅI$dR)T: tt2>#|47m_9 h e,<+9Ꜥ3B}`N@B='$U+WX@[a&eTQ&5S3=%Fƫ4^E9F*]S\9 aDX3dzUvUd@P] ("|Eg-=xqˆEs s=YJd:i (wR Ljmp"$irԺKA Rz 4:B5 j+%h;F,C:JRͧ+np;/C\MvR3 \Մ`KcFЛoB&)wHt(ՉTシ R+bT#̹=#JB]i!TWXUhB:H` aTwcR!H@ӸQH6koFRm'#'AƠ-%p,@ F#9TE:-m &:uҠuo'(U8., s1$Z3B%ֹ4I"\F0CWQ-BFvr=!'t=`CT }PtƹSu 6].`T_ltk%j&KRu6nN|z*N`̥*[FmrVmr8L 3 t-4@Ht"-g$( I56FhO5/s N]7{OS脥Hzp(yu@Zh#=%Ak6Fpܨs2FpU6cLm + (́ c]F|qzV8N3F<#h{cen`bR(1"AJBʝ8 IN t 6sQ+ pZ+Y#*`%WQN4l9촊G!QLoԍdNHʎL`IT$t,XޛpIBXzBЂ.' ?Kpۏ evBLLR'e~yE3Qh X'9T{xe2i(R02K6l;(cx01HGt'B +S*؉2IB:V)%$bVg'9 2~IhNIU/"tJR4[J'Ԡt::XH(H"'ehZ X㶶m.,h9)H E)Vqh,ZB]?>Eb"͢ r#(UyN[d R{IL2$UZ2ɴK 6\uPij%4HɁ@A*N%t¯\ +ma,>7"K(zq,BIs"JZ /5Pd`kᶮtA|"о@D*N}@[ ;pd"L=6 x'ؼJP@ >A;9:'8LwA8FᤳT R-H5E( vұ(=Ȥ7*nAK]efL%Q>I2LRп$#Aa'ϔ@TÔ[0='X:/Nz$XRй" pBYD"0dgɠ܈L.:فmJ&"'5*ԾfKN*<|N$f@oۥc5ZDcBGBjPl'R/Yn 30~B!Y%!bfX s#Dp>įO"h"໕:o8]&nj_{P:%)u NFGRH+uIM|$m_$HEln~.@B2:AEVPN@M9u2ȀX;641j  ѐIjƛ0֕Cʴ3 L;ʜf)zDX @*mޫDP{U%ϖ3o"+`Ұہ!Dp'XIrB~ 2mlFŷ1N-1R7e1ژP2cT#h@0z:6)7 *xPȤC6Rl2t/ ÿg ,OB Nd3I(&&!/[a''!˟(J @TK=ɱ>ΡE_0` tF'HIN[SWݜP38EHى)& ѱN VNK88&'s^V"v=|фDR tC:~IIgK9KeX1<H4*ꁠNNHe I R Ϻ$ hMGc2D>ddMCӽNZ¸$TY5h6:7[h- N` 0MTE:KCNzec'JRtl;FZg"A Ez"( F*]\V-<*/9]B`{7b "X>h4 ֝ lQZhkA _`ʝ Wt8=ӸsX'5Ld DpRA7k@ 2)ffl-㬤Z I7I&v aR XyMp$n0W!;uNGn0=N ~.S)\h'h$jB8K R:4읝V okg!t8)iP#/@@f;>!d~-$QLE:TFJ ؐh$("^Hg40k{9k'q@NWH!24aGLRi`*/9F ܦP͗}#@B D'RKݎLD>'fXƓH hW4T7iI!5p:)} %C+.N$22"AwC,) ]I3F X棥P JW+9),ѐtI{ز2nD#hMZ\'u# Ri!n9, g h =_Nr'ҙ<@5.9IT&sljT& ے /HDIXv+ &hϖ&&6l@"PFr ЙDNd0E%|{@Ԉv$C8a/^&8uX2rА@ʶat*$0Zݐ=U--\f/2P3#kCψ zܣRaHG3'8]p5'892OX'ﱢ$ C4g-B=H&)%'¸ =aTFR/rT;݂=ā,=@rhͷ󭧓Ё;@]tЊs_۷d?IDd cܠETLJ*I%rQ$S/%2N4#=Auf>z`#^bkCnj/3X/BŎq$yM4;C@  -=@Q!2$,[y9H'Aqx~S 'i`iB&,Hs5 wd:%'EPJ7u2He3 =Q8Q`#5ò-.1;Y_߽H9CAek[l7 }f/͋rG8ɯ=qK4>u%y+ĞvMЯO]PiSOd{Եs{JjZ7rn"SE7nOy|Y6} ڞ\T^WW#t{J;Y~4Гޞ9bm]7g}Es{h+VV˯S5a۪XY.Xoƣh?ǝʾާ DĂ "|w@~hf,yg g9<~'y}7o^M(bξ*2Ϧ=y+gs;hi-=ꐾkmϪÄpğv/ke'NJpW8 $ ?P:7:=v@0϶kBCd*- Ć9PEHE$bl* [P&`(%@+S@"L)8)$EE:J!NJ=GN ~{9 u"Xɥ$ E(:q({d`rVnjt^C+Z#痓RAзBHp"8' ('ͩr]wY_sjzÐIEHJ.@c!,原4N/6ITPʄ='H dD+@yj%!AlNbk'HPF- Tح-|PڳWNi4ȩvF tON`KP_ԗzi`YԁEi{jL\:h @9 Z'55328i]ᄊt4A'T\t> xlo:ġaZ`RE#@ u\4t!-Nt0pJ P5 FZ|O4u>3'u=|,VF u\ uݭRN2JI07RI #ÁNVM*{F$1'NE>kpꃻ  JΦ{`>'8h48ϱo2JB#爐 53-@nElU|L QN`-A'h9qH94 ,"L2I5R: s duP;2)C,:Fj4Mr =9c.I*^eNFiiDR5SC:Jg%$TvՀ~(*$%@)ۻw!n ɁNJߞw w74nX7'>IG8ۿ}R nTG1mFr ]eBN|7`Trδ d]:@Iф LhL`2&J Pv"QKr+B__hdۮ%a /ͥc<[0)( #4\wYZ Lo,5`ϻ`˯Yb;$a1HPO ާ#!IJ j13d,M s#O$V֦ ># `}A'-.'x`uRT zWfn3I$/#,.;u3Nda0NH,IHytg =g='}{I EPv:I,o/#b^Id9Еy7yIg(I&v4^ XH(]*2$LytlNI%eM@B˺#$tw9iᚡ5El'Aj.8ZsHt_.|ťL*vF DQN^D ;|?i K"'.㜨ǖ}|MlșN.X 0SHphdPv(a*tZV2iɤΌPc/4nw@' JYɦ-np(; R,9!p8Zp:P]P5j'MV2K%us eU#zw朴Npl[-qJn[6p@D"Oju3wݮ|1b4o&e4a3&9I(z\Iu.DP9xe0E W EPقP9L /2v@ngPvYE8 8,L+1>aqOSZrR|zi;?P@$$QA'N9.L{n_ETJ ' J 8D]Np."MF'T d` '"X&w'Tt碓2td"XIibT>;ӝN*E.DQТ抇i.BR86`cɴgbO 춇(*=PutR RRvP2x.΁`. bu$K#rHv_e`'D+LOid+ߪ'3!MT:NHs1̮٘ᚸ'!m_CW7muU ƠL>G#%Zϙq+vFZ;Ȧ5B:蚘vymtl$މ`6Ͳ_ͫ)DdW#qR%ťPƣGwcz`u&3ױFbKwȃX&.4p\2@%Y6$a ~YDP(5 25%@Iu+*Q:yOԴȿIv$+l@QVj12(^ -tVȷf'5Zrl(#1ڷ0(jNROq_ P t*BGNBQp'XR2mȣ]DZDP$Pd/b7F`Lk\@84 ^D@(r$5NBw;vñdE0Q(dr>nNP@,@2k6tmB)X֑ZtɌ5}D@24L:8(]!?J:P.2vs&MUi9/Ke ^_w -W,NRB:t$,Tek(M8IH$$E8X9qMD eK"us*N$xy BK-|;m/4=OrRҍN@AY;xwWRg9~8v0H&'SɗοIdM|@)_/:5Ϲ6FK~daB C(aRt"$#!Πh +^j?qX,ajKնYdyaHz{0E}3~9l+rWr\ t-fAp$ O VDP*8#qInpIj=J$H VY9Vlw \ U~$BN_ڕR΅]wbQt9D.L]K.݄JHQCa^`)ڃjWn{ NNzeN]_(:'H O1IJK(#?6_`-DQNb:@PQ`dl Զ,~#%1,  t|b\ Y_ʱ6XSuP0<0on ` A'onB>SI_/}up XqP|dNZ /9H|5lKu7E),*==/5BH6@w%t@()]7宂Hip*o9͙ Er/ӕ 38sHB_o*0S3<=^dqeF߂@RGe?:9+RyvǩA2Wy (':VىwdZXdsv&r5N`:Q'ڃ̊F]g80S포 j(oGS*!V yQĪl0]?@(>Q:d @If8"T)t BTCy}Jd`H`H)?4̽bԅaj"kvjtNH*u ˚rg 7TPFZ 1CpM" NkC7%Қ#s%nhIh`DH_#q>8m[ DP(z)(S\"iPP^JX2L7O Zf;Z׊À~]!I($ @RÂScY\֦/$ eTJB}IC! T^f&ؑ7 dL7vcI 찑o(\"⫨2ؕp"3瞬"@25Pn"h3eQ*bQ\@ ƟCG7'XGWjHmG; d,޹^kvZaW 6B~,9E4ZQPK[ %BfqBhLQYR"P!*8csC$ ::fŸ_'1lf`}$2;yhTj+ r%:8k'Zx:!bDY %U7| v$Ad 2':`9(I AA!l;WqNu-v](.q'M@$GBRRn= ,9QBZNrQM|.SDS5P䃪 D)Y[t7$$0~{)`+Hr?̾:*v@K\P}tn+zT3 :.odJ8dbI|%g<ҜM8^po'{MR:u/`/Y ^[Λ `:oyD憅tE`6歕4:˽u]LBZBlٙ4 l|FSi[f'Ci=L2I* y8\ )$4 A,RlPQ)"cQvFp'wď"!e{n8 [JHd ׀24>] q)ݧ x 0AO{X*]u7ʹ& vb:H$jV#h!LD#%P @PFB_#W (d _*5ˁR*tˈ=⢌FqВ9X)%)j ,'8j%jQF&@pP9 DŽhjZ3k2hXҶv3N2hM w;w8 E2Ed8缆;d |] elc{j4yn&!8I0'(ԱnN#;Ic@Lw:i ms79~z 3+*wmәT<[rN&7^kRXFC`t 9%@`pA:ĜCJ!Y_:F'$j|ABUʑQ"Z l%2D` VL2j м쾘AyS=lqk6H{ʁ =[* (Ґ跈PTjHQӕ3A&paZ{]ǿ[q2EQK͏_yvMc)?uSy?Kw-(_oo /ml?=~yuNY:ol>ƙ1ڜ*<dׄ||iw0'|wgzr}}_!ϲl!Մ? g<=FV쵨W/ҧ,O|ļ:/vt iT]=")MFO33GRiXIam6;JHIf!Uvr3O׏Z|+!G+s[#wj[Y z*W㧗ϷT?Ujy4F㗯nֿ>[~f,% "3O {!PnΞMߺ5#MGmөOE20N nJ>r~>ؐ활*>?Vٞw(r~>h)?\-jKS;ba[m~̬UZ:;c?5˾gKJqpn=7Kp]1?G}g`;3Zbқ2ȴgPG_^J^/ϯWy <"j VBm#}pps|#>rAʚY9nl}hK[cl%=_1:h^z_,m%?=Tw QLyݩ Ү Rnux῿ug}ˣZOMFҽڞF8|TCt6k*X;r c(ROrE4LL AY?-YE/[s0J+{yR j lŗspgGy(z5M9}ݰ F<ߝ~h@>ۺozz4g:D?{ޥnoe`o@Ig;`dN\Nv) @*WK஺y䭹}Jj~8[}u3lWlzW뚲mNno5ȥ3G7[ֳg?xh{R`,[Vjy{m%ygݐawV6V[Go}MÜ}#=3Mܝo0noWyN<7^q²Oc6=>U\)H#?Yo?9wSO_lflV%'^hN޹jgY~ἏߟyooCքenzSVљc]6,~6͡l;^ LoO~eK> =;ܞ-+i[TG} :ɉ>O3f.+Xg? E\%7'}_5W;nO薣㦾sfi<ٟ}Ҏ?ڰ&o/&e뉔[zL\_4%GWWg$$Qݦ:?\]SLsZ^n:N(5&kjǏn\c+f7K~ &o:d<:=UblFݮ9EYB/U2vcߩ#/~O&?/YO?R'+ۥ5O詞,Kgeo>Shzϴ[3J4fvSC ~U#ZіɌ4u1}6n?5# >Z<)z@]RSV7+iNRa6 \dQE}|bn]\oO!?Բ7<Ӓ {L暽wby{ONۿ>/y;>Y{;,>ul3Ғnn8m=*kVW[9xϖugvͽC s~/NwZi]հV,na}P/,v~o3S\r&}.$m"45߸(az[=~9VA ma JTUXtFm+yz ?)BYKߜKwybꁷЬxE#7ĮΨyT YӖAz6V*( i߽<9,}67uo)Й6C±;q7/#c{vM~jyS쥯BN*o7fnM~{`Nm|oVؿ{k+y6h6Nnc)wJClgѯ=;D9}j wx۔JJcO.째0$mtnfM-,dY"YڗLٟ > stream xˮuOCs ky/7,#:FAYPS2`Ooc,kb1&I_k?wO_ k}_~%_οY~|N믿|??s_ןiOxy_yOw&??gi?uUp?Oy|?˿֯p֟߿c=~>o?ܯ|W/|/?~׾]ksE;:6NOs'SƟ}ߤl?[ ߻[gevS|nu]S&?[ƿվfz?_}-˹/o_?G'~~X:9tOUf6-k念qu˿ e9('QVv-?מֲOQ^ ƣu;k^׹ݿ~/ͼe$]U(=>|w_EW>60[>Y26UZuS>Z}yٯkү࿛ok{mlׯcwyUy1eYO: ?-2c%lJ϶AkfP6?tM q@kn!DYEoʡC^Y%Oe>_(:~%DRV颫gP6=tKhkUj'ftS(:P%D^Y~ZPF7!#%\Bנ+?GO67tM ojj|gP2= ROsٓ t˱U,= 6lJ乺}ﺟ\Ձ6wzyp݄fܰ)]uCZ'F?C7\B\JZ=*c8\B3u ^%?2:gMQ$Do~K&Za˾u2guEwUl w"s"As::tæCZgkNgUoؔܿIXaS}iyviLaEq| fv >\ړm'G s{l*/7,*lJ+LbMKtVM<>WkZNMKtVMk+V}YoX*lJTGMKtfM sY n7Y,6%|}̑8<2xKBe8Y4h7\Jt S-OG, ס|M 1o7Y,Y6%.mB7Y,Y6%CU4hX?MKtVMkQW1{ 7Y(y.!:=CmH3+lJGXXu~YaҡkR E8WaS·u٦u!Q0p]vr[$D^f Yө.!$JqKY|ә6ws9M!fMzؔxՕ⦵Xb`tMyg, f_ <^Gb`tbM.[?C"Lps2!fM'U{}K{}L|w'Y~|3}Z~I?Aig@xs=lJn'wrx=lJ۞1Iչ&TiQ~:3-a9 :%Ծ_ʧe;_AlaLJ\=o^Q3,j W/Ιwc\bƟ)/|ӻ$dZ۞og\aS3Ow5d ﳌRzq92%vx 1Yչ6%_3J|S=\B\?k)NZ,L"z.>2gQw~*['*S|$2gQWPؔקݞpjn(lJe3de8 A1(lJJj/Z'?e CaSz@Z.81cd@PؔrOqYF@.G 5#I#I%oej1,h W&Έ$,#h e_@}p !'2e¾Ő3|0_ePOp q}Ppgϐ1l(lJ+o#¦~^5'\1>e AaS~Qw_n~2F 4ME[jOx<_#¦U~D2tA(\B1z~1i )#¦XU )&>ed@PαrCȲF)qcQ=2tA(\B QZƔZnǔlji-<ȹHxu{Q2bxdI8d,;iD wvQX3X4"MkAJG3X4$MSnh`YvҘ6%mL ˓ e'aSZ6,ե,?iT nWkaY~.!Β!>NBSX4*K;EG2X4 Ms%89dHaY~(6%|3ݯvGrXkkn?ߟEkT3hdHcY6%uOjaKKcYҰwg\l'aSԊ{o'^ò11lJkzNݐòA1lJmՖxB~ò$a1\B&9pD.eIbؔ>5{>o5$=iP @.׀q`YzҠ.!x΋Etk77<1 G'V!fRcbؔ`~ǻg,[jL RT}lӞKYϒ۾kO!*R>fRtؔ}/N,_jʻ{>αϧY6%V{h|;|JaShm.i+5DM;fhڱA'$Yj[ޢ[]>rİ)qO{ybfLYԘ6%|<>!hQl)!1<2\ځUh[P|0lJcQMq,_A1<2]g~ML1lJŬaWuLY{6%֘O\q:lJI)0,ejwݤ?CV2)qDIeUq:lJ\OlZM9ϪY86%5@ qOYΔX.!DRu=Lw{Ebuؔnws>>K%Zy}ϲ)aL.j>'\utq`yQs}5VMkS_КyO%K[l`Y(6%B]i?LeNK[rLeqaS\xf4#\BWoLeqMaSzRx,O}>gY\tؔX:!gY\tؔX}$'Y\txd@J|5JMk;4p b yoYX6%D,|5VM=k=O_,>K%ĕWVZ@}ORp $m7&,kFz=,g3/#x&0HC¦LS8$ !aSz5I=d)$\BQ[sZxe!aH +6Ο 0`<|o ${P/x~ sfO ]h?x@ ^hvn}3V({BGz^bCSjyg+4wEK%r玄)4kIHfA (4gMH;(FȨBsFؔ~4CѓGF4%ĞPzwdLI#lJ6udDy#lJ\;_k^;]ȘBFؔX+[]y Th+6`* Q0 @sTׄ8.cR{OG~2ҙz cCQ&#zFgOChZ k6T}!Ȼq(CMkbE|fB hF V[/ey,z nӓ:GXXE$>G(M`aSb׉^s82P7¦ '7׎KOJGXXC+*#P7%֐=Go$Ii7}'CMbl'#aSbMVO0kidl#"\Bh#W) O7-%Ľ07)N?y#,*2:t䞌i`FyD. Г䱰׳JOF3¦ʺ;:'CM`aIZF m4wGuP4O6%խ #3 }>h V7b}2.!v3x53a# k4yK5u;뙝HLdX+\B۰V_[ > H [(ޠ۳Wa81¦1>vg 4KМs;XKXؔXyc@p pE@Bdm ,<2>M <6֐⯗ CM zk> %g5q#īpXXOâº}k=ex4\Bzلa 2\6%vء,:HKiؔXx /m7SecjI6 [ȿ#x(a&p q-2ʒ;?lj|o KSVX#ZgmIe)+lJw\vGH,,ZBv¹e+lJu\U[ӣXY¦ԟ2Y4XyÃ֑SXFW¦ʞ4EU7:ޙ;```LSO9e5 'LzBbeIB k?T75'4Kk{(Kit S^8Fپ&kc. +R'f﹞h1?ͤaa5j'GŻa~M#:ԃo{Ufا4\BC]PSPok' 4K{^3߀2aF}TæՓ7o0>Ibw\F'C!?Ma`m^c7=ra|P%Ec' 4K^3S :$٪ѐæզpD`\B=e=fXI>\B35RaS>z)zv͸T|ؔ Vݿ1#&h*y>L:\o5RMaS^&O,* qհ)ym#qoyB)/V>3/f׌K5݇IUKk-vcׄL5݇IqgYf@ K5هK<*dO0أkƥæ=ֵzXW!Sa- )B%R jk7z^P0𔟋YsȭjFᆍ-kFâ}k-Eg7fhi>\BM߱%m\5#SaSMYP9kƦæӇxt N5чK4P|[(C'!)quX[?¯JkWČ:ip @ϯ jVj扏l=)7fiiMWl6%7T#Tf)'#T)aUN%o T+8h{ˀo8Pu"bVl F¤=3dV OBZV>RuFGqBIdJTzNYH$,*.™Og$9錖?¦q=4AQg,.!ea;#uFJan¬ PGؔc^3bVfmM孷Ǒ3bL6%)Z<rꌙ5ӇMs7d,3fT6%H*d8Fr 3K L۵}ꌘ%ӇK;% 螩3^T.!s0F:eMaS̛TlS=Qg,I?\Bw3?i6YzNX$cG}QaNg46%vfmf@ .+K{\b,cARg06\Z4z^^r6E *+~C$}tJaQc9:cd%)qw|Y a s{N Y#\B\%[^ww QFt0Y篇?#+oM(@y[#+rM dRFe_y(v·zxjaSy;3rWDx$AG ە9#s^+sK{caAY +pG+3YG>Avp q'M#X FدCTRGؔدr⚓v\>Av0K/<>CyN욄Mûx\r{}gL6%lwf Օ%ĕ˛3euf$ fث!/Ϙ]I(,*oy|g3lW ODaO%zϠ]a#\BX>v%)Kj݁!pu3pWb"֖;TrlqPG޾-ك}J7{g̮6%άL>cv厰){;og/}[VT~>v0Z`BMVl>vp g©կ{ϸ]#lJD{:x3rW{z&rTG>#@#Þ!y 8i @7 Mg^ǻ>haщ8Qw7qCCI6'.䳧ԕ¦D.{v8Px ,iH pPtY,,?p}JAz Wbfl+M Tg0Nx{A 6 g#3 Ab=nod^bȀn; /aF#%V:{wNo5!&v9lh}F!¤:HPp226%9MXv'u.#s@aSb%Fu0P Om$VB(\BºRێW{y p 4 L0⸀mdNB(lJ'ѷ9 Ap 7RZnP0 ;D p`mp*9ݴ{PX 8d|?{jaa/߂ΥݨKp shqYy(I]|S3\gŸwDQV {ZQq.26Fah#&Vǜuw8(M7F~ѢʼZؔX!y'E\,Qx¦7~\7lP2ӣ.!̾Ŕ^sLeG-\B{2pACo2ߣ6%Vҹl{(M l8=%7|R[ؔX+`^sL&hOw`7Gj {R(3>lb"幽uFQ@ +g>g 9XN|22ǣ|6%HZ|Qfz%vVQؔX730xH}ądC )lJ:>XqXoD26%p~zGE26%hgqup#@  ׵~ĉd.C(\B=06V' p !r[B58e(M uTݣ\Qؔ0J\[Y&ܬw": 3K*G# 声)f7?y V$Hb.pp"PB +hv0Y]iDu~D26%v"XsOD26%VҬuzrdNCP)\B\>VzkDHb5ƵhO;-yj#Pz :0#j^ zկ= eyp s7O(Kb+f(M үzy)a Pq EJr[t 1EEJR[vo (v,R¦;BNGR[ؔv{[݉;7=R¦|nPMRb%i[;Gb[ؔy38(f4IRl ;W6['6%)a!#,zٟ#UjQEepGQH k~Fvl(q>Haao' qbGfC26%~hH2¦5j?o)׽\RRؔXe3&iFF26%̿Z㽃K 0lsf~@ɜBRtjz;3 Ep fC/ {o3 p Jiea/u"P> {C-lJKzZWmaSb±2eG-lJ\1;?.!vv4!eG-L:QŻ;e)gGƞnt(3? na7a;ʜR[ؔX3aX8E}26%ݱjޓF/E`Mst=ʬZ؏FvgtGQ* }fХop aM;J/g墰)J*)eG(L:lUS{Ϙ*ȼQؔXW!fwV#Gy E)6hXG-¦H^>}"}`n P6  ̽ޅdC(lJۊq 8q!(<2ĭW |MHb0%ꚩY?IQtTiY8 `p P6 kkVrсdB(lJ {CtނdbȰs1j,֓{ p h^2± ȼQXWsqw~\(Gsn=^9 %)fȜQؔ"}hҞŸi>o$chB26%H/l6$+4xtp<0[ؔ؏:2ڹ(K>sY٣(KTw{Q|¦PbTX~O8G` Q[/8a `FQ` k}E7|B[ؔ0ަP2ߣ6%]S:Fo)a"{8 7FQj QW8!#H]B[tn:q`2ף6%ϵDgv(3>Ew3]ece0EQd k|vx}e~G-lJ\X7"JkDKr[ؔX변 X]R怔¦XF9#Fe~G(M]Kj[26%̾}sut("%G-\B lOS:8K3Dv^ueG-lJ`s91ш18)K+tTE{Ao2.!vb~TFp g+* 0 unuHQF HjZ($eH)\Bڎy,?X\Hf4%S9y`E26%pT%UOɼRؔ0jwýޯ? p xEG26%̵RmdnC))lJg=:C p f#q#PF {>ۉ-POoF2.!4SEG/ e)q;^F2HagXCE26A:zg("M 3oO639 Ť)n$qJIaaMDŽ/ p  d6c\sڄH2¤~JlaSb'*Vkع(M ۓ{YEp qmT $zsep AG"eG-lJE=sp gogm՗֕eG-\B 8ogާEҒeGq-lJ:~N*Q{%N̍eG-\BDCfm EQ8 N/<R6|/LRXZ?Qbz%P06;9 Ȱ'n]n@2wd6%y` P. {>v `dljǃ QXYCFm p qE&ω܅QP~k>b@2wt6%̽9!Q\(GT#\\x8`>2cd.!{έ|dB(lJ.~dB(lJlÿ*; !fʧA%ȼbQؔB'B$13WB$O#$1kaӝ[JX mfԇkؕ.*w.!2Em4 Qfv%;pAQ Qbv¤PQ+v:7YEp gw,'wI7Yp 檅)OsP(I=W퍯Pu¦Tܤ^?y)g ؒ Qv¤8d(3;Bja;79%)qN8KxCQP z%VG1-\B^;κPbuP Xnp\QX9(MkW;ҲPs¤Ú l$m2.FjEIqBQ& +zvڋE̓\RQؔ0OzGPbv%7x2d6%vy- `_X A0鰂g 7P2 "-sTg?2k`.!3h?pF?sd.!C8ѽ̅QtY_ŗȜrQt0綥}}_{zy Ţ)!sq@?2o`6%̻Z>/8[(M3 #Ky; 0`{NNX,$#GgMǼxyaK.%u^5:Gt!P^ &'i']|–5¤^s)#(s=kbE9:G|Qy¦hP0XeGp-,* d)apD\ L6w%vGa-\B5,Qv¦>8e~GY-lJw˅YT1(3Jkb'teGi-lJ4Mu|XRQf|` {L:'Z#1n\Qx¦.S7ϲ\Qx¦zeG-lJ5]pKܾΦeG-lJ0#k%z z_yp Jmgl(s>naSb7TGQt  Jy?ʼ[ؔXsᬽt(3>maN$xQz¦ې799J[0&@oȰo͔eG-\B5 'ge7|QX3շָggmN2ףl6%Tm`,Qz%JkcC0Qz¢žλMԽȳ;y %)4׉1 H.¦y71.\:-H/¦Ċڮc_2g1Qxd}>1myvpz9q%w֞zW{Y ŵp a-̋}$@i7 /*w6%vmZ6Sp gBMg3P26%F_2/Sp g͞ eG-\B8m]S3\[ؔ~l߈18(M]K!NQz¦ si.sFQd פ2"FQj &;'6أ(KݧW^FeG-\B98'VT (s>G] F*r2ϣ6%VzbQz¦iQp +&$(s=mz;OQ0jz_y) n;>b2磄6%pԻ0eG )\Bਭv[Ǎ{$G(,*(e gfE2!x.fVv"P@ HhEeD26%L8t!P@ j[j$m@7Z4; p ]ik PB {=u?7!PB iWxz{ׁqxޅdC(\Biݿ]A2|6%N_ ~?gd6$sJ4V=Jl7 Il[@w{3e<سU¦S~ g(>maSBmaSBTX:BQ*(M qaiz.)1AmbO{'4>)@ naSbφ>)@JnaSb*z!6)@ nըӟ5)M Wmsauf%eH-\BCݫD`.!v:/x%hg.!Vc3oΗG[ؔ؇:G )?paS9Cg}ۤ)GԻ^;(G}f9(K]>wGQB }ʨG!AQt؁:qN,Rb%Ċàyt)s? GaSbg;~d:ދdFC(\BYO}zj{/ e)apފd6C(\By)jnH2¦7Y;e(M oj||d(Gm!foѽ Qؔ~'O\H0¦z͙ކdC(\B1;lam;v>Ͻ=ʼ[ؔ؇z#]\GQn _fMvGQj ~6U &(s>laSb/ꊟ'OxQf}¤Ú2FyCp2ߣ6%]=eG-lJeϬKGQn ;Qʵ7(=mbA5:}Qy¤.T(2c!t&Vlmvp=2_l&̼Ӷmq<2Wl6%Vl88fݟx{y e)a%i_Fh b/UgDdj[: H.¦{f:& wJ}2sX.!vq.5ꬓ͗I̅RQފl DͅBQxd0!q`>2c@.!V-,szo=2[8.!̹/ZtX=T̘s!vqF|}G)¤>9kxxij" Ggz<ZؔY:{n39e)gEZgsv(:iaSL<`2.!V̵n=̍e&GI-\B+*q'Pbr%J`3I=Dit6(8 jbςfװ>(19iafM i|9C;k?<I}Ws|ф (7 gaSz+x.rlX2.!vΠA 2ZؔX3󴜋76(8JiaS&by'|Pfr%nK\Z0n.F(s9JDaSb#;z3YA0 FI`n:3Ep a۟ݚ eFG(\Bܑ'ŹClQX+s`~.'XG*%Ğ͵l}wdB(\BY0[ɃH<2Qt0Vpsd~b%@M=ϵFf#%jyg42@.!V5'~k$FBx(L:`lV#JCaSbu F. XRFb%%b:9;?y_g9K0.!g?L[:ۑx E0Csmd~T{ב9 %)2Rlۑy ap a;{ ב9 p g .[yO K vSy3Fg92;10c9t0ul#1BgaQ#mKQ)S%]:,\B98(Mu;k+1A> (fh ,ZLJ|ٙ( K:+%GY(\Bw J P0۫Owbd(7BaagݾLt# Bbu 7/ 7XN( K][;b e>G(lJu"H eFG(\Bٰ?]Og2#<&7wdBi(lJ+یVp_o<S4.!0Sˁ*mt #JCb̌ӗh秸ydBy(lJZ󥳧sP* +e'#~ٽ;޸4Q(MU2>:ۑX Ep ;sB[ۑX p %|<5T(KuO8bH|QXTءyaa&ȜQؔ.zF5.rG-¦Ě[TI:[(M ti P2 e}$1Ea|aǻn#sb3G DW*]-ȬZs@6*3w[ߧ #M=hqp͡)J Zt-R_(s;JjaSb0]֝%쎂ZXųc (1DQV ^m֖x7ٳ7EQX n=-YBQ@o2ϣ6%y_y)a-'ljw}eG-lJໝ`ڞC{k$G-<2#)ÕnX2ϣ6%V𦖩݉ce)ty/fegȰ@(sY-g"-7}>G 4f0\_4:z0y\[0ϰܤxz(+zKf+sꮁ3NVk zdLk8#{` >%N3,jNPY#\Blu6*\24tFʊaSb +ZV{֥SSӉ[azN`Y#\B.h}θ@ljSӵ=%>]Oh:#e%)`F9[Gp:cep QJ|x_*+~KϾKT8&)q'84x:eȾ|E3V6%{D {NxYxd7!y\:eM.սǏ u˚æľG h֌O`sC @2k{n|Q9~R5KB=c3FՌ6%pA Jvc3Fլ6%v8Amc3FlXT3Olaä5 Ux׌L09+y]2Մvڜ4oRjwpq8\3*d.!n[\32<}C׳vգkƥæ@ k%];aap ޏn|5RMaSF{o=fX)>\B܍.cy }=fT9>lJA\#G&XI>\Bg)#l;~ՓkFæ9kaףkƥ%Nl#Q)qGzŌ86 욀fp H}OϮJ;Hpyu.XO#j w'bA=&\5L:ǀј[#[N'f5\BkmLDbĄ5E؍-X3tVXhÌ4M~3T6%vd,(plGi& λVW/>Oiؔ޳fڎB:yB7 f4\B63D6%c\V<bFJæ2WNC 1?ͧaSƌ9|Ӭ.!e7tw߸(, 5ug ="f7Ȁh>'x&p ~` /bF} |b7goχiz 3\8, fװ)mqD3&w7E81@M)"~!? 0 n7~mnX1@ͪaS,9+fY5lJ2xӶi1CAM_pI; |6h1#AMaS9%Z<{\XPjؔ7b3Ԭ:cpHjV ro»1_i=pbƀYæĽ=s03 .!ye:pd[Yâ: ̓' @іp V]ۥl-b/~#8f)!m8hd2 6%V%%,L:ڠ\xdqi {"RG,.M_8_vXݻƚesi ՛Wo2,6%֫8e罱#eԥY,lJܥc ;={2˨KXؔx|Jn2˨k\9%`$ʛ/6˸KkXTXN-3ۢ=eХ5\B<.Ly6X26%zDӌڃY]f%\\T?,C/Mb\"/ʀg zi OJ8xK텆ԁt&nSW3Z_¦J DX63Z_¦ZCnݞd.!,BAD2T.!pԞ!-#0daSNلme6ȰE>&2d.!Kp9pp ql8e,.MeaS^Ԍj;c;@GrYtX|#lM= e,lJ?UkƉ>= e,lJܗڈ>+QHGYؔH.j2|6x hGZؔ“z&ʀGG~-O(MaSBdq`w4M ,UfIe,[(#"aSЅ؞8X!&p ߝHxƕ[@`$#-,* (JGZW~!ڕgq^cEhJ ^2gvntLf)lф.!V8(#gaSb77W{1=e# -\Bz|aw4Mp%30Q;¦J 7EkRRDh> 9=ox ;(ʈGsGؔxr[;֝ T揰)u%݆e_3@YhOZ^&p j) #c aSbرw-4I{ >r>2.!o`xѥ=G>%IAդP<XhxoVXhOa)v~G# aS)"3*jq捰)Bqq&)t WdS.1:L:^xKk:lJL[~@S .A:\B\=O].yw)>K%S2N)4F)>æ]фا,}q:,*f9StؔXs`jϫY@6%{vj35TM=ʅ!f9Scؔ޺V0@k452K0'>1ĚeMaS2inZ1lJ,QSZ\)1\Bvj k854KݲsMŲ 1lJ왝1OX40Klya?y,Qæօխ1e9JbؔX3r^l7,Gi` kF6u4( z{A6笞>eJCPؔXlZ\}X4M {}Uky,QW`E tǽ[rcY6%j D$)aQBuEƲ1lJ\͛ZyDz1lJ-ET]"˲Fư)!~nAj8ݨdY6%v|3~Le)aSbe@dMCȲ$1\BͿ\pJdDzq1L:kl? Y,P¦j6**.eJcPؔg#w35|AaS~w#I%zsW6@e@aSBq\m[Yg,h &]P:d,h V She,H U| pGI}/\Q(lJntAvO0dA(\BoEBj7#K#1Eiy0OY2.!n跣̜'t"¦U8%,iY.6%pW-rl0l(lJ^5)\>$,h {rt7 U|@aSުZ1E $K¸ݹ/.T (L:י(YEHF)q/|xp,L(lJ!SPօ,THqQ$G,\p8egeYչ6%?X*,\^<,d;?E9Y6wt>si]bYN;)suGdA Cs+'\B܅ġU +JCT"F)q)/]Xb)<.2,T;D1*gWgzؔㇻj ؅,LAv|'p=lJo~K`KzY6%.ۦ_9:æĚ0 r:%}v ,tw7?g9q0q2%z31ZX݇$ ucH(E8WaSzwrbv*lJ7cb@O,7sznkuzY6%M}›N &~<)}̢N)q_hqYtө6%7P !0 o:%J筯CN)RuG)N} Ϊ)q'mgc έ)tn}?>!dDVؔxV hZpl_!' ':#8U,k[.b=ƛ, \֊t.& %:%Qp&nX7lJ\Ao6M ACbɈ\C(rjs&CbΪ)q}G۶xŒabG=ͩw&":¦Sm¤Cʎz.5|{7@7 pe^ IM<Ѱ/#\Bt;J_T#4~mKg;`~fo\(i/Q A(b-dkH=Re8 ɠ~_<hԯ#\Bkk^I ~YxUQYe/v .9#Q !ej~#2+Oޛ7 Aaω8'#3zG:C[|0)em9Oq)ǯf~hFBqqᬱ[UA Y#.q#~wE! 9e'GCs|)DyˀgmJ*Tԃ?އ`TNiTRZk}F\Ә­l?4Y+dQP.z'X *9!Oqa68*`UP1sg_VN2&>k:O${ےb,<>UAEi98|ۏYWJQMJ2\/yy sUퟚf.tP|"25QȴyVֿ=i ojas)$7OOk*۟ o?eo?^~qTшG5".nSFwwOoѻ_v6Jaz?W_|"!xjkB;Y!߈Csl8G/;Uwa^$T-y QwM⣿ͳi .7׷0Ѱ[G_Fzx޼.hW5ݻ/nɻ&?L3Jm?nZ~8`<=r@M|WQܣ/Ҫ%oz}i@~r̹rS\{˒+F(u} zqJ _@_?|^Orow ǹ"ry^?w=]:xid\#5m_aJ摱!M'ÇSeY)-\;\_DQif Dj0/]#8<@OAH+ ,)} Br>r^͓5VjGnzVTr' ()}O:  逊:ܧBH@HS } Brܧ $ } Brܧ } Br>;1)FLJ@I)0)@& Ĥ 3)!& Ĥ„ c0UZcTaĺUfnbRbT=Oj?qwCR DC!% Ľs0}2IY/#)S"eI)"e͊lM@)5A ٚ[SP[/]lM[dk lM0)lMA)5!pnN]lMr0++ֈIn8ϞqW¼X#z>ާֈ >!' ?}BAB*B!BX@*BAB @Sd LQ0)*1Eu1E> u3EFLQ@)*0E@  3E! ĺoiM1SbbI1$CKzo WVY>ޏߏ`I5$ B$Q@$*F7A$5d ٣{T`Qi\S`JôRAV JZ)H+heuM2|S |S0o*|SAo*M5&AQD65$/Sl1 ji1d|cC7ne3آDD ıP*JBIo 1amqLz0%ƈ~֢bؖPbR0c5^X#~A* p U`A ٨*}̷Cb0-D{WfIo48o@[0FimcLk.v5<6[ȂkcaMns1vj|b08\RJ3Pla7[N E w<-h - N[8qN \A;rsg7.K5t?]a;6N#zDQl1Ϯyl i6pՠWcL r)yy 0S/+.: 4\b) .^0ůe ) V]bJcbڈN٫€2[xLM+ iY[Zܒlq@~4FL|g8Rv_WX@nL`P08LoÄ0 7<} ˔ݜ K8N 8 TE97 A@VVPbt`b⁺c( `P< x EWգ 5y!y<_  }6Zz~m5+c9Ѭ}&dwPg*{)-VkEbt_iG2PD-0LMT]3ęݲC 0L™~KL& |^a :Zzލ9 L~.щ_v\mZ_0l4LJ jўblbA-cVPY[QcTPY(pD bj!4ݗ>'hqbVWVԵVP0P`   u,@ymS 0vTV$!,IVjI@$Q!<k\l(4lLbQbrL>&OD{[,J,&qxߖnn%Vd"T:5c0rWƚ:p)%7FdcPb٪tksJK#|"R d1\j#"-\ .&5 ZrK-N뮔MԥuHUTUT@UEA@UXw-0bh- B &u(G[)X\y[ * U*\5ƺʹ:,XX,1TV* SRj OH ElJx,+-K=nh(-.ɌO7 4 Zc ]Xmy,#C ŕk+ӆiY#b2I- /823Ϯ,H<:P,:-`1aD֙]2X7ND?jݥЈuDHiT@FA]:Zw 5K#@FAHj1zZ!=FA]zX7| X6+2N5Lm-XP^5Ɗ*:2 9]VF|rv3ivmZ?:#ZijY 8шOD!'ZF#> BR=eC=/hu\/eb5)Ho>e[2<&lE=r3zyX#ƍ}a5bܥרc^S?`n+!<«XFCVʲ dKFU] (RO^F{nsv‹҈wjԸ#5XlNCvr1xΕ5 xVހGbu_S;FOO BKE@0|PWK]''''?uS~Z'?qc5t%\l)KjL:Ew&ڕnMBnƙ{J'ix &i`IA%tXVF^]zVե@(ƍےJl_~[\*qתR\UR3aԺͺkUIV* *)* *)*)kUO> (i-Z">EbBE֢,`1nH--JqZӣ~7c|y c4QMRq+'3oXU9=^Xr NBҴ@z~ph<KjJ-[(rX>9z3F1sj۸nzHa ͸+}Xw'jݥu~]X'jADA@? Ou'a~" ('OԺgu1uzF2zd1n(XF9;Rmr.-TQ*c|^mr~ciP=-1M*R`R0G!XA,s1NcHIe_B"X+DjĒʞgbIe9Wӣ7c,%`_#%}5>6R8C0PPR8 66 }`!n}e/kί\HJ}yv`< ʋ#"_'3MGvֆH徺Řslڃ<߶I1-|;DΠhTZŢ74sN)6-4:4̯o[_OCؠxdPD1;T}1xps9i6)_2M9Ƈ~pi;--zd'sB`HA?Snbr U\ O[ (x .E3y4.«[Q'od~INנu3;.._d5cuѠ3|(H}ڠ/DɟK!&kmY :ޔ@!\:GDslE>? ĥ!y6 0`q\W4aE,~.O..6T(ؠX<Fu׳y_/}Em y2_b0|g0u"ΠH~MS|`$xr+%.](4<ُ S$ ^r9MGNk|,ww&FZ}$!^[ |\^4am4l׬f>fuOd0:8to`ϫ!݅oLtYYnq1\([^boq0~8`d0X4 o~88SE3~ky |;vSw_p-cUZGw I3h5㍏A͞"y&Gz1^&DSZ8Y䅎Z\,'Th<X9B4 x d}^~$wܟ9Hs9ԍD@l?Қ-D~h_yo5Xi%wtSlqN5!8M(lAr,ۗ^ rO~|]2i A7΢=N]ӅI?ÂG1/YHð+rS-uy!@dkؕF۬C-cqgnٺsVF .}nޢ-ӔɥL8KEj#[%yǸ.X}d:ScߛxmhOKK y贡Za˶ ]- 4FbF]Fj5ۢxg]/C;+\ϢQ<5 fZrFg(3 " gu܂xu,Zh`|.ĸD|Pɀܣ59lf4'C8d!`lCNI'u^4,8~%b'gc |"MS L!^͔- &_b sg]܎Lxr&{<;X.69>&88p ` W%`q97١ŧM 4qdI`,Y,xO=pYԨ1K_2YH97&~Tbw99.8vsi>AX02y38Oͣb@^(ILb7Ka{Y@x8G^Pr.N0 P9 -KLƜ:XjO-6,|&y~K4X^3-Yieo&ub .B^ôR| cR/Y̌atA4K#$x ͧQB |>c+E9cWjs_9GFWgoJ|nOVu-vmW,Fٙ$0P=5kn|Bh:ݚ`^M 59i9-ƛKsR>_q1QǼk'PeGVx|N5Fyu{\eSDS>`^7PXd2a((mFk2|,I\oMHc+#Fc>wrFgsbٲ&8ڼ|p=BNhd#uL2˒yh7p5gu[\o8樏a?/YDS/т':ٻM,!;pJhqSWT527#l[Cf)2`Z[thX`%x&B&. [\Q9㌧'b>>_u&>Fz9z%.<=R٬zB=m_f ~W^Sǧư+G~(:ٿ/ǧ޿ɞy}.=O+?bnrz|^Z+S=T(fooKꤧ_(l ).]+o]ݳ?}~|oෑ:dz/[gejFJ.9 :c$.i/|<]i?}>ic8 9sjkv9׿o.1΋|ϗslq}_gJEY*z6qSF;l%V]׿oy1c~>,c>qO /K)@ڽ8\ed0n3ǒ%ty7Dx42|0m-s兌)u.?)q.[DEjyT47;C8nS*drkmtk?FPjBpP7m*At !rU'9Rza???ǻW<{.Y7ܞs$ o t q~ UZy~!|07oD#ay7oyeN~B!!~A]#?׿28-KXOoC|*/E_,po8HhV[ED\8~o7^y{!}yip;oeaݻ/5aߚ/vR,9jpl~2xX\Ki}{|~Y /to8n^詔u?PIw5ɍM~b?k~n郎Ȗs͇wfmާe)`iwee?ПW2M\'spӾyO0}P%#mNysi1ۦ܁v`?>5 ~z_:߲,x9e4DuX?2os2ш|֝<ۼs);?n;rK>NٞS}WSؽ֗ ׯ"_0wMYBE79|ᛟ~o}8Nϴ|n$~_5q_LfS{*Lׁ0;W~ؕ8gʷjZz}#(J܍/;]ǢǑQ*܍Iz> stream x\KsǑǞaҍdˡ%#,@$' `΀2V~33zW_>zy6nو/~*?޿ E_.oϾz =Sjgo޽=Yh=?hٛ㨔3q$=4csn|vs]VfxIכsXUJjՀfR>4ΫrcXs `^1TF4̚yqaelgP?!Hx<(e&&nXuF7`.۰tki-jlϢl }:!T#65ZK9@`zsD=IyH(kŲX$Q88p11"ԋ w p)2!O 9qEJ[v8bCUfah!"rhDT4P5Nf}s G6x'ͿwxM R 1='G~jGZep;q%B| `Z}Yw vy#irnSBBEVUof|? vJC6OFXL|_=[ dwp2 >ƄWZ)R_/h c&y6vyhډ}l \j Pp%_>m(R_*>lSDH eM"^&\f!b/i@AztcVh&ԕftD.6xbhB1LcM*G*aLq|O@v'4[ bi2t>51Cw5 ' &%sHF׹q-׎Y8`XFŗ\'`&'ijO0"qk}'YSE0l=;2&?o%!y) gȰR)qׅ $aL==T(|**|fq̮x :[2qBa73&Yc\{AH %~\1Ј9i-Rw}:a}ZoSςK5Jd,۠h:IyA# Skcpd4C dY ߱s6@ws}>cc\ =u-ѝ2xosD 74̯u͵h '\FͰW ba&Zϑ}BϔraA6eW#,ω@ 9Ogse oN -U4xguųAN^ fM:Li_"&ͩֆ$:VdlO`e$Vhk#2Di6Ş|܃C;di^5鸘RwlECH$oTks8 EdW [Au(;u]v̨fw^ix@]isUKY\lEHVv=hP`s06D5u KwwX neçL12= ճ"4 >;6w8AtRͿ."uckw?\\bۡg{b?Q/k +s{Ϭaw(@:U1?^ Uf|RQh0l61eȂX*bMX"Yԩc`jڪaYM>F4riw8r**1{ERW@\ۈ(I1TQS5đj \Wfb9fATHY+)%:XI/KBGCO ONQş[L>剱8*$lYy2b/LaSǯn0<)QuuR] #*@E%H1B5 8FG@ ]]rO_7>]SŅbhC@ rPb⏛:J 7*$q*tV. AEqfefu$zޢ-X[=WE@Z ZxYcad6ϱ

ޤ GKPn8e'򺺅2k~B~|2͵J@4 a\F:MAM|Y#KtKZW¤*2Ёd 4qXl.-j(KPгsR0nyi=!C&8LenULQ ߾/0rH]3;UkL僑t*X*(Tu)3P&D5M`(l%ʶ\ĥ.qH&92>b`YUU vΜ7sI%s3YfBxd5q5J8u̖Cs N%ܰYLgA+ xu>p ҟ,{tp T84~M Htv޺H.HTg`yml?'+i%+[|: XdU#tgV`AVtEE@C҂ʲl[Z/RL N'WJPą'&ix/NK|o@c^A"᫕=2'%R{9V+q#WLGޖ Ͱp. yN fg>{kcy_KƐTj;K1l%ݻ/%eC'jւ(Oxcrw\'>s#zQcmN\Eɨv$\:z=9uW;@|55RpZTUт@k8_r(Ldt*oI^!^yi:v+߯"s;Wk*3F߿JkziΦBXor鷒GŐ}gUrxT2)SZk=!жr8`M[.NR.c|ȔێOà|.tK _E @WY齜n9R+Yf.BNy~ywHƋ Zf]3l  w۵>O+ڷS42aF?fd%Po2d` |Po|aA4䀯?en'-ߐ_@2sEɤI!\G(K{([ FyF̫u[ >VD"X`(iN`tC(%RWM[:KDE>JBUnfzʖ`*Y` NQq4+7S*`ypw&umH_3r2+:'-B{U2[gAmC dgmNhd` 2asN^c"~B%X`LG#WUVwsU&gaعBf#҃@C}G@xѯB:.b>P-\tST +A5[*O<UxcTW[B*J}t$I2ۭ_֖х^~ 21cmT21L.nvG*q)X/ebw-NȕSpc.]øͬz~9CWքՓ2J,sX"bYt'^pb rmeYp:%(@?z-W5}zcQ}j]g"hgTF~ \6n=6X3ÜF?0qL?x.Vd pHO) ^+LpkwVh^JIfNY.Y(?qLOp^my~IA޼92?{qxU㹮W|W˧`8v(TlUGE.g˖E]4 'm.!;!.H@ 1w]5kpvx G3`2l~=|vð\SaWX+Xk"6;ո8w> stream x\KGr9ٍUQv%J%'X0$E;3; )l|Utѵ'x_tO~zNjŗ@ 蜾|$=.z}w: &.Ư]b kZZ'~)״=< .z?NO}b|י=~hYV5_ͷmP.53x:\^iӁ.:vbwXZ}96<GUX 1lCBzXahbO[ZNyxva;uGa1Ӝ,AFMdym<i@H^`XUpd?aKߐFXՇ,yiQ} %I0'~Tй mf8Hv}.@B#ip8F CY@nzE-`zSs|ruw4\ls7 02lOx۩cM {_S ;"ǩq6x#kmZNp /I){=Q  HHgZŨ:IHbߡLO>FB/TNg̅^l̘ B<9zVÐXH< }m;Oj-֫@YH}zԫLny(!̼͆4`0f,MR|Kg\ eObIZ f`1VdFPќdrnLgZ"oqh?[(opl#^*r[8WG q{)#cx@qa=cCD4 zj yPKNHf+RMM-eMz=521"si֢8-GDu2#h:afb/V{SDDm 7٘~_9X`%H_PTs0%Pnzz=V?EQV>$ ,+ngnMD-*>P,G;;;xLs\N&i{qiYKΙApFaXn5d]}>İ0 d6 WԵ);6]{;{c9( ks=rSrڂ`xC8Jf2߉(ؘ[=zOoU3&'5\J `Ra ǖά5u# V^sN[u*(\M(&[Ґ/vaʖĨo`6av>V# l/ Y%ք zP#R$f@Gzsz[aײ{2w8ݐ}U )#cḹz٣5F̕~ڳ˞0|4LBa >:踥!̋b~|.V-ɏS()9B,B5 \Ԗ m:N0J=. Utڻ *& ߝhz%)A-T-n68~Ӏྦྷ@nÄ֗6HsKpCaSTC(+:ab-2(;z–z=M ,A 2T'w &Sk>9ݛ2;gwi}5R+ct.QW|كЭeCkǿHFJٯL_6 袭REH%:Hc qNĒ#`2y.dLN^js7|la{}X}qF:ܽ}:A7s'8-/cǝBl5qer=Ńj_~ R)ֿGe$hpez2smH]nKzS9\jlC˜@ >\^& cʐi&w-a&rmjw!q1FӸ}k˸Kotd 0͔M~24FͫP*oB8[8~W <e|<֏p;pH8Nd`);&1\on=p{%~"ssi̜<>0m[g|=t1{LB:UD MQiZ =zAL Q?8鲼#y Ͱl]ʐ]ĵ+Pjꍩ't"#f;M_ʿ%z->C\c]NB3/ ;e .D+nM&i.$ Ua:V$wXD1:Wl?%~/S}ԝW 2'xLe@d9}ǽpFN L+E-X[:hSs؜3H_#nAEHKKMjYg㨆K׼[jc3QaT";G2Q*um8`& N‰yQ'U]/CP)+cTHN-}zbAy݋2A9g6W~ gݧR;^fM^ Z?'ϫy6W\w}[v,xYg̱SG TTgZ5.56 u1ov~|sz@<5 yMLk0 &ϫ ˘j]g\b[9:4#*1XAןvxHHϸ5Xd v=$~BU%iMyF* 04}[cLx mh8reѕ8V'bĪ׫!{U Lͷ&,l5w߆ Si߸]^V'130&H?ȊIN3 8cLw`\-DVv?B čԂ!"Wju?&]xq3+Y@A6yi5U51wBGBxnuRXb?\\_"j5.0EPSQIp2\yj>ӘջnLY`HdEO u-CcB?OJ&!"y`O]NiZ)|M[rj38v_|Jzf@¨jl7)ɤP`\g#hE:a{ }މvUyH hYs(X]\ c>W.^"Z|f*ȟ9l\'hP cdtm&hRhkˬx`{՟g9UIq;&, 0Q #mrE9'zOP>FEjJLM#u;k'/ᙉ6\hd|ť3^}\WRb;Ew:>} =h-jB;:9ŠN:"^ ?œ=ycηt "=1]ʜ׬ 7Iɔ3FByM#m||>8B."@8=bk)Bӆ:ZR9rNx(q %]Byu Y\ )7;eUc2A\Ʋ0/VY߰eNe [`5ٵǯ>5ϳZ+*7l12cȻJ MeQU<껡64dw[K|Nsf:PR뗣3œcK{=\xNx2e }>t3mXW% -K-lc<\' 4%8J剼R!kވ=\O9 ARxz 2t[ l[=r_;(^QƏ;(s|f(5 ] 0aH rQD嗔s4WKQ/|,\0E˺on!uy/(^N|Գ?(i^<")| KAߗ`,]祾oy}81! W"S4݋N:<ŀݖu(#̺mBhW/-zUfhNdr!ت s2]WiN3^D%wx Cluaۧhΐ;65$[0fkKNA5nmK)/?^zvtZU>>K>哿1endstream endobj 330 0 obj << /Filter /FlateDecode /Length 3901 >> stream x[Ks ߠӦQ(H,U|ڃKՌd^e|9JV H}8<rs|;WGdqs ͱmV?_c0|skBBHiuh4+%aL).U:x |4(k6o^3mE<%Tv HJYjVjQOd-u9QK< p"aF;`=>5lPi mt`ZlŰ t >!(=z>70!,<,c;ϖ޸|#M@8gHy\cRf/ 4}q b;t1$9|hk eIN^&3Vex0dFr{/Ra)$qM_eeKS$ 0ߑjYI $L47j&]S i,vL mOt[,qDSO,+U0k00קF@ Ǡ r%[(BFY ɴ̙2l\DCIZg̣\L+IZZvty*St@2D6d;) et@JSc<ڐ4+_*$/p,/2BD}Gas w!6@8L.cAf-}h}x?'Xi}T۬{ ^\ W~IѣF# 'H ?BXi(gY7dr[_mj(Q$ NO>CIu!;T1a0^elR4)o$ ꕟiX嘵A2=B7'y e1kT2z r ]T>Vhp]̫910DG+r>FrvK>l$5#))gځOz0[Ңx`Nb5W `!ͯ#*FdH+VR %TLD7fclJK]2Ob-g[$j^MjebV+ڥDw²}"*mJnϳ*jGCLs\ B$9>!1kc]p혠r 8ʞ)L;2I+0%DK0T bpj^Z/re"~Ymoj*`[c;CjdjE ogḺY_[߬U=I۫vZqʟ`Tnt ՜]_ N“o0H3Qf")9“_tאZ}i`XoZu|-D/:?ՋJNx ^ ':E}A>%0A訞(D۬lF(W%Nae=>Ax\yQ cDLͿv\c䮓9͛٬JkInSTJ88M'Ϧ.zND<5Ղ͎G4! UL=a)Tm_u}n<מݾ+$K2s¾b%<~|pSq?;^wZY+^]de,WD:A 6RR8B:3[-SĖA z.Z]9̝ X&TR4{ "@pG 2?,T ZG9}#$-"']Ki72jwQˉ}tB z{YmC8($=%;Hl HvHdD.#}1GV݂KөͿ0*JcKHx pq֏@!C$wo*U Pui)qʮQDnŒ~8\km?pTj+=zt3l>P-˯cEm6:dJp*Nı<$F*cjO׶Jy3M 5Z|mCu@67*¢6 'c5󴄊g5C~Q/(ZoHIAn6YFIt0Y%/Ke0{-")zou+r3cd˜WKWweBmk$wazL5?޷wJ{ˉTbjԷMθc|rYU{5 0ᔾwwR?rh~',騧.FbN^ZE<9*lGɖ#P#|qOGP?]1ly!!s3J^;7ae [ު0O{'DC\ Cŵ9 ԳЄpYVUmI$ElD#:_ "5< k?&ݓM*M-ϠS=3,+vp[Y>x\AZwOC1D&N)>`9)׈,¿'endstream endobj 331 0 obj << /Type /XRef /Length 340 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 332 /ID [<4e8817a897bb526da6b958a4f87ea26e>] >> stream x+Qa13anfO!MVKQ`GYZ`%)K([ȎR.;ņFY|-~===9Fc OȰ9].=]*{tMP6l|ıcwr_Lήv)Vϋ fX[bSPLӲhҁ<ΘX'Ё,=r&fbb=>Dpѿ).wp^\Sψʙ>bL_-w;Gw.19BN<"gTR%ee>w*C7T6KsbNM]*ض%VA endstream endobj startxref 592677 %%EOF tgp/src/0000755000175100001440000000000012655414756011670 5ustar hornikuserstgp/src/lik_post.h0000644000175100001440000000315612655414756013672 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __LIK_POST_H__ #define __LIK_POST_H__ double post_margin_rj(unsigned int n, unsigned int col, double lambda, double **Vb, double log_detK, double **T, double tau2, double a0, double g0, double temp); double post_margin(unsigned int n, unsigned int col, double lambda, double **Vb, double log_detK, double a0, double g0, double temp); double gp_lhood(double *Z, unsigned int n, unsigned int col, double **F, double *beta, double s2, double **Ki, double log_det_K, double *Kdiag, double temp); #endif tgp/src/predict_linear.h0000644000175100001440000000713512655414756015033 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __PREDICT_LINEAR_H__ #define __PREDICT_LINEAR_H__ int predict_full_linear(unsigned int n, double *zp, double *zpm, double *zpvm, double *zps2, double *Kdiag, unsigned int nn, double *zz, double *zzm, double *zzvm, double *zzs2, double *KKdiag, double **Ds2xy, double *improv, double *Z, unsigned int col, double **F, double **FF, double *bmu, double s2, double **Vb, double Zmin, int err, void *state); int predict_full_noK(unsigned int n1, double *zp, double *zpm, double *zps2, double *Kdiag, unsigned int n2, double * zz, double *zzm, double *zzs2, double *KKdiag, double **Ds2xy, unsigned int col, double **F, double **T, double tau2, double **FF, double *b, double ss2, int err, void *state); void predict_noK(unsigned int n1, unsigned int col, double *zzm, double *zzs2, double **F, double *b, double s2, double **Vb); void delta_sigma2_noK(double *Ds2xy, unsigned int n1, unsigned int n2, unsigned int col, double ss2, double denom, double **FT, double tau2, double *fT, double *IDpFTFiQx, double **FFrow, unsigned int which_i, double corr_diag); double predictive_mean_noK(unsigned int n1, unsigned int col, double *FFrow, int i, double * b); void predict_data_noK(double *zpm, double *zps2, unsigned int n1, unsigned int col, double **FFrow, double *b, double ss2, double *Kdiag); double predictive_var_noK(unsigned int n1, unsigned int col, double *Q, double *rhs, double *Wf, double *s2cor, double ss2, double *f, double **FW, double **W, double tau2, double **IDpFWFi, double corr_diag); void predict_delta_noK(double *zmean, double *zs, double **Ds2xy, unsigned int n1, unsigned int n2, unsigned int col, double **FFrow, double **FW, double **W, double tau2, double **IDpFWFi, double *b, double ss2, double* KKdiag); void predict_no_delta_noK(double *zmean, double *zs, unsigned int n1, unsigned int n2, unsigned int col, double **FFrow, double **FW, double **W, double tau2, double **IDpFWFi, double *b, double ss2, double *KKdiag); void predict_help_noK(unsigned int n1,unsigned int col,double *b, double **F, double **W, double tau2, double **FW, double **IDpFWFi, double *Kdiag); void delta_sigma2_linear(double *ds2xy, unsigned int n, unsigned int col, double s2, double *Vbf, double fVbf, double **F, double corr_diag); void predict_linear(unsigned int n, unsigned int col, double *zm, double *zs2, double **F, double *b, double s2, double **Vb, double **Ds2xy, double *Kdiag); #endif tgp/src/matrix.c0000644000175100001440000014577112655414756013357 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include "rhelp.h" #include "matrix.h" #include #include #include /* #define DEBUG */ /* * get_data_rect: * * compute and return the rectangle implied by the X data */ double **get_data_rect(double **X, unsigned int N, unsigned int d) { unsigned int i,j; double ** rect = new_matrix(2, d); for(i=0; i rect[1][i]) rect[1][i] = X[j][i]; } } return(rect); } /* * replace matrix with zeros */ void zero(double **M, unsigned int n1, unsigned int n2) { unsigned int i, j; for(i=0; i= n1); assert(n2_new >= n2); if(n1_new <= 0 || n2_new <= 0) { assert(M == NULL); return NULL; } if(M == NULL) { assert(n1 == 0 || n2 == 0); return new_zero_matrix(n1_new, n2_new); } if(n2 == n2_new) { m = (double**) malloc(sizeof(double*) * n1_new); assert(m); m[0] = realloc(M[0], sizeof(double) * n1_new * n2_new); free(M); assert(m[0]); for(i=1; i= n1); assert(n2_new >= n2); if(n1_new <= 0 || n2_new <= 0) { assert(M == NULL); return NULL; } if(M == NULL) { assert(n1 == 0 || n2 == 0); return new_zero_imatrix(n1_new, n2_new); } if(n2 == n2_new) { m = (int**) malloc(sizeof(int*) * n1_new); assert(m); m[0] = realloc(M[0], sizeof(int) * n1_new * n2_new); free(M); assert(m[0]); for(i=1; i 0 && col > 0) assert(M); for(i=0; i 0 && col > 0) assert(M); for(i=0; i 0 && col > 0) assert(M); for(i=0; i 0 && n2 > 0); assert(M1 && M2); for(i=0; i 0 && n2 > 0); for(i=0; i 0) s[i] = f(M[0][i]); else s[i] = 0; for(j=1; jx < bb->x) return -1; else return 1; } /* * calculate the quantiles of v[1:n] specified in q[1:m], and store them * in qs[1:m]; If non-null weights, then use the sorting method; assume * that the weights are NORMALIZED, it is also assumed that the q[1:m] * is specified in increasing order */ void quantiles(double *qs, double *q, unsigned int m, double *v, double *w, unsigned int n) { unsigned int i, k, j; double wsum; Wsamp **wsamp; /* create and fill pointers to weighted sample structures */ if(w != NULL) { wsamp = (Wsamp**) malloc(sizeof(struct wsamp*) * n); for(i=0; iw = w[i]; wsamp[i]->x = v[i]; } /* sort by v; and implicity report the associated weights w */ qsort((void*)wsamp, n, sizeof(Wsamp*), compareWsamp); } else wsamp = NULL; /* for each quantile in q */ wsum = 0.0; for(i=0, j=0; j 0 && q[j] <1); /* find the (non-weighted) quantile using select */ if(w == NULL) { /* calculate the index-position of the quantile */ k = (unsigned int) n*q[j]; qs[j] = quick_select(v, n, k); } else { /* else using sorting method */ /* check to make sure the qs are ordered */ assert(wsamp); if(j > 0) assert(q[j] > q[j-1]); /* find the next quantile in the q-array */ for(; i 0 && wsum >= q[j]) { qs[j] = wsamp[i-1]->x; break; } /* increment with the next weight */ wsum += wsamp[i]->w; /* see if we've found the next quantile */ if(wsum >= q[j]) { qs[j] = wsamp[i]->x; break; } } /* check to make sure we actually had founda quantile */ if(i == n) warning("unable to find quanile q[%d]=%g", j, q[j]); } } /* clean up */ if(w) { assert(wsamp); for(i=0; i to); n = (unsigned int) (from - to) + 1; by = -1; } if(n == 0) return NULL; s = new_ivector(n); s[0] = from; for(i=1; i) EQ(==) LEQ(<=) GEQ(>=) NE(!=) */ int* find(double *V, unsigned int n, FIND_OP op, double val, unsigned int* len) { unsigned int i,j; int *tf; int *found; tf = new_ivector(n); (*len) = 0; switch (op) { case GT: for(i=0; i val) tf[i] = 1; else tf[i] = 0; if(tf[i] == 1) (*len)++; } break; case GEQ: for(i=0; i= val) tf[i] = 1; else tf[i] = 0; if(tf[i] == 1) (*len)++; } break; case EQ: for(i=0; i) * EQ(==) LEQ(<=) GEQ(>=) NE(!=) */ int* find_col(double **V, int *pv, unsigned int n, unsigned int var, FIND_OP op, double val, unsigned int* len) { unsigned int i,j; int *tf, *p; int *found; tf = new_ivector(n); if(pv) p = pv; else p = iseq(0,n-1); (*len) = 0; switch (op) { case GT: for(i=0; i val) tf[i] = 1; else tf[i] = 0; if(tf[i] == 1) (*len)++; } break; case GEQ: for(i=0; i= val) tf[i] = 1; else tf[i] = 0; if(tf[i] == 1) (*len)++; } break; case EQ: for(i=0; i= low && k <= high); for (;;) { if (high <= low) /* One element only */ return arr[k] ; if (high == low + 1) { /* Two elements only */ if (arr[low] > arr[high]) ELEM_SWAP(arr[low], arr[high]) ; return arr[k] ; } /* Find kth of low, middle and high items; swap into position low */ middle = (low + high) / 2; if (arr[middle] > arr[high]) ELEM_SWAP(arr[middle], arr[high]) ; if (arr[low] > arr[high]) ELEM_SWAP(arr[low], arr[high]) ; if (arr[middle] > arr[low]) ELEM_SWAP(arr[middle], arr[low]) ; /* Swap low item (now in position middle) into position (low+1) */ ELEM_SWAP(arr[middle], arr[low+1]) ; /* Nibble from each end towards middle, swapping items when stuck */ ll = low + 1; hh = high; for (;;) { do ll++; while (arr[low] > arr[ll]) ; do hh--; while (arr[hh] > arr[low]) ; if (hh < ll) break; ELEM_SWAP(arr[ll], arr[hh]) ; } /* Swap middle item (in position low) back into correct position */ ELEM_SWAP(arr[low], arr[hh]) ; /* Re-set active partition */ if (hh <= k) low = ll; if (hh >= k) high = hh - 1; } } /* * same as the quick_select algorithm above, but less * efficient. Not currently used in tgp */ double kth_smallest(double a[], int n, int k) { int i,j,l,m ; double x ; l=0 ; m=n-1 ; while (l= lenp * and ncol(v) >= max(p) */ void sub_p_matrix(double **V, int *p, double **v, unsigned int nrows, unsigned int lenp, unsigned int col_offset) { int i,j; assert(V); assert(p); assert(v); assert(nrows > 0 && lenp > 0); for(i=0; i= ncols * and ncol(v) >= max(p) */ double **new_p_submatrix(int *p, double **v, unsigned int nrows, unsigned int ncols, unsigned int col_offset) { double **V; if(nrows == 0 || ncols+col_offset == 0) return NULL; V = new_matrix(nrows, ncols + col_offset); if(ncols > 0) sub_p_matrix(V, p, v, nrows, ncols, col_offset); return(V); } /* * sub_p_matrix_rows: * * copy the rows v[1:n1][p[n2]] to V. * must have ncol(v) == ncol(V) and nrow(V) >= lenp * and nrow(v) >= max(p) */ void sub_p_matrix_rows(double **V, int *p, double **v, unsigned int ncols, unsigned int lenp, unsigned int row_offset) { int i; assert(V); assert(p); assert(v); assert(ncols > 0 && lenp > 0); for(i=0; i= nrows * and nrow(v) >= max(p) */ double **new_p_submatrix_rows(int *p, double **v, unsigned int nrows, unsigned int ncols, unsigned int row_offset) { double **V; if(nrows+row_offset == 0 || ncols == 0) return NULL; V = new_matrix(nrows + row_offset, ncols); if(nrows > 0) sub_p_matrix_rows(V, p, v, ncols, nrows, row_offset); return(V); } /* * copy_p_matrix: * * copy v[n1][n2] to V into the positions specified by p1[n1] and p2[n2] */ void copy_p_matrix(double **V, int *p1, int *p2, double **v, unsigned int n1, unsigned int n2) { int i,j; assert(V); assert(p1); assert(p2); assert(n1 > 0 && n2 > 0); for(i=0; i q2[i] || mean[i] < q1[i]) { MYprintf(MYstdout, "replacing %g with (%g,%g,%g)\n", mean[i], q1[i], median[i], q2[i]); mean[i] = median[i]; replace++; } } /* let us know what happened */ if(replace > 0) MYprintf(MYstdout, "NOTICE: %d predictive means replaced with medians\n", replace); } /* * pass back the indices (through p) into the matrix X which lie * within the boundaries described by rect; return the number of true * indices. X is treated as n1 x n2, and p is an n1 (preallocated) * array */ unsigned int matrix_constrained(int *p, double **X, unsigned int n1, unsigned int n2, Rect *rect) { unsigned int i,j, count; count = 0; /* printRect(MYstderr, rect->d, rect->boundary); */ for(i=0; iopl[j] == GT) { assert(rect->opr[j] == LEQ); p[i] = (int) (X[i][j] > rect->boundary[0][j] && X[i][j] <= rect->boundary[1][j]); } else if(rect->opl[j] == GEQ) { if(rect->opr[j] == LEQ) p[i] = (int) (X[i][j] >= rect->boundary[0][j] && X[i][j] <= rect->boundary[1][j]); else if(rect->opr[j] == LT) p[i] = (int) (X[i][j] >= rect->boundary[0][j] && X[i][j] < rect->boundary[1][j]); else assert(0); } else assert(0); if(p[i] == 0) break; } if(p[i] == 1) count++; } return count; } /* * create a new rectangle structure without any of the fields filled * in */ Rect* new_rect(unsigned int d) { Rect* rect = (Rect*) malloc(sizeof(struct rect)); rect->d = d; rect->boundary = new_matrix(2, d); rect->opl = (FIND_OP *) malloc(sizeof(FIND_OP) * d); rect->opr = (FIND_OP *) malloc(sizeof(FIND_OP) * d); return rect; } /* * create a new rectangle structure with the boundary populated * by the contents of a double array */ Rect* new_drect(double **drect, int d) { unsigned int i; Rect *rect = new_rect(d); for(i=0; iboundary[0][i] = drect[0][i]; rect->boundary[1][i] = drect[1][i]; rect->opl[i] = GEQ; rect->opr[i] = LEQ; } return rect; } /* * return a pointer to a duplicated rectangle structure */ Rect* new_dup_rect(Rect* oldR) { unsigned int i; Rect* rect = (Rect*) malloc(sizeof(struct rect)); rect->d = oldR->d; rect->boundary = new_dup_matrix(oldR->boundary, 2, oldR->d); rect->opl = (FIND_OP *) malloc(sizeof(FIND_OP) * rect->d); rect->opr = (FIND_OP *) malloc(sizeof(FIND_OP) * rect->d); for(i=0; id; i++) { rect->opl[i] = oldR->opl[i]; rect->opr[i] = oldR->opr[i]; } return rect; } /* * calculate and return the area depicted by * the rectangle boundaries */ double rect_area(Rect* rect) { unsigned int i; double area; area = 1.0; for(i=0; id; i++) area *= rect->boundary[1][i] - rect->boundary[0][i]; return area; } /* * calculate and return the area depicted by * the rectangle boundaries, using only dimensions 0,...,maxd-1 */ double rect_area_maxd(Rect* rect, unsigned int maxd) { unsigned int i; double area; assert(maxd <= rect->d); area = 1.0; for(i=0; iboundary[1][i] - rect->boundary[0][i]; return area; } /* * print a rectangle structure out to * the file denoted by "outfile" */ void print_rect(Rect *r, FILE* outfile) { unsigned int i; MYprintf(outfile, "# %d dim rect (area=%g) with boundary:\n", r->d, rect_area(r)); printMatrix(r->boundary, 2, r->d, outfile); MYprintf(outfile, "# opl and opr\n"); for(i=0; id; i++) MYprintf(outfile, "%d ", r->opl[i]); MYprintf(outfile, "\n"); for(i=0; id; i++) MYprintf(outfile, "%d ", r->opr[i]); MYprintf(outfile, "\n"); } /* * free the memory associated with a * rectangle structure */ void delete_rect(Rect *rect) { delete_matrix(rect->boundary); free(rect->opl); free(rect->opr); free(rect); } /* * make it so that the data lives in * [0,1]^d. */ void normalize(double **X, double **rect, int N, int d, double normscale) { int i, j; double norm; if(N == 0) return; assert(d != 0); for(i=0; i=0 && X[j][i] <= normscale)) MYprintf(MYstdout, "X[%d][%d] = %g, normscale = %g\n", j, i, X[j][i], normscale); assert(X[j][i] >=0 && X[j][i] <= normscale); */ } } } /* * put Rect r on the scale of double rect * r should be form 0 to NORMSCALE */ void rect_unnorm(Rect* r, double **rect, double normscale) { int i; double norm; for(i=0; id; i++) { assert(r->boundary[0][i] >= 0 && r->boundary[1][i] <= normscale); norm = fabs(rect[1][i] - rect[0][i]); if(norm == 0) norm = fabs(rect[0][i]); r->boundary[1][i] = normscale * r->boundary[1][i]; r->boundary[0][i] = rect[0][i] + norm * r->boundary[0][i]; r->boundary[1][i] = rect[1][i] - norm * (1.0 - r->boundary[1][i]); } } /* * allocates a new double array of size n1 */ double* new_vector(unsigned int n) { double *v; if(n == 0) return NULL; v = (double*) malloc(sizeof(double) * n); return v; } /* * allocates a new double array of size n1 * and fills it with zeros */ double* new_zero_vector(unsigned int n) { double *v; v = new_vector(n); zerov(v, n); return v; } /* * allocates a new double array of size n1 * and fills it with the contents of vold */ double* new_dup_vector(double* vold, unsigned int n) { double *v; v = new_vector(n); dupv(v, vold, n); return v; } /* * copies vold to v * (assumes v has already been allcocated) */ void dupv(double *v, double* vold, unsigned int n) { unsigned int i; for(i=0; i 0); for(i=0; i 0); for(i=0; i 0); assert(v1 && v2); add_matrix(a, &v1, b, &v2, 1, n); } /* * add two integer vectors of the same size * v1 = v1 + v2 */ void add_ivector(int *v1, int *v2, unsigned int n) { unsigned int i; if(n == 0) return; assert(n > 0); assert(v1 && v2); for(i=0; i max) { max = v[i]; *which = i; } } return max; } /* * new vector of integers of length n */ int *new_ivector(unsigned int n) { int *iv; if(n == 0) return NULL; iv = (int*) malloc(sizeof(int) * n); assert(iv); return iv; } /* * duplicate the integer contents of iv of length n into the already * allocated vector iv_new, also of length n */ void dupiv(int *iv_new, int *iv, unsigned int n) { unsigned int i; if(n > 0) assert(iv && iv_new); for(i=0; i 0) assert(iv); for(i=0; i 0); for(i=0; i 0); for(i=0; i= b) return a; else return b; } /* * MYfmin: * * seems like some systems are missing the prototype * for the fmin function which should be in math.h -- * so I wrote my own */ double MYfmin(double a, double b) { if(a <= b) return a; else return b; } /* * vmult: * * returns the product of its arguments */ double vmult(double *v1, double *v2, int n) { double v = 0.0; int i; for(i=0; i #ifndef _RANDOMKIT_ #define _RANDOMKIT_ #define RK_STATE_LEN 624 typedef struct rk_state_ { unsigned long key[RK_STATE_LEN]; int pos; int has_gauss; /* !=0: gauss contains a gaussian deviate */ double gauss; } rk_state; typedef enum { RK_NOERR = 0, /* no error */ RK_ENODEV = 1, /* no RK_DEV_RANDOM device */ RK_ERR_MAX = 2 } rk_error; /* error strings */ extern char *rk_strerror[RK_ERR_MAX]; /* Maximum generated random value */ #define RK_MAX 0xFFFFFFFFUL #ifdef __cplusplus extern "C" { #endif /* * Initialize the RNG state using the given seed. */ extern void rk_seed(unsigned long seed, rk_state *state); /* * Initialize the RNG state using a random seed. * Uses /dev/random or, when unavailable, the clock (see randomkit.c). * Returns RK_NOERR when no errors occurs. * Returns RK_ENODEV when the use of RK_DEV_RANDOM failed (for example because * there is no such device). In this case, the RNG was initialized using the * clock. */ extern rk_error rk_randomseed(rk_state *state); /* * Returns a random unsigned long between 0 and RK_MAX inclusive */ extern unsigned long rk_random(rk_state *state); /* * Returns a random long between 0 and LONG_MAX inclusive */ extern long rk_long(rk_state *state); /* * Returns a random unsigned long between 0 and ULONG_MAX inclusive */ extern unsigned long rk_ulong(rk_state *state); /* * Returns a random unsigned long between 0 and max inclusive. */ extern unsigned long rk_interval(unsigned long max, rk_state *state); /* * Returns a random double between 0.0 and 1.0, 1.0 excluded. */ extern double rk_double(rk_state *state); /* * fill the buffer with size random bytes */ extern void rk_fill(void *buffer, size_t size, rk_state *state); /* * fill the buffer with randombytes from the random device * Returns RK_ENODEV if the device is unavailable, or RK_NOERR if it is * On Unix, if strong is defined, RK_DEV_RANDOM is used. If not, RK_DEV_URANDOM * is used instead. This parameter has no effect on Windows. * Warning: on most unixes RK_DEV_RANDOM will wait for enough entropy to answer * which can take a very long time on quiet systems. */ extern rk_error rk_devfill(void *buffer, size_t size, int strong); /* * fill the buffer using rk_devfill if the random device is available and using * rk_fill if is is not * parameters have the same meaning as rk_fill and rk_devfill * Returns RK_ENODEV if the device is unavailable, or RK_NOERR if it is */ extern rk_error rk_altfill(void *buffer, size_t size, int strong, rk_state *state); /* * return a random gaussian deviate with variance unity and zero mean. */ extern double rk_gauss(rk_state *state); #ifdef __cplusplus } #endif #endif /* _RANDOMKIT_ */ tgp/src/gp.h0000644000175100001440000001627612655414756012463 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __GP_H__ #define __GP_H__ #include #include "corr.h" #include "base.h" /* not including tree.h */ class Tree; #define BUFFMAX 256 typedef enum BETA_PRIOR {B0=801, BMLE=802, BFLAT=803, B0NOT=804, BMZT=805, BMZNOT=806} BETA_PRIOR; typedef enum MEAN_FN {LINEAR=901, CONSTANT=902, TWOLEVEL=903} MEAN_FN; class Gp : public Base { private: double **F; /* col x n, matrix */ double **FF; /* col x nn, matrix */ double **xxKx; /* nn x n, cross covariance between XX and X */ double **xxKxx; /* nn x nn, cross covariance between XX and XX */ double *b; /* dimension=col, beta: linear coefficients */ double s2; /* sigma^2: process variance */ double tau2; /* tau^2: linear variance */ Corr_Prior *corr_prior; /* prior model for the correlation function */ Corr *corr; /* unspecified correllation family */ double **Vb; /* variance of Gibbs beta step */ double *bmu; /* mean of gibbs beta step */ double *bmle; /* linear coefficients mle w/o Gp */ double lambda; /* parameter in marginalized beta */ public: Gp(unsigned int d, Base_Prior *prior, Model *model); Gp(double **X, double *Z, Base *gp_old, bool economy); virtual ~Gp(void); virtual Base* Dup(double **X, double *Z, bool economy); virtual void Clear(void); virtual void ClearPred(void); virtual void Update(double **X, unsigned int n, unsigned int d, double *Z); virtual void UpdatePred(double **XX, unsigned int nn, unsigned int d, bool Ds2xy); virtual bool Draw(void *state); virtual void Predict(unsigned int n, double *zp, double *zpm, double *zpvm, double *zps2, unsigned int nn, double *zz, double *zzm, double *zzvm, double *zzs2, double **ds2xy, double *improv, double Zmin, bool err, void *state); virtual void Match(Base* gp_old); virtual void Combine(Base *l_gp, Base *r_gp,void *state); virtual void Split(Base *l_gp, Base *r_gp, void *state); virtual double Posterior(void); virtual double MarginalLikelihood(double itemp); virtual double Likelihood(double itemp); virtual double FullPosterior(double itemp); virtual double MarginalPosterior(double itemp); virtual void Compute(void); virtual void ForceLinear(void); virtual void ForceNonlinear(void); virtual bool Linear(void); virtual bool Constant(void); virtual void printFullNode(void); virtual double Var(void); virtual char* State(unsigned int which); virtual unsigned int sum_b(void); virtual void Init(double *dgp); virtual void X_to_F(unsigned int n, double **X, double **F); virtual double* Trace(unsigned int* len, bool full); virtual char** TraceNames(unsigned int* len, bool full); virtual double NewInvTemp(double itemp, bool isleaf); double* get_b(void); double *Bmle(void); double* all_params(double *s2, double *tau2, Corr** corr); void split_tau2(double *tau2_new, void *state); Corr *get_Corr(void); }; double combine_tau2(double l_tau2, double r_tau2, void *state); class Gp_Prior : public Base_Prior { private: BETA_PRIOR beta_prior; /* indicator for type of Beta Prior */ MEAN_FN mean_fn; Corr_Prior *corr_prior; double *b; /* starting: col, GP linear regression coefficients */ double s2; /* starting: GP variance parameter */ double tau2; /* starting: GP linear variance parameter */ double *b0; /* hierarchical non-tree parameter b0 */ /* (the T matrix is called W in the paper) */ double **Ti; /* hierearical non-tree parameter Ti */ double **T; /* inverse of Ti */ double **Tchol; /* for help in T=inv(Ti) */ double *mu; /* mean prior for b0 */ double **Ci; /* prior covariance for b0 */ unsigned int rho; /* prior df for T */ double **V; /* prior covariance for T */ double **rhoVi; /* (rho*V)^(-1) for Ti pdf calculation */ double s2_a0; /* s2 prior alpha parameter */ double s2_g0; /* s2 prior beta parameter */ double s2_a0_lambda; /* hierarchical s2 inv-gamma alpha parameter */ double s2_g0_lambda; /* hierarchical s2 inv-gamma beta parameter */ bool fix_s2; /* estimate hierarchical s2 parameters or not */ double tau2_a0; /* tau2 prior alpha parameter */ double tau2_g0; /* tau2 prior beta parameter */ double tau2_a0_lambda; /* hierarchical tau2 inv-gamma alpha parameter */ double tau2_g0_lambda; /* hierarchical tau2 inv-gamma beta parameter */ bool fix_tau2; /* estimate hierarchical tau2 parameters or not */ void initT(void); public: /* start public functions */ Gp_Prior(unsigned int d, MEAN_FN mean_fn); Gp_Prior(Base_Prior* prior); virtual ~Gp_Prior(void); virtual void read_ctrlfile(std::ifstream* ctrlfile); virtual void read_double(double *dparams); virtual void Init(double *dhier); virtual void Draw(Tree** leaves, unsigned int numLeaves, void *state); virtual bool LLM(void); virtual double ForceLinear(void); virtual void ResetLinear(double gamb); virtual void Print(FILE* outfile); virtual Base* newBase(Model *model); virtual Base_Prior* Dup(void); virtual double log_HierPrior(void); virtual double* Trace(unsigned int* len, bool full); virtual char** TraceNames(unsigned int* len, bool full); virtual double GamLin(unsigned int which); void InitT(void); void read_beta(char *line); void default_s2_priors(void); void default_s2_lambdas(void); void default_tau2_priors(void); void default_tau2_lambdas(void); double s2Alpha(void); double s2Beta(void); double tau2Alpha(void); double tau2Beta(void); double *B(void); double S2(void); double Tau2(void); double** get_T(void); double** get_Ti(void); double* get_b0(void); Corr_Prior* CorrPrior(void); BETA_PRIOR BetaPrior(void); MEAN_FN MeanFn(void); }; void allocate_leaf_params(unsigned int col, double ***b, double **s2, double **tau2, unsigned int **n, Corr ***corr, Tree **leaves, unsigned int numLeaves); void deallocate_leaf_params(double **b, double *s2, double *tau2, unsigned int *n, Corr **corr); #endif tgp/src/gen_covar.h0000644000175100001440000000506212655414756014007 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __GEN_COVAR_H__ #define __GEN_COVAR_H__ void dist(double **DIST, unsigned int m, double **X1, unsigned int n1, double **X2, unsigned int n2, double pwr); void exp_corr_sep(double **K, unsigned int m, double **X1, unsigned int n1, double **X2, unsigned int n2, double *d, double pwr); void sim_corr(double **K, unsigned int m, double **X1, unsigned int n1, double **X2, unsigned int n2, double *d, double pwr); void dist_symm(double **DIST, unsigned int m, double **X, unsigned int n, double pwr); void exp_corr_sep_symm(double **K, unsigned int m, double **X, unsigned int n, double *d, double nug, double pwr); void sim_corr_symm(double **K, unsigned int m, double **X, unsigned int n, double *d, double nug, double pwr); void dist_to_K(double **K, double **DIST, double d, double nug, unsigned int m, unsigned int n); void dist_to_K_symm(double **K, double **DIST, double d, double nug, unsigned int n); void matern_dist_to_K(double **K, double **DIST, double d, double nu, double *bk, double nug, unsigned int m, unsigned int n); void matern_dist_to_K_symm(double **K, double **DIST, double d, double nu, double *bk, double nug, unsigned int n); void inverse_chol(double **M, double **Mi, double **Mutil, unsigned int n); void inverse_lu(double **M, double **Mi, double **Mutil, unsigned int n); void solve_chol(double *x, double **A, double *b, unsigned int n); double log_bessel_k(double x, double nu, double exp0, double *bk, long bn); #endif tgp/src/predict.c0000644000175100001440000005532512655414756013500 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include #include #include #include #include "rand_draws.h" #include "rand_pdf.h" #include "matrix.h" #include "predict.h" #include "linalg.h" #include "rhelp.h" #include "lh.h" #include /* #define DEBUG */ /* * predictive_mean: * * compute the predictive mean of a single observation * used by predict_data and predict * * FFrow[col], KKrow[n1], KiZmFb[n1], b[col] */ double predictive_mean(n1, col, FFrow, KKrow, b, KiZmFb) unsigned int n1, col; double *FFrow, *KKrow, *KiZmFb, *b; { double zzm; /* Note that KKrow has been passed without any jitter. */ /* f(x)' * beta */ zzm = linalg_ddot(col, FFrow, 1, b, 1); /* E[Z(x)] = f(x)' * beta + k'*Ki*(Zdat - F*beta) */ zzm += linalg_ddot(n1, KKrow, 1, KiZmFb, 1); #ifdef DEBUG /* check to make sure the prediction is not too big; an old error */ if(abs(zzm) > 10e10) warning("(predict) abs(zz)=%g > 10e10", zzm); #endif return zzm; } /* * predict_data: * * used by the predict_full funtion below to fill * zmean and zs [n1] with predicted mean and var values * at the data locations, X * * b[col], KiZmFb[n1], z[n1], FFrow[n1][col], K[n1][n1]; */ void predict_data(zpm,zps2,n1,col,FFrow,K,b,ss2,zpjitter,KiZmFb) unsigned int n1, col; double *b, *KiZmFb, *zpm, *zps2, *zpjitter; double **FFrow, **K; double ss2; { int i; /* Note that now K is passed with jitter included. This was previously removed in the predict_full fn. */ /* printf("zp: "); printVector(zpjitter,5,MYstdout, HUMAN); */ /* for each point at which we want a prediction */ for(i=0; i 0);*/ Qy = new_vector(n1); for(i=0; i= 0); } /* clean up */ free(Qy); } /* * predictive_var: * * computes the predictive variance for a single location * used by predict. Also returns Q, rhs, Wf, and s2corr * which are useful for computing Delta-sigma * * Q[n1], rhs[n1], Wf[col], KKrow[n1], FFrow[n1], FW[col][n1], * KpFWFi[n1][n1], W[col][col]; */ double predictive_var(n1, col, Q, rhs, Wf, s2cor, ss2, k, f, FW, W, tau2, KpFWFi, corr_diag) unsigned int n1, col; double *Q, *rhs, *Wf, *k, *f, *s2cor; double **FW, **KpFWFi, **W; double ss2, corr_diag, tau2; { double s2, kappa, fWf, last; /* Var[Z(x)] = s2*[KKii + jitter + fWf - Q (K + FWF)^{-1} Q] */ /* where Q = k + FWf */ /* Q = k + tau2*FW*f(x); */ dupv(Q, k, n1); linalg_dgemv(CblasNoTrans,n1,col,tau2,FW,n1,f,1,1.0,Q,1); /* rhs = KpFWFi * Q */ linalg_dgemv(CblasNoTrans,n1,n1,1.0,KpFWFi,n1,Q,1,0.0,rhs,1); /* Q (K + tau2*FWF)^{-1} Q */ /* last = Q*rhs = Q*KpFWFi*Q */ last = linalg_ddot(n1, Q, 1, rhs, 1); /* W*f(x) */ linalg_dsymv(col,1.0,W,col,f,1,0.0,Wf,1); /* f(x)*Wf */ fWf = linalg_ddot(col, f, 1, Wf, 1); /* finish off the variance */ /* Var[Z(x)] = s2*[KKii + jitter + fWf - Q (K + FWF)^{-1} Q] */ /* Var[Z(x)] = s2*[kappa - Q C^{-1} Q] */ /* of course corr_diag = 1.0 + nug, for non-mr_tgp & non calibration */ kappa = corr_diag + tau2*fWf; *s2cor = kappa - last; s2 = ss2*(*s2cor); /* this is to catch bad s2 calculations; note that jitter = nug for non-mr_tgp */ if(s2 <= 0) { s2 = 0; *s2cor = corr_diag-1.0; } return s2; } /* * predict_delta: * * used by the predict_full funtion below to fill * zmean and zs [n2] with predicted mean and var * values based on the input coded in terms of * FF,FW,W,xxKx,KpFWF,KpFWFi,b,ss2,nug,KiZmFb * * Also calls delta_sigma2 at each predictive location, * because it uses many of the same computed quantaties * as needed to compute the predictive variance. * * b[col], KiZmFb[n1], z[n2] FFrow[n2][col], KKrow[n2][n1], * xxKxx[n2][n2], KpFWFi[n1][n1], FW[col][n1], W[col][col], * Ds2xy[n2][n2]; */ void predict_delta(zzm,zzs2,Ds2xy,n1,n2,col,FFrow,FW,W,tau2,KKrow,xxKxx,KpFWFi,b, ss2, zzjitter,KiZmFb) unsigned int n1, n2, col; double *b, *KiZmFb, *zzm, *zzs2, *zzjitter; double **FFrow, **KKrow, **xxKxx, **KpFWFi, **FW, **W, **Ds2xy; double ss2, tau2; { int i; double s2cor; /*double Q[n1], rhs[n1], Wf[col];*/ double *Q, *rhs, *Wf; /* zero stuff out before starting the for-loop */ rhs = new_zero_vector(n1); Wf = new_zero_vector(col); Q = new_vector(n1); /* for each point at which we want a prediction */ for(i=0; i 0) improv[i] = diff; */ if(improv[i] < 0) improv[i] = 0.0; } } /* * predicted_improv: * * compute the improvement statistic for * posterior predictive data z * * This more raw statistic allows * a full summary of the Improvement I(X) distribution, * rather than the expected improvement provided by * expected_improv. * * Samples z(X) are (strongly) preferred over the data * Z(X), and likewise for zz(XX) rather than zz-hat(XX) * * Note that there is no predictive-variance argument. */ void predicted_improv(n, nn, improv, Zmin, zp, zz) unsigned int n, nn; double *improv, *zp, *zz; double Zmin; { unsigned int which, i; double fmin, diff; /* shouldn't be called if improv is NULL */ assert(improv); /* calculate best minimum so far */ fmin = min(zp, n, &which); if(Zmin < fmin) fmin = Zmin; for(i=0; i 0) improv[i] = diff; else improv[i] = 0.0; } } /* * GetImprovRank: * * implements Matt Taddy's algorithm for determining the order * in which the nn points -- whose improv samples are recorded * in the cols of Imat_in over R rounds -- should be added into * the design in order to get the largest expected improvement. * w are R importance tempering (IT) weights */ unsigned int* GetImprovRank(int R, int nn, double **Imat_in, int g, int numirank, double *w) { /* duplicate Imat, since it will be modified by this method */ unsigned int j, i, k, /* m,*/ maxj; double *colmean, *maxcol; double **Imat; /* double maxmean; */ unsigned int *pntind; /* allocate the ranking vector */ pntind = new_zero_uivector(nn); assert(numirank >= 0 && numirank <= nn); if(numirank == 0) return pntind; /* duplicate the Improv matrix so we can modify it */ Imat = new_dup_matrix(Imat_in, R, nn); /* first, raise improv to the appropriate power */ for (j=0; j 0.0) Imat[i][j] = 1.0; else for(k=1; k MYfmax(fabs(XX[i]-Xo[l]), fabs(XX[i]-Xo[u]))) search = 0; else{ l++; u++; } } /*printf("l=%d, u=%d, Xo[l]=%g, Xo[u]=%g, XX[i]=%g \n", l, u, Xo[l],Xo[u],XX[i]);*/ /* width of the window in X-space */ range = MYfmax(fabs(XX[i]-Xo[l]), fabs(XX[i]-Xo[u])); /* calculate the weights in the window; * every weight outside the window will be zero */ zerov(w,n); for(j=l; j<=u; j++){ dist = fabs(XX[i]-Xo[j])/range; w[j] = (1.0-dist)*(1.0-dist); } /* record the (normalized) weighted average in the window */ sumW = sumv(&(w[l]), q); YY[i] = vmult(&(w[l]), &(Yo[l]), q)/sumW; /*printf("YY = "); printVector(YY, nn, MYstdout, HUMAN);*/ } /* clean up */ free(w); free(o); free(Xo); free(Yo); } /* * sobol_indices: * * calculate the Sobol S and T indices using samples of the * posterior predictive distribution (ZZm and ZZvar) at * nn*(d+2) locations */ void sobol_indices(double *ZZ, unsigned int nn, unsigned int m, double *S, double *T) { /* pointers to responses for the original two LHSs */ unsigned int j, k; double dnn, sqEZ, lVZ, ponent, U, Uminus; double *fN; double *fM1 = ZZ; double *fM2 = ZZ + nn; /* accumilate means and variances */ double EZ, EZ2, Evar; Evar = EZ = EZ2 = 0.0; for(j=0; j #include #include #include #include using namespace std; /* * Corr: * * the usual constructor function */ Corr::Corr(unsigned int dim, Base_Prior *base_prior) { this->dim = dim; col = base_prior->Col(); n = 0; linear = true; Vb_new = new_matrix(col, col); bmu_new = new_vector(col); K = Ki = Kchol = K_new = Kchol_new = Ki_new = NULL; log_det_K = log_det_K_new = 0.0; /* set priors */ assert(base_prior); this->base_prior = base_prior; } /* * ~Corr: * * the usual destructor function */ Corr::~Corr(void) { deallocate_new(); delete_matrix(Vb_new); free(bmu_new); } /* * NugInit: * * reset nug and linear (as passed via one of the inheretid corr * corr functions) eventually coming via a vector of doubles from * passt by R */ void Corr::NugInit(double nug, bool linear) { this->nug = nug; this->linear = linear; } /* Cov: * * copy just the covariance part from the * passed cc Corr module instace */ void Corr::Cov(Corr *cc) { /* there is no covarance matrix to copy */ if(cc->n == 0 || linear) return; allocate_new(cc->n); dup_matrix(K, cc->K, n, n); dup_matrix(Ki, cc->Ki, n, n); } /* * swap_new: * * swapping the real and utility quantities */ void Corr::swap_new(double **Vb, double **bmu, double *lambda) { if(! linear) { swap_matrix(K, K_new, n, n); swap_matrix(Ki, Ki_new, n, n); } swap_matrix(Vb, Vb_new, col, col); assert(*bmu != bmu_new); swap_vector(bmu, &bmu_new); assert(*bmu != bmu_new); *lambda = lambda_new; log_det_K = log_det_K_new; } /* * allocate_new: * * create new memory for auxillary covariance matrices */ void Corr::allocate_new(unsigned int n) { if(this->n == n) return; else { deallocate_new(); this->n = n; /* auxilliary matrices */ assert(!K_new); K_new = new_matrix(n, n); assert(!Ki_new); Ki_new = new_matrix(n, n); assert(!Kchol_new); Kchol_new = new_matrix(n, n); /* real matrices */ assert(!K); K = new_matrix(n, n); assert(!Ki); Ki = new_matrix(n, n); assert(!Kchol); Kchol = new_matrix(n, n); } } /* * invert: * * invert the covariance matrix K, * put the inverse in Ki, and use Kchol * as the work matrix */ void Corr::Invert(unsigned int n) { if(! linear) { assert(n == this->n); inverse_chol(K, Ki, Kchol, n); log_det_K = log_determinant_chol(Kchol, n); } else { assert(n > 0); log_det_K = n * log(1.0 + nug); } } /* * deallocate_new: * * free the memory used for auxilliaty covariance matrices */ void Corr::deallocate_new(void) { if(this->n == 0) return; if(K_new) { delete_matrix(K_new); K_new = NULL; assert(Ki_new); delete_matrix(Ki_new); Ki_new = NULL; assert(Kchol_new); delete_matrix(Kchol_new); Kchol_new = NULL; } assert(K_new == NULL && Ki_new == NULL && Kchol_new == NULL); if(K) { delete_matrix(K); K = NULL; assert(Ki); delete_matrix(Ki); Ki = NULL; assert(Kchol); delete_matrix(Kchol); Kchol = NULL; } assert(K == NULL && Ki == NULL && Kchol == NULL); n = 0; } /* * Nug: * * return the current value of the nugget parameter */ double Corr::Nug(void) { return nug; } /* * get_delta_nug: * * compute nug for two nugs (used in prune) */ double Corr::get_delta_nug(Corr* c1, Corr* c2, void *state) { double nugch[2]; int ii[2]; nugch[0] = c1->nug; nugch[1] = c2->nug; propose_indices(ii,0.5, state); return nugch[ii[0]]; } /* * propose_new_nug: * * propose new NUGGET parameters for possible * new children partitions */ void Corr::propose_new_nug(Corr* c1, Corr* c2, void *state) { if(prior->FixNug()) c1->nug = c2->nug = nug; else { int i[2]; double nugnew[2]; propose_indices(i, 0.5, state); nugnew[i[0]] = nug; nugnew[i[1]] = prior->NugDraw(state); c1->nug = nugnew[0]; c2->nug = nugnew[1]; } } /* * CombineNug: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ void Corr::CombineNug(Corr *c1, Corr *c2, void *state) { nug = get_delta_nug(c1, c2, state); } /* * SplitNug: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void Corr::SplitNug(Corr *c1, Corr *c2, void *state) { propose_new_nug(c1, c2, state); } /* * get_K: * * return the covariance matrix (K) */ double** Corr::get_K(void) { assert(K != NULL); return K; } /* * get_Ki: * * return the inverse covariance matrix (Ki) */ double** Corr::get_Ki(void) { assert(Ki != NULL); return Ki; } /* * getlog_det_K: * * return the log determinant of the covariance * matrix (K) */ double Corr::get_log_det_K(void) { return log_det_K; } /* * Linear: * * return the linear boolean indicator */ bool Corr::Linear(void) { return linear; } /* * log_NugPrior: * * compute the (log) prior for the nugget */ double Corr::log_NugPrior(void) { return prior->log_NugPrior(nug); } /* * printCorr * * prints only covariance matrix K */ void Corr::printCorr(unsigned int n) { if(K && !linear) { assert(this->n == n); matrix_to_file("K_debug.out", K, n, n); assert(Ki); matrix_to_file("Ki_debug.out", Ki, n, n); } else { assert(linear); double **Klin = new_id_matrix(n); for(unsigned int i=0; idim = dim; base_prior = NULL; gamlin[0] = 10; /* gamma for the linear pdf */ gamlin[1] = 0.2; /* min prob for the linear pdf */ gamlin[2] = 0.75; /* max-min prob for the linear pdf */ nug = 0.1; /* starting correlation nugget parameter */ default_nug_priors(); /* set nug_alpha and nug_beta */ default_nug_lambdas(); /* set nug_alpha_lambda and nug_beta_lambda */ } /* * Corr_Prior: (new duplicate) * * duplicate constructor function for the correllation function * module parameterized with a nugget */ Corr_Prior::Corr_Prior(Corr_Prior *c) { dim = c->dim; nug = c->nug; fix_nug = c->fix_nug; dupv(nug_alpha, c->nug_alpha, 2); dupv(nug_beta, c->nug_beta, 2); dupv(nug_alpha_lambda, c->nug_alpha_lambda, 2); dupv(nug_beta_lambda, c->nug_beta_lambda, 2); base_prior = NULL; } /* * ~Corr_Prior: * * destructor function for the correllation function module * parameterized with a nugget */ Corr_Prior::~Corr_Prior(void) { } /* * NugInit: * * read hiererchial prior parameters from a double-vector * */ void Corr_Prior::NugInit(double *dhier) { nug_alpha[0] = dhier[0]; nug_beta[0] = dhier[1]; nug_alpha[1] = dhier[2]; nug_beta[1] = dhier[3]; } /* * default_nug_priors: * * set nug prior parameters * to default values */ void Corr_Prior::default_nug_priors(void) { nug_alpha[0] = 1.0; nug_beta[0] = 1.0; nug_alpha[1] = 1.0; nug_beta[1] = 1.0; } /* * default_nug_lambdas: * * set nug (lambda) hierarchical prior parameters * to default values */ void Corr_Prior::default_nug_lambdas(void) { nug_alpha_lambda[0] = 0.5; nug_beta_lambda[0] = 10.0; nug_alpha_lambda[1] = 0.5; nug_beta_lambda[1] = 10.0; fix_nug = false; //fix_nug = true; } /* * fix_nug_prior: * * fix the nug priors (alpha, beta) so that * they are not estimated */ void Corr_Prior::fix_nug_prior(void) { fix_nug = true; } /* * read_double_nug: * * read the a prior parameter vector of doubles for * items pertaining to the nugget, coming from R */ void Corr_Prior::read_double_nug(double *dparams) { /* read the starting nugget value */ nug = dparams[0]; // MYprintf(MYstdout, "starting nug=%g\n", nug); /* the d parameter is at dparams[1], should change this later */ /* read nug gamma mixture prior parrameters */ get_mix_prior_params_double(nug_alpha, nug_beta, &(dparams[2]), "nug"); /* nug hierarchical lambda prior parameters */ if((int) dparams[6] == -1) { fix_nug = true; /* MYprintf(MYstdout, "fixing nug prior\n"); */} else { fix_nug = false; get_mix_prior_params_double(nug_alpha_lambda, nug_beta_lambda, &(dparams[6]), "nug lambda"); } /* reset dparams */ dparams += 10; /* read gamma linear pdf prior parameter */ dupv(gamlin, dparams, 3); /* print and sanity check the gamma linear pdf parameters */ // MYprintf(MYstdout, "gamlin=[%g,%g,%g]\n", gamlin[0], gamlin[1], gamlin[2]); assert(gamlin[0] == -1 || gamlin[0] >= 0); assert(gamlin[1] >= 0.0 && gamlin[1] <= 1); assert(gamlin[2] >= 0.0 && gamlin[2] <= 1); assert(gamlin[2] + gamlin[1] <= 1); } /* * read_ctrlfile_nug: * * read the a prior parameter the control file * items pertaining to the nugget */ void Corr_Prior::read_ctrlfile_nug(ifstream* ctrlfile) { char line[BUFFMAX], line_copy[BUFFMAX]; /* Read the starting nugget value */ ctrlfile->getline(line, BUFFMAX); nug = atof(strtok(line, " \t\n#")); MYprintf(MYstdout, "starting nug=%g\n", nug); /* read the nug gamma mixture prior parameters */ ctrlfile->getline(line, BUFFMAX); get_mix_prior_params(nug_alpha, nug_beta, line, "nug"); /* nug hierarchical lambda prior parameters */ ctrlfile->getline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_nug = true; MYprintf(MYstdout, "fixing nug prior\n"); } else { fix_nug = false; get_mix_prior_params(nug_alpha_lambda, nug_beta_lambda, line, "nug lambda"); } /* read gamma linear pdf parameter */ ctrlfile->getline(line, BUFFMAX); gamlin[0] = atof(strtok(line, " \t\n#")); gamlin[1] = atof(strtok(NULL, " \t\n#")); gamlin[2] = atof(strtok(NULL, " \t\n#")); /* print and sanity check the gamma linear pdf parameters */ MYprintf(MYstdout, "lin[gam,min,max]=[%g,%g,%g]\n", gamlin[0], gamlin[1], gamlin[2]); assert(gamlin[0] == -1 || gamlin[0] >= 0); assert(gamlin[1] >= 0.0 && gamlin[1] <= 1); assert(gamlin[2] >= 0.0 && gamlin[2] <= 1); assert(gamlin[2] + gamlin[1] <= 1); } /* * Nug: * * return the starting nugget value */ double Corr_Prior::Nug(void) { return(nug); } /* * NugAlpha: * * return the starting nugget alpha parameter * vector for the mixture gamma prior */ double *Corr_Prior::NugAlpha(void) { return nug_alpha; } /* * NugBeta: * * return the starting nugget beta parameter * vector for the mixture gamma prior */ double *Corr_Prior::NugBeta(void) { return nug_beta; } /* * NugDraw * * sample a nugget value from the prior */ double Corr_Prior::NugDraw(void *state) { return nug_prior_rand(nug_alpha, nug_beta, state); } /* * DrawNug: * * draws for the hierarchical priors for the nugget * contained in the params module */ void Corr_Prior::DrawNugHier(Corr **corr, unsigned int howmany, void *state) { if(!fix_nug) { double *nug = new_vector(howmany); for(unsigned int i=0; iNug(); mixture_priors_draw(nug_alpha, nug_beta, nug, howmany, nug_alpha_lambda, nug_beta_lambda, state); free(nug); } } /* * log_NugPrior: * * compute the (log) prior for the nugget */ double Corr_Prior::log_NugPrior(double nug) { return log_nug_prior_pdf(nug, nug_alpha, nug_beta); } /* * CorrModel: * * return an indicator of what type of correlation * model this is a generaic module for: e.g., exp, expsep */ CORR_MODEL Corr_Prior::CorrModel(void) { return corr_model; } /* * Linear: * * returns true if the prior is "forcing" a linear model */ bool Corr_Prior::Linear(void) { if(gamlin[0] == -1) return true; else return false; } /* * LLM: * * returns true if the prior is allwoing the LLM */ bool Corr_Prior::LLM(void) { if(gamlin[0] > 0) return true; else return false; } /* * ForceLinear: * * make the prior force the linear model by setting the * gamma (gamlin[0]) parameter to -1; return the new * gamma parameter */ double Corr_Prior::ForceLinear(void) { double gam = gamlin[0]; gamlin[0] = -1; return gam; } /* * ResetLinear: * * (re)-set the gamma linear parameter (gamlin[0]) * to the passed in gam value */ void Corr_Prior::ResetLinear(double gam) { gamlin[0] = gam; } /* * GamLin * * return the (three) vector of "gamma" prior parameters * governing the LLM booleans b */ double* Corr_Prior::GamLin(void) { return gamlin; } /* * Print: * * pretty print the correllation function (nugget) parameters out * to a file */ void Corr_Prior::PrintNug(FILE *outfile) { /* range parameter */ //MYprintf(outfile, "starting nug=%g\n", nug); /* range gamma prior */ MYprintf(outfile, "nug[a,b][0,1]=[%g,%g],[%g,%g]\n", nug_alpha[0], nug_beta[0], nug_alpha[1], nug_beta[1]); /* range gamma hyperprior */ if(fix_nug) MYprintf(outfile, "nug prior fixed\n"); else { MYprintf(MYstdout, "nug lambda[a,b][0,1]=[%g,%g],[%g,%g]\n", nug_alpha_lambda[0], nug_beta_lambda[0], nug_alpha_lambda[1], nug_beta_lambda[1]); } /* gamma linear parameters */ MYprintf(outfile, "gamlin=[%g,%g,%g]\n", gamlin[0], gamlin[1], gamlin[2]); } /* * log_NugHierPrior: * * return the log prior of the hierarchial parameters * to the correllation parameters (i.e., nugget) */ double Corr_Prior::log_NugHierPrior(void) { double lpdf; lpdf = 0.0; if(!fix_nug) { lpdf += mixture_hier_prior_log(nug_alpha, nug_beta, nug_alpha_lambda, nug_beta_lambda); } return lpdf; } /* * NugTrace: * * return the current values of the hierarchical * parameters to nugget of this correlation function: */ double* Corr_Prior::NugTrace(unsigned int* len) { *len = 4; double* trace = new_vector(*len); trace[0] = nug_alpha[0]; trace[1] = nug_beta[0]; trace[2] = nug_alpha[1]; trace[3] = nug_beta[1]; return trace; } /* * NugTraceNames: * * return the names of the traces recorded by Corr_Prior::NugTrace() */ char** Corr_Prior::NugTraceNames(unsigned int* len) { *len = 4; char** trace = (char**) malloc(sizeof(char*) * (*len)); trace[0] = strdup("nug.a0"); trace[1] = strdup("nug.g0"); trace[2] = strdup("nug.a1"); trace[3] = strdup("nug.g1"); return trace; } /* * FixNug: * * returns the fix_nug variable (not the prior) */ bool Corr_Prior::FixNug(void) { return nug_alpha[0] == 0; } tgp/src/rhelp.c0000644000175100001440000000633212655414756013152 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include "rhelp.h" #ifdef RPRINT #include #include FILE *MYstdout = (FILE*) 0; FILE *MYstderr = (FILE*) 1; #endif #include #include #include /* * MYprintf: * * a function many different types of printing-- in particular, using * the Rprintf if the code happens to be compiled with RPRINT, * othersie fprintf (takes the same arguments as fprintf) */ void MYprintf(FILE *outfile, const char *str, ...) { va_list argp; va_start(argp, str); #ifdef RPRINT if(outfile == MYstdout) Rvprintf(str, argp); else if(outfile == MYstderr) REvprintf(str, argp); else vfprintf(outfile, str, argp); #else vfprintf(outfile, str, argp); #endif va_end(argp); } #ifndef RPRINT /* * error: * * printf style function that reports errors to stderr */ void error(const char *str, ...) { va_list argp; va_start(argp, str); MYprintf(stderr, "ERROR: "); vfprintf(stderr, str, argp); va_end(argp); MYflush(stderr); /* add a final newline */ MYprintf(stderr, "\n"); /* kill the code */ assert(0); } /* * warning: * * printf style function that reports warnings to stderr */ void warning(const char *str, ...) { va_list argp; va_start(argp, str); MYprintf(stderr, "WARNING: "); vfprintf(stderr, str, argp); va_end(argp); MYflush(stderr); /* add a final newline */ MYprintf(stderr, "\n"); } #endif /* * MYflush: * * a function for many different types of flushing-- in particular, * using * the R_FlushConsole the code happens to be compiled with * RPRINT, otherwise fflush */ void MYflush(FILE *outfile) { #ifdef RPRINT R_FlushConsole(); #else fflush(outfile); #endif } /* * MY_r_process_events: * * at least every 1 second(s) pass control back to * R so that it can check for interrupts and/or * process other R-gui events */ time_t MY_r_process_events(time_t itime) { #ifdef RPRINT time_t ntime = time(NULL); if(ntime - itime > 1) { R_FlushConsole(); R_CheckUserInterrupt(); #if (defined(HAVE_AQUA) || defined(Win32) || defined(Win64)) R_ProcessEvents(); #endif itime = ntime; } #endif return itime; } tgp/src/linalg.c0000644000175100001440000002274112655414756013310 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include #include #include "linalg.h" #include "matrix.h" #include "rhelp.h" #ifdef FORTPACK char uplo = 'U'; #endif /* #define DEBUG */ /* * linalg_dtrsv: * * analog of dtrsv in cblas nad blas * assumed row-major lower-tri and non-unit */ void linalg_dtrsv(TA, n, A, lda, Y, ldy) const enum CBLAS_TRANSPOSE TA; int n, lda, ldy; double **A; double *Y; { #ifdef FORTBLAS char ta; char diag = 'N'; if(TA == CblasTrans) ta = 'T'; else ta = 'N'; dtrsv(&uplo, &ta, &diag, &n, *A, &lda, Y, &ldy); #else cblas_dtrsv(CblasRowMajor,CblasLower,TA,CblasNonUnit, /*cblas_dtrsv(CblasColMajor,CblasUpper,CblasNoTrans,CblasNonUnit,*/ n,*A,lda,Y,ldy); #endif } /* * linalg_ddot: * * analog of ddot in cblas nad blas */ double linalg_ddot(n, X, ldx, Y, ldy) int n, ldx, ldy; double *X, *Y; { double result; #ifdef FORTBLAS size_t n64,ldx64,ldy64; n64 = n; ldx64 = ldx; ldy64=ldy; result = ddot(&n64,X,&ldx64,Y,&ldy64); #else result = cblas_ddot(n, X, ldx, Y, ldy); #endif return result; } /* * linalg_daxpy: * * analog of daxpy in cblas nad blas */ void linalg_daxpy(n,alpha,X,ldx,Y,ldy) int n, ldx, ldy; double alpha; double *X, *Y; { #ifdef FORTBLAS size_t n64, ldx64, ldy64; n64 = n; ldx64 = ldx; ldy64 = ldy; /* daxpy(&n,&alpha,X,&ldx,Y,&ldy); */ daxpy(&n64,&alpha,X,&ldx64,Y,&ldy64); #else cblas_daxpy(n, alpha, X, ldx, Y, ldy); #endif } /* * linalg_dgemm: * * analog of dgemm in cblas nad blas * assumed column major representation */ void linalg_dgemm(TA, TB, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc) const enum CBLAS_TRANSPOSE TA, TB; int m, n, k, lda, ldb, ldc; double alpha, beta; double **A, **B, **C; { #ifdef FORTBLAS size_t m64, n64, k64, lda64, ldb64, ldc64; char ta, tb; m64 = m; n64 = n; k64 = k; lda64 = lda; ldb64 = ldb; ldc64 = ldc; if(TA == CblasTrans) ta = 'T'; else ta = 'N'; if(TB == CblasTrans) tb = 'T'; else tb = 'N'; /* dgemm(&ta,&tb,&m,&n,&k,&alpha,*A,&lda,*B,&ldb,&beta,*C,&ldc); */ dgemm(&ta,&tb,&m64,&n64,&k64,&alpha,*A,&lda64,*B,&ldb64,&beta,*C,&ldc64); #else cblas_dgemm(CblasColMajor,TA,TB,m,n,k,alpha,*A,lda,*B,ldb,beta,*C,ldc); #endif } /* * linalg_dgemv: * * analog of dgemv in cblas nad blas * assumed column major representation */ void linalg_dgemv(TA, m, n, alpha, A, lda, X, ldx, beta, Y, ldy) const enum CBLAS_TRANSPOSE TA; int m, n, lda, ldx, ldy; double alpha, beta; double **A; double *X, *Y; { #ifdef FORTBLAS size_t m64, n64, lda64, ldx64, ldy64; char ta; m64 = m; n64 = n, lda64 = lda; ldx64 = ldx; ldy64 = ldy; if(TA == CblasTrans) ta = 'T'; else ta = 'N'; /* dgemv(&ta,&m,&n,&alpha,*A,&lda,X,&ldx,&beta,Y,&ldy); */ dgemv(&ta,&m64,&n64,&alpha,*A,&lda64,X,&ldx64,&beta,Y,&ldy64); #else cblas_dgemv(CblasColMajor,TA,m,n,alpha,*A,lda,X,ldx,beta,Y,ldy); #endif } /* * linalg_dsymm: * * analog of dsymm in cblas nad blas * assumed column major and upper-triangluar representation */ void linalg_dsymm(SIDE, m, n, alpha, A, lda, B, ldb, beta, C, ldc) const enum CBLAS_SIDE SIDE; int m, n, lda, ldb, ldc; double alpha, beta; double **A, **B, **C; { #ifdef FORTBLAS size_t m64, n64, lda64, ldb64, ldc64; char side; m64 = m; n64 = n; lda64 = lda; ldb64 = ldb; ldc64 = ldc; if(SIDE == CblasRight) side = 'R'; else side = 'L'; /* dsymm(&side,&uplo,&m,&n,&alpha,*A,&lda,*B,&ldb,&beta,*C,&ldc); */ dsymm(&side,&uplo,&m64,&n64,&alpha,*A,&lda64,*B,&ldb64,&beta,*C,&ldc64); #else cblas_dsymm(CblasColMajor,SIDE,CblasUpper,m,n,alpha,*A,lda,*B,ldb,beta,*C,ldc); #endif } /* * linalg_dsymv: * * analog of dsymv in cblas and blas * assumed column major representation */ void linalg_dsymv(n, alpha, A, lda, X, ldx, beta, Y, ldy) int n, lda, ldx, ldy; double alpha, beta; double **A; double *X, *Y; { #ifdef FORTBLAS size_t n64, lda64, ldy64, ldx64; n64 = n; lda64 = lda; ldx64 = ldx; ldy64 = ldy; /* dsymv(&uplo,&n,&alpha,*A,&lda,X,&ldx,&beta,Y,&ldy); */ dsymv(&uplo,&n64,&alpha,*A,&lda64,X,&ldx64,&beta,Y,&ldy64); #else cblas_dsymv(CblasColMajor,CblasUpper,n,alpha,*A,lda,X,ldx,beta,Y,ldy); #endif } /* * linalg_dposv: * * analog of dposv in clapack and lapack where * Mutil is with colmajor and uppertri or rowmajor * and lowertri */ int linalg_dposv(n, Mutil, Mi) int n; double **Mutil, **Mi; { long info; /* then use LAPACK */ #ifdef FORTPACK size_t n64; n64 = n; dposv(&uplo,&n64,&n64,*Mutil,&n64,*Mi,&n64,&info); #else /*info = clapack_dposv(CblasColMajor,CblasUpper,n,n,*Mutil,n,*Mi,n);*/ info = clapack_dposv(CblasRowMajor,CblasLower,n,n,*Mutil,n,*Mi,n); #endif #ifdef DEBUG if(info != 0) { matrix_to_file("M.dump", Mutil, n, n); error("offending matrix dumped into matrix.dump"); } #endif return (int) info; } /* * linalg_dgesv: * * analog of dgesv in clapack and lapack; * row or col major doesn't matter because it is * assumed that Mutil is symmetric * * inverse_lu used this with RowMajor, other with ColMajor */ int linalg_dgesv(n, Mutil, Mi) int n; double **Mutil, **Mi; { int info; int *p; p = new_ivector(n); #ifdef FORTPACK dgesv(&n,&n,*Mutil,&n,p,*Mi,&n,&info); #else info = clapack_dgesv(CblasColMajor,n,n,*Mutil,n,p,*Mi,n); /*info = clapack_dgesv(CblasRowMajor,n,n,*Mutil,n,p,*Mi,n);*/ #endif free(p); #ifdef DEBUG assert(info == 0); #endif return info; } /* * * analog of dpotrf in clapack and lapack where * var is with colmajor and uppertri or rowmajor * and lowertri */ int linalg_dpotrf(n, var) int n; double **var; { long info; #ifdef FORTPACK size_t n64; n64 = n; dpotrf(&uplo,&n64,*var,&n64,&info); #else info = clapack_dpotrf(CblasRowMajor,CblasLower,n,*var,n); /*info = clapack_dpotrf(CblasColMajor,CblasUpper,n,*var,n);*/ #endif #ifdef DEBUG assert(info == 0); #endif return (int) info; } #ifndef FORTPACK /* * solve_cg_symm: * * solve Ax=b by inverting A and computing using the conjugate * gradient method from Skilling (also takes advantage of symmetry in C) * C[n][n] double u[n], y[n], y_star[n] */ int solve_cg_symm(y, y_star, C, u, theta, n) unsigned int n; double **C; double *u, *y, *y_star; double theta; { double g[n], g_star[n], h[n], h_star[n], Ch[n], Ch_star[n]; double Cy[n], Cy_star[n], Ag_star[n], ACh_star[n], Ay_star[n], CAy_star[n]; double **A; double gamma, gamma_star, lambda, lambda_star, g_old_norm, g_old_norm_star, Q, Q_star, u_norm, upper; unsigned int k, i, j;/*, iter;*/ A = new_matrix(n, n); u_norm = linalg_ddot(n, u, 1, u, 1); /* initialize */ for(i=0; i #include #include // #define DEBUG #define CPRUNEOP TREE_OP tree_op; /* * Tree: * * the usual class constructor function */ Tree::Tree(double **X, int* p, unsigned int n, unsigned int d, double *Z, Rect *rect, Tree* parent, Model* model) { this->rect = rect; this->model = model; /* data size */ this->n = n; this->d = d; /* data storage */ this->X = X; this->p = p; XX = NULL; pp = NULL; nn = 0; this->Z = Z; /* tree pointers */ leftChild = NULL; rightChild = NULL; if(parent != NULL) depth = parent->depth+1; else depth = 0; this->parent = parent; /* changepoint (split) variables */ var = 0; val = 0; /* output file for progress printing, and printing level */ OUTFILE = model->Outfile(&verb); /* create the GP model */ Base_Prior *prior = model->get_params()->BasePrior(); base = prior->newBase(model); base->Init(NULL); } /* * Tree: * * duplication constructor function only copies information about X (not XX) * then generates XX stuff from rect, and params. Any "new" variables are * also set to NULL values -- the economy argument is passed to the base model * duplicator and meant to indicate a memory efficient copy (i.e., don't * copy the GP covariance matrices as these can be re-generated) */ Tree::Tree(const Tree *told, bool economy) { /* simple non-pointer copies */ d = told->d; n = told->n; /* tree parameters */ var = told->var; val = told->val; depth = told->depth; parent = leftChild = rightChild = next = NULL; /* things that must be NULL * because they point to other tree nodes */ XX = NULL; pp = NULL; nn = 0; /* data */ assert(told->rect); rect = new_dup_rect(told->rect); assert(told->X); X = new_dup_matrix(told->X, n, d); assert(told->Z); Z = new_dup_vector(told->Z, n); assert(told->p); p = new_dup_ivector(told->p, n); /* copy the core GP model: * must pass in the new X and Z values because they * are stored as pointers in the GP module */ /* there should be a switch statement here, or maybe I should use a copy constructor */ model = told->model; base = told->base->Dup(X, Z, economy); OUTFILE = told->OUTFILE; /* recurse down the leaves */ if(! told->isLeaf()) { leftChild = new Tree(told->leftChild, economy); rightChild = new Tree(told->rightChild, economy); } } /* * ~Tree: * * the usual class destructor function */ Tree::~Tree(void) { delete base; delete_matrix(X); if(Z) free(Z); if(XX) delete_matrix(XX); if(p) free(p); if(pp) free(pp); if(leftChild) delete leftChild; if(rightChild) delete rightChild; if(rect) delete_rect(rect); } /* * Init: * * update and compute for the base model in the tree; * the arguments represent a tree encoded as a matrix * (where the number of rows is specified as nrow) * flattened into a double vector */ void Tree::Init(double *dtree, unsigned int ncol, double **rect) { /* when no tree information is provided */ if(ncol == 0) { /* sanity checks */ assert(!dtree); assert(isLeaf()); /* prepare this leaf for the big time */ Update(); Compute(); } else { /* read the tree information */ unsigned int row = (unsigned int) dtree[0]; /* check if this should be a leaf */ if(dtree[1] < 0.0) { /* yes */ /* cut off rows, var, and val before passing to base */ base->Init(&(dtree[3])); /* make sure base model is ready to go @ this leaf */ Update(); Compute(); } else { /* not a leaf */ /* read split dim (var) */ var = (unsigned int) dtree[1]; /* calculate normd location (val) -- should made a function */ double norm = fabs(rect[1][var] - rect[0][var]); if(norm == 0) norm = fabs(rect[0][var]); if(rect[0][var] < 0) val = (dtree[2] + fabs(rect[0][var])) / norm; else val = (dtree[2] - rect[0][var]) / norm; /* create children split at (var,val) */ bool success = grow_children(); assert(success); if(success == false) MYprintf(MYstdout, "bad grow_children\n"); /* recursively read the left and right children from dtree */ unsigned int left = 1; while(((unsigned int)dtree[ncol*left]) != 2*row) left++; leftChild->Init(&(dtree[ncol*left]), ncol, rect); rightChild->Init(&(dtree[ncol*(left+1)]), ncol, rect); /* no need to Update() or Compute() on an internal node */ } } } /* * Add_XX: * * deal with the new predictive data; figuring out which XX locations * (and pp) belong in this partition, return the count of XX determined * via matrix_constrained */ unsigned int Tree::add_XX(double **X_pred, unsigned int n_pred, unsigned int d_pred) { // fprintf(MYstderr, "d_pred = %d, d = %d\n", d_pred, d); assert(d_pred == d); assert(isLeaf()); /* do not recompute XX if it has already been computed */ if(XX) { assert(pp); warning("failed add_XX in leaf"); return 0; } int *p_pred = new_ivector(n_pred); nn = matrix_constrained(p_pred, X_pred, n_pred, d, rect); XX = new_matrix(nn, d); pp = new_ivector(nn); unsigned int k=0; for(unsigned int i=0; iClear(); int *p_new = new_ivector(n_new); n = matrix_constrained(p_new, X_new, n_new, d, rect); assert(n > 0); X = new_matrix(n, d); Z = new_vector(n); p = new_ivector(n); unsigned int k=0; for(unsigned int i=0; inew_data(Xc, plen, d_new, Zc, pnew); success = part_child(GT, &Xc, &pnew, &plen, &Zc, &newRect); assert(success); /* rectangles must be equal */ if(success == false) MYprintf(MYstdout, "bad part_child\n"); delete_rect(newRect); rightChild->new_data(Xc, plen, d_new, Zc, pnew); } /* * delete_XX: * * free everything having to do with predictive locations */ void Tree::delete_XX(void) { if(XX) delete_matrix(XX); if(pp) free(pp); pp = NULL; XX = NULL; base->ClearPred(); nn = 0; } /* * predict: * * prediction based on the current parameter settings: (predictive variables * recomputed and/or initialised when appropriate) */ void Tree::Predict(double *Zp, double *Zpm, double *Zpvm, double *Zps2, double *ZZ, double *ZZm, double *ZZvm, double *ZZs2, double *Ds2x, double *Improv, double Zmin, unsigned int wZmin, bool err, void *state) { if(!n) warning("n = %d\n", n); assert(isLeaf() && n); if(Zp == NULL && nn == 0) return; /* set the partition */ if(nn > 0) base->UpdatePred(XX, nn, d, (bool) Ds2x); /* ready the storage for predictions */ double *zp, *zpm, *zpvm, *zps2, *zz, *zzm, *zzvm, *zzs2, *improv; double **ds2xy; /* allocate necessary space for predictions */ zp = zpm = zpvm = zps2 = zz = zzm = zzvm = zzs2 = NULL; if(Zp) { zp = new_vector(n); zpm = new_vector(n); zpvm = new_vector(n); zps2 = new_vector(n); } if(nn > 0) { zz = new_vector(nn); zzm = new_vector(nn); zzvm = new_vector(nn); zzs2 = new_vector(nn); } assert(zp != NULL || zz != NULL); /* allocate space for Delta-sigma */ ds2xy = NULL; if(Ds2x) ds2xy = new_matrix(nn, nn); /* allocate space for IMPROV */ improv = NULL; if(Improv) improv = new_vector(nn); /* check if the wZmin index is in p */ if(zp) { bool inp = false; for(unsigned int i=0; iPredict(n, zp, zpm, zpvm, zps2, nn, zz, zzm, zzvm, zzs2, ds2xy, improv, Zmin, err, state); /* copy data-pred stats to the right place in their respective full matrices */ if(zp) { copy_p_vector(Zp, p, zp, n); if(Zpm) copy_p_vector(Zpm, p, zpm, n); if(Zpvm) copy_p_vector(Zpvm, p, zpvm, n); if(Zps2) copy_p_vector(Zps2, p, zps2, n); free(zp); free(zpm); free(zpvm); free(zps2); } /* similarly, copy new predictive location stats */ if(zz) { copy_p_vector(ZZ, pp, zz, nn); if(ZZm) copy_p_vector(ZZm, pp, zzm, nn); if(ZZvm) copy_p_vector(ZZvm, pp, zzvm, nn); if(ZZs2) copy_p_vector(ZZs2, pp, zzs2, nn); free(zz); free(zzm); free(zzvm); free(zzs2); } /* similarly, copy ds2x predictive stats */ if(ds2xy) { for(unsigned int i=0; iClearPred(); } /* * getDepth: * * return the node's depth */ unsigned int Tree::getDepth(void) const { return depth; } /* * isLeaf: * * TRUE if the node is a leaf, * FALSE otherwise */ bool Tree::isLeaf(void) const { assert(!(leftChild != NULL && rightChild == NULL)); assert(!(leftChild == NULL && rightChild != NULL)); if(leftChild == NULL && rightChild == NULL) return true; else return false; } /* * isRoot: * * TRUE if the node is the root (parent == NULL), * FALSE otherwise */ bool Tree::isRoot(void) const { if(parent == NULL) return true; else return false; } /* * internals: * * get a list of internal (non-leaf) nodes, where the first in * list is pointed to by the first pointer, and the last by the * last pointer. The length of the list is returned. */ unsigned int Tree::internals(Tree **first, Tree **last) { if(isLeaf()) { *first = *last = NULL; return 0; } Tree *leftFirst, *leftLast, *rightFirst, *rightLast; leftFirst = leftLast = rightFirst = rightLast = NULL; int left_len = leftChild->internals(&leftFirst, &leftLast); int right_len = rightChild->internals(&rightFirst, &rightLast); if(left_len == 0) { this->next = rightFirst; *first = this; if(right_len > 0) { *last = rightLast; (*last)->next = NULL; } else { *last = this; (*last)->next = NULL; } return right_len + 1; } else { leftLast->next = rightFirst; this->next = leftFirst; *first = this; if(right_len == 0) *last = leftLast; else *last = rightLast; (*last)->next = NULL; return left_len + right_len + 1; } } /* * leaves: * * get a list of leaf nodes, where the first in list is pointed to by the * first pointer, and the last by the last pointer. The length of the list * is returned. */ unsigned int Tree::leaves(Tree **first, Tree **last) { if(isLeaf()) { *first = this; *last = this; (*last)->next = NULL; return 1; } Tree *leftFirst, *leftLast, *rightFirst, *rightLast; leftFirst = leftLast = rightFirst = rightLast = NULL; int left_len = leftChild->leaves(&leftFirst, &leftLast); int right_len = rightChild->leaves(&rightFirst, &rightLast); leftLast->next = rightFirst; *first = leftFirst; *last = rightLast; return left_len + right_len; } /* * swapable: * * get a list of swapable children , where the first in list is pointed to * by the first pointer, and the last by the last pointer. The length of * the list is returned. */ unsigned int Tree::swapable(Tree **first, Tree **last) { if(isLeaf()) return 0; int len; Tree *leftFirst, *leftLast, *rightFirst, *rightLast; leftFirst = leftLast = rightFirst = rightLast = NULL; int left_len = leftChild->swapable(&leftFirst, &leftLast); int right_len = rightChild->swapable(&rightFirst, &rightLast); if(left_len == 0) { if(right_len != 0) { *first = rightFirst; *last = rightLast; } } else if(right_len == 0) { *first = leftFirst; *last = leftLast; } else { assert(leftLast); leftLast->next = rightFirst; *first = leftFirst; *last = rightLast; } len = left_len + right_len; if(*last) (*last)->next = NULL; if(parent != NULL) { this->next = *first; *first = this; if(!(*last)) *last = this; len++; } return len; } /* * isPrunable: * * returns true if this node is prunable: * i.e., both children are leaves */ bool Tree::isPrunable(void) const { if(isLeaf()) return false; if(leftChild->isLeaf() && rightChild->isLeaf()) return true; else return false; } /* * prunable: * * get a list of prunable nodes, where the first in list is pointed to by the * first pointer, and the last by the last pointer. The length of the list is returned. */ unsigned int Tree::prunable(Tree **first, Tree **last) { if(isLeaf()) return 0; /* if this node is prunable, then add it to the list, and return */ if(isPrunable()) { *first = this; *last = this; (*last)->next = NULL; return 1; } Tree *leftFirst, *leftLast, *rightFirst, *rightLast; leftFirst = leftLast = rightFirst = rightLast = NULL; /* gather lists of prunables from leftchild and rightchild */ int left_len = leftChild->prunable(&leftFirst, &leftLast); int right_len = rightChild->prunable(&rightFirst, &rightLast); /* combine the two lists */ if(left_len == 0) { if(right_len == 0) return 0; *first = rightFirst; *last = rightLast; return right_len; } else if(right_len == 0) { *first = leftFirst; *last = leftLast; return left_len; } /* set the pointers to beginning and end of new combined list */ leftLast->next = rightFirst; *first = leftFirst; *last = rightLast; return left_len + right_len; } /* * swapData: * * swap all data between partition */ void Tree::swapData(Tree* t) { /* grab the data from the old parent */ assert(t); delete_matrix(X); X = t->X; free(p); p = t->p; delete_XX(); /*if(XX) delete_matrix(XX);*/ XX = t->XX; /*free(pp);*/ pp = t->pp; free(Z); Z = t->Z; delete_rect(rect); rect = t->rect; n = t->n; nn = t->nn; /* create the new child data */ unsigned int plen; double **Xc; Rect *newRect; double *Zc; int *pnew; FIND_OP op; if(t == rightChild) op = GT; else { assert(t == leftChild); op = LEQ; } /* create the partition */ bool success = part_child(op, &Xc, &pnew, &plen, &Zc, &newRect); assert(success); if(success == false) MYprintf(MYstdout, "bad part_child in swapData\n"); /* copy */ t->X = Xc; t->p = pnew; t->Z = Zc; t->rect = newRect; t->n = plen; /* sanity checks */ assert(n == leftChild->n + rightChild->n); assert(nn == leftChild->nn + rightChild->nn); assert(t->n == t->leftChild->n + t->rightChild->n); assert(t->nn == t->leftChild->nn + t->rightChild->nn); } /* * rotate_right: * * rotate this child to the right */ void Tree::rotate_right(void) { Tree *pt = this->parent; /* set the parent of the parent, and the root of the model */ if(pt->parent != NULL) { if(pt->parent->leftChild == pt) pt->parent->leftChild = this; else pt->parent->rightChild = this; } else { assert(model->get_TreeRoot() == pt); model->set_TreeRoot(this); } this->parent = pt->parent; /* set the children */ pt->leftChild = this->rightChild; pt->leftChild->parent = pt; this->rightChild = pt; pt->parent = this; /* take care of DEPTHS */ (pt->depth)++; (this->depth)--; (this->leftChild)->adjustDepth(-1); (pt->rightChild)->adjustDepth(1); assert(pt->depth == this->depth + 1 && pt->depth >= 0); if(this->parent) assert(this->depth == this->parent->depth + 1 && this->depth >= 0); else assert(this->depth == 0); /* take care of the DATA */ this->swapData(pt); this->Clear(); pt->Clear(); } /* * rotate_left: * * rotate this child to the left */ void Tree::rotate_left(void) { Tree *pt = this->parent; /* set the parent of the parent, and the root of the model */ if(pt->parent != NULL) { if(pt->parent->rightChild == pt) pt->parent->rightChild = this; else pt->parent->leftChild = this; } else { /* this node is the root */ assert(model->get_TreeRoot() == pt); model->set_TreeRoot(this); } this->parent = pt->parent; /* set the children */ pt->rightChild = this->leftChild; pt->rightChild->parent = pt; this->leftChild = pt; pt->parent = this; /* take care of DEPTHS */ (pt->depth)++; (this->depth)--; (this->rightChild)->adjustDepth(-1); (pt->leftChild)->adjustDepth(1); assert(pt->depth == this->depth + 1 && pt->depth >= 0); if(this->parent) assert(this->depth == this->parent->depth + 1 && this->depth >= 0); else assert(this->depth == 0); /* take care of the DATA */ this->swapData(pt); this->Clear(); pt->Clear(); } /* * rotate: * * attempt to rotate the split point of this INTERNAL node and its parent. */ bool Tree::rotate(void *state) { tree_op = ROTATE; assert(!isLeaf()); assert(parent); /* do the rotation (child becomes root, etc) */ if(parent->rightChild == this) { /* this node is a rightChild */ double alpha = pT_rotate(rightChild, parent->leftChild); if(runi(state) < alpha) rotate_left(); else return(false); } else { /* this node is a leftChild */ assert(parent->leftChild == this); double alpha = pT_rotate(leftChild, parent->rightChild); if(runi(state) < alpha) rotate_right(); else return(false); } return(true); } /* * pT_rotate: * * calculate the prior probablilty ratio for a rotate * when low and high are swapped */ double Tree::pT_rotate(Tree* low, Tree* high) { unsigned int low_ni, low_nl, high_ni, high_nl; Tree** low_i = low->internalsList(&low_ni); Tree** low_l = low->leavesList(&low_nl); Tree** high_i = high->internalsList(&high_ni); Tree** high_l = high->leavesList(&high_nl); unsigned int t_minpart, splitmin, basemax; double t_alpha, t_beta; model->get_params()->get_T_params(&t_alpha, &t_beta, &t_minpart, &splitmin, &basemax); unsigned int i; double pT_log = 0; for(i=0; idepth); for(i=0; idepth,0.0-t_beta)); for(i=0; idepth); for(i=0; idepth,0.0-t_beta)); double pTstar_log = 0; for(i=0; idepth); for(i=0; idepth,0.0-t_beta)); for(i=0; idepth); for(i=0; idepth,0.0-t_beta)); free(low_i); free(low_l); free(high_i); free(high_l); double a = exp(pTstar_log - pT_log); if(a >= 1.0) return 1.0; else return a; } /* * swap: * * attempt to swap the split point of this INTERNAL node and its parent, * while keeping parameters in the lower partitions the same. */ bool Tree::swap(void *state) { tree_op = SWAP; assert(!isLeaf()); assert(parent); if(parent->var == var) { bool success = rotate(state); if(success && verb >= 3) MYprintf(OUTFILE, "**ROTATE** @depth %d, var=%d, val=%g\n", depth, var+1, val); return success; } /* save old stuff */ double parent_val = parent->val; int parent_var = parent->var; double old_val = val; int old_var = var; Tree* oldPLC = parent->leftChild; Tree* oldPRC = parent->rightChild; /* swapped tree */ parent->val = old_val; val = parent_val; parent->var = old_var; var = parent_var; /* re-build the current child */ parent->leftChild = parent->rightChild = NULL; bool success = parent->grow_children(); assert(success); /* continue with new left and right children */ success = parent->leftChild->match(oldPLC, state); if(parent->try_revert(success, oldPLC, oldPRC, parent_var, parent_val)) { val = old_val; var = old_var; return false; } success = parent->rightChild->match(oldPRC, state); if(parent->try_revert(success, oldPLC, oldPRC, parent_var, parent_val)) { val = old_val; var = old_var; return false; } /* posterior probabilities and acceptance ratio */ assert(oldPRC->leavesN() + oldPLC->leavesN() == parent->leavesN()); double pklast = oldPRC->leavesPosterior() + oldPLC->leavesPosterior(); assert(R_FINITE(pklast)); double pk = parent->leavesPosterior(); /* alpha = min(1,exp(A)) */ double alpha = exp(pk-pklast); /* accept or reject? */ if(runi(state) < alpha) { if(verb >= 3) MYprintf(OUTFILE, "**SWAP** @depth %d: [%d,%g] <-> [%d,%g]\n", depth, var+1, val, (parent->var)+1, parent->val); if(oldPRC) delete oldPRC; if(oldPRC) delete oldPLC; return true; } else { parent->try_revert(false, oldPLC, oldPRC, parent_var, parent_val); val = old_val; var = old_var; return false; } } /* * change: * * attempt to move the split point of an INTERNAL node. * keeping parameters in the lower partitions the same. */ bool Tree::change(void *state) { tree_op = CHANGE; assert(!isLeaf()); /* Bobby: maybe add code here to prevent 0->1 proposals when there the marginal X is only binary */ /* save old tree */ double old_val = val; val = propose_val(state); Tree* oldLC = leftChild; Tree* oldRC = rightChild; leftChild = rightChild = NULL; /* new left child */ unsigned int success = grow_child(&leftChild, LEQ); if(try_revert((bool)success && leftChild->wellSized(), oldLC, oldRC, var, old_val)) return false; /* new right child */ success = grow_child(&rightChild, GT); if(try_revert((bool)success && rightChild->wellSized(), oldLC, oldRC, var, old_val)) return false; /* continue with new left and right children */ success = leftChild->match(oldLC, state); if(try_revert(success, oldLC, oldRC, var, old_val)) return false; success = rightChild->match(oldRC, state); if(try_revert(success, oldLC, oldRC, var, old_val)) return false; /* posterior probabilities and acceptance ratio */ assert(oldLC->leavesN() + oldRC->leavesN() == this->leavesN()); double pklast = oldLC->leavesPosterior() + oldRC->leavesPosterior(); #ifdef DEBUG assert(R_FINITE(pklast)); #endif double pk = leavesPosterior(); /* alpha = min(1,exp(A)) */ double alpha = exp(pk-pklast); /* accept or reject? */ if(runi(state) < alpha) { /* accept */ if(oldLC) delete oldLC; if(oldRC) delete oldRC; if(tree_op == CHANGE && verb >= 4) MYprintf(OUTFILE, "**CHANGE** @depth %d: var=%d, val=%g->%g, n=(%d,%d)\n", depth, var+1, old_val, val, leftChild->n, rightChild->n); else if(tree_op == CPRUNE && verb >= 1) MYprintf(OUTFILE, "**CPRUNE** @depth %d: var=%d, val=%g->%g, n=(%d,%d)\n", depth, var+1, old_val, val, leftChild->n, rightChild->n); return true; } else { /* reject */ try_revert(false, oldLC, oldRC, var, old_val); return false; } } /* * match: * * match the parameters of oldT with new partition * induced by THIS tree */ bool Tree::match(Tree* oldT, void *state) { assert(oldT); if(oldT->isLeaf()) { base->Match(oldT->base); return true; } else { var = oldT->var; val = oldT->val; Clear(); bool success = grow_children(); if(success) { success = leftChild->match(oldT->leftChild, state); if(!success) return false; success = rightChild->match(oldT->rightChild, state); if(!success) return false; } else { if(tree_op != CHANGE) return false; #ifdef CPRUNEOP /* growing failed because of <= MINPART, try CPRUNE */ tree_op = CPRUNE; if(!oldT->rightChild->isLeaf()) return match(oldT->rightChild, state); else if(!oldT->leftChild->isLeaf()) return match(oldT->leftChild, state); else { bool success = false; if(runi(state) > 0.5) success = match(oldT->leftChild, state); else success = match(oldT->rightChild, state); assert(success); return success; } #endif } } return true; } /* * try_revert: * * revert children and changepoint back to the way they were */ bool Tree::try_revert(bool success, Tree* oldLC, Tree* oldRC, int old_var, double old_val) { if(!success) { val = old_val; var = old_var; if(leftChild) delete leftChild; if(rightChild) delete rightChild; leftChild = oldLC; rightChild = oldRC; assert(leftChild && rightChild); return true; } else { return false; } } /* * propose_val: * * given the old var/val pair, propose a new one */ double Tree::propose_val(void *state) { double min, max; unsigned int N; double **locs = model->get_Xsplit(&N); min = 1e300*1e300; max = -1e300*1e300; for(unsigned int i=0; i val && Xivar < min) min = Xivar; else if(Xivar < val && Xivar > max) max = Xivar; } assert(val != min && val != max); if(runi(state) < 0.5) return min; else return max; } /* * leavesPosterior: * * get the posterior probability of all * leaf children of this node */ double Tree::leavesPosterior(void) { Tree *first, *last; int numLeaves = leaves(&first, &last); assert(numLeaves > 0); double p = 0; while(first) { p += first->Posterior(); if(!R_FINITE(p)) break; first = first->next; numLeaves--; } assert(numLeaves == 0); return p; } /* * MartinalLikelihood: * * check to make sure the model (e.g., GP) is up to date * -- has correct data size --, if not then Update it, * and then copute the posterior pdf */ double Tree::Posterior(void) { unsigned int basen = base->N(); if(basen == 0) { Update(); Compute(); } else assert(basen == n); return base->Posterior(); } /* * leavesN: * * get the partition sizes (n) at all * leaf children of this node */ unsigned int Tree::leavesN(void) { Tree *first, *last; int numLeaves = leaves(&first, &last); assert(numLeaves > 0); unsigned int N = 0; while(first) { N += first->n; first = first->next; numLeaves--; } assert(numLeaves == 0); return N; } /* * prune: * * attempt to remove both children of this PRUNABLE node by * randomly choosing one of its children, and then randomly * choosing the D and NUGGET parameters a single child. */ bool Tree::prune(double ratio, void *state) { tree_op = PRUNE; double logq_bak, pk, pklast, logp_split, alpha; /* sane prune ? */ assert(leftChild && leftChild->isLeaf()); assert(rightChild && rightChild->isLeaf()); /* get the marginalized posterior of the current * leaves of this PRUNABLE node*/ pklast = leavesPosterior(); #ifdef DEBUG assert(R_FINITE(pklast)); #endif /* compute the backwards split proposal probability */ logq_bak = split_prob(); /* calculate the prior probability of this split (just 1/n) */ unsigned int nsplit; model->get_Xsplit(&nsplit); logp_split = 0.0 - log((double) nsplit); /* compute corr and p(Delta_corr) for corr1 and corr2 */ base->Combine(leftChild->base, rightChild->base, state); /* update data, create covariance matrix, and compute marginal parameters */ Update(); Compute(); assert(n == leftChild->n + rightChild->n); assert(nn == leftChild->nn + rightChild->nn); /* compute posterior of new tree */ pk = this->Posterior(); /* prior ratio and acceptance ratio */ alpha = ratio*exp(logq_bak+pk-pklast-logp_split); /* accept or reject? */ if(runi(state) < alpha) { if(verb >= 1) MYprintf(OUTFILE, "**PRUNE** @depth %d: [%d,%g]\n", depth, var+1, val); delete leftChild; delete rightChild; leftChild = rightChild = NULL; base->ClearPred(); return true; } else { Clear(); return false; } } /* * grow: * * attempt to add two children to this LEAF node by randomly choosing * splitting criterion, along new d and nugget parameters */ bool Tree::grow(double ratio, void *state) { tree_op = GROW; bool success; double q_fwd, pk, pklast, logp_split, alpha; /* sane grow ? */ assert(isLeaf()); /* propose the next tree, by choosing the split point */ /* We only partition on variables > splitmin */ unsigned int mn = model->get_params()->T_smin(); var = sample_seq(mn, d-1, state); /* can't grow if this dimension does not have varying x-values */ if(rect->boundary[0][var] == rect->boundary[1][var]) return false; /* propose the split location */ val = propose_split(&q_fwd, state); /* Compute the prior for this split location (just 1/n) */ unsigned int nsplit; model->get_Xsplit(&nsplit); logp_split = 0.0 - log((double) nsplit); /* grow the children; stop if partition too small */ success = grow_children(); if(!success) return false; /* propose new correlation paramers for the new leaves */ base->Split(leftChild->base, rightChild->base, state); /* marginalized posteriors and acceptance ratio */ pk = leftChild->Posterior() + rightChild->Posterior(); pklast = this->Posterior(); alpha = ratio*exp(pk-pklast+logp_split)/q_fwd; /* MYprintf(MYstderr, "%d:%g : alpha=%g, ratio=%g, pk=%g, pklast=%g, logp_s=%g, q_fwd=%g\n", var, val, alpha, ratio, pk, pklast, logp_split, q_fwd); MYflush(MYstderr); */ /* accept or reject? */ bool ret_val = true; if(runi(state) > alpha) { delete leftChild; delete rightChild; leftChild = rightChild = NULL; ret_val = false; } else { Clear(); if(verb >= 1) MYprintf(OUTFILE, "**GROW** @depth %d: [%d,%g], n=(%d,%d)\n", depth, var+1, val, leftChild->n, rightChild->n); } return ret_val; } /* * grow_children: * * grow both left and right children based on splitpoint */ bool Tree::grow_children(void) { unsigned int suc1 = grow_child(&leftChild, LEQ); if(!suc1 || !(leftChild->wellSized())) { if(leftChild) delete leftChild; leftChild = NULL; assert(rightChild == NULL); return false; } unsigned int suc2 = grow_child(&rightChild, GT); if(!suc2 || !(rightChild->wellSized())) { delete leftChild; if(rightChild) delete rightChild; leftChild = rightChild = NULL; return false; } assert(suc1 + suc2 == n); assert(leftChild->nn + rightChild->nn == nn); return true; } /* * part_child: * * creates the data according to the current partition * the current var and val parameters, and the operation "op" */ int Tree::part_child(FIND_OP op, double ***Xc, int **pnew, unsigned int *plen, double **Zc, Rect **newRect) { unsigned int i,j; int *pchild = find_col(X, NULL, n, var, op, val, plen); if(*plen == 0) return 0; /* partition the data and predictive locations */ *Xc = new_matrix(*plen,d); *Zc = new_vector(*plen); *pnew = new_ivector(*plen); for(i=0; iboundary[0][i] = rect->boundary[0][i]; (*newRect)->boundary[1][i] = rect->boundary[1][i]; (*newRect)->opl[i] = rect->opl[i]; (*newRect)->opr[i] = rect->opr[i]; } if(op == LEQ) { (*newRect)->opr[var] = op; (*newRect)->boundary[1][var] = val; } else { (*newRect)->opl[var] = op; assert(op == GT); (*newRect)->boundary[0][var] = val; } return (*plen); } /* * grow_child: * * based on current val and var variables, create the corresponding * leftChild partition returns the number of points in the grown region */ unsigned int Tree::grow_child(Tree** child, FIND_OP op) { assert(!(*child)); /* find partition indices */ unsigned int plen; double **Xc = NULL; Rect *newRect = NULL; double *Zc = NULL; int *pnew = NULL; unsigned int success = part_child(op, &Xc, &pnew, &plen, &Zc, &newRect); if(success == 0) return success; /* grow the Child */ (*child) = new Tree(Xc, pnew, plen, d, Zc, newRect, this, model); return plen; } #ifdef DONTDOTHIS /* * val_order_probs: * * compute the discrete probability distribution over valid * changepoint locations (UNIFORM) */ void Tree::val_order_probs(double **Xo, double **probs, unsigned int var, double **rX, unsigned int rn) { unsigned int i; *Xo = new_vector(rn); *probs = new_vector(rn); for(i=0; iboundary[1][var] + rect->boundary[0][var]) / 2; /* calculate the squared distance of each rX[][var] point from the midpoint */ double *XmMid = new_vector(rn); for(unsigned int i=0; iboundary[0][var] || (*Xo)[i] >= rect->boundary[1][var]) (*probs)[i] = 0.0; else (*probs)[i] = 1.0/one2n[i]; /* calculate the cumulative probability to the left and right of midpoint */ if((*Xo)[i] < mid) sum_left += (*probs)[i]; else sum_right += (*probs)[i]; } /* normalise the probability distribution with sim_left and sum_right */ double mult; if(sum_left > 0 && sum_right > 0) mult = 0.5; else mult = 1.0; for(unsigned int i=0; iget_Xsplit(&N); val_order_probs(&Xo, &probs, var, locs, N); dsample(&val, &indx, 1, N, Xo, probs, state); *p = probs[indx]; free(Xo); free(probs); return val; } /* * split_prob: * * compute the probability of the current split point * returns the log probability */ double Tree::split_prob() { double *Xo, *probs; double p; unsigned int find_len, N; double **locs = model->get_Xsplit(&N); val_order_probs(&Xo, &probs, var, locs, N); int *indx = find(Xo, N, EQ, val, &find_len); assert(find_len >= 1 && indx[0] >= 0); p = log(probs[indx[0]]); free(Xo); free(probs); free(indx); return p; } /* * getN: * * return the number of input locations, N */ unsigned int Tree::getN(void) const { return n; } /* * getNN: * * return the number of predictive locations locations, NN */ unsigned int Tree::getNN(void) const { return nn; } /* * adjustDepth: * * auto increment or decrement the depth of * a node (and its children) by int "a" */ void Tree::adjustDepth(int a) { if(leftChild) leftChild->adjustDepth(a); if(rightChild) rightChild->adjustDepth(a); depth += a; assert(depth >= 0); } /* * swapableList: * * get an array containing the internal nodes of the tree t */ Tree** Tree::swapableList(unsigned int* len) { Tree *first, *last; first = last = NULL; *len = swapable(&first, &last); if(*len == 0) return NULL; return first->buildTreeList(*len); } /* * internalsList: * * get an array containing the internal nodes of the tree t */ Tree** Tree::internalsList(unsigned int* len) { Tree *first, *last; first = last = NULL; *len = internals(&first, &last); if(*len == 0) return NULL; return first->buildTreeList(*len); } /* * leavesList: * * get an array containing the leaves of the tree t */ Tree** Tree::leavesList(unsigned int* len) { Tree *first, *last; first = last = NULL; *len = leaves(&first, &last); if(*len == 0) return NULL; return first->buildTreeList(*len); } /* * prunableList: * * get an array containing the prunable nodes of the tree t */ Tree** Tree::prunableList(unsigned int* len) { Tree *first, *last; first = last = NULL; *len = prunable(&first, &last); if(*len == 0) return NULL; return first->buildTreeList(*len); } /* * numLeaves: * * get a count of the number of leaves in the tree t */ unsigned int Tree::numLeaves(void) { Tree *first, *last; first = last = NULL; int len = leaves(&first, &last); return len; } /* * numPrunable: * * get a count of the number of prunable nodes of the tree t */ unsigned int Tree::numPrunable(void) { Tree *first, *last; first = last = NULL; int len = prunable(&first, &last); return len; } /* * buildTreeList: * * takes a pointer to the first element of a Tree list and a * length parameter and builds an array style list */ Tree** Tree::buildTreeList(unsigned int len) { unsigned int i; Tree* first = this; Tree** list = (Tree**) malloc(sizeof(Tree*) * (len)); for(i=0; inext; } return list; } /* * PrintTree: * * print the tree out to the file in depth first order * -- the R CART tree structure format * rect and scale are for unnnormalization of split point */ void Tree::PrintTree(FILE* outfile, double** rect, double scale, int root) const { /* print the node number, followinf by or the splitting dimension */ if(isLeaf()) MYprintf(outfile, "%d \t", root); else MYprintf(outfile, "%d %d ", root, var); /* print the defiance (which is just zero since this is unused) and the variance (s2) in the partition */ MYprintf(outfile, "%d 0 %.4f ", n, base->Var()); /* don't print split information if this is a leaf, but do print the params */ if(isLeaf()) { /* skipping the split locations */ MYprintf(outfile, "\"\" \"\" 0 "); } else { /* unnormalize the val */ double vn = val / scale; vn = (rect[1][var] - rect[0][var])*vn + rect[0][var]; /* print the split locations */ MYprintf(outfile, "\"<%-5g\" \">%-5g\" ", vn, vn); /* print val again, this time in higher precision */ MYprintf(outfile, "%15f ", vn); } /* not skipping the printing of leaf (GP) paramerters */ unsigned int len; double *trace = base->Trace(&len, true); printVector(trace, len, outfile, MACHINE); if(trace) free(trace); /* process children */ if(!isLeaf()) { leftChild->PrintTree(outfile, rect, scale, 2*root); rightChild->PrintTree(outfile, rect, scale, 2*root+1); } } /* * dopt_from_XX: * * return the indices of N d-optimal draws from XX (of size nn); */ unsigned int* Tree::dopt_from_XX(unsigned int N, unsigned int iter, void *state) { assert(N <= nn); assert(XX); int *fi = new_ivector(N); double ** Xboth = new_matrix(N+n, d); // dopt(Xboth, fi, X, XX, d, n, nn, N, d, nug, iter, 0, state); dopt(Xboth, fi, X, XX, d, n, nn, N, DOPT_D(d), DOPT_NUG(), iter, 0, state); unsigned int *fi_ret = new_uivector(N); for(unsigned int i=0; i t_minp points in the partition) */ bool Tree::wellSized(void) const { /* partition must have enough data in it */ if(n <= model->get_params()->T_minp()) return false; /* don't care about the rest of the checks if the base model is constant */ if(base->Constant()) return true; /* checks to do with well defined linear and GP models */ return ((Area() > 0) /* non-zero Area or Volume */ && (!Singular())); /* non-singular design matrix */ } /* * Singular: * * return true return true iff X has a column with all * the same value or if Z has all of the same value */ bool Tree::Singular(void) const { /* first check each column of X for >=1 unique value */ assert(X); unsigned int bm = model->get_params()->T_bmax(); for(unsigned int i=0; i= d+1 unique vectors */ unsigned int UN = d+2; double **U = new_matrix(UN, bm); dupv(U[0], X[0], bm); unsigned int un = 1; /* for each row */ for(unsigned int i=1; i= UN) { if(2*UN > n) UN = n; else UN = 2*UN; U = new_bigger_matrix(U, un, bm, UN, bm); } dupv(U[un], X[i], bm); un++; } /* have we found enough unique X's */ if(un >= d+1) break; } delete_matrix(U); if(un <= d) return true; /* then check Z for >=1 unique value */ assert(Z); double f = Z[0]; unsigned int j = 0; for(j=1; jget_params()->T_bmax(); return rect_area_maxd(rect, bm); /* return rect_area(rect); */ } /* * GetRect: * * return a pointer to the rectangle associated with this partition */ Rect* Tree::GetRect(void) const { return rect; } /* * get_pp: * * return indices into the XX array */ int* Tree::get_pp(void) const { return pp; } /* * get_XX: * * return the predictive data locations: XX */ double** Tree::get_XX(void) const { return XX; } /* * get_X: * * return the data locations: X */ double** Tree::get_X(void) const { return X; } /* * get_Z: * * return the data responses: Z */ double* Tree::get_Z(void) const { return Z; } /* * cut_branch: * * cut the children (recursively) from the tree */ void Tree::cut_branch(void) { if(!isLeaf()) { assert(leftChild != NULL && rightChild != NULL); delete leftChild; delete rightChild; leftChild = rightChild = NULL; } // base->ClearPred(); base->Init(NULL); /* calls ClearPred() already */ Update(); Compute(); } /* * Outfile: * * set outfile handle */ void Tree::Outfile(FILE *file, int verb) { OUTFILE = file; this->verb = verb; if(leftChild) leftChild->Outfile(file, verb); if(rightChild) rightChild->Outfile(file, verb); } /* * Height: * * compute the height of the the tree */ unsigned int Tree::Height(void) const { if(isLeaf()) return 1; unsigned int lh = leftChild->Height(); unsigned int rh = rightChild->Height(); if(lh > rh) return 1 + lh; else return 1 + rh; } /* * Prior: * * Calculate the tree process prior, possibly * tempered. * * returns a log probability */ double Tree::Prior(double itemp) { double prior; /* get the tree process prior parameters */ double alpha, beta; unsigned int minpart, splitmin, basemax; model->get_params()->get_T_params(&alpha, &beta, &minpart, &splitmin, &basemax); if(isLeaf()) { /* probability of not growing this branch */ prior = log(1.0 - alpha*pow(1.0+depth,0.0-beta)); /* temper, in log space uselog=1 */ prior = temper(prior, itemp, 1); } else { /* probability of growing here */ prior = log(alpha) - beta*log(1.0 + depth); /* temper, in log space uselog=1 */ prior = temper(prior, itemp, 1); /* probability of the children */ prior += leftChild->Prior(itemp); prior += rightChild->Prior(itemp); } return prior; } /* * FullPosterior: * * Calculate the full posterior of (the leaves of) * the tree using the base models and the probability * of growing (or not) at internal (leaf) nodes with * process prior determined by alpha and beta * * returns a log posterior probability */ double Tree::FullPosterior(double itemp, bool tprior) { double post; /* get the tree process prior parameters */ double alpha, beta; unsigned int minpart, splitmin, basemax; model->get_params()->get_T_params(&alpha, &beta, &minpart, &splitmin, &basemax); if(isLeaf()) { /* probability of not growing this branch */ post = log(1.0 - alpha*pow(1.0+depth,0.0-beta)); /* temper, in log space uselog=1 */ if(tprior) post = temper(post, itemp, 1); /* base posterior */ post += base->FullPosterior(itemp); } else { /* probability of growing here */ post = log(alpha) - beta*log(1.0 + depth); /* temper, in log space uselog=1 */ if(tprior) post = temper(post, itemp, 1); /* probability of the children */ post += leftChild->FullPosterior(itemp, tprior); post += rightChild->FullPosterior(itemp, tprior); } return post; } /* * MarginalPosterior: * * Calculate the full (marginal) posterior of (the leaves of) * the tree using the base models and the probability * of growing (or not) at internal (leaf) nodes with * process prior determined by alpha and beta * * returns a log posterior probability * * SHOULD ADD tprior ARGUMENT! */ double Tree::MarginalPosterior(double itemp) { double post; /* get the tree process prior parameters */ double alpha, beta; unsigned int minpart, splitmin, basemax; model->get_params()->get_T_params(&alpha, &beta, &minpart, &splitmin, &basemax); if(isLeaf()) { /* probability of not growing this branch */ post = log(1.0 - alpha*pow(1.0+depth,0.0-beta)); /* probability of the base model at this leaf */ post += base->MarginalPosterior(itemp); } else { /* probability of growing here */ post = log(alpha) - beta*log(1.0 + depth); /* probability of the children */ post += leftChild->MarginalPosterior(itemp); post += rightChild->MarginalPosterior(itemp); } return post; } /* * Likelihood: * * Calculate the likelihood of (all of the leaves of) * the tree using the base models; returns the log likelihood */ double Tree::Likelihood(double itemp) { double llik; if(isLeaf()) { /* likelihood of the base model at this leaf */ //double olditemp = base->NewInvTemp(itemp, true); llik = base->Likelihood(itemp); //base->NewInvTemp(olditemp, true); } else { /* add in likelihoods of the children */ llik = leftChild->Likelihood(itemp); llik += rightChild->Likelihood(itemp); } return llik; } /* * Update: * * calls the GP function of the same name with * the data for this tree in this partition */ void Tree::Update(void) { base->Update(X, n, d, Z); } /* * Compute: * * do necessary computations the (GP) model at this * node in the tree */ void Tree::Compute(void) { assert(base); base->Compute(); } /* * State: * * return string state information from the (GP) model * at this node in the tree */ char* Tree::State(unsigned int which) { assert(base); return base->State(which); } /* * Draw: * * draw from all of the conditional posteriors of the model(s) * (e.g. GP) attached to this leaf node */ bool Tree::Draw(void *state) { assert(base); assert(isLeaf()); return base->Draw(state); } /* * Clear: * * call the model (e.g. GP) clear function */ void Tree::Clear(void) { base->Clear(); } /* * ForceLinear: * * make adjustments to toggle to the (limiting) linear * model (right now, this only makes sense for the * GP LLM) */ void Tree::ForceLinear(void) { base->ForceLinear(); } /* * ForceNonlinear: * * make adjustments to toggle to the (limiting) linear * model (right now, this only makes sense for the * GP LLM) */ void Tree::ForceNonlinear(void) { base->ForceNonlinear(); } /* * Linarea: * * get statistics from the model (e.g. GP) for calculating * the area of the domain under the LLM */ bool Tree::Linarea(unsigned int *sum_b, double *area) const { *sum_b = base->sum_b(); *area = Area(); return base->Linear(); } /* * GetBase: * * return the base model (e.g. gp) */ Base* Tree::GetBase(void) const { return base; } /* * BasePrior: * * return the prior to base model (e.g. gp) */ Base_Prior* Tree::GetBasePrior(void) const { return base->Prior(); } /* * TraceNames: * * prints the names of the traces recorded in Tree::Trace() * without "index" (i.e., basically return base->TraceNames()) */ char** Tree::TraceNames(unsigned int *len, bool full) { return base->TraceNames(len, full); } /* * Trace: * * gathers trace statistics from the Base model * and writes them out to the specified file */ void Tree::Trace(unsigned int index, FILE* XXTRACEFILE) { double *trace; unsigned int len; /* sanity checks */ assert(XXTRACEFILE); if(!pp) return; /* get the trace */ trace = base->Trace(&len, false); /* write to the XX trace file */ for(unsigned int i=0; iNewInvTemp(itemp, true); else { base->NewInvTemp(itemp, false); rightChild->NewInvTemp(itemp); leftChild->NewInvTemp(itemp); } } /* * Distance: * * returns, via d1 and d2, two distance measures between pairs * of XX locations: d1 gives the number of nodes in the tree * along the shortest path; d2 sums the distances to the partition * boundary along that path, with any nodes in the same region * having distance zero */ void Tree::Distance(double **XX, int *p, const unsigned int plen, double **d1, double *h, double **d2, double *ad) { if(isLeaf()) { for(unsigned int i=0; iDistance(XX, pl, pllen, d1, h, d2, ad); rightChild->Distance(XX, pr, prlen, d1, h, d2, ad); /* accumulate distance to boundary as we recurse back up */ for(unsigned int i=0; i #include #include #include "rhelp.h" #include "rand_draws.h" #include "matrix.h" #include "predict_linear.h" #include "predict.h" #include "linalg.h" /* #define DEBUG */ /* * predictive_mean_noK: * * compute the predictive mean of a single observation * used by predict_data and predict * * FFrow[col], b[col] */ double predictive_mean_noK(n1, col, FFrow, i, b) unsigned int n1, col; int i; double *FFrow, *b; { double zm; /* f(x)' * beta */ zm = linalg_ddot(col, FFrow, 1, b, 1); return zm; } /* * predict_data_noK: * * used by the predict_full funtion below to fill * z[n1] with predicted values based on the input coded in * terms of Frow,FW,W,xxKx,IDpFWF,IDpFWFi,b,ss2,Kdiag * returns the number of warnings * * b[col], z[n1], FFrow[n1][col]; */ void predict_data_noK(zpm,zps2,n1,col,FFrow,b,ss2,Kdiag) unsigned int n1, col; double *b, *zpm, *zps2, *Kdiag; double **FFrow; double ss2; { int i; /* for each point at which we want a prediction */ for(i=0; i 0);*/ Qy = new_vector(n1); for(i=0; i= 0); } /* clean up */ free(Qy); } /* * predictive_var_noK: * * computes the predictive variance for a single location * used by predict. Also returns Q, rhs, Wf, and s2corr * which are useful for computeing Delta-sigma * * Q[n1], rhs[n1], Wf[col], FFrow[n1], FW[col][n1], * IDpFWFi[n1][n1], W[col][col]; */ double predictive_var_noK(n1, col, Q, rhs, Wf, s2cor, ss2, f, FW, W, tau2, IDpFWFi, corr_diag) unsigned int n1, col; double *Q, *rhs, *Wf, *f, *s2cor; double **FW, **IDpFWFi, **W; double corr_diag, ss2, tau2; { double s2, kappa, fWf, last; /* Var[Z(x)] = s2*[corr_diag + fWf - Q (K + FWF)^{-1} Q] */ /* where Q = k + FWf */ /* Q = tau2*FW*f(x); */ zerov(Q, n1); linalg_dgemv(CblasNoTrans,n1,col,tau2,FW,n1,f,1,0.0,Q,1); /* rhs = IDpFWFi * Q */ linalg_dgemv(CblasNoTrans,n1,n1,1.0,IDpFWFi,n1,Q,1,0.0,rhs,1); /* Q (tau2*FWF)^{-1} Q */ /* last = Q*rhs = Q*KpFWFi*Q */ last = linalg_ddot(n1, Q, 1, rhs, 1); /* W*f(x) */ linalg_dsymv(col,1.0,W,col,f,1,0.0,Wf,1); /* f(x)*Wf */ fWf = linalg_ddot(col, f, 1, Wf, 1); /* finish off the variance */ /* Var[Z(x)] = s2*[corr_diag + fWf - Q (Id + FWF)^{-1} Q] */ /* Var[Z(x)] = s2*[kappa - Q C^{-1} Q] */ kappa = corr_diag + tau2*fWf; *s2cor = kappa - last; s2 = ss2*(*s2cor); /* this is to catch bad s2 calculations; */ if(s2 <= 0) { s2 = 0; *s2cor = corr_diag-1.0; } return s2; } /* * predict_delta_noK: * * used by the predict_full funtion below to fill * zmean and zs [n2] with predicted mean and var * values based on the input coded in * terms of FF,FW,W,xxKx,IDpFWF,IDpFWFi,b,ss2,Kdiag * * Also calls delta_sigma2 at each predictive location, * because it uses many of the same computed quantaties * as needed to compute the predictive variance. * * b[col], z[n2] FFrow[n2][col] IDpFWFi[n1][n1], * FW[col][n1], W[col][col], Ds2xy[n2][n2]; */ void predict_delta_noK(zzm,zzs2,Ds2xy,n1,n2,col,FFrow,FW,W,tau2,IDpFWFi,b,ss2,KKdiag) unsigned int n1, n2, col; double *b, *zzm, *zzs2, *KKdiag; double **FFrow, **IDpFWFi, **FW, **W, **Ds2xy; double ss2, tau2; { int i; double s2cor; /*double Q[n1], rhs[n1], Wf[col];*/ double *Q, *rhs, *Wf; /* zero stuff out before starting the for-loop */ rhs = new_zero_vector(n1); Wf = new_zero_vector(col); Q = new_vector(n1); /* for each point at which we want a prediction */ for(i=0; i #include #include "rand_pdf.h" #include "linalg.h" #include "gen_covar.h" #include "lik_post.h" #include "matrix.h" #include "rhelp.h" #include #include #include /* #define DEBUG */ /* * post_margin_rj: * * uses marginalized parameters (lambda) to calculate the posterior * probability of the GP (d and nug params). * Uses full (unnormalized) * distribution as needed for RJMCMC. return value is logarithm * * T[col][col], Vb[col][col] */ double post_margin_rj(n, col, lambda, Vb, log_detK, T, tau2, a0, g0, itemp) unsigned int n,col; double **T, **Vb; double a0, g0, tau2, lambda, log_detK, itemp; { double log_detVB, log_detT, one, two, p; unsigned int m = 0; /* sanity check for temperature */ assert(itemp >= 0); if(itemp == 0) return 0.0; /* itemp = pow(itemp, 1.0/n); */ /* log det Vb */ log_detVB = log_determinant_dup(Vb, col); /* determine if design matrix is collinear */ if(log_detVB == 0.0-1e300*1e300 || lambda < 0 || log_detK == 0.0-1e300*1e300) { /* warning("degenerate design matrix in post_margin_rj"); */ /* assert(0); */ return 0.0-1e300*1e300; } /* determinant of T depends on Beta Prior Model */ if(T[0][0] == 0.0) { assert(tau2 == 1.0); log_detT = 0.0 /*- col*LOG_2_PI*/; m = col; } else log_detT = log_determinant_dup(T, col); /* one = log(det(VB)) - n*log(2*pi) - log(det(K)) - log(det(T)) - col*log(tau2) */ one = log_detVB - (itemp*n)*2*M_LN_SQRT_2PI - itemp*log_detK - log_detT - col*log(tau2); /* two = (a0/2)*log(g0/2) - ((a0+n)/2)*log((g0+lambda)/2) * + log(gamma((a0+n)/2)) - log(gamma(a0/2)); */ two = 0.5*a0*log(0.5*g0) - 0.5*(a0 + itemp*(n-m))*log(0.5*(g0+lambda)); two += lgammafn(0.5*(a0 + itemp*(n-m))) - lgammafn(0.5*a0); /* posterior probability */ p = 0.5*one + two; /* MYprintf(MYstderr, "n=%d, one=%g, two=%g, ldVB=%g, Vb00=%g, ldK=%g, ldT=%g, T00=%g, col_ltau2=%g\n", n, one, two, log_detVB, Vb[0][0], log_detK, log_detT, T[0][0], col*log(tau2)); MYflush(MYstderr); */ /* make sure we got a good p */ if(ISNAN(p)) { p = 0.0-1e300*1e300; /* warning("post_margin_rj, p is NAN"); */ #ifdef DEBUG assert(!ISNAN(p)); #endif } return p; } /* * post_margin: * * uses marginalized parameters (lambda) to calculate the posterior * probability of the GP (d and nug params). Cancels common factors * in ratio of posteriors for MH-MCMC. return value is logarithm * * Vb[col][col] */ double post_margin(n, col, lambda, Vb, log_detK, a0, g0, itemp) unsigned int n, col; double **Vb; double a0, g0, lambda, log_detK, itemp; { double log_detVB, one, two, p; /* sanity check for temperature */ assert(itemp >= 0); if(itemp == 0) return 0.0; /* itemp = pow(itemp, 1.0/n); */ /* log determinant of Vb */ log_detVB = log_determinant_dup(Vb, col); /* determine if design matrix is collinear */ if(log_detVB == 0.0-1e300*1e300 || lambda < 0 || log_detK == 0.0-1e300*1e300) { /* warning("degenerate design matrix in post_margin"); */ return 0.0-1e300*1e300; } /* one = log(det(VB)) - log(det(K)) */ one = log_detVB - itemp*log_detK; /* two = - ((a0+n)/2)*log((g0+lambda)/2) */ two = 0.0 - 0.5*(a0 + itemp*n)*log(0.5*(g0+lambda)); /* posterior probability */ p = 0.5*one + two; /* make sure we got a good p */ if(ISNAN(p)) { p = 0.0-1e300*1e300; /* warning("post_margin, p is NAN"); */ #ifdef DEBUG assert(!ISNAN(p)); #endif } return p; } /* * gp_lhood: * * compute the GP likelihood MVN; some of these calculations are * the same as in predict_help(). Should consider moving them to * a more accessible place so predict_help and gp_lhood can share. * * BOBBY: Now when we have Ki == NULL, the Kdiag vec is used. * Thus we now allocate KiFbmZ regardless. * * uses annealing inv-temperature; returns the log pdf */ double gp_lhood(double *Z, unsigned int n, unsigned int col, double **F, double *b, double s2, double **Ki, double log_det_K, double *Kdiag, double itemp) { double *ZmFb, *KiZmFb; double ZmFbKiZmFb, eponent, front, llik; unsigned int i; /* sanity check for temperature */ assert(itemp >= 0); if(itemp == 0.0) return 0.0; /* itemp = pow(itemp, 1.0/n); */ /* ZmFb = Zdat - F * b; first, copy Z (copied code from predict_help()) */ ZmFb = new_dup_vector(Z, n); linalg_dgemv(CblasNoTrans,n,col,-1.0,F,n,b,1,1.0,ZmFb,1); /* KiZmFb = Ki * (Z - F * b); first, zero-out KiZmFb */ KiZmFb = new_zero_vector(n); if(Ki) { linalg_dsymv(n,1.0,Ki,n,ZmFb,1,0.0,KiZmFb,1); } else { for(i=0; i using namespace std; typedef enum BASE_MODEL {GP=901} BASE_MODEL; class Model; class Tree; class Base_Prior; /* * CLASS for the generic implementation of a base model * e.g., a Gaussian Process (GP) */ class Base { private: protected: bool pcopy; /* is this a private copy of the prior? */ Base_Prior *prior; /* Base (Gaussian Process) prior module */ unsigned int d; /* dim for X of input variables */ unsigned int col; /* dim for design */ unsigned int n; /* number of input data points-- rows in the design matrix */ unsigned int nn; /* number of predictive input data locations */ double **X; /* pointer to inputs X from tree module */ double **XX; /* pointer to inputs XX from tree module */ double *Z; /* pointer to responses Z from tree module */ double mean; /* mean of the Zs */ double itemp; /* importance annealing inv-temperature */ FILE* OUTFILE; /* where to print tree-specific info */ int verb; /* printing level (0=none, ... , 3+=verbose) */ public: Base(unsigned int d, Base_Prior *prior, Model *model); Base(double **X, double *Z, Base *gp_old, bool economy); virtual ~Base(void); BASE_MODEL BaseModel(void); Base_Prior* Prior(void); virtual Base* Dup(double **X, double *Z, bool economy)=0; virtual void Clear(void)=0; virtual void ClearPred(void)=0; virtual void Update(double **X, unsigned int n, unsigned int d, double *Z)=0; virtual void UpdatePred(double **XX, unsigned int nn, unsigned int d, bool Ds2xy)=0; virtual bool Draw(void *state)=0; virtual void Predict(unsigned int n, double *zp, double *zpm, double *zpvm, double *zps2, unsigned int nn, double *zz, double *zzm, double *zzvm, double *zzs2, double **ds2xy, double *improv, double Zmin, bool err, void *state)=0; virtual void Match(Base* gp_old)=0; virtual void Combine(Base *l_gp, Base *r_gp, void *state)=0; virtual void Split(Base *l_gp, Base *r_gp, void *state)=0; virtual void Compute(void)=0; virtual void ForceLinear(void)=0; virtual void ForceNonlinear(void)=0; virtual bool Linear(void)=0; virtual bool Constant(void)=0; virtual void printFullNode(void)=0; virtual double Var(void)=0; virtual double Posterior(void)=0; virtual double MarginalLikelihood(double itemp)=0; virtual double FullPosterior(double itemp)=0; virtual double MarginalPosterior(double itemp)=0; virtual double Likelihood(double itemp)=0; virtual char* State(unsigned int which)=0; virtual unsigned int sum_b(void)=0; virtual void Init(double *dbase)=0; virtual void X_to_F(unsigned int n, double **X, double **F)=0; virtual double* Trace(unsigned int* len, bool full)=0; virtual char** TraceNames(unsigned int* len, bool full)=0; virtual double NewInvTemp(double itemp, bool isleaf)=0; unsigned int N(void); }; /* * generic CLASS for the prior to the correlation function * including a nugget parameter */ class Base_Prior { private: protected: unsigned int d; /* col dimension of the data */ unsigned int col; /* col dimension of the design (eg F for GP) */ BASE_MODEL base_model; /* indicator for type of model (e.g., GP) */ public: /* start public functions */ Base_Prior(unsigned int d); Base_Prior(Base_Prior* prior); virtual ~Base_Prior(void); BASE_MODEL BaseModel(void); unsigned int Col(void); virtual void read_ctrlfile(std::ifstream* ctrlfile)=0; virtual void read_double(double *dparams)=0; virtual void Init(double *dhier)=0; virtual void Draw(Tree** leaves, unsigned int numLeaves, void *state)=0; virtual bool LLM(void)=0; virtual double ForceLinear(void)=0; virtual void ResetLinear(double gamb)=0; virtual void Print(FILE* outfile)=0; virtual Base* newBase(Model *model)=0; virtual Base_Prior* Dup(void)=0; virtual double log_HierPrior(void)=0; virtual double* Trace(unsigned int* len, bool full)=0; virtual char** TraceNames(unsigned int* len, bool full)=0; virtual double GamLin(unsigned int which)=0; }; #endif tgp/src/lh.c0000644000175100001440000002570212655414756012445 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include #include #include #include #include #include "lh.h" #include "matrix.h" #include "rhelp.h" #include "rand_draws.h" int compareRank(const void* a, const void* b); int compareDouble(const void* a, const void* b); /* * structure for ranking */ typedef struct rank { double s; int r; } Rank; /* * rect_sample_lh: * * returns a unidorm sample of (n) points * within a regular (dim)-dimensional cube. * (n*dim matrix returned) */ double** rect_sample(int dim, int n, void *state) { int i,j; double **s = new_matrix(dim, n); for(i=0; i= 0); if(n == 0) return NULL; z = e = s = NULL; /* We could just draw random permutations of (1..n) here, which is effectively what we are doing. This ranking scheme could be valuable, though, in drawing lhs for correlated variables. In that case, s would instead be a sample from the correct joint distribution, and the quantile functions at the end would have to correspond to the marginal distributions for each variable. See Stein, 1987 (Technometrics). This would have to be coded on a case to case basis though. */ /* get initial sample */ s = rect_sample(dim, n, state); /* get ranks */ r = (int**) malloc(sizeof(int*) * dim); for(i=0; is = s[i][j]; sr[j]->r = j; } qsort((void*)sr, n, sizeof(Rank*), compareRank); /* assign ranks */ for(j=0; jr] = j+1; free(sr[j]); } free(sr); } /* Draw random variates */ e = rect_sample(dim, n, state); /* Obtain latin hypercube sample on the unit cube: The alpha parameters for each beta quantile function are calculated from the (re-scaled) mode and the shape parameter. */ z = new_matrix(dim,n); for(i=0; i 1.0 || mode[i] < 0) mscaled=0.5; else mscaled = mode[i]; for(j=0; j mscaled || 1 < mscaled ) mscaled=0.5; if(shape[i] < 1) shape[i] = 1; /* only concave betas, else uniform */ alpha = (1 + mscaled*(shape[i]-2))/(1-mscaled); assert( alpha > 0 ); for(j=0; j= 0); if(n == 0) return NULL; z = e = s = NULL; /* get initial sample */ s = rect_sample(dim, n, state); /* get ranks */ r = (int**) malloc(sizeof(int*) * dim); for(i=0; is = s[i][j]; sr[j]->r = j; } qsort((void*)sr, n, sizeof(Rank*), compareRank); /* assign ranks */ for(j=0; jr] = j+1; free(sr[j]); } free(sr); } /* Draw random variates */ if(er) e = rect_sample(dim, n, state); /* Obtain latin hypercube sample */ z = new_matrix(dim,n); for(i=0; is < bb->s) return -1; else return 1; } /* * compareDouble: * * comparison function double sorting ranking */ int compareDouble(const void* a, const void* b) { double aa = (double)(*(double *)a); double bb = (double)(*(double *)b); if(aa < bb) return -1; else return 1; } /* * rect_scale: * * shift/scale a draws from a unit cube into * the specified rectangle */ void rect_scale(double** z, int d, int n, double** rect) { int i,j; double scale, shift; for(i=0; is = s[j]; sr[j]->r = j; } qsort((void*)sr, n, sizeof(Rank*), compareRank); /* assign ranks */ for(j=0; jr +1; free(sr[j]); } free(sr); return r; } /* * rank: * * obtain the integer rank of the elemts of s */ int* rank(double *s, unsigned int n) { int j; int *r; Rank ** sr; r = new_ivector(n); sr = (Rank**) malloc(sizeof(Rank*) * n); for(j=0; js = s[j]; sr[j]->r = j; } qsort((void*)sr, n, sizeof(Rank*), compareRank); /* assign ranks */ for(j=0; jr] = j+1; free(sr[j]); } free(sr); return r; } tgp/src/temper.cc0000644000175100001440000005171012655414756013477 0ustar hornikusers /******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include "R.h" extern "C" { #include "rand_draws.h" #include "matrix.h" #include "rhelp.h" } #include "temper.h" #include #include #include /* * Temper: (constructor) * * create a new temperature structure from the temperature * array provided, of length n (duplicating the array) */ Temper::Temper(double *itemps, double *tprobs, unsigned int numit, double c0, double n0, IT_LAMBDA it_lambda) { /* copy the inv-temperature vector */ this->itemps = new_dup_vector(itemps, numit); this->numit = numit; /* stochastic approximation parameters */ this->c0 = c0; this->n0 = n0; this->doSA = false; /* must turn on in Model:: */ /* combination method */ this->it_lambda = it_lambda; /* either assign uniform probs if tprobs is NULL */ if(tprobs == NULL) { this->tprobs = ones(numit, 1.0/numit); } else { /* or copy them and make sure they're positive and normalized */ this->tprobs = new_dup_vector(tprobs, numit); Normalize(); } /* init itemp-location pointer -- find closest to 1.0 */ this->k = 0; double mindist = fabs(this->itemps[0] - 1.0); for(unsigned int i=1; inumit; i++) { double dist = fabs(this->itemps[i] - 1.0); if(dist < mindist) { mindist = dist; this->k = i; } } /* set new (proposed) temperature to "null" */ this->knew = -1; /* set iteration number for stoch_approx to zero */ this->cnt = 1; /* zero-out a new counter for each temperature */ this->tcounts = new_ones_uivector(this->numit, 0); this->cum_tcounts = new_ones_uivector(this->numit, 0); } /* * Temper: (constructor) * * create a new temperature structure from the temperature * array provided, the first entry of the array is n. If n * is not zero, then c0 and n0 follow, and then n inverse * temperatures and n (possibly unnormalized) probabilities. */ Temper::Temper(double *ditemps) { /* read the number of inverse temperatures */ assert(ditemps[0] >= 0); numit = (unsigned int) ditemps[0]; /* copy c0 and n0 */ c0 = ditemps[1]; n0 = ditemps[2]; assert(c0 >= 0 && n0 >= 0); doSA = false; /* must turn on in Model:: */ /* copy the inv-temperature vector and probs */ itemps = new_dup_vector(&(ditemps[3]), numit); tprobs = new_dup_vector(&(ditemps[3+numit]), numit); /* normalize the probs and then check that they're positive */ Normalize(); /* combination method */ int dlambda = (unsigned int) ditemps[3+3*numit]; switch((unsigned int) dlambda) { case 1: it_lambda = OPT; break; case 2: it_lambda = NAIVE; break; case 3: it_lambda = ST; break; default: error("IT lambda = %d unknown\n", dlambda); } /* init itemp-location pointer -- find closest to 1.0 */ k = 0; double mindist = fabs(itemps[0] - 1.0); for(unsigned int i=1; iitemps, temp->numit); tprobs = new_dup_vector(temp->tprobs, temp->numit); tcounts = new_dup_uivector(temp->tcounts, temp->numit); cum_tcounts = new_dup_uivector(temp->cum_tcounts, temp->numit); numit = temp->numit; k = temp->k; knew = temp->knew; c0 = temp->c0; n0 = temp->n0; doSA = false; cnt = temp->cnt; } /* * Temper: (assignment operator) * * copy new temperature structure from the temperature * array provided, of length n (duplicating the array) */ Temper& Temper::operator=(const Temper &t) { Temper *temp = (Temper*) &t; assert(numit == temp->numit); dupv(itemps, temp->itemps, numit); dupv(tprobs, temp->tprobs, numit); dupuiv(tcounts, temp->tcounts, numit); dupuiv(cum_tcounts, temp->cum_tcounts, numit); numit = temp->numit; k = temp->k; knew = temp->knew; c0 = temp->c0; n0 = temp->n0; cnt = temp->cnt; doSA = temp->doSA; return *this; } /* * ~Temper: (destructor) * * free the memory and contents of an itemp * structure */ Temper::~Temper(void) { free(itemps); free(tprobs); free(tcounts); free(cum_tcounts); } /* * Itemp: * * return the actual inv-temperature currently * being used */ double Temper::Itemp(void) { return itemps[k]; } /* * Prob: * * return the probability inv-temperature currently * being used */ double Temper::Prob(void) { return tprobs[k]; } /* * ProposedProb: * * return the probability inv-temperature proposed */ double Temper::ProposedProb(void) { return tprobs[knew]; } /* * Propose: * * Uniform Random-walk proposal for annealed importance sampling * temperature in the continuous interval (0,1) with bandwidth * of 2*0.1. Returns proposal, and passes back forward and * backward probs */ double Temper::Propose(double *q_fwd, double *q_bak, void *state) { /* sanity check */ if(knew != -1) warning("did not accept or reject last proposed itemp"); if(k == 0) { if(numit == 1) { /* only one temp avail */ knew = k; *q_fwd = *q_bak = 1.0; } else { /* knew should be k+1 */ knew = k + 1; *q_fwd = 1.0; if(knew == (int) (numit - 1)) *q_bak = 1.0; else *q_bak = 0.5; } } else { /* k > 0 */ /* k == numit; means k_new = k-1 */ if(k == (int) (numit - 1)) { assert(numit > 1); knew = k - 1; *q_fwd = 1.0; if(knew == 0) *q_bak = 1.0; else *q_bak = 0.5; } else { /* most general case */ if(runi(state) < 0.5) { knew = k - 1; *q_fwd = 0.5; if(knew == (int) (numit - 1)) *q_bak = 1.0; else *q_bak = 0.5; } else { knew = k + 1; *q_fwd = 0.5; if(knew == 0) *q_bak = 1.0; else *q_bak = 0.5; } } } return itemps[knew]; } /* * Keep: * * keep a proposed itemp, double-checking that the itemp_new * argument actually was the last proposed inv-temperature */ void Temper::Keep(double itemp_new, bool burnin) { assert(knew >= 0); assert(itemp_new == itemps[knew]); k = knew; knew = -1; /* update the observation counts only whilest not doing SA and not doing burn in rounds */ if(!(doSA || burnin)) { (tcounts[k])++; (cum_tcounts[k])++; } } /* * Reject: * * reject a proposed itemp, double-checking that the itemp_new * argument actually was the last proposed inv-temperature -- * this actually amounts to simply updating the count of the * kept (old) temperature */ void Temper::Reject(double itemp_new, bool burnin) { assert(itemp_new == itemps[knew]); /* do not update itemps->k, but do update the counter for the old (kept) temperature */ knew = -1; /* update the observation counts only whilest not doing SA and not doing burn in rounds */ if(!(doSA || burnin)) { (tcounts[k])++; (cum_tcounts[k])++; } } /* * UpdatePrior: * * re-create the prior distribution of the temperature * ladder by dividing by the normalization constant, i.e., * adjust by the "observation counts" -- returns a pointer * to the probabilities */ double* Temper::UpdatePrior(void) { /* do nothing if there is only one temperature */ if(numit == 1) return tprobs; /* first find the min (non-zero) tcounts */ unsigned int min = tcounts[0]; for(unsigned int i=1; inumit == numit); dupv(this->tprobs, tprobs, numit); } /* * CopyPrior: * * write the tprior into the double vector provided, in the * same format as the double-input vector to the * Temper::Temper(double*) constructor */ void Temper::CopyPrior(double *dparams) { assert(this->numit == (unsigned int) dparams[0]); /* copy the pseudoprior */ dupv(&(dparams[3+numit]), tprobs, numit); /* copy the integer counts in each temperature */ for(unsigned int i=0; i= 1); for(unsigned int i=0; i= 1) MYprintf(MYstdout, "\neffective sample sizes:\n"); /* for each temperature */ for(unsigned int i=0; i 0 && w2sum[i] > 0) { /* compute ess and max weight for this temp */ lambda[i] = sq(W[i]) / w2sum[i]; /* check for numerical problems and (if none) calculate the within temperature ESS */ if(!R_FINITE(lambda[i])) { lambda[i] = 0; ei = 0; } else ei = calc_ess(wi, len); /* sum up the within temperature ESS's */ eisum += ei*len; } else { W[i] = 1; } /* doesn't matter since ei=0 */ /* keep track of sum of lengths and ess so far */ tlen += len; tess += len * ei; /* save individual ess to the (double) output essd vector */ essd[i] = len; essd[numit + i] = ei*len; /* print individual ess */ if(verb >= 1) MYprintf(MYstdout, "%d: itemp=%g, len=%d, ess=%g\n", //, sw=%g\n", i, itemps[i], len, ei*len); //, sumv(wi, len)); /* clean up */ free(wi); free(p); } /* normalize the lambdas */ double gamma_sum = sumv(lambda, numit); scalev(lambda, numit, 1.0/gamma_sum); /* for each temperature, calculate the adjusted weights */ for(unsigned int i=0; i= 1) { MYprintf(MYstdout, "total: len=%d, ess.sum=%g, ess(w)=%g\n", tlen, tess, ((double)wlen)*calc_ess(w,wlen)); double lce = wlen*(wlen-1.0)*gamma_sum/(sq(wlen)-gamma_sum); if(ISNAN(lce)) lce = 1; MYprintf(MYstdout, "lambda-combined ess=%g\n", lce); } /* clean up */ free(lambda); free(W); free(w2sum); /* return the overall effective sample size */ return(((double)wlen)*calc_ess(w, wlen)); } /* * EachESS: * * calculate the effective sample size at each temperature */ void Temper::EachESS(double *w, double *itemp, unsigned int wlen, double *essd) { /* for each temperature */ for(unsigned int i=0; i= 1) MYprintf(MYstdout, "\nST sample size=%d\n", len); /* return the overall effective sample size */ return((double) len); } /* * LambdaNaive: * * adjust the weight distribution w[n] via Naive Importance Tempering; * that is, disregard demperature, and just normalize the weight vector */ double Temper::LambdaNaive(double *w, unsigned int wlen, unsigned int verb) { /* calculate Wi=sum(wi) */ double W = sumv(w, wlen); if(W == 0) return 0.0; /* multiply by numerator of lambda-star */ scalev(w, wlen, 1.0/W); /* calculate ESS */ double ess = ((double)wlen)*calc_ess(w, wlen); /* print totals */ if(verb >= 1) MYprintf(MYstdout, "\nnaive IT ess=%g\n", ess); /* return the overall effective sample size */ return(ess); } /* * N: * * get number of temperatures n: */ unsigned int Temper::Numit(void) { return numit; } /* * DoStochApprox: * * true if both c0 and n0 are non-zero, then we * are doing StochApprox */ bool Temper::DoStochApprox(void) { if(c0 > 0 && n0 > 0 && numit > 1) return true; else return false; } /* * IS_ST_or_IS: * * return true importance tempering, simulated tempering, * or importance sampling is supported by the current * Tempering distribution */ bool Temper::IT_ST_or_IS(void) { if(numit > 1 || itemps[0] != 1.0) return true; else return false; } /* * IT_or_ST: * * return true importance tempering or simulated tempering, * is supported by the current Tempering distribution */ bool Temper::IT_or_ST(void) { if(numit > 1) return true; else return false; } /* * IS: * * return true if importance sampling (only) is supported * by the current Tempering distribution */ bool Temper::IS(void) { if(numit == 1 && itemps[0] != 1.0) return true; else return false; } /* * Itemps: * * return the temperature ladder */ double* Temper::Itemps(void) { return itemps; } /* * C0: * * return the c0 (SA) paramete */ double Temper::C0(void) { return c0; } /* * N0: * * return the n0 (SA) paramete */ double Temper::N0(void) { return n0; } /* * ResetSA: * * reset the stochastic approximation by setting * the counter to 1, and turn SA on */ void Temper::ResetSA(void) { doSA = true; cnt = 1; } /* * StopSA: * * turn off stochastic approximation */ void Temper::StopSA(void) { doSA = false; } /* * ITLambda: * * choose a method for importance tempering based on the it_lambda * variable, call that method, passing back the lambda-adjusted * weights w, and returning a calculation of ESSw */ double Temper::LambdaIT(double *w, double *itemp, unsigned int R, double *essd, unsigned int verb) { /* sanity check that it makes sense to adjust weights */ assert(IT_ST_or_IS()); double ess = 0; switch(it_lambda) { case OPT: ess = LambdaOpt(w, itemp, R, essd, verb); break; case NAIVE: ess = LambdaNaive(w, R, verb); EachESS(w, itemp, R, essd); break; case ST: ess = LambdaST(w, itemp, R, verb); EachESS(w, itemp, R, essd); break; default: error("bad it_lambda\n"); } return ess; } /* * Print: * * write information about the IT configuration * out to the supplied file */ void Temper::Print(FILE *outfile) { /* print the importance tempring information */ if(IS()) MYprintf(outfile, "IS with inv-temp %g\n", itemps[0]); else if(IT_or_ST()) { switch(it_lambda) { case OPT: MYprintf(outfile, "IT: optimal"); break; case NAIVE: MYprintf(outfile, "IT: naive"); break; case ST: MYprintf(outfile, "IT: implementing ST"); break; } MYprintf(outfile, " on %d-rung ladder\n", numit); if(DoStochApprox()) MYprintf(outfile, " with stoch approx\n"); else MYprintf(outfile, "\n"); } } /* * AppendLadder: * * append tprobs and tcounts to a file with the name * provided */ void Temper::AppendLadder(const char* file_str) { FILE *LOUT = fopen(file_str, "a"); printVector(tprobs, numit, LOUT, MACHINE); printUIVector(tcounts, numit, LOUT); fclose(LOUT); } /* * Normalize: * * normalize the pseudo-prior (tprobs) and * check that all probs are positive */ void Temper::Normalize(void) { scalev(tprobs, numit, 1.0/sumv(tprobs, numit)); for(unsigned int i=0; i 0); } /* * ess: * * effective sample size calculation for imporancnce * sampling -- per unit sample. To get the full sample * size, just multiply by n */ double calc_ess(double *w, unsigned int n) { if(n == 0) return 0; else { double cv2 = calc_cv2(w,n); if(ISNAN(cv2) || !R_FINITE(cv2)) { // warning("nan or inf found in cv2, probably due to zero weights"); return 0.0; } else return(1.0/(1.0+cv2)); } } /* * cv2: * * calculate the coefficient of variation, used here * to find the variance of a sample of unnormalized * importance sampling weights */ double calc_cv2(double *w, unsigned int n) { double mw; wmean_of_rows(&mw, &w, 1, n, NULL); double sum = 0; if(n == 1) return 0.0; for(unsigned int i=0; i #define BUFFMAX 256 //#define PRINTNUG #define REJECTMAX 1000 typedef enum CORR_MODEL {EXP=701, EXPSEP=702, MATERN=703, MREXPSEP=704, SIM=705} CORR_MODEL; class Model; /* not including model.h */ class Corr_Prior; class Base_Prior; /* * CLASS for the generic implementation of a correlation * function with nugget */ class Corr { private: protected: Base_Prior *base_prior;/* Base prior module */ Corr_Prior *prior; /* generic prior parameterization for nugget */ unsigned int dim; /* # of columns in the matrix X */ unsigned int col; /* # of columns in the design matrix F */ unsigned int n; /* number of input data points-- rows in the design matrix */ /* actual current covariance matrices */ double **K; /* n x n, covariance matrix */ double **Ki; /* n x n, utility inverse covariance matrix */ double **Kchol; /* n x n, covatiance matrix cholesy decomp */ double log_det_K; /* log determinant of the K matrix */ bool linear; /* is this the linear model? (d ?= 0) */ /* new utility matrices */ double **Vb_new; /* Utility: variance of Gibbs beta step */ double *bmu_new; /* Utility: mean of gibbs beta step */ double lambda_new; /* Utility: parameter in marginalized beta */ double **K_new; /* n x n, new (proposed) covariance matrix */ double **Ki_new; /* n x n, new (proposed) utility inverse covariance matrix */ double **Kchol_new; /* n x n, new (proposed) covatiance matrix cholesy decomp */ double log_det_K_new; /* log determinant of the K matrix */ double nug; /* the nugget parameter */ public: Corr(unsigned int dim, Base_Prior* base_prior); virtual ~Corr(void); virtual Corr& operator=(const Corr &c)=0; virtual int Draw(unsigned int n, double **F, double **X, double *Z,double *lambda, double **bmu, double **Vb, double tau2, double temp, void *state)=0; virtual void Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX)=0; virtual void Update(unsigned int n1, double **X)=0; virtual void Update(unsigned int n1, double **K, double **X)=0; virtual void Combine(Corr *c1, Corr *c2, void *state)=0; virtual void Split(Corr *c1, Corr *c2, void *state)=0; virtual char* State(unsigned int which)=0; virtual double log_Prior(void)=0; virtual unsigned int sum_b(void)=0; virtual void ToggleLinear(void)=0; virtual bool DrawNugs(unsigned int n, double **X, double **F, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double temp, void *state)=0; virtual double* Trace(unsigned int *len)=0; virtual char** TraceNames(unsigned int *len)=0; virtual void Init(double *dcorr)=0; virtual double* Jitter(unsigned int n1, double **X)=0; virtual double* CorrDiag(unsigned int n1, double **X)=0; unsigned int N(); double** get_Ki(void); double** get_K(void); double get_log_det_K(void); bool Linear(void); void Cov(Corr *cc); void printCorr(unsigned int n); // Move all this to the member classes double get_delta_nug(Corr* c1, Corr* c2, void *state); void propose_new_nug(Corr* c1, Corr* c2, void *state); void CombineNug(Corr *c1, Corr *c2, void *state); void SplitNug(Corr *c1, Corr *c2, void *state); void swap_new(double **Vb, double **bmu, double *lambda); void allocate_new(unsigned int n); void Invert(unsigned int n); void deallocate_new(void); double Nug(void); double log_NugPrior(void); void NugInit(double nug, bool linear); }; /* * generic CLASS for the prior to the correlation function * including a nugget parameter */ class Corr_Prior { private: /* starting nugget value */ double nug; /* mixture prior parameters */ double nug_alpha[2]; /* nug gamma-mixture prior alphas */ double nug_beta[2]; /* nug gamma-mixture prior beta */ bool fix_nug; /* estimate nug-mixture parameters or not */ double nug_alpha_lambda[2]; /* nug prior alpha lambda parameter */ double nug_beta_lambda[2]; /* nug prior beta lambda parameter */ protected: CORR_MODEL corr_model; /* indicator for type of correllation model */ Base_Prior *base_prior; /* prior for the base model */ unsigned int dim; double gamlin[3]; /* gamma for the linear pdf */ public: Corr_Prior(const unsigned int dim); Corr_Prior(Corr_Prior *c); virtual ~Corr_Prior(void); CORR_MODEL CorrModel(void); virtual void read_double(double *dprior)=0; virtual void read_ctrlfile(std::ifstream* ctrlfile)=0; virtual void Draw(Corr **corr, unsigned int howmany, void *state)=0; virtual Corr* newCorr(void)=0; virtual void Print(FILE *outfile)=0; virtual Corr_Prior* Dup(void)=0; virtual Base_Prior* BasePrior(void)=0; virtual void SetBasePrior(Base_Prior *base_prior)=0; virtual double log_HierPrior(void)=0; virtual double* Trace(unsigned int* len)=0; virtual char** TraceNames(unsigned int* len)=0; virtual void Init(double *dhier)=0; void read_double_nug(double *dprior); void read_ctrlfile_nug(std::ifstream* ctrlfile); double log_NugPrior(double nug); double log_NugHierPrior(void); double Nug(void); void DrawNugHier(Corr **corr, unsigned int howmany, void *state); void default_nug_priors(void); void default_nug_lambdas(void); void fix_nug_prior(void); double *NugAlpha(void); double *NugBeta(void); double NugDraw(void *state); double* GamLin(void); bool Linear(void); bool LLM(void); double ForceLinear(void); void ResetLinear(double gam); double* NugTrace(unsigned int* len); char** NugTraceNames(unsigned int* len); void NugInit(double *dhier); bool FixNug(void); void PrintNug(FILE *outfile); }; #endif tgp/src/randomkit.c0000644000175100001440000001617412655414756014035 0ustar hornikusers/* Random kit 1.3 */ /* * Copyright (c) 2003-2005, Jean-Sebastien Roy (js@jeannot.org) * * The rk_random and rk_seed functions algorithms and the original design of * the Mersenne Twister RNG: * * Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, * All rights reserved. * * Original algorithm for the implementation of rk_interval function from * Richard J. Wagner's implementation of the Mersenne Twister RNG, optimised by * Magnus Jonsson. * * Constants used in the rk_double implementation by Isaku Wada. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* static char const rcsid[] = "@(#) $Jeannot: randomkit.c,v 3.28 2005/07/21 22:14:09 js Exp $"; */ #include #include #include #include #include #include #include #ifdef _WIN32 /* Windows */ #include #ifndef RK_NO_WINCRYPT /* Windows crypto */ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #include #include #endif #else /* Unix */ #include #include #endif #include "randomkit.h" #ifndef RK_DEV_URANDOM #define RK_DEV_URANDOM "/dev/urandom" #endif #ifndef RK_DEV_RANDOM #define RK_DEV_RANDOM "/dev/random" #endif char *rk_strerror[RK_ERR_MAX] = { "no error", "random device unvavailable" }; /* static functions */ static unsigned long rk_hash(unsigned long key); void rk_seed(unsigned long seed, rk_state *state) { int pos; seed &= 0xffffffffUL; /* Knuth's PRNG as used in the Mersenne Twister reference implementation */ for (pos=0; poskey[pos] = seed; seed = (1812433253UL * (seed ^ (seed >> 30)) + pos + 1) & 0xffffffffUL; } state->pos = RK_STATE_LEN; state->has_gauss = 0; } /* Thomas Wang 32 bits integer hash function */ unsigned long rk_hash(unsigned long key) { key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); return key; } rk_error rk_randomseed(rk_state *state) { #ifndef _WIN32 struct timeval tv; #else struct _timeb tv; #endif if(rk_devfill(state->key, sizeof(state->key), 0) == RK_NOERR) { state->key[0] |= 0x80000000UL; /* ensures non-zero key */ state->pos = RK_STATE_LEN; state->has_gauss = 0; return RK_NOERR; } #ifndef _WIN32 gettimeofday(&tv, NULL); rk_seed(rk_hash(getpid()) ^ rk_hash(tv.tv_sec) ^ rk_hash(tv.tv_usec) ^ rk_hash(clock()), state); #else _ftime(&tv); rk_seed(rk_hash(tv.time) ^ rk_hash(tv.millitm) ^ rk_hash(clock()), state); #endif return RK_ENODEV; } /* Magic Mersenne Twister constants */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL #define UPPER_MASK 0x80000000UL #define LOWER_MASK 0x7fffffffUL /* Slightly optimised reference implementation of the Mersenne Twister */ unsigned long rk_random(rk_state *state) { unsigned long y; if (state->pos == RK_STATE_LEN) { int i; for (i=0;ikey[i] & UPPER_MASK) | (state->key[i+1] & LOWER_MASK); state->key[i] = state->key[i+M] ^ (y>>1) ^ (-(y & 1) & MATRIX_A); } for (;ikey[i] & UPPER_MASK) | (state->key[i+1] & LOWER_MASK); state->key[i] = state->key[i+(M-N)] ^ (y>>1) ^ (-(y & 1) & MATRIX_A); } y = (state->key[N-1] & UPPER_MASK) | (state->key[0] & LOWER_MASK); state->key[N-1] = state->key[M-1] ^ (y>>1) ^ (-(y & 1) & MATRIX_A); state->pos = 0; } y = state->key[state->pos++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } long rk_long(rk_state *state) { return rk_ulong(state) >> 1; } unsigned long rk_ulong(rk_state *state) { #if ULONG_MAX <= 0xffffffffUL return rk_random(state); #else return (rk_random(state) << 32) | (rk_random(state)); #endif } unsigned long rk_interval(unsigned long max, rk_state *state) { unsigned long mask = max, value; if (max == 0) return 0; /* Smallest bit mask >= max */ mask |= mask >> 1; mask |= mask >> 2; mask |= mask >> 4; mask |= mask >> 8; mask |= mask >> 16; #if ULONG_MAX > 0xffffffffUL mask |= mask >> 32; #endif /* Search a random value in [0..mask] <= max */ while ((value = (rk_ulong(state) & mask)) > max); return value; } double rk_double(rk_state *state) { /* shifts : 67108864 = 0x4000000, 9007199254740992 = 0x20000000000000 */ long a = rk_random(state) >> 5, b = rk_random(state) >> 6; return (a * 67108864.0 + b) / 9007199254740992.0; } void rk_fill(void *buffer, size_t size, rk_state *state) { unsigned long r; unsigned char *buf = buffer; for (; size >= 4; size -= 4) { r = rk_random(state); *(buf++) = r & 0xFF; *(buf++) = (r >> 8) & 0xFF; *(buf++) = (r >> 16) & 0xFF; *(buf++) = (r >> 24) & 0xFF; } if (!size) return; r = rk_random(state); for (; size; r >>= 8, size --) *(buf++) = (unsigned char)(r & 0xFF); } rk_error rk_devfill(void *buffer, size_t size, int strong) { #ifndef _WIN32 FILE *rfile; int done; if (strong) rfile = fopen(RK_DEV_RANDOM, "rb"); else rfile = fopen(RK_DEV_URANDOM, "rb"); if (rfile == NULL) return RK_ENODEV; done = fread(buffer, size, 1, rfile); fclose(rfile); if (done) return RK_NOERR; #else #ifndef RK_NO_WINCRYPT HCRYPTPROV hCryptProv; BOOL done; if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) || !hCryptProv) return RK_ENODEV; done = CryptGenRandom(hCryptProv, size, (unsigned char *)buffer); CryptReleaseContext(hCryptProv, 0); if (done) return RK_NOERR; #endif #endif return RK_ENODEV; } rk_error rk_altfill(void *buffer, size_t size, int strong, rk_state *state) { rk_error err; err = rk_devfill(buffer, size, strong); if (err) rk_fill(buffer, size, state); return err; } double rk_gauss(rk_state *state) { if (state->has_gauss) { state->has_gauss = 0; return state->gauss; } else { double f, x1, x2, r2; do { x1 = 2.0*rk_double(state) - 1.0; x2 = 2.0*rk_double(state) - 1.0; r2 = x1*x1 + x2*x2; } while (r2 >= 1.0 || r2 == 0.0); f = sqrt(-2.0*log(r2)/r2); /* Box-Muller transform */ state->has_gauss = 1; state->gauss = f*x1; /* Keep for next call */ return f*x2; } } tgp/src/mr_exp_sep.h0000644000175100001440000001460512655414756014210 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C ) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __MR_EXP_SEP_H__ #define __MR_EXP_SEP_H__ #include "corr.h" class MrExpSep_Prior; /* * CLASS for the implementation of the separable exponential * power family of correlation functions */ class MrExpSep : public Corr { private: double *d; /* kernel correlation width parameter */ int *b; /* dimension-wize linearization */ double *d_eff; /* dimension-wize linearization */ double *pb; /* prob of dimension-wize linearization */ unsigned int dreject; /* d rejection counter */ double delta; /* fine variance discount factor */ double nugaux; /* observation nugget for fine level proc */ public: MrExpSep(unsigned int dim, Base_Prior *base_prior); virtual Corr& operator=(const Corr &c); virtual ~MrExpSep(void); virtual void Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX); virtual void Update(unsigned int n1, double **X); virtual void Update(unsigned int n1, double **K, double **X); virtual int Draw(unsigned int n, double **F, double **X, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); virtual void Combine(Corr *c1, Corr *c2, void *state); virtual void Split(Corr *c1, Corr *c2, void *state); virtual char* State(unsigned int which); virtual unsigned int sum_b(void); virtual void ToggleLinear(void); virtual bool DrawNugs(unsigned int n, double **X, double **F, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); virtual double* Trace(unsigned int* len); virtual char** TraceNames(unsigned int* len); virtual void Init(double *dmrexpsep); virtual double* Jitter(unsigned int n1, double **X); virtual double* CorrDiag(unsigned int n1, double **X); void get_delta_d(MrExpSep* c1, MrExpSep* c2, void *state); void propose_new_d(MrExpSep* c1, MrExpSep* c2, void *state); bool propose_new_d(double* d_new, int * b_new, double *pb_new, double *q_fwd, double *q_bak, void *state); virtual double log_Prior(void); void draw_d_from_prior(double *d_new, void *state); int d_draw(double *d, unsigned int n, unsigned int col, double **F, double **X, double *Z, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double nug, double nugaux, double qRatio, double pRatio_log, double a0, double g0, int lin, double itemp, void *state); double *D(void); double Delta(void); void SetDelta(double deltanew); void SetNugaux(double nugauxnew); double CombineNugaux(MrExpSep *c1, MrExpSep *c2, void *state); double CombineDelta(MrExpSep *c1, MrExpSep *c2, void *state); void SplitNugaux(MrExpSep *c1, MrExpSep *c2, void *state); void SplitDelta(MrExpSep *c1, MrExpSep *c2, void *state); void corr_symm(double **K, unsigned int m, double **X, unsigned int n, double *d, double nug, double nugaux, double delta, double pwr); void corr_unsymm(double **K, unsigned int m, double **X1, unsigned int n1, double **X2, unsigned int n2, double *d, double delta, double pwr); bool DrawDelta(unsigned int n, double **X, double **F, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); double Nugaux(void); }; /* * CLASS for the prior parameterization of the separable * exponential power family of correlation functions */ class MrExpSep_Prior : public Corr_Prior { private: double *d; double **d_alpha; /* d gamma-mixture prior alphas */ double **d_beta; /* d gamma-mixture prior beta */ bool fix_d; /* estimate d-mixture parameters or not */ double d_alpha_lambda[2]; /* d prior alpha lambda parameter */ double d_beta_lambda[2]; /* d prior beta lambda parameter */ double delta; /* fine variance discount factor */ double *delta_alpha; double *delta_beta; double nugaux; double *nugaux_alpha; double *nugaux_beta; public: MrExpSep_Prior(unsigned int dim); MrExpSep_Prior(Corr_Prior *c); virtual ~MrExpSep_Prior(void); virtual void read_double(double *dprior); virtual void read_ctrlfile(std::ifstream* ctrlfile); virtual Corr_Prior* Dup(void); virtual void Draw(Corr **corr, unsigned int howmany, void *state); virtual Corr* newCorr(void); virtual void Print(FILE *outfile); virtual Base_Prior* BasePrior(void); virtual void SetBasePrior(Base_Prior *base_prior); virtual double log_HierPrior(void); virtual double* Trace(unsigned int* len); virtual char** TraceNames(unsigned int* len); virtual void Init(double *hier); void draw_d_from_prior(double *d_new, void *state); double* D(void); double Delta(void); double DeltaDraw(void *state); double NugauxDraw(void *state); double** DAlpha(void); double** DBeta(void); double* Delta_alpha(void); double* Delta_beta(void); void default_d_priors(void); void default_d_lambdas(void); double log_Prior(double *d, int *b, double *pb, bool linear); double log_DPrior_pdf(double *d); void DPrior_rand(double *d_new, void *state); double Nugaux(void); double* Nugaux_alpha(void); double* Nugaux_beta(void); }; #endif tgp/src/base.cc0000644000175100001440000000701612655414756013115 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include "base.h" #include "model.h" #include #include #include //class GP_Prior; class Base_Prior; /* * Base: * * constructor for the base (e.g., GP) model; * most things are set to null values */ Base::Base(unsigned int d, Base_Prior *prior, Model *model) { /* data size */ this->n = 0; this->d = d; nn = 0; col = prior->Col(); /* null everything */ X = XX = NULL; Z = NULL; mean = 0; /* model references */ this->prior = prior; pcopy = false; OUTFILE = model->Outfile(&verb); /* annleaing temper comes from model */ itemp = model->iTemp(); } /* * Base: * * duplication constructor; params any "new" variables are also * set to NULL values; the economy argument is not used here */ Base::Base(double **X, double *Z, Base *old, bool economy) { /* simple non-pointer copies */ d = old->d; col = old->col; n = old->n; /* pointers to data */ this->X = X; this->Z = Z; mean = old->mean; /* prior parameters; forces a copy to be made */ prior = old->prior->Dup(); pcopy = true; /* copy the importance annealing temperature */ itemp = old->itemp; /* things that must be NULL */ XX = NULL; nn = 0; OUTFILE = old->OUTFILE; } /* * ~Base: * * destructor function for the base (e.g., GP) model */ Base::~Base(void) { if(pcopy) delete prior; } /* * N: * * sanity check, and return n, the size of the data * under this GP */ unsigned int Base::N(void) { if(n == 0) { assert(X == NULL); return 0; } else { assert(X != NULL); return n; } } /* * BaseModel: * * return s the "prior" base model */ BASE_MODEL Base::BaseModel(void) { return prior->BaseModel(); } /* * BasePrior: * * return the prior used by this base * */ Base_Prior* Base::Prior(void) { return prior; } /* * Base_Prior: * * the usual constructor function */ Base_Prior::Base_Prior(unsigned int d) { this->d = d; } /* * Base_Prior: * * duplication constructor function */ Base_Prior::Base_Prior(Base_Prior *p) { assert(p); base_model = p->base_model; /* generic and tree parameters */ d = p->d; col = p->col; } /* * BaseModel: * * return the base model indicator */ BASE_MODEL Base_Prior::BaseModel(void) { return base_model; } /* * Col * */ unsigned int Base_Prior::Col(void) { return col; } /* * ~Base_Prior: * * the usual destructor, nothing to do */ Base_Prior::~Base_Prior(void) { } tgp/src/exp.cc0000644000175100001440000004733512655414756013007 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "matrix.h" #include "lh.h" #include "rand_draws.h" #include "rand_pdf.h" #include "all_draws.h" #include "gen_covar.h" #include "rhelp.h" } #include "corr.h" #include "params.h" #include "model.h" #include "exp.h" #include #include #include #include #include #include using namespace std; #define BUFFMAX 256 #define PWR 2.0 /* * Exp: * * constructor function */ Exp::Exp(unsigned int dim, Base_Prior *base_prior) : Corr(dim, base_prior) { assert(base_prior->BaseModel() == GP); prior = ((Gp_Prior*) base_prior)->CorrPrior(); assert(prior); nug = prior->Nug(); /* check if we should really be starting in the LLM */ if(!prior->Linear() && !prior->LLM()) linear = false; assert( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == EXP); d = ((Exp_Prior*) prior)->D(); xDISTx = NULL; nd = 0; dreject = 0; } /* * Exp (assignment operator): * * used to assign the parameters of one correlation * function to anothers. Both correlation functions * must already have been allocated. */ Corr& Exp::operator=(const Corr &c) { Exp *e = (Exp*) &c; log_det_K = e->log_det_K; linear = e->linear; d = e->d; nug = e->nug; dreject = e->dreject; assert(prior->CorrModel() == EXP); assert(prior == ((Gp_Prior*) base_prior)->CorrPrior()); /* copy the covariance matrices -- no longer performed due to the economy argument in Gp/Base */ // Cov(e); return *this; } /* * ~Exp: * * destructor */ Exp::~Exp(void) { if(xDISTx) delete_matrix(xDISTx); xDISTx = NULL; } /* * Init: * * initialise this corr function with the parameters provided * from R via the vector of doubles */ void Exp::Init(double *dexp) { d = dexp[1]; NugInit(dexp[0], ! (bool) dexp[2]); } /* * Jitter: * * fill jitter[ ] with the variance inflation factor. That is, * the variance for an observation with covariates in the i'th * row of X will be s2*(1.0 + jitter[i]). In standard tgp, the * jitter is simply the nugget. But for calibration and mr tgp, * the jitter value depends upon X (eg real or simulated data). * */ double* Exp::Jitter(unsigned int n1, double **X) { double *jitter = new_vector(n1); for(unsigned int i=0; in); /* randomly reject 1/2 the time, to avoid having to do lots of matrix inversions -- as the nug mixes better than d already */ if(runi(state) > 0.5) return false; /* make the draw */ double nug_new = nug_draw_margin(n, col, nug, F, Z, K, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, prior->NugAlpha(), prior->NugBeta(), gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) linear, itemp, state); /* did we accept the draw? */ if(nug_new != nug) { nug = nug_new; success = true; swap_new(Vb, bmu, lambda); } return success; } /* * Update: (symmetric) * * compute correlation matrix K */ void Exp::Update(unsigned int n, double **X) { if(linear) return; assert(this->n == n); if(!xDISTx || nd != n) { if(xDISTx) delete_matrix(xDISTx); xDISTx = new_matrix(n, n); nd = n; } dist_symm(xDISTx, dim, X, n, PWR); dist_to_K_symm(K, xDISTx, d, nug, n); //delete_matrix(xDISTx); } /* * Update: (symmetric) * * takes in a (symmetric) distance matrix and * returns a correlation matrix */ void Exp::Update(unsigned int n, double **K, double **X) { double ** xDISTx = new_matrix(n, n); dist_symm(xDISTx, dim, X, n, PWR); dist_to_K_symm(K, xDISTx, d, nug, n); delete_matrix(xDISTx); } /* * Update: (non-symmetric) * * takes in a distance matrix and * returns a correlation matrix */ void Exp::Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX) { double **xxDISTx = new_matrix(n2, n1); dist(xxDISTx, dim, XX, n1, X, n2, PWR); dist_to_K(K, xxDISTx, d, 0.0, n1, n2); delete_matrix(xxDISTx); } /* * Draw: * * draw parameters for a new correlation matrix; * returns true if the correlation matrix (passed in) * has changed; otherwise returns false */ int Exp::Draw(unsigned int n, double **F, double **X, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state) { int success = 0; bool lin_new; double q_fwd , q_bak, d_new; /* sometimes skip this Draw for linear models for speed, and only draw the nugget */ if(linear && runi(state) > 0.5) return DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); /* proppose linear or not */ if(prior->Linear()) lin_new = true; else { q_fwd = q_bak = 1.0; d_proposal(1, NULL, &d_new, &d, &q_fwd, &q_bak, state); if(prior->LLM()) lin_new = linear_rand(&d_new, 1, prior->GamLin(), state); else lin_new = false; } /* if not linear then compute new distances */ /* allocate K_new, Ki_new, Kchol_new */ if(! lin_new) { if(!xDISTx || nd != n) { if(xDISTx) delete_matrix(xDISTx); xDISTx = new_matrix(n, n); nd = n; } dist_symm(xDISTx, dim, X, n, PWR); allocate_new(n); assert(n == this->n); } /* d; rebuilding K, Ki, and marginal params, if necessary */ if(prior->Linear()) { d_new = d; success = 1; } else { Exp_Prior* ep = (Exp_Prior*) prior; Gp_Prior *gp_prior = (Gp_Prior*) base_prior; success = d_draw_margin(n, col, d_new, d, F, Z, xDISTx, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, nug, q_bak/q_fwd, ep->DAlpha(), ep->DBeta(), gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) lin_new, itemp, state); } /* did we accept the new draw? */ if(success == 1) { d = d_new; linear = (bool) lin_new; swap_new(Vb, bmu, lambda); dreject = 0; } else if(success == -1) return success; else if(success == 0) dreject++; /* abort if we have had too many rejections */ if(dreject >= REJECTMAX) return -2; /* draw nugget */ bool changed = DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); success = success || changed; return success; } /* * Combine: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ void Exp::Combine(Corr *c1, Corr *c2, void *state) { get_delta_d((Exp*)c1, (Exp*)c2, state); CombineNug(c1, c2, state); } /* * Split: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void Exp::Split(Corr *c1, Corr *c2, void *state) { propose_new_d((Exp*) c1, (Exp*) c2, state); SplitNug(c1, c2, state); } /* * get_delta_d: * * compute d from two ds (used in prune) */ void Exp::get_delta_d(Exp* c1, Exp* c2, void *state) { double dch[2]; int ii[2]; dch[0] = c1->d; dch[1] = c2->d; propose_indices(ii, 0.5, state); d = dch[ii[0]]; linear = linear_rand(&d, 1, prior->GamLin(), state); } /* * propose_new_d: * * propose new D parameters for possible * new children partitions. */ void Exp::propose_new_d(Exp* c1, Exp* c2, void *state) { int i[2]; double dnew[2]; Exp_Prior *ep = (Exp_Prior*) prior; propose_indices(i, 0.5, state); dnew[i[0]] = d; if(prior->Linear()) dnew[i[1]] = d; else dnew[i[1]] = d_prior_rand(ep->DAlpha(), ep->DBeta(), state); c1->d = dnew[0]; c2->d = dnew[1]; c1->linear = (bool) linear_rand(&(dnew[0]), 1, prior->GamLin(), state); c2->linear = (bool) linear_rand(&(dnew[1]), 1, prior->GamLin(), state); } /* * State: * * return a string depecting the state * of the (parameters of) correlation function */ char* Exp::State(unsigned int which) { char buffer[BUFFMAX]; #ifdef PRINTNUG string s = "(d="; #else string s = ""; if(which == 0) s.append("d="); #endif if(linear) sprintf(buffer, "0(%g)", d); else sprintf(buffer, "%g", d); s.append(buffer); #ifdef PRINTNUG sprintf(buffer, ", g=%g)", nug); s.append(buffer); #endif char* ret_str = (char*) malloc(sizeof(char) * (s.length()+1)); strncpy(ret_str, s.c_str(), s.length()); ret_str[s.length()] = '\0'; return ret_str; } /* * sum_b: * * return 1 if linear, 0 otherwise */ unsigned int Exp::sum_b(void) { if(linear) return 1; else return 0; } /* * ToggleLinear: * * make linear if not linear, otherwise * make not linear */ void Exp::ToggleLinear(void) { if(linear) { linear = false; } else { linear = true; } } /* * D: * * return the range parameter */ double Exp::D(void) { return d; } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug) */ double Exp::log_Prior(void) { double prob = ((Corr*)this)->log_NugPrior(); prob += ((Exp_Prior*) prior)->log_Prior(d, linear); return prob; } /* * TraceNames: * * return the names of the parameters recorded in Exp::Trace() */ char** Exp::TraceNames(unsigned int* len) { *len = 4; char **trace = (char**) malloc(sizeof(char*) * (*len)); trace[0] = strdup("nug"); trace[1] = strdup("d"); trace[2] = strdup("b"); /* determinant of K */ trace[3] = strdup("ldetK"); return trace; } /* * Trace: * * return the current values of the parameters * to this correlation function: nug, d, then linear */ double* Exp::Trace(unsigned int* len) { *len = 4; double *trace = new_vector(*len); trace[0] = nug; trace[1] = d; trace[2] = (double) !linear; /* determinant of K */ trace[3] = log_det_K; return trace; } /* * newCorr: * * construct and return a new isotropic exponential correlation * function with this module governing its prior parameterization */ Corr* Exp_Prior::newCorr(void) { return new Exp(dim, base_prior); } /* * Exp_Prior: * * constructor for the prior distribution for * the exponential correlation function */ Exp_Prior::Exp_Prior(unsigned int dim) : Corr_Prior(dim) { corr_model = EXP; /* defaults */ d = 0.5; default_d_priors(); default_d_lambdas(); } /* * Init: * * read hiererchial prior parameters from a double-vector * */ void Exp_Prior::Init(double *dhier) { d_alpha[0] = dhier[0]; d_beta[0] = dhier[1]; d_alpha[1] = dhier[2]; d_beta[1] = dhier[3]; NugInit(&(dhier[4])); } /* * Dup: * * duplicate this prior for the isotropic exponential * power family */ Corr_Prior* Exp_Prior::Dup(void) { return new Exp_Prior(this); } /* * Exp_Prior (new duplicate) * * duplicating constructor for the prior distribution for * the exponential correlation function */ Exp_Prior::Exp_Prior(Corr_Prior *c) : Corr_Prior(c) { Exp_Prior *e = (Exp_Prior*) c; assert(e->corr_model == EXP); corr_model = e->corr_model; dupv(gamlin, e->gamlin, 3); d = e->d; fix_d = e->fix_d; dupv(d_alpha, e->d_alpha, 2); dupv(d_beta, e->d_beta, 2); dupv(d_alpha_lambda, e->d_alpha_lambda, 2); dupv(d_beta_lambda, e->d_beta_lambda, 2); } /* * ~Exp_Prior: * * destructor the the prior distribution for * the exponential correlation function */ Exp_Prior::~Exp_Prior(void) { } /* * read_double: * * read prior parameterization from a vector of doubles * passed in from R */ void Exp_Prior::read_double(double *dparams) { /* read the parameters that have to do with the * nugget first */ read_double_nug(dparams); /* starting value for the range parameter */ d = dparams[1]; //MYprintf(MYstdout, "starting d=%g\n", d); /* reset dparams to start after the nugget gamlin params */ dparams += 13; /* initial parameter settings for alpha and beta */ get_mix_prior_params_double(d_alpha, d_beta, &(dparams[0]), "d"); dparams += 4; /* reset */ /* d hierarchical lambda prior parameters */ if((int) dparams[0] == -1) { fix_d = true; /*MYprintf(MYstdout, "fixing d prior\n");*/ } else { fix_d = false; get_mix_prior_params_double(d_alpha_lambda, d_beta_lambda, &(dparams[0]), "d lambda"); } dparams += 4; /* reset */ } /* * read_ctrlfile: * * read prior parameterization from a control file */ void Exp_Prior::read_ctrlfile(ifstream *ctrlfile) { char line[BUFFMAX], line_copy[BUFFMAX]; /* read the parameters that have to do with the * nugget first */ read_ctrlfile_nug(ctrlfile); /* read the d parameter from the control file */ ctrlfile->getline(line, BUFFMAX); d = atof(strtok(line, " \t\n#")); MYprintf(MYstdout, "starting d=%g\n", d); /* read d and nug-hierarchical parameters (mix of gammas) */ ctrlfile->getline(line, BUFFMAX); get_mix_prior_params(d_alpha, d_beta, line, "d"); /* d hierarchical lambda prior parameters */ ctrlfile->getline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_d = true; MYprintf(MYstdout, "fixing d prior\n"); } else { fix_d = false; get_mix_prior_params(d_alpha_lambda, d_beta_lambda, line, "d lambda"); } } /* * default_d_priors: * * set d prior parameters * to default values */ void Exp_Prior::default_d_priors(void) { d_alpha[0] = 1.0; d_beta[0] = 20.0; d_alpha[1] = 10.0; d_beta[1] = 10.0; } /* * default_d_lambdas: * * set d (lambda) hierarchical prior parameters * to default values */ void Exp_Prior::default_d_lambdas(void) { d_alpha_lambda[0] = 1.0; d_beta_lambda[0] = 10.0; d_alpha_lambda[1] = 1.0; d_beta_lambda[1] = 10.0; fix_d = false; //fix_d = true; } /* * D: * * return the default range parameter setting * for the exponential correllation function */ double Exp_Prior::D(void) { return d; } /* * DAlpha: * * return the alpha prior parameter setting to the gamma * distribution prior for the range parameter */ double* Exp_Prior::DAlpha(void) { return d_alpha; } /* * DBeta: * * return the beta prior parameter setting to the gamma * distribution prior for the range parameter */ double* Exp_Prior::DBeta(void) { return d_beta; } /* * Draw: * * draws for the hierarchical priors for the Exp * correlation function which are * contained in the params module */ void Exp_Prior::Draw(Corr **corr, unsigned int howmany, void *state) { if(!fix_d) { double *d = new_vector(howmany); for(unsigned int i=0; iD(); mixture_priors_draw(d_alpha, d_beta, d, howmany, d_alpha_lambda, d_beta_lambda, state); free(d); } /* hierarchical prior draws for the nugget */ DrawNugHier(corr, howmany, state); } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug) : does * not include priors of hierarchical params. See * log_HierPrior, below */ double Exp_Prior::log_Prior(double d, bool linear) { double prob = 0; /* force linear model */ if(gamlin[0] < 0) return prob; /* force gp model */ prob += log_d_prior_pdf(d, d_alpha, d_beta); if(gamlin[0] <= 0) return prob; /* using 1.0, because of 1.0 - lin_pdf, and will adjust later */ double lin_pdf = linear_pdf(&d, 1, gamlin); if(linear) prob += log(lin_pdf); else prob += log(1.0-lin_pdf); /* return the log pdf */ return prob; } /* * BasePrior: * * return the prior for the Base (eg Gp) model */ Base_Prior* Exp_Prior::BasePrior(void) { return base_prior; } /* * SetBasePrior: * * set the base_prior field */ void Exp_Prior::SetBasePrior(Base_Prior *base_prior) { this->base_prior = base_prior; } /* * Print: * * pretty print the correllation function parameters out * to a file */ void Exp_Prior::Print(FILE *outfile) { MYprintf(MYstdout, "corr prior: isotropic power\n"); /* print nugget stuff first */ PrintNug(outfile); /* range parameter */ // MYprintf(outfile, "starting d=%g\n", d); /* range gamma prior */ MYprintf(outfile, "d[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha[0], d_beta[0], d_alpha[1], d_beta[1]); /* range gamma hyperprior */ if(fix_d) MYprintf(outfile, "d prior fixed\n"); else { MYprintf(MYstdout, "d lambda[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha_lambda[0], d_beta_lambda[0], d_alpha_lambda[1], d_beta_lambda[1]); } } /* * log_HierPrior: * * return the log prior of the hierarchial parameters * to the correllation parameters (i.e., range and nugget) */ double Exp_Prior::log_HierPrior(void) { double lpdf; lpdf = 0.0; /* mixture prior for the range parameter, d */ if(!fix_d) { lpdf += mixture_hier_prior_log(d_alpha, d_beta, d_alpha_lambda, d_beta_lambda); } /* mixture prior for the nugget */ lpdf += log_NugHierPrior(); return lpdf; } /* * Trace: * * return the current values of the hierarchical * parameters to this correlation function: * nug(alpha,beta), d(alpha,beta), then linear */ double* Exp_Prior::Trace(unsigned int* len) { /* first get the hierarchical nug parameters */ unsigned int clen; double *c = NugTrace(&clen); /* calculate and allocate the new trace, which will include the nug trace */ *len = 4; double* trace = new_vector(clen + *len); trace[0] = d_alpha[0]; trace[1] = d_beta[0]; trace[2] = d_alpha[1]; trace[3] = d_beta[1]; /* then copy in the nug trace */ dupv(&(trace[*len]), c, clen); /* new combined length, and free c */ *len += clen; if(c) free(c); else assert(clen == 0); return trace; } /* * TraceNames: * * return the names of the traces recorded in Exp_Prior::Trace() */ char** Exp_Prior::TraceNames(unsigned int* len) { /* first get the hierarchical nug parameters */ unsigned int clen; char **c = NugTraceNames(&clen); /* calculate and allocate the new trace, which will include the nug trace */ *len = 4; char** trace = (char**) malloc(sizeof(char*) * (clen + *len)); trace[0] = strdup("d.a0"); trace[1] = strdup("d.g0"); trace[2] = strdup("d.a1"); trace[3] = strdup("d.g1"); /* then copy in the nug trace */ for(unsigned int i=0; i #include #include #include #include "rand_pdf.h" #include "matrix.h" #include "linalg.h" #include "rhelp.h" /* #define DEBUG */ /* * copyCovUpper: * * copy the upper trianglar part of (n x n) Sigma into cov * so that cov can be an argument to LAPACK (like Choleski * decomposition) routines which modify their argument */ void copyCovUpper(cov, Sigma, n, scale) unsigned int n; /*double cov[][n], Sigma[][n];*/ double **cov, **Sigma; double scale; { int i,j; for(i=0; i=0 && b>0); /* evaluate the pdf for each x */ for(i=0; i 0); if(a == 0) p[i] = 0; else p[i] = a*log(b) - lgammafn(a) + (a-1)*log(x[i]) - b*x[i]; } } /* * invgampdf_log_gelman: * * GELMAN PARAMATERIZATION * logarithm of the density of n x values distributed * as Gamma(a,b). * p must be pre-alloc'd n-array */ void invgampdf_log_gelman(p, x, a, b, n) unsigned int n; double *p, *x, a, b; { int i; /* sanity checks */ assert(a>0 && b>0); /* evaluate the pdf for each x */ for(i=0; i= 0); p[i] = a*log(b) - lgammafn(a) - (a+1)*log(x[i]) - b/x[i]; } } /* * gampdf_log: * * logarithm of the density of n x values distributed * as Gamma(a,b). * p must be pre-alloc'd n-array; not using Gelman parameterization */ void gampdf_log(p, x, a, b, n) unsigned int n; double *p, *x, a, b; { int i; /* sanity checks */ assert(a>0 && b>0); /* evaluate the pdf for each x */ for(i=0; i 0); p[i] = 0.0 - a*log(b) - lgammafn(a) + (a-1)*log(x[i]) - x[i]/b; } } /* * betapdf_log: * * logarithm of the density of n x values distributed * as Beta(a,b). * p must be pre-alloc'd n-array */ void betapdf_log(p, x, a, b, n) unsigned int n; double *p, *x, a, b; { int i; for(i=0; i 0); assert(nu > n); /* denominator */ /* gammapart <- 1 */ lgampart = 0.0; /* for(i in 1:k) gammapart <- gammapart * gamma((v + 1 - i)/2) */ for(i=1; i<=n; i++) lgampart += lgammafn((nu+1.0-(double)i)/2.0 ); /* denom <- gammapart * 2^(v * k / 2) * pi^(k*(k-1)/4) */ denom = lgampart + (nu*n/2.0)*M_LN2 + (n*(n-1.0)/2.0)*M_LN_SQRT_PI; /* numerator */ /* detW <- det(W) */ ldetW = log_determinant_dup(x, n); /* hold <- solve(S) %*% W */ hold = new_dup_matrix(x, n, n); Sdup = new_dup_matrix(S, n, n); linalg_dposv(n, Sdup, hold); /* detS <- det(S) */ /* dposv should have left us with chol(S) inside Sdup */ ldetS = log_determinant_chol(Sdup, n); /* tracehold <- sum(hold[row(hold) == col(hold)]) */ tracehold = 0.0; for(i=0; i 0); assert(*nu_in > *n_in); /* copy W_in vector to W matrix */ /* Bobby: this is wasteful; should write a function which allocates * the "skeleton" of a new matrix, and points W[0] to a vector */ W = new_matrix(*n_in, *n_in); dupv(W[0], W_in, *n_in * *n_in); /* copy S_in vector to S matrix */ S = new_matrix(*n_in, *n_in); dupv(S[0], S_in, *n_in * *n_in); /* evaluate the lpdf */ *lpdf_out = wishpdf_log(W, S, *n_in, *nu_in); /* clean up */ delete_matrix(W); delete_matrix(S); } /* * temper: * * apply temperature temp to pdf density p; i.e., * take p^temp when uselog = 0, and temp*k, when * uselog = 1, assuming that p is in log space */ double temper(double p, double temp, int uselog) { double tp; /* remove this later */ /* if(temp != 1.0) warning("temper(): temp = %g is not 1.0", temp); */ if(uselog) tp = temp * p; else { if(temp == 1.0) tp = p; else if(temp == 0.0) tp = 1.0; else tp = pow(p, temp); } return tp; } /* * temper_invgam: * * apply temperature t to the alpha (a) and beta (b) parameters * to the inverse gamma distribution */ void temper_invgam(double *a, double *b, double temp) { /* remove this later */ /* if(temp != 1.0) warning("temper_invgam(): temp = %g is not 1.0", temp); */ *a = temp*(*a+1.0) - 1.0; *b = temp * (*b); /* sanity check */ assert(*a > 0 && *b > 0); } /* * temper_gamma: * * apply temperature t to the alpha (a) and beta (b) parameters * to the inverse gamma distribution */ void temper_gamma(double *a, double *b, double temp) { /* remove this later */ /* if(temp != 1.0) warning("temper_gamma(): temp = %g is not 1.0", temp); */ *a = temp*(*a-1.0) + 1.0; *b = temp * (*b); /* sanity check */ assert(*a > 0 && *b > 0); } /* * temper_wish: * * apply temperature t to the rho and V (col x col) * parameters to a wishart distribution */ void temper_wish(int *rho, double **V, unsigned int col, double temp) { double drho; /* remove this later */ /* if(temp != 1.0) warning("temper_wish(): temp = %g is not 1.0", temp); */ /* adjust rho for temperature */ drho = temp * (*rho) + (col + 1.0)*(1.0 - temp); drho = ceil(drho); assert(drho > col); *rho = (int) drho; /* adjust V for temperature */ assert(V); scalev(V[0], col, 1.0/temp); } tgp/src/mstructs.h0000644000175100001440000001027412655414756013731 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __MSTRUCTS_H__ #define __MSTRUCTS_H__ #include "tree.h" #define NORMSCALE 1.0 /* * useful structure for passing the storage of * predictive data locations around */ typedef struct preds { double **XX; /* predictive locations (nn * col) */ unsigned int nn; /* number of predictive locations */ unsigned int n; /* number of data locations */ unsigned int d; /* number of covariates */ unsigned int R; /* number of rounds in preds */ unsigned int mult; /* number of rounds per prediction */ double *w; /* tempered importance sampling weights */ double *itemp; /* importance sampling inv-temperature */ double **ZZ; /* predictions at candidates XX */ double **ZZm; /* Normal predictive mean at XX */ double **ZZvm; /* Variance of additive mean (ignoring jitter) at XX */ double **ZZs2; /* Normal predictive var at XX */ double **Zp; /* predictions at inputs X */ double **Zpm; /* Normal predictive mean at X */ double **Zpvm; /* Variance of additive mean (ignoring jitter) at X */ double **Zps2; /* Normal predictive var at X */ double **improv; /* expected global optimization */ double **Ds2x; /* delta-sigma calculation for XX */ double **rect; /* data rect */ double **bnds; /* uncertainty bounds */ double *mode; /* lhs beta modes */ double *shape; /* lhs beta shapes */ double **M; /* LHS sample locations for sensitivity analysis */ unsigned int nm; /* # of lhs locations stored at each iteration */ } Preds; /* * structure used to keep track of the highest * posterior trees for each depth */ typedef struct posteriors { unsigned int maxd; double* posts; Tree** trees; } Posteriors; /* * structure used to keep track of the area * of regions under the linear model * and of proportions of linear dimensions */ typedef struct linarea { unsigned int total; unsigned int size; double* ba; double* la; unsigned int *counts; } Linarea; /* structure for passing arguments to processes * that are spawned using pthreads */ typedef struct largs { Tree* leaf; Preds* preds; int index; bool dnorm; Model *model; bool tree_modify; } LArgs; /* * function prototypes */ Preds* new_preds(double **XX, unsigned int nn, unsigned int n, unsigned int d, double **rect, unsigned int R, bool pred_n, bool krige, bool it, bool delta_s2, bool improv, bool sens, unsigned int every); void delete_preds(Preds* preds); void import_preds(Preds* to, unsigned int where, Preds *from); Preds *combine_preds(Preds *to, Preds *from); Posteriors* new_posteriors(void); void delete_posteriors(Posteriors* posteriors); void register_posterior(Posteriors* posteriors, Tree* t, double post); void fill_larg(LArgs* larg, Tree *leaf, Preds* preds, int index, bool dnorm); Linarea* new_linarea(void); Linarea* realloc_linarea(Linarea* lin_area); void delete_linarea(Linarea* lin_area); void process_linarea(Linarea* lin_area, unsigned int numLeaves, Tree** leaves); void reset_linarea(Linarea* lin_area); void print_linarea(Linarea* lin_area, FILE *outfile); #endif tgp/src/tgp.cc0000644000175100001440000005671212655414756013004 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "matrix.h" #include "rand_draws.h" #include "rhelp.h" #include "predict.h" } #include "tgp.h" #include "model.h" #include "params.h" #include "mstructs.h" #include #include #include #include #include #include extern "C" { Tgp* tgpm = NULL; void *tgp_state = NULL; void tgp(int* state_in, /* inputs from R */ double *X_in, int *n_in, int *d_in, double *Z_in, double *XX_in, int *nn_in, double *Xsplit_in, int *nsplit_in, int *trace_in, int *BTE_in, int* R_in, int* linburn_in, int *zcov_in, int *g_in, double *params_in, double *ditemps_in, int *verb_in, double *dtree_in, double* hier_in, int *MAP_in, int *sens_ngrid, double *sens_span, double *sens_Xgrid_in, /* output dimensions for checking NULL */ int* predn_in, int* nnprime_in, int *krige_in, int* Ds2x_in, int *improv_in, /* outputs to R */ double *Zp_mean_out, double *ZZ_mean_out, double *Zp_km_out, double *ZZ_km_out, double *Zp_kvm_out, double *ZZ_kvm_out, double *Zp_q_out, double *ZZ_q_out, double *Zp_s2_out, double *ZZ_s2_out, double *ZpZZ_s2_out, double *Zp_ks2_out, double *ZZ_ks2_out, double *Zp_q1_out, double *Zp_median_out, double *Zp_q2_out, double *ZZ_q1_out, double *ZZ_median_out, double *ZZ_q2_out, double *Ds2x_out, double *improv_out, int *irank_out, double *ess_out, double *gpcs_rates_out, double *sens_ZZ_mean_out, double *sens_ZZ_q1_out, double *sens_ZZ_q2_out, double *sens_S_out, double *sens_T_out) { /* create the RNG state */ unsigned int lstate = three2lstate(state_in); tgp_state = newRNGstate(lstate); /* possibly create NULL pointers that couldn't be passed by .C -- not sure if all are needed */ if(dtree_in[0] < 0) dtree_in = NULL; if(hier_in[0] < 0) hier_in = NULL; if((*predn_in * *n_in) == 0) Zp_q1_out = Zp_q_out = Zp_q2_out = Zp_median_out = Zp_mean_out = NULL; if(*nnprime_in == 0) ZZ_q1_out = ZZ_q_out = ZZ_q2_out = ZZ_median_out = ZZ_mean_out = NULL; if((*krige_in * *predn_in * *n_in) == 0) Zp_km_out = Zp_kvm_out = Zp_ks2_out = NULL; if((*krige_in * *nnprime_in) == 0) ZZ_km_out = ZZ_kvm_out = ZZ_ks2_out = NULL; if((*Ds2x_in * *nnprime_in) == 0) Ds2x_out = NULL; if((*improv_in * *nnprime_in) == 0) { improv_out = NULL; irank_out = NULL; } /* copy the input parameters to the tgp class object where all the MCMC work gets done */ tgpm = new Tgp(tgp_state, *n_in, *d_in, *nn_in, BTE_in[0], BTE_in[1], BTE_in[2], *R_in, *linburn_in, (bool) (Zp_mean_out!=NULL), (bool) ((Zp_ks2_out!=NULL) || (ZZ_ks2_out!=NULL)), (bool) (Ds2x_out!=NULL), g_in[0], (bool) (*sens_ngrid > 0), X_in, Z_in, XX_in, Xsplit_in, *nsplit_in, params_in, ditemps_in, (bool) *trace_in, *verb_in, dtree_in, hier_in); /* post constructor initialization */ tgpm->Init(); /* tgp MCMC rounds are done here */ if(*MAP_in) tgpm->Predict(); else tgpm->Rounds(); /* gather the posterior predictive statistics from the MCMC rounds */ tgpm->GetStats(!((bool)*MAP_in), Zp_mean_out, ZZ_mean_out, Zp_km_out, ZZ_km_out, Zp_kvm_out, ZZ_kvm_out, Zp_q_out, ZZ_q_out, (bool) (*zcov_in), Zp_s2_out, ZZ_s2_out, ZpZZ_s2_out, Zp_ks2_out, ZZ_ks2_out, Zp_q1_out, Zp_median_out, Zp_q2_out, ZZ_q1_out, ZZ_median_out, ZZ_q2_out, Ds2x_out, improv_out, g_in[1], irank_out, ess_out); /* sensitivity analysis? */ if((bool) (*sens_ngrid > 0)) tgpm->Sens(sens_ngrid, sens_span, sens_Xgrid_in, sens_ZZ_mean_out, sens_ZZ_q1_out, sens_ZZ_q2_out, sens_S_out, sens_T_out); /* get (possibly unchanged) pseudo--prior used by Importance Tempering (only) */ tgpm->GetPseudoPrior(ditemps_in); /* get the (tree) acceptance rates */ tgpm->GetTreeStats(gpcs_rates_out); /* delete the tgp model */ delete tgpm; tgpm = NULL; /* destroy the RNG */ deleteRNGstate(tgp_state); tgp_state = NULL; } /* * Tgp: (constructor) * * copies the input passed to the tgp function from R via * .C("tgp", ..., PACKAGE="tgp"). Then, it calls the init * function in order to get everything ready for MCMC rounds. */ Tgp::Tgp(void *state, int n, int d, int nn, int B, int T, int E, int R, int linburn, bool pred_n, bool krige, bool delta_s2, int improv, bool sens, double *X, double *Z, double *XX, double *Xsplit, int nsplit, double *dparams, double *ditemps, bool trace, int verb, double *dtree, double *hier) { itime = time(NULL); /* a bunch of NULL entries to be filled in later */ this->state = NULL; this->X = this->XX = NULL; this->rect = NULL; this->Z = NULL; params = NULL; model = NULL; cump = preds = NULL; /* RNG state */ this->state = state; /* integral dimension parameters */ this->n = (unsigned int) n; this->d = (unsigned int) d; this->nn = (unsigned int) nn; /* MCMC round information */ this->B = B; this->T = T; this->E = E; this->R = R; this->linburn = linburn; /* types of predictive data to gather */ this->pred_n = pred_n; this->krige = krige; this->delta_s2 = delta_s2; this->improv = improv; /* is this a sensitivity analysis? */ this->sens = sens; /* importance tempring */ this->its = new Temper(ditemps); /* saving output and printing progress */ this->trace = trace; this->verb = verb; /* PROBABLY DON'T NEED TO ACTUALLY DUPLICATE THESE MATRICES -- COULD USE new_matrix_bones INSTEAD */ /* copy X from input */ assert(X); this->X = new_matrix(n, d); dupv(this->X[0], X, n*d); /* copy Z from input */ this->Z = new_dup_vector(Z, n); /* copy XX from input */ this->XX = new_matrix(nn, d); if(this->XX) dupv(this->XX[0], XX, nn*d); /* copy Xsplit from input -- this determines the bounding rectangle AND the tree split locations */ assert(nsplit > 0); this->Xsplit = new_matrix(nsplit, d); dupv(this->Xsplit[0], Xsplit, nsplit*d); this->nsplit = nsplit; /* to be filled in by Init() */ params = NULL; rect = NULL; model = NULL; cump = NULL; /* former parameters to Init() */ this->dparams = dparams; if(dtree) { treecol = (unsigned int) dtree[0]; tree = dtree+1; } else { treecol = 0; tree = NULL; } this->hier = hier; } /* * ~Tgp: (destructor) * * typical destructor function. Checks to see if the class objects * are NULL first because this might be called from within * tgp_cleanup if tgp was interrupted during computation */ Tgp::~Tgp(void) { /* clean up */ if(model) { delete model; model = NULL; } if(params) { delete params; params = NULL; } if(XX) { delete_matrix(XX); XX = NULL; } if(Xsplit) { delete_matrix(Xsplit); Xsplit = NULL; } if(Z) { free(Z); Z = NULL; } if(rect) { delete_matrix(rect); rect = NULL; } if(X) { delete_matrix(X); X = NULL; } if(cump) { delete_preds(cump); } if(preds) { delete_preds(preds); } if(its) { delete its; } } /* * Init: * * get everything ready for MCMC rounds -- should only be called just * after the Tgp constructor function, in order to separate the copying * of the input parameters from the initialization of the model * and predictive data, but in case there are any errors in Initialization * the tgp_cleanup function still has a properly built Tgp module to * destroy. */ void Tgp::Init(void) { /* use default parameters */ params = new Params(d); if((int) dparams[0] != -1) params->read_double(dparams); else MYprintf(MYstdout, "Using default params.\n"); /* get the rectangle */ /* rect = getXdataRect(X, n, d, XX, nn); */ /* now Xsplit governs the rectangle */ rect = get_data_rect(Xsplit, nsplit, d); /* construct the new model */ model = new Model(params, d, rect, 0, trace, state); model->Init(X, n, d, Z, its, tree, treecol, hier); model->Outfile(MYstdout, verb); /* if treed partitioning is allowed, then set the splitting locations (Xsplit) */ if(params->isTree()) model->set_Xsplit(Xsplit, nsplit, d); /* structure for accumulating predictive information */ cump = new_preds(XX, nn, pred_n*n, d, rect, R*(T-B), pred_n, krige, its->IT_ST_or_IS(), delta_s2, improv, sens, E); /* make sure the first col still indicates the coarse or fine process */ if(params->BasePrior()->BaseModel() == GP){ if( ((Gp_Prior*) params->BasePrior())->CorrPrior()->CorrModel() == MREXPSEP ){ for(unsigned int i=0; iXX[i][0] == XX[i][0]); } } /* print the parameters of this module */ if(verb >= 2) Print(MYstdout); } /* * Rounds: * * Actually do the MCMC for sampling from the posterior of the tgp model * based on the parameterization given to the Tgp constructor. */ void Tgp::Rounds(void) { for(unsigned int i=0; iLinburn(B, state); /* Stochastic Approximation burn-in rounds to jump-start the psuedo-prior for ST */ if(i == 0 && its->DoStochApprox()) { model->StochApprox(T, state); } else { /* do model rounds 1 thru B (burn in) */ model->Burnin(B, state); } /* do the MCMC rounds B,...,T */ preds = new_preds(XX, nn, pred_n*n, d, rect, T-B, pred_n, krige, its->IT_ST_or_IS(), delta_s2, improv, sens, E); model->Sample(preds, T-B, state); /* print tree statistics */ if(verb >= 1) model->PrintTreeStats(MYstdout); /* accumulate predictive information */ import_preds(cump, preds->R * i, preds); delete_preds(preds); preds = NULL; /* done with this repetition */ /* prune the tree all the way back unless importance tempering */ if(R > 1) { if(verb >= 1) MYprintf(MYstdout, "finished repetition %d of %d\n", i+1, R); if(its->Numit() == 1) model->cut_root(); } /* if importance tempering, then update the pseudo-prior based on the observation counts */ if(its->Numit() > 1) its->UpdatePrior(model->update_tprobs(), its->Numit()); } /* cap off the printing */ if(verb >= 1) MYflush(MYstdout); /* print the rectangle of the MAP partition */ model->PrintBestPartitions(); /* print the splits of the best tree for each height */ model->PrintPosteriors(); /* this should only happen if trace==TRUE */ model->PrintLinarea(); /*******/ model->MAPreplace(); /* write the preds out to files */ if(trace && T-B>0) { if(nn > 0) { /* at predictive locations */ matrix_to_file("trace_ZZ_1.out", cump->ZZ, cump->R, nn); if(cump->ZZm) matrix_to_file("trace_ZZkm_1.out", cump->ZZm, cump->R, nn); if(cump->ZZs2) matrix_to_file("trace_ZZks2_1.out", cump->ZZs2, cump->R, nn); } if(pred_n) { /* at the data locations */ matrix_to_file("trace_Zp_1.out", cump->Zp, cump->R, n); if(cump->Zpm) matrix_to_file("trace_Zpkm_1.out", cump->Zpm, cump->R, n); if(cump->Zps2) matrix_to_file("trace_Zpks2_1.out", cump->Zps2, cump->R, n); } /* write improv */ if(improv) matrix_to_file("trace_improv_1.out", cump->improv, cump->R, nn); /* Ds2x is un-normalized, it needs to be divited by nn everywhere */ if(delta_s2) matrix_to_file("trace_Ds2x_1.out", cump->Ds2x, cump->R, nn); } /* copy back the itemps */ model->DupItemps(its); } /* * SampleMAP: * * Only do sampling from the posterior predictive distribution; * that is, don't update GP or Tree */ void Tgp::Predict(void) { /* don't need multiple rounds R when just kriging */ if(R > 1) warning("R=%d (>0) not necessary for Kriging", R); for(unsigned int i=0; iIT_ST_or_IS(), delta_s2, improv, sens, E); model->Predict(preds, T-B, state); /* accumulate predictive information */ import_preds(cump, preds->R * i, preds); delete_preds(preds); preds = NULL; /* done with this repetition; prune the tree all the way back */ if(R > 1) { MYprintf(MYstdout, "finished repetition %d of %d\n", i+1, R); // model->cut_root(); } } /* cap of the printing */ if(verb >= 1) MYflush(MYstdout); /* these is here to maintain compatibility with tgp::Rounds() */ /* print the rectangle of the MAP partition */ model->PrintBestPartitions(); /* print the splits of the best tree for each height */ model->PrintPosteriors(); /* this should only happen if trace==TRUE */ model->PrintLinarea(); /* write the preds out to files */ if(trace && T-B>0) { if(nn > 0) { matrix_to_file("trace_ZZ_1.out", cump->ZZ, cump->R, nn); if(cump->ZZm) matrix_to_file("trace_ZZkm_1.out", cump->ZZm, cump->R, nn); if(cump->ZZs2) matrix_to_file("trace_ZZks2_1.out", cump->ZZs2, cump->R, nn); } if(pred_n) { matrix_to_file("trace_Zp_1.out", cump->Zp, cump->R, n); if(cump->Zpm) matrix_to_file("trace_Zpkm_1.out", cump->Zpm, cump->R, n); if(cump->Zps2) matrix_to_file("trace_Zpks2_1.out", cump->Zps2, cump->R, n); } if(improv) matrix_to_file("trace_improv_1.out", cump->improv, cump->R, nn); } } /* * Sens: * * function for post-procesing a sensitivity analysis * performed on a tgp model -- this is the sensitivity version of the * GetStats function */ void Tgp::Sens(int *ngrid_in, double *span_in, double *sens_XX, double *sens_ZZ_mean, double *sens_ZZ_q1,double *sens_ZZ_q2, double *sens_S, double *sens_T) { /* Calculate the main effects sample: based on M1 only for now. */ // unsigned int bmax = model->get_params()->T_bmax(); int colj; int ngrid = *ngrid_in; double span = *span_in; double **ZZsample = new_zero_matrix(cump->R, ngrid*cump->d); unsigned int nm = cump->nm; double *XXdraw = new_vector(nm); for(unsigned int i=0; iR; i++) { /* real-valued predictors */ for(unsigned int j=0; jshape[j] == 0) continue; /* categorical; do later */ for(unsigned int k=0; kM[i][k*cump->d + j]; colj = j*ngrid; move_avg(ngrid, &sens_XX[j*ngrid], &ZZsample[i][colj], nm, XXdraw, cump->ZZ[i], span); } /* categorical predictors */ for(unsigned int j=0; jshape[j] != 0) continue; /* continuous; did earlier */ unsigned int n0 = 0; for(unsigned int k=0; kM[i][k*cump->d + j] == 0){ n0++; colj = j*ngrid; ZZsample[i][colj] += cump->ZZ[i][k]; } else{ colj = (j+1)*(ngrid)-1; ZZsample[i][colj] += cump->ZZ[i][k]; } } /* assign for each of {0,1} */ ZZsample[i][j*ngrid] = ZZsample[i][j*ngrid]/((double) n0); ZZsample[i][(j+1)*(ngrid)-1] = ZZsample[i][(j+1)*(ngrid)-1]/((double) (nm-n0) ); } } /* calculate the average of the columns of ZZsample */ wmean_of_columns(sens_ZZ_mean, ZZsample, cump->R, ngrid*cump->d, NULL); /* allocate pointers for holding q1 and q2 */ double q[2] = {0.05, 0.95}; double **Q = (double**) malloc(sizeof(double*) * 2); Q[0] = sens_ZZ_q1; Q[1] = sens_ZZ_q2; quantiles_of_columns(Q, q, 2, ZZsample, cump->R, ngrid*cump->d, NULL); free(XXdraw); delete_matrix(ZZsample); free(Q); /* variability indices S and total variability indices T are calculated here */ for(unsigned int i=0; iR; i++) sobol_indices(cump->ZZ[i], cump->nm, cump->d, &(sens_S[i*(cump->d)]), &(sens_T[i*(cump->d)])); } /* * GetStats: * * Coalate the statistics from the samples of the posterior predictive * distribution gathered during the MCMC Tgp::Rounds() function * * argument indicates whether to report traces (e.g., for wlambda); i.e., * if Kriging (rather than Rounds) then parameters are fixed, so there * is no need for traces of weights because they should be constant */ void Tgp::GetStats(bool report, double *Zp_mean, double *ZZ_mean, double *Zp_km, double *ZZ_km, double *Zp_kvm, double *ZZ_kvm, double *Zp_q, double *ZZ_q, bool zcov, double *Zp_s2, double *ZZ_s2, double *ZpZZ_s2, double *Zp_ks2, double *ZZ_ks2, double *Zp_q1, double *Zp_median, double *Zp_q2, double *ZZ_q1, double *ZZ_median, double *ZZ_q2, double *Ds2x, double *improvec, int numirank, int* irank, double *ess) { itime = MY_r_process_events(itime); /* possibly adjust weights by the chosen lambda method, and possibly write the trace out to a file*/ double *w = NULL; if(its->IT_ST_or_IS()) { ess[0] = its->LambdaIT(cump->w, cump->itemp, cump->R, ess+1, verb); if(trace && report) vector_to_file("trace_wlambda_1.out", cump->w, cump->R); w = cump->w; } else { ess[0] = ess[1] = ess[2] = cump->R; } /* allocate pointers for holding q1 median and q3 */ /* TADDY's IQR settings double q[3] = {0.25, 0.5, 0.75};*/ double q[3] = {0.05, 0.5, 0.95}; double **Q = (double**) malloc(sizeof(double*) * 3); /* calculate means and quantiles */ if(T-B>0 && pred_n) { assert(n == cump->n); /* mean */ wmean_of_columns(Zp_mean, cump->Zp, cump->R, n, w); /* kriging mean */ if(Zp_km) wmean_of_columns(Zp_km, cump->Zpm, cump->R, n, w); if(Zp_km) wvar_of_columns(Zp_kvm, cump->Zpvm, cump->R, n, w); /* variance (computed from samples Zp) */ if(zcov) { double **Zp_s2_M = (double**) malloc(sizeof(double*) * n); Zp_s2_M[0] = Zp_s2; for(unsigned int i=1; iZp, Zp_mean, cump->R, n, w); free(Zp_s2_M); } else { wmean_of_columns_f(Zp_s2, cump->Zp, cump->R, n, w, sq); for(unsigned int i=0; iZps2, cump->R, n, w); /* quantiles and medians */ Q[0] = Zp_q1; Q[1] = Zp_median; Q[2] = Zp_q2; quantiles_of_columns(Q, q, 3, cump->Zp, cump->R, n, w); for(unsigned int i=0; i0 && nn>0 && !sens) { /* mean */ wmean_of_columns(ZZ_mean, cump->ZZ, cump->R, nn, w); /* kriging mean */ if(ZZ_km) wmean_of_columns(ZZ_km, cump->ZZm, cump->R, nn, w); if(ZZ_km) wvar_of_columns(ZZ_kvm, cump->ZZvm, cump->R, nn, w); /* variance (computed from samples ZZ) */ if(zcov) { /* calculate the covarince between all predictive locations */ double **ZZ_s2_M = (double **) malloc(sizeof(double*) * nn); ZZ_s2_M[0] = ZZ_s2; for(unsigned int i=1; iZZ, ZZ_mean, cump->R, nn, w); free(ZZ_s2_M); } else { /* just the variance */ wmean_of_columns_f(ZZ_s2, cump->ZZ, cump->R, nn, w, sq); for(unsigned int i=0; iZp, cump->ZZ, Zp_mean, ZZ_mean, cump->R, n, nn, w); free(ZpZZ_s2_M); } /* kriging variance */ if(ZZ_ks2) wmean_of_columns(ZZ_ks2, cump->ZZs2, cump->R, nn, w); /* quantiles and medians */ Q[0] = ZZ_q1; Q[1] = ZZ_median; Q[2] = ZZ_q2; quantiles_of_columns(Q, q, 3, cump->ZZ, cump->R, cump->nn, w); for(unsigned int i=0; iDs2x) { assert(delta_s2); wmean_of_columns(Ds2x, cump->Ds2x, cump->R, cump->nn, w); } /* improv (minima) */ if(improv) { assert(cump->improv); wmean_of_columns(improvec, cump->improv, cump->R, cump->nn, w); int *ir = (int*) GetImprovRank(cump->R, cump->nn, cump->improv, improv, numirank, w); dupiv(irank, ir, nn); free(ir); } } /* clean up */ free(Q); } /* * tgp_cleanup * * function for freeing memory when tgp is interrupted * by R, so that there won't be a (big) memory leak. It frees * the major chunks of memory, but does not guarentee to * free up everything */ void tgp_cleanup(void) { /* free the RNG state */ if(tgp_state) { deleteRNGstate(tgp_state); tgp_state = NULL; if(tgpm->Verb() >= 1) MYprintf(MYstderr, "INTERRUPT: tgp RNG leaked, is now destroyed\n"); } /* free tgp model */ if(tgpm) { if(tgpm->Verb() >= 1) MYprintf(MYstderr, "INTERRUPT: tgp model leaked, is now destroyed\n"); delete tgpm; tgpm = NULL; } } } /* extern "C" */ /* * getXdataRect: * * given the data Xall (Nxd), infer the rectancle * from IFace class */ double ** getXdataRect(double **X, unsigned int n, unsigned int d, double **XX, unsigned int nn) { unsigned int N = nn+n; double **Xall = new_matrix(N, d); dupv(Xall[0], X[0], n*d); if(nn > 0) dupv(Xall[n], XX[0], nn*d); double **rect = get_data_rect(Xall, N, d); delete_matrix(Xall); return rect; } /* * Print: * * print the settings of the parameters used by this module: * which basically summarize the data and MCMC-related inputs * followed by a call to the model Print function */ void Tgp::Print(FILE *outfile) { MYprintf(MYstdout, "\n"); /* DEBUG: print the input parameters */ MYprintf(MYstdout, "n=%d, d=%d, nn=%d\nBTE=(%d,%d,%d), R=%d, linburn=%d\n", n, d, nn, B, T, E, R, linburn); /* print the importance tempring information */ its->Print(MYstdout); /* print the random number generator state */ printRNGstate(state, MYstdout); /* print predictive statistic types */ if(pred_n || (delta_s2 || improv)) MYprintf(MYstdout, "preds:"); if(pred_n) MYprintf(MYstdout, " data"); if(krige && (pred_n || nn)) MYprintf(MYstdout, " krige"); if(delta_s2) MYprintf(MYstdout, " ALC"); if(improv) MYprintf(MYstdout, " improv"); if(pred_n || (((krige && (pred_n || nn)) || delta_s2) || improv)) MYprintf(MYstdout, "\n"); MYflush(MYstdout); /* print the model, uses the internal model printing variable OUTFILE */ model->Print(); } /* * Verb: * * returns the verbosity level */ int Tgp::Verb(void) { return verb; } /* * GetPseudoPrior: * * write the iTemps->tprobs to the last n entries * of the ditemps vector */ void Tgp::GetPseudoPrior(double *ditemps) { its->CopyPrior(ditemps); } /* * GetTreeStats: * * get the (Tree) acceptance rates for (G)row, (P)rune, * (C)hange and (S)wap tree operations in the model module */ void Tgp::GetTreeStats(double *gpcs) { model->TreeStats(gpcs); } tgp/src/tree.h0000644000175100001440000001616012655414756013004 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __TREE_H__ #define __TREE_H__ #include #include "exp.h" #include "corr.h" #include "params.h" extern "C" { #include "matrix.h" } #include "base.h" typedef enum TREE_OP {GROW=201, PRUNE=202, CHANGE=203, CPRUNE=204, SWAP=205, ROTATE=206} TREE_OP; /* dummy prototype */ class Model; class Tree { private: /*variables */ Rect *rect; unsigned int n; /* number of input data locations */ unsigned int nn; /* number of predictive input data locations */ unsigned int d; /* dimension of the input data */ double **X; /* n x (col-1), data: spatial locations */ int *p; /* n, indices into original data */ double *Z; /* n, f(X) */ double **XX; /* nn x (col-1), predictive spatial locations */ int *pp; /* nn, indices into original XX */ Model* model; /* point to the model this (sub-)tree is in */ Base *base; /* point to the base (e.g., Gp) model */ unsigned int var; /* split point dimension */ double val; /* split point value */ Tree* parent; /* parent partition */ Tree* leftChild; /* partition LEQ (<=) split point */ Tree* rightChild; /* partition GT (>) split point */ Tree* next; /* used for making lists of tree nodes */ unsigned int depth; /* depth of partition in tree */ FILE* OUTFILE; /* where to print tree-specific info */ int verb; /* printing level (0=none, ... , 3+=verbose); */ private: /* functions */ /* auxiliaty swap functions */ bool rotate(void *state); void rotate_right(void); void rotate_left(void); double pT_rotate(Tree* low, Tree* high); void swapData(Tree* t); void adjustDepth(int a); /* change point probability calculations & proposals */ void val_order_probs(double **Xo, double **probs, unsigned int var, double **rX, unsigned int rn); double split_prob(void); double propose_split(double *p, void *state); double propose_val(void *state); /* create lists of tree nodes, * and traverse them from first to next ... to last */ unsigned int leaves(Tree** first, Tree** last); unsigned int prunable(Tree** first, Tree** last); unsigned int internals(Tree **first, Tree **last); unsigned int swapable(Tree **first, Tree **last); /* creating new leaves, and removing them */ unsigned int grow_child(Tree** child, FIND_OP op); int part_child(FIND_OP op, double ***Xc, int **pnew, unsigned int *plen, double **Zc, Rect **newRect); bool grow_children(void); bool try_revert(bool success, Tree* oldLC, Tree* oldRC, int old_var, double old_val); bool match(Tree* oldT, void *state); /* compute lost of the posterior * (likelihood + plus some prior stuff) * of a particular lef, or all leaves */ double leavesPosterior(void); double Posterior(void); unsigned int leavesN(void); public: /* constructor, destructor and misc partition initialization */ Tree(double **X, int *p, unsigned int n, unsigned int d, double *Z, Rect* rect, Tree* parent, Model* model); Tree(const Tree *oldt, bool economy); void Init(double *dtree, unsigned int nrow, double **iface_rect); ~Tree(void); void delete_XX(void); /* things that model (module) will initiate * on ONLY leaf nodes */ void Predict(double *Zp, double *Zpm, double *Zpvm, double *Zps2,double *ZZ, double *ZZm, double *ZZvm, double *ZZs2, double *Ds2x, double *improv, double Zmin, unsigned int wZmin, bool err, void *state); /* propose tree operations */ bool grow(double ratio, void *state); bool prune(double ratio, void *state); bool change(void *state); bool swap(void *state); void cut_branch(void); void new_data(double **X_new, unsigned int n_new, unsigned int d_new, double *Z_new, int *p_new); /* access functions: * return current values of the parameters */ unsigned int getDepth(void) const; unsigned int getN(void) const; unsigned int getNN(void) const; Rect* GetRect(void) const; int* get_pp(void) const; double** get_XX(void) const; double** get_X(void) const; double* get_Z(void) const; Base* GetBase(void) const; Base_Prior* GetBasePrior(void) const; /* global computation functions */ void Update(void); void Compute(void); void ForceLinear(void); void ForceNonlinear(void); bool Linarea(unsigned int *sum_b, double *area) const; void NewInvTemp(double itemp); /* access function: info about nodes */ bool isLeaf(void) const; bool isRoot(void) const; char* State(unsigned int which); bool Draw(void* state); void Clear(void); /* create an arraw of typed tree nodes, * passing back the length of the array */ Tree** swapableList(unsigned int* len); Tree** leavesList(unsigned int* len); Tree** prunableList(unsigned int* len); Tree** internalsList(unsigned int* len); Tree** buildTreeList(unsigned int len); unsigned int numPrunable(void); bool isPrunable(void) const; unsigned int numLeaves(void); Tree* Parent(void) const; /* size checks */ double Area(void) const; bool wellSized(void) const; unsigned int Height(void) const; bool Singular(void) const; /* printing */ void PrintTree(FILE* outfile, double** rect, double scale, int root) const; void Outfile(FILE *file, int verb); /* seperating prediction from estimation */ unsigned int add_XX(double **X_pred, unsigned int n_pred, unsigned int d_new); void new_XZ(double **X_new, double *Z_new, unsigned int n_new, unsigned int d_new); unsigned int* dopt_from_XX(unsigned int N, unsigned int iter, void *state); /* computing the full posterior or likelihood of the tree */ double Prior(double itemp); double FullPosterior(double itemp, bool tprior); double MarginalPosterior(double itemp); double Likelihood(double itemp); /* gathering traces of parameters */ void Trace(unsigned int index, FILE* XXTRACEFILE); char** TraceNames(unsigned int *len, bool full); void Distance(double **XX, int *p, const unsigned int plen, double **d1, double *h, double **d2, double *ad); }; #endif tgp/src/model.h0000644000175100001440000001624112655414756013145 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __MODEL_H__ #define __MODEL_H__ #include "tree.h" #include "list.h" #include "params.h" #include "mstructs.h" #include "temper.h" /*#define PARALLEL*/ /* should prediction be done with pthreads */ #define NUMTHREADS 2 /* number of pthreads for prediction */ #define QUEUEMAX 100 /* maximum queue size for partitions on which to predict */ #define PPMAX 100 /* maximum partitions accumulated before sent to queue */ class Model { private: unsigned int d; /* X input dimension */ double **iface_rect; /* X-input bounding rectangle */ int Id; /* identification number for this model */ Params *params; /* hierarchical and initial parameters */ Base_Prior *base_prior; /* base model (e.g., GP) prior module */ Tree* t; /* root of the partition tree */ double **Xsplit; /* locations at which trees can split */ unsigned int nsplit; /* number of locations in Xsplit */ double Zmin; /* global minimum Z-value used in EGO/Improve calculations */ unsigned int wZmin; /* index of minimum Z-value in Z-vector */ /* for computing acceptance proportions of tree proposals */ int swap,change,grow,prune,swap_try,grow_try,change_try,prune_try; bool parallel; /* use pthreads or not */ void *state_to_init_consumer; /* to initialize consumer state variables */ List *PP; /* producer wait queue (before producing to tlist) */ #ifdef PARALLEL pthread_t** consumer; /* consumer thread handle */ pthread_mutex_t* l_mut; /* locking the prediction list */ pthread_cond_t* l_cond_nonempty; /* cond variable signals nonempty list */ pthread_cond_t* l_cond_notfull; /* cond variable signals nonempty list */ List* tlist; /* list of prediction leaves */ unsigned int num_consumed; /* number of consumed leaves total */ unsigned int num_produced; /* number of produced leaves total */ pthread_mutex_t* l_trace_mut; /* locking the XX_trace file */ #endif FILE *PARTSFILE; /* what file to write partitions to */ FILE *POSTTRACEFILE; /* what file to write posterior traces to */ FILE *XXTRACEFILE; /* files for writing traces to for each XX */ FILE *HIERTRACEFILE; /* files for writing traces to hierarchical params */ double partitions; /* counter for the averave number of partitions */ FILE* OUTFILE; /* file for MCMC status output */ int verb; /* printing level (0=none, ... , 3+=verbose) */ bool trace; /* should a trace of the MC be written to files? */ Posteriors *posteriors; /* for keeping track of the best tree posteriors */ Linarea *lin_area; /* if so, we need a pointer to the area structure */ Temper *its; /* inv-temperature for importance-tempering */ bool Tprior; /* whether to temper the (tree) prior or not */ public: /* init and destruct */ Model(Params *params, unsigned int d, double **rect, int Id, bool trace, void *state_to_init_conumer); ~Model(void); void Init(double **X, unsigned int d, unsigned int n, double *Z, Temper *it, double *dtree, unsigned int ncol, double* hier); /* MCMC */ void rounds(Preds *preds, unsigned int B, unsigned int T, void *state); void Linburn(unsigned int B, void *state); void Burnin(unsigned int B, void *state); void StochApprox(unsigned int B, void *state); void Sample(Preds *preds, unsigned int R, void *state); void Predict(Preds *preds, unsigned int R, void *state); /* tree operations and modifications */ bool modify_tree(void *state); bool change_tree(void *state); bool grow_tree(void *state); bool swap_tree(void *state); bool prune_tree(void *state); void set_TreeRoot(Tree *t); Params* get_params(void); Tree* get_TreeRoot(void); double** get_Xsplit(unsigned int *nsplit); void set_Xsplit(double **X, unsigned int n, unsigned int d); void predict_master(Tree *leaf, Preds *preds, int index, void* state); void Predict(Tree* leaf, Preds* preds, unsigned int index, bool dnorm, void *state); Tree** CopyPartitions(unsigned int *numLeaves); void MAPreplace(void); void predict_xx(Tree* ll, Preds* preds, int index, bool dnorm, void *state); void cut_branch(void *state); void cut_root(void); void new_data(double **X, unsigned int n, unsigned int d, double* Z, double **rect); /* parallel prediction functions */ void init_parallel_preds(void); void close_parallel_preds(void); void predict_consumer(void); void predict_producer(Tree *leaf, Preds* preds, int index, bool dnorm); void consumer_finish(void); void consumer_start(void); void wrap_up_predictions(void); void produce(void); /* printing functions */ FILE* Outfile(int* verb); void Outfile(FILE *file, int verb); double Partitions(void); FILE* OpenFile(const char *prefix, const char *type); void PrintPartitions(void); void PrintBestPartitions(); void PrintTree(FILE* outfile); double Posterior(bool record); void PrintState(unsigned int r, unsigned int numLeaves, Tree** leaves); void PrintPosteriors(void); Tree* maxPosteriors(void); void Print(void); void PrintTreeStats(FILE* outfile); void TreeStats(double *gpcs); void PrintHiertrace(void); void ProcessLinarea(Tree **leaves, unsigned int numLeaves); /* LLM functions */ double Linear(void); void ResetLinear(double gam); void PrintLinarea(void); /* recording traces of Base parameters for XX in leaves */ void Trace(Tree *leaf, unsigned int index); void TraceNames(FILE * outfile, bool full); void PriorTraceNames(FILE * outfile, bool full); /* tempered importance sampling */ double iTemp(void); void DrawInvTemp(void* state, bool burnin); double* update_tprobs(void); void DupItemps(Temper *its); }; unsigned int new_index(double *quantiles, unsigned int n, unsigned int r); void* predict_consumer_c(void* m); void print_parts(FILE *PARTSFILE, Tree *t, double **iface_rect); #endif tgp/src/lh.h0000644000175100001440000000340212655414756012443 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __LH_H__ #define __LH_H__ #include void sens_sample(double **XX, int nn, int d, double **bnds, double *shape, double *mode, void *state); double** rect_sample(int dim, int n, void *state); double** rect_sample_lh(int dim, int n, double** rect, int er, void *state); double** beta_sample_lh(int dim, int n, double** rect, double* shape, double* mode, void *state); void rect_scale(double** z, int n, int d, double** rect); double** readRect(char* rect, unsigned int *d); void errorBadRect(void); void printRect(FILE* outfile, int d, double** rect); void errorBadRect(void); int* order(double *s, unsigned int n); void sortDouble(double *s, unsigned int n); #endif tgp/src/model.cc0000644000175100001440000014062012655414756013302 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include extern "C" { #include "lh.h" #include "matrix.h" #include "all_draws.h" #include "rand_draws.h" #include "rand_pdf.h" #include "gen_covar.h" #include "rhelp.h" } #include "model.h" #include #include #include #include #include #define DNORM true #define MEDBUFF 256 #define DBETAA 2.0 #define DBETAB 1.0 /* * Model: * * the usual constructor function */ Model::Model(Params* params, unsigned int d, double** rect, int Id, bool trace, void *state) { this->params = new Params(params); base_prior = this->params->BasePrior(); this->d=d; this->Id = Id; this->iface_rect = new_dup_matrix(rect, 2, d); /* parallel prediction implementation ? */ #ifdef PARALLEL parallel = true; if(RNG == CRAN && NUMTHREADS > 1) warning("using thread unsafe unif_rand() with pthreads"); #else parallel = false; #endif PP = NULL; this->state_to_init_consumer = newRNGstate_rand(state); if(parallel) { init_parallel_preds(); consumer_start(); } /* stuff to do with printing */ OUTFILE = MYstdout; verb = 2; this->trace = trace; /* for keeping track of the average number of partitions */ partitions = 0; /* null initializations for trace files and data structures*/ PARTSFILE = XXTRACEFILE = HIERTRACEFILE = POSTTRACEFILE = NULL; lin_area = NULL; /* asynchronous writing to files by multiple threads is problematic */ if(trace && parallel) warning("traces in parallel version of tgp not recommended\n"); /* initialize tree operation statistics */ swap = prune = change = grow = swap_try = change_try = grow_try = prune_try = 0; /* init best tree posteriors */ posteriors = new_posteriors(); /* initialize Zmin to zero -- nothing better */ Zmin = 0; /* make null tree, and then call Model::Init() to make a new * one so that when we pass "this" model to tree, it won't be * only partially allocated */ t = NULL; Xsplit = NULL; nsplit = 0; /* default inv-temperature is 1.0 */ its = NULL; Tprior = true; } /* * Init: * * this function exists because we need to create the new tree * "t" by passing it a pointer to "this" model. But we can't pass * it the "this" pointer until its done constructing, i.e., after * Model::Model() finishes. So this function has all of the stuff * that used to be at the end of Model::Model. It should always be * called immediately after Model::Model() * * the last three arguments (dtree, ncol, dhier) describe a place to * initialize the model at; i.e., what tree (and base model params) and * what base (hierarchal) prior. */ void Model::Init(double **X, unsigned int n, unsigned int d, double *Z, Temper *its, double *dtree, unsigned int ncol, double *dhier) { assert(d == this->d); /* copy input and predictive data; and NORMALIZE */ double **Xc = new_normd_matrix(X,n,d,iface_rect,NORMSCALE); /* read hierarchical parameters from a double-vector */ if(dhier) base_prior->Init(dhier); /* make sure the first col still indicates the coarse or fine process */ if(base_prior->BaseModel() == GP){ if( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == MREXPSEP ){ for(unsigned int i=0; iboundary[0][i] = 0.0; newRect->boundary[1][i] = NORMSCALE; newRect->opl[i] = GEQ; newRect->opr[i] = LEQ; } /* set the starting inv-temperature */ /* it is important that this happens before new Tree() */ this->its = new Temper(its); /* initialization of the (main) tree part of the model */ int *p = iseq(0,n-1); t = new Tree(Xc, p, n, d, Zc, newRect, NULL, this); /* initialize the tree mode: i.e., Update() & Compute() */ t->Init(dtree, ncol, iface_rect); /* initialize the posteriors with the current tree only if that tree was read-in from R; don't record a trace */ if(ncol > 0) Posterior(false); } /* * ~Model: * * the usual class deletion function */ Model::~Model(void) { /* close down parallel prediction */ if(parallel) { consumer_finish(); close_parallel_preds(); } /* delete the tree model & params */ if(iface_rect) delete_matrix(iface_rect); if(t) delete t; if(Xsplit) delete_matrix(Xsplit); if(params) delete params; /* delete the inv-temperature structure */ if(its) delete its; /* delete linarea and posterior */ if(posteriors) delete_posteriors(posteriors); if(trace && lin_area) { delete_linarea(lin_area); lin_area = NULL; } /* clean up partsfile */ if(PARTSFILE) fclose(PARTSFILE); PARTSFILE = NULL; /* clean up post trace file */ if(POSTTRACEFILE) fclose(POSTTRACEFILE); POSTTRACEFILE = NULL; /* clean up XX trace file */ if(XXTRACEFILE) fclose(XXTRACEFILE); XXTRACEFILE = NULL; /* clean up trace file for hierarchical params */ if(HIERTRACEFILE) fclose(HIERTRACEFILE); HIERTRACEFILE = NULL; deleteRNGstate(state_to_init_consumer); } /* * rounds: * * MCMC rounds master function * ZZ and ZZp are the predictions for rounds B:T * must be pre-allocated. */ void Model::rounds(Preds *preds, unsigned int B, unsigned int T, void *state) { /* check for well-allocated preds module */ if(T>B) { assert(preds); assert(T-B >= preds->mult); assert(((int)ceil(((double)(T-B))/preds->R)) == (int)preds->mult); } /* TESTING TREE DISTANCE */ /* double **td1, **td2; int *tdp; double *th, *tad; if(preds) { td1 = new_zero_matrix(preds->nn, preds->nn); td2 = new_zero_matrix(preds->nn, preds->nn); th = new_zero_vector(preds->nn); tad = new_zero_vector(preds->nn); tdp = iseq(0, preds->nn); } */ /* for the leavesList function in the for loop below */ unsigned int numLeaves = 1; /* for helping with periodic interrupts */ time_t itime = time(NULL); /* every round, do ... */ for(int r=0; r<(int)T; r++) { /* draw a new temperature */ if((r+1)%4 == 0) DrawInvTemp(state, r < (int)B); /* propose tree changes */ /* bool treemod = false; */ if((r+1)%4 == 0) /* treemod = */ modify_tree(state); /* get leaves of the tree */ Tree **leaves = t->leavesList(&numLeaves); /* for each leaf: draw params first compute marginal params as necessary */ int index = (int)r-B; bool success = false; for(unsigned int i=0; iCompute(); /* draws for the parameters at the leaves of the tree */ if(!(success = leaves[i]->Draw(state))) break; /* note that Compute still needs to be called on each leaf, below */ } /* check to see if draws from leaves was successful */ if(!success) { if(parallel) { if(PP) produce(); wrap_up_predictions(); } cut_root(); partitions = 0; r = -1; free(leaves); continue; } /* produce leaves for parallel prediction */ /* MAYBE this should be moved after/into the preds if-statement below */ if(parallel && PP && PP->Len() > PPMAX) produce(); /* draw hierarchical parameters */ base_prior->Draw(leaves, numLeaves, state); /* make sure to Compute on leaves now that hier-priors have changed */ for(unsigned int i=0; iCompute(); /* print progress meter */ if((r+1) % 1000 == 0 && r>0 && verb >= 1) PrintState(r+1, numLeaves, leaves); /* process full posterior, and calculate linear area */ if(T>B && (index % preds->mult == 0)) { /* keep track of MAP, and calculate importance sampling weight */ double w = Posterior(true); /* must call Posterior for mapt */ if(its->IT_ST_or_IS()) { preds->w[index/preds->mult] = w; preds->itemp[index/preds->mult] = its->Itemp(); } /* For random XX (eg sensitivity analysis), draw the predictive locations */ if(preds->nm > 0){ sens_sample(preds->XX, preds->nn, preds->d, preds->bnds, preds->shape, preds->mode, state); dupv(preds->M[index/preds->mult], preds->XX[0], preds->d * preds->nm); normalize(preds->XX, preds->rect, preds->nn, preds->d, 1.0); } /* TESTING TREE DISTANCE */ // t->Distance(preds->XX, tdp, preds->nn, td1, th, td2, tad); /* predict for each leaf */ /* make sure to do this after calculation of preds->w[r], above */ for(unsigned int i=0; imult; partitions = (m*partitions + numLeaves)/(m+1); /* these do nothing when traces=FALSE */ ProcessLinarea(leaves, numLeaves); /* calc area under the LLM */ PrintPartitions(); /* print leaves of the tree */ PrintHiertrace(); /* print hierarchical params */ } /* clean up the garbage */ free(leaves); /* periodically check R for interrupts and flush console every second */ itime = MY_r_process_events(itime); } /* send a full set of leaves out for prediction */ if(parallel && PP) produce(); /* wait for final predictions to finish */ if(parallel) wrap_up_predictions(); /* normalize Ds2x, i.e., divide by the total (not within-partition) XX locs */ if(preds && preds->Ds2x) scalev(preds->Ds2x[0], preds->R * preds->nn, 1.0/preds->nn); /* TESTING TREE DISTANCE */ /* if(preds) { scalev(*td1, preds->nn * preds->nn, 1.0/preds->R); matrix_to_file("node_dist.txt", td1, preds->nn, preds->nn); scalev(*td2, preds->nn * preds->nn, 1.0/preds->R); matrix_to_file("nodeabs_dist.txt", td2, preds->nn, preds->nn); delete_matrix(td1); delete_matrix(td2); free(tdp); free(th); free(tad); } */ } /* * predict_master: * * chooses parallel prediction; * first determines whether or not to do a prediction * based on the prediction index (>0) and the preds module * indication of how many predictions it wants. */ void Model::predict_master(Tree *leaf, Preds *preds, int index, void* state) { /* only predict every E = preds->mult */ if(index < 0) return; if(index % preds->mult != 0) return; /* calculate r index into preds matrices */ unsigned int r = index/preds->mult; assert(r < preds->R); /* if-statement should never be true: if(r >= preds->R) return; */ /* choose parallel or serial prediction */ if(parallel) predict_producer(leaf, preds, r, DNORM); else predict_xx(leaf, preds, r, DNORM, state); } /* * predict: * * predict at one of the leaves of the tree. * this was made into a function in order to help simplify * the rounds() function. Also, now fascilitates parameter * traces for the GPs which govern the XX locations. */ void Model::Predict(Tree* leaf, Preds* preds, unsigned int index, bool dnorm, void *state) { /* these declarations just make for shorter function arguments below */ double *Zp, *Zpm, *Zpvm, *Zps2, *ZZ, *ZZm, *ZZvm, *ZZs2, *improv, *Ds2x; if(preds->Zp) Zp = preds->Zp[index]; else Zp = NULL; if(preds->Zpm) Zpm = preds->Zpm[index]; else Zpm = NULL; if(preds->Zpvm) Zpvm = preds->Zpvm[index]; else Zpvm = NULL; if(preds->Zps2) Zps2 = preds->Zps2[index]; else Zps2 = NULL; if(preds->ZZ) ZZ = preds->ZZ[index]; else ZZ = NULL; if(preds->ZZm) ZZm = preds->ZZm[index]; else ZZm = NULL; if(preds->ZZvm) ZZvm = preds->ZZvm[index]; else ZZvm = NULL; if(preds->ZZs2) ZZs2 = preds->ZZs2[index]; else ZZs2 = NULL; if(preds->Ds2x) Ds2x = preds->Ds2x[index]; else Ds2x = NULL; if(preds->improv) improv = preds->improv[index]; else improv = NULL; /* this is probably the best place for gathering traces about XX */ if(preds->ZZ) Trace(leaf, index); /* checks if trace=TRUE inside Trace */ /* here is where the actual prediction happens */ leaf->Predict(Zp, Zpm, Zpvm, Zps2, ZZ, ZZm, ZZvm, ZZs2, Ds2x, improv, Zmin, wZmin, dnorm, state); } /* * modify_tree: * * Propose structural changes to the tree via * GROW, PRUNE, CHANGE, and SWAP operations * chosen randomly */ bool Model::modify_tree(void *state) { /* since we may modify the tree we need to * update the marginal parameters now! */ unsigned int numLeaves; Tree **leaves = t->leavesList(&numLeaves); assert(numLeaves >= 1); for(unsigned int i=0; iCompute(); free(leaves); /* end marginal parameter computations */ /* probability distribution for each tree operation ("action") */ double probs[4] = {1.0/5, 1.0/5, 2.0/5, 1.0/5}; int actions[4] = {1,2,3,4}; /* sample an action */ int action; unsigned int indx; isample(&action, &indx, 1, 4, actions, probs, state); /* do the chosen action */ switch(action) { case 1: /* grow */ return grow_tree(state); case 2: /* prune */ return prune_tree(state); case 3: /* change */ return change_tree(state); case 4: /* swap */ return swap_tree(state); default: error("action %d not supported", action); } /* should not reach here */ return 0; } /* * swap_tree: * * Choose which INTERNAL node should have its split-point * moved. */ bool Model::swap_tree(void *state) { unsigned int len; Tree** nodes = t->swapableList(&len); if(len == 0) return false; unsigned int k = (unsigned int) sample_seq(0,len-1, state); bool success = nodes[k]->swap(state); free(nodes); swap_try++; if(success) swap++; return success; } /* * change_tree: * * Choose which INTERNAL node should have its split-point * moved. */ bool Model::change_tree(void *state) { unsigned int len; Tree** nodes = t->internalsList(&len); if(len == 0) return false; unsigned int k = (unsigned int) sample_seq(0,len-1, state); bool success = nodes[k]->change(state); free(nodes); change_try++; if(success) change++; return success; } /* * prune_tree: * * Choose which part of the tree to attempt to prune */ bool Model::prune_tree(void *state) { /* get the list of possible prunable nodes */ unsigned int len; Tree** nodes = t->prunableList(&len); if(len == 0) return false; /* update the forward and backward proposal probabilities */ double q_fwd = 1.0/len; double q_bak = 1.0/(t->numLeaves()-1); /* get the prior tree parameters */ unsigned int t_minpart, t_splitmin, t_basemax; double t_alpha, t_beta; params->get_T_params(&t_alpha, &t_beta, &t_minpart, &t_splitmin, &t_basemax); /* calculate the tree prior */ unsigned int k = (unsigned int) sample_seq(0,len-1, state); unsigned int depth = nodes[k]->getDepth() + 1; double pEtaT = t_alpha * pow(1+depth,0.0-(t_beta)); double pEtaPT = t_alpha * pow(1+depth-1,0.0-(t_beta)); double diff = 1-pEtaT; double pTreeRatio = (1-pEtaPT) / ((diff*diff) * pEtaPT); /* temper the tree probabilities in non-log space ==> uselog=0 */ if(Tprior) pTreeRatio = temper(pTreeRatio, its->Itemp(), 0); /* attempt a prune */ bool success = nodes[k]->prune((q_bak/q_fwd)*pTreeRatio, state); free(nodes); /* update the prune success rates */ prune_try++; if(success) prune++; return success; } /* * grow_tree: * * Choose which part of the tree to attempt to grow on */ bool Model::grow_tree(void *state) { /* get the tree prior params */ unsigned int len, t_minpart, t_splitmin, t_basemax; double t_alpha, t_beta; params->get_T_params(&t_alpha, &t_beta, &t_minpart, &t_splitmin, &t_basemax); if(t_alpha == 0 || t_beta == 0) return false; /* get the list of growable nodes */ Tree** nodes = t->leavesList(&len); /* forward (grow) probability */ double q_fwd = 1.0/len; /* choose which leaf to grow on */ unsigned int k = (unsigned int) sample_seq(0,len-1, state); /* calculate the reverse (prune) probability */ double q_bak; double num_prune = t->numPrunable(); /* if the parent is prunable, then we don't change the number of prunable nodes with a grow; otherwise we add one */ Tree* parent_k = nodes[k]->Parent(); if(parent_k == NULL) { assert(nodes[k]->getDepth() == 0); q_bak = 1.0/(num_prune+1); } else if(parent_k->isPrunable()) { q_bak = 1.0/(num_prune+1); } else { q_bak = 1.0/num_prune; } unsigned int depth = nodes[k]->getDepth(); double pEtaT = t_alpha * pow(1+depth,0.0-(t_beta)); double pEtaCT = t_alpha * pow(1+depth+1,0.0-(t_beta)); double diff = 1-pEtaCT; double pTreeRatio = pEtaT * (diff*diff) / (1-pEtaT); /* temper the tree probabilities in non-log space ==> uselog=0 */ if(Tprior) pTreeRatio = temper(pTreeRatio, its->Itemp(), 0); /* attempt a grow */ bool success = nodes[k]->grow((q_bak/q_fwd)*pTreeRatio, state); free(nodes); grow_try++; if(success) grow++; return success; } /* * cut_branch: * * randomly cut a branch (swath) of the tree off * an internal node is selected, and its children * are cut (removed) from the tree */ void Model::cut_branch(void *state) { unsigned int len; Tree** nodes = t->internalsList(&len); if(len == 0) return; unsigned int k = (unsigned int) sample_seq(0,len,state); if(k == len) { if(verb >= 1) MYprintf(OUTFILE, "tree unchanged (no branches removed)\n"); } else { if(verb >= 1) MYprintf(OUTFILE, "removed %d leaves from the tree\n", nodes[k]->numLeaves()); nodes[k]->cut_branch(); } free(nodes); } /* * cut_root: * * cut_branch, but from the root of the tree * */ void Model::cut_root(void) { if(t->isLeaf()) { if(verb >= 1) MYprintf(OUTFILE, "removed 0 leaves from the tree\n"); } else { if(verb >= 1) MYprintf(OUTFILE, "removed %d leaves from the tree\n", t->numLeaves()); } t->cut_branch(); } /* * update_tprobs: * * re-create the prior distribution of the temperature * ladder by dividing by the normalization constant -- returns * a pointer to the new probabilities */ double *Model::update_tprobs(void) { /* for debugging */ // its->AppendLadder("ladder.txt"); return its->UpdatePrior(); } /* * new_data: * * adding new data to the model * (and thus also to the tree) */ void Model::new_data(double **X, unsigned int n, unsigned int d, double* Z, double **rect) { /* copy input and predictive data; and NORMALIZE */ double **Xc = new_normd_matrix(X,n,d,rect,NORMSCALE); /* make sure the first col still indicates the coarse or fine process */ if(base_prior->BaseModel() == GP){ if( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == MREXPSEP ){ for(unsigned int i=0; inew_data(Xc, n, d, Zc, p); /* reset the MAP per height bookeeping */ delete_posteriors(posteriors); posteriors = new_posteriors(); } /* * PrintTreeStats: * * printing out tree operation stats */ void Model::PrintTreeStats(FILE* outfile) { if(grow_try > 0) MYprintf(outfile, "Grow: %.4g%c, ", 100* (double)grow/grow_try, '%'); if(prune_try > 0) MYprintf(outfile, "Prune: %.4g%c, ", 100* (double)prune/prune_try, '%'); if(change_try > 0) MYprintf(outfile, "Change: %.4g%c, ", 100* (double)change/change_try, '%'); if(swap_try > 0) MYprintf(outfile, "Swap: %.4g%c", 100* (double)swap/swap_try, '%'); if(grow_try > 0) MYprintf(outfile, "\n"); } /* * TreeStats: * * write the tree operation stats to the double arg */ void Model::TreeStats(double *gpcs) { gpcs[0] = (double)grow/grow_try; gpcs[1] = (double)prune/prune_try; gpcs[2] = (double)change/change_try; gpcs[3] = (double)swap/swap_try; } /* * get_TreeRoot: * * return the root of the tree in this model */ Tree* Model::get_TreeRoot(void) { return t; } /* * get_Xsplit: * * return the locations at which the tree can make splits; * either Xsplit, or t->X if Xsplit is NULL -- pass back the * number of locations (nsplit) */ double** Model::get_Xsplit(unsigned int *nsplit) { /* calling this function only makes sense if treed partitioning is allowed */ assert(params->isTree()); if(Xsplit) { *nsplit = this->nsplit; return Xsplit; } else { assert(t); *nsplit = t->getN(); return t->get_X(); } } /* * set_Xsplit: * * set the locations at which the tree can make splits; * NULL indicates that the locations should be t->X */ void Model::set_Xsplit(double **X, unsigned int n, unsigned int d) { /* calling this function only makes sense if treed partitioning is allowed */ assert(params->isTree()); /* make sure X dims match up */ assert(d == this->d); if(Xsplit) delete_matrix(Xsplit); if(! X) { assert(nsplit == 0); Xsplit = NULL; nsplit = 0; } else { Xsplit = new_normd_matrix(X,n,d,iface_rect,NORMSCALE); nsplit = n; } } /* * set_TreeRoot: * * return the root of the tree in this model */ void Model::set_TreeRoot(Tree *t) { this->t = t; } /* * PrintState: * * Print the state for the current round */ void Model::PrintState(unsigned int r, unsigned int numLeaves, Tree** leaves) { /* print round information */ #ifdef PARALLEL if(num_produced - num_consumed > 0) MYprintf(OUTFILE, "(r,l)=(%d,%d) ", r, num_produced - num_consumed); else MYprintf(OUTFILE, "r=%d ", r); #else MYprintf(OUTFILE, "r=%d ", r); #endif /* this is here so that the progress meter in SampleMap doesn't need to print the same tree information each time */ if(numLeaves > 0) { // MYprintf(OUTFILE, " d="); /* print the (correllation) state (d-values and maybe nugget values) */ for(unsigned int i=0; iState(i); MYprintf(OUTFILE, "%s", state); if(i != numLeaves-1) MYprintf(OUTFILE, " "); free(state); } /* a delimeter */ MYprintf(OUTFILE, "; "); /* print maximum posterior prob tree height */ Tree *maxt = maxPosteriors(); if(maxt) MYprintf(OUTFILE, "mh=%d ", maxt->Height()); /* print partition sizes */ if(numLeaves > 1) MYprintf(OUTFILE, "n=("); else MYprintf(OUTFILE, "n="); for(unsigned int i=0; igetN()); if(numLeaves > 1) MYprintf(OUTFILE, "%d)", leaves[numLeaves-1]->getN()); else MYprintf(OUTFILE, "%d", leaves[numLeaves-1]->getN()); } /* cap off the printing */ if(its->Numit() > 1) MYprintf(OUTFILE, " k=%g", its->Itemp()); MYprintf(OUTFILE, "\n"); MYflush(OUTFILE); } /* * get_params: * * return a pointer to the fixed input parameters */ Params* Model::get_params() { return params; } /* * close_parallel_preds: * * close down and destroy producer & consumer * data, queues and pthreads */ void Model::close_parallel_preds(void) { #ifdef PARALLEL /* close and free the consumers */ for(unsigned int i=0; iDeQueue())) { delete l->leaf; free(l); } delete tlist; tlist = NULL; /* empty then free the PP list */ while((l = (LArgs*) PP->DeQueue())) { delete l->leaf; free(l); } delete PP; PP = NULL; #else error("close_parallel_preds: not compiled for pthreads"); #endif } /* * init_parallel_preds: * * initialize producer & consumer parallel prediction * data, queues and pthreads */ void Model::init_parallel_preds(void) { #ifdef PARALLEL /* initialize everything for parallel prediction */ l_mut = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t)); l_cond_nonempty = (pthread_cond_t*) malloc(sizeof(pthread_cond_t)); l_cond_notfull = (pthread_cond_t*) malloc(sizeof(pthread_cond_t)); pthread_mutex_init(l_mut, NULL); pthread_cond_init(l_cond_nonempty, NULL); pthread_cond_init(l_cond_notfull, NULL); tlist = new List(); assert(tlist); PP = new List(); assert(PP); /* initialize lock for synchronizing printing of XX traces */ l_trace_mut = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(l_trace_mut, NULL); /* allocate consumers */ consumer = (pthread_t**) malloc(sizeof(pthread_t*) * NUMTHREADS); for(unsigned int i=0; iadd_XX(preds->XX, preds->nn, d); LArgs *largs = (LArgs*) malloc(sizeof(struct largs)); fill_larg(largs, newleaf, preds, index, dnorm); num_produced++; PP->EnQueue((void*) largs); #else error("predict_producer: not compiled for pthreads"); #endif } /* * produce: * * collect tree leaves for prediction in a list before * putting the into another list (tlist) for consumption */ void Model::produce(void) { #ifdef PARALLEL assert(PP); if(PP->isEmpty()) return; pthread_mutex_lock(l_mut); while (tlist->Len() >= QUEUEMAX) pthread_cond_wait(l_cond_notfull, l_mut); assert(tlist->Len() < QUEUEMAX); unsigned int pp_len = PP->Len(); for(unsigned int i=0; iEnQueue(PP->DeQueue()); assert(PP->isEmpty()); pthread_mutex_unlock(l_mut); pthread_cond_signal(l_cond_nonempty); #else error("produce: not compiled for pthreads"); #endif } /* * predict_consumer: * * is awakened when there is a leaf node (and ooutput pointers) * in the list (queue) and calls the predict routine on it; * list produced by predict_producer in main thread. */ void Model::predict_consumer(void) { #ifdef PARALLEL unsigned int nc = 0; /* each consumer needs its on random state variable */ void *state = newRNGstate_rand(state_to_init_consumer); while(1) { pthread_mutex_lock (l_mut); /* increment num_consumed from the previous iteration */ num_consumed += nc; assert(num_consumed <= num_produced); nc = 0; /* wait for the tlist to get populated with leaves */ while (tlist->isEmpty()) pthread_cond_wait (l_cond_nonempty, l_mut); /* dequeue half of the waiting leaves into LL */ unsigned int len = tlist->Len(); List* LL = new List(); void *entry = NULL; unsigned int i; /* dequeue a calculated portion of the remaing leaves */ for(i=0; iisEmpty()); entry = tlist->DeQueue(); if(entry == NULL) break; assert(entry); LL->EnQueue(entry); } /* release lock and signal */ pthread_mutex_unlock(l_mut); if(len - i < QUEUEMAX) pthread_cond_signal(l_cond_notfull); if(len - i > 0) pthread_cond_signal(l_cond_nonempty); /* take care of each leaf */ while(!(LL->isEmpty())) { LArgs* l = (LArgs*) LL->DeQueue(); Predict(l->leaf, l->preds, l->index, l->dnorm, state); nc++; delete l->leaf; free(l); } /* this list should be empty */ delete LL; /* if the final list entry was NULL, then this thread is done */ if(entry == NULL) { /* make sure to update the num consumed */ pthread_mutex_lock(l_mut); num_consumed += nc; pthread_mutex_unlock(l_mut); /* delete random number generator state for this thread */ deleteRNGstate(state); return; } } #else error("predict_consumer: not compiled for pthreads"); #endif } /* * predict_consumer_c: * * a dumMY c-style function that calls the * consumer function from the Model class */ void* predict_consumer_c(void* m) { Model* model = (Model*) m; model->predict_consumer(); return NULL; } /* * consumer_finish: * * wait for the consumer to finish predicting */ void Model::consumer_finish(void) { #ifdef PARALLEL /* send a null terminating entry into the queue */ pthread_mutex_lock(l_mut); for(unsigned int i=0; iEnQueue(NULL); pthread_mutex_unlock(l_mut); pthread_cond_signal(l_cond_nonempty); for(unsigned int i=0; iLen() != tlen || diff != (int)num_produced-(int)num_consumed) { tlen = tlist->Len(); diff = num_produced - num_consumed; if(verb >= 1) { MYprintf(OUTFILE, "waiting for (%d, %d) predictions\n", tlen, diff); MYflush(OUTFILE); } } pthread_mutex_unlock(l_mut); usleep(500000); } pthread_mutex_unlock(l_mut); num_consumed = num_produced = 0; #else error("wrap_up_predictions: not compiled for pthreads"); #endif } /* * CopyPartitions: * * return COPIES of the leaves of the tree * (i.e. the partitions) */ Tree** Model::CopyPartitions(unsigned int *numLeaves) { Tree* maxt = maxPosteriors(); Tree** leaves = maxt->leavesList(numLeaves); Tree** copies = (Tree**) malloc(sizeof(Tree*) * *numLeaves); for(unsigned int i=0; i<*numLeaves; i++) { copies[i] = new Tree(leaves[i], true); copies[i]->Clear(); } free(leaves); return copies; } /* * MAPreplace: * * set the current model tree to be the MAP one that * is stored */ void Model::MAPreplace(void) { Tree* maxt = maxPosteriors(); assert(maxt); if(t) delete t; t = new Tree(maxt, true); /* get leaves ready for use */ unsigned int len; Tree** leaves = t->leavesList(&len); for(unsigned int i=0; iUpdate(); leaves[i]->Compute(); } free(leaves); } /* * PrintBestPartitions: * * print rectangles covered by leaves of the tree * with the highest posterior probability * (i.e. the partitions) */ void Model::PrintBestPartitions() { FILE *BESTPARTS; Tree *maxt = maxPosteriors(); if(!maxt) { warning("not enough MCMC rounds for MAP tree, using current"); maxt = t; } assert(maxt); BESTPARTS = OpenFile("best", "parts"); print_parts(BESTPARTS, maxt, iface_rect); fclose(BESTPARTS); } /* * print_parts * * print the partitions of the leaves of the tree * specified PARTSFILE */ void print_parts(FILE *PARTSFILE, Tree *t, double** iface_rect) { assert(PARTSFILE); assert(t); unsigned int numLeaves; Tree** leaves = t->leavesList(&numLeaves); for(unsigned int i=0; iGetRect()); rect_unnorm(rect, iface_rect, NORMSCALE); print_rect(rect, PARTSFILE); delete_rect(rect); } free(leaves); } /* * PrintPartitions: * * print rectangles covered by leaves of the tree * (i.e. the partitions) -- do nothing if traces are not * enabled */ void Model::PrintPartitions(void) { if(!trace) return; if(!PARTSFILE) { /* stuff for printing partitions and other to files */ if(params->isTree()) PARTSFILE = OpenFile("trace", "parts"); else return; } print_parts(PARTSFILE, t, iface_rect); } /* * predict_xx: * * usual non-parallel predict function that copies the leaf * before adding XX to it, and then predicts */ void Model::predict_xx(Tree* leaf, Preds* preds, int index, bool dnorm, void *state) { leaf->add_XX(preds->XX, preds->nn, d); if(index >= 0) Predict(leaf, preds, index, dnorm, state); leaf->delete_XX(); } /* * Outfile: * * return file handle to model outfile */ FILE* Model::Outfile(int *verb) { *verb = this->verb; return OUTFILE; } /* * Outfile: * * set outfile handle */ void Model::Outfile(FILE *file, int verb) { OUTFILE = file; this->verb = verb; t->Outfile(file, verb); } /* * Partitions: * * return the current number of partitions */ double Model::Partitions(void) { return partitions; } /* * OpenFile: * * open a the file named prefix_trace_Id+1.out */ FILE* Model::OpenFile(const char *prefix, const char *type) { char outfile_str[BUFFMAX]; sprintf(outfile_str, "%s_%s_%d.out", prefix, type, Id+1); FILE* OFILE = fopen(outfile_str, "w"); assert(OFILE); return OFILE; } /* * PrintTree: * * print the tree in the R CART tree structure format */ void Model::PrintTree(FILE* outfile) { assert(outfile); MYprintf(outfile, "rows var n dev yval splits.cutleft splits.cutright "); /* the following are for printing a higher precision val, and base model parameters for reconstructing trees later */ MYprintf(outfile, "val "); TraceNames(outfile, true); this->t->PrintTree(outfile, iface_rect, NORMSCALE, 1); } /* * DrawInvTemp: * * propose and accept/reject a new annealed importance sampling * inv-temperature, the burnin argument indicates if we are doing * burn-in rounds in the Markov chain */ void Model::DrawInvTemp(void* state, bool burnin) { /* don't do anything if there is only one temperature */ if(its->Numit() == 1) return; /* propose a new inv-temperature */ double q_fwd, q_bak; double itemp_new = its->Propose(&q_fwd, &q_bak, state); /* calculate the posterior probability under both temperatures */ //double p = t->FullPosterior(itemp, Tprior); //double pnew = t->FullPosterior(itemp_new, Tprior); /* calculate the log likelihood under both temperatures */ double ll = t->Likelihood(its->Itemp()); double llnew = t->Likelihood(itemp_new); /* add in a tempered version of the tree prior, or not */ if(Tprior) { ll += t->Prior(its->Itemp()); llnew += t->Prior(itemp_new); } /* sanity check that the priors don't matter */ //double diff_post = pnew - p; double diff_lik = llnew - ll; //MYprintf(MYstderr, "diff=%g\n", diff_post-diff_lik); //assert(diff_post == diff_lik); /* add in the priors for the itemp (weights) */ double diff_p_itemp = log(its->ProposedProb()) - log(its->Prob()); /* Calcculate the MH acceptance ratio */ //double alpha = exp(diff_post + diff_p_itemp)*q_bak/q_fwd; double alpha = exp(diff_lik + diff_p_itemp)*q_bak/q_fwd; double ru = runi(state); if(ru < alpha) { its->Keep(itemp_new, burnin); t->NewInvTemp(itemp_new); } else { its->Reject(itemp_new, burnin); } /* stochastic approximation update of psuedo-prior, only actually does something if its->resetSA() has been called first, see the Model::StochApprox() function */ its->StochApprox(); } /* * Posterior: * * Compute full posterior of the model, tempered and untempered. * Record best posterior as a function of tree height. * * The importance sampling weight is returned, the argument indicates * whether or not a trace should be recorded for the current posterior * probability */ double Model::Posterior(bool record) { /* tempered and untemepered posteriors, from tree on down */ double full_post_temp = t->FullPosterior(its->Itemp(), Tprior); double full_post = t->FullPosterior(1.0, Tprior); /* include priors hierarchical (linear) params W, B0, etc. and the hierarchical corr prior priors in the Base module */ double hier_full_post = base_prior->log_HierPrior(); full_post_temp += hier_full_post; full_post += hier_full_post; /* importance sampling weight */ double w = exp(full_post - full_post_temp); /* if(get_curr_itemp(itemps) == 1.0) assert(w==1.0); */ /* see if this is (untempered) the MAP model; if so then record */ register_posterior(posteriors, t, full_post); // register_posterior(posteriors, t, t->MarginalPosterior(1.0)); /* record the (log) posterior as a function of height */ if(trace && record) { /* allocate the trace files for printing posteriors*/ if(!POSTTRACEFILE) { POSTTRACEFILE = OpenFile("trace", "post"); MYprintf(POSTTRACEFILE, "height leaves lpost itemp tlpost w\n"); } /* write a line to the file recording the trace of the posteriors */ MYprintf(POSTTRACEFILE, "%d %d %15f %15f %15f %15f\n", t->Height(), t->numLeaves(), full_post, its->Itemp(), full_post_temp, w); MYflush(POSTTRACEFILE); } return w; } /* * PrintPosteriors: * * print the highest posterior trees for each height * in the R CART tree structure format * doesn't do anything if no posteriors were recorded */ void Model::PrintPosteriors(void) { char filestr[MEDBUFF]; /* open a file to write the posterior information to */ sprintf(filestr, "tree_m%d_posts.out", Id); FILE *postsfile = fopen(filestr, "w"); MYprintf(postsfile, "height lpost "); PriorTraceNames(postsfile, true); /* unsigned int t_minpart, t_splitmin; double t_alpha, t_beta; params->get_T_params(&t_alpha, &t_beta, &t_minpart, &t_splitmin); */ for(unsigned int i=0; imaxd; i++) { if(posteriors->trees[i] == NULL) continue; /* open a file to write the tree to */ sprintf(filestr, "tree_m%d_%d.out", Id, i+1); FILE *treefile = fopen(filestr, "w"); /* add maptree-relevant headers */ MYprintf(treefile, "rows var n dev yval splits.cutleft splits.cutright "); /* the following are for printing a higher precision val, and base model parameters for reconstructing trees later */ MYprintf(treefile, "val "); /* add parameter trace relevant headers */ TraceNames(treefile, true); /* write the tree and trace parameters */ posteriors->trees[i]->PrintTree(treefile, iface_rect, NORMSCALE, 1); fclose(treefile); /* add information about height and posteriors to file */ assert(i+1 == posteriors->trees[i]->Height()); MYprintf(postsfile, "%d %g ", posteriors->trees[i]->Height(), posteriors->posts[i]); /* add prior parameter trace information to the posts file */ unsigned int tlen; double *trace = (posteriors->trees[i]->GetBasePrior())->Trace(&tlen, true); printVector(trace, tlen, postsfile, MACHINE); free(trace); } fclose(postsfile); } /* * maxPosteriors: * * return a pointer to the maximum posterior tree */ Tree* Model::maxPosteriors(void) { Tree *maxt = NULL; double maxp = -1e300*1e300; for(unsigned int i=0; imaxd; i++) { if(posteriors->trees[i] == NULL) continue; if(posteriors->posts[i] > maxp) { maxt = posteriors->trees[i]; maxp = posteriors->posts[i]; } } return maxt; } /* * Linear: * * change prior to prefer all linear models force leaves (partitions) * to use the linear model; if gamlin[0] == 0, then do nothing and * return 0, because the linear is model not allowed */ double Model::Linear(void) { //if(! base_prior->LLM()) return 0; double gam = base_prior->ForceLinear(); /* toggle linear in each of the leaves */ unsigned int numLeaves = 1; Tree **leaves = t->leavesList(&numLeaves); for(unsigned int i=0; iForceLinear(); free(leaves); return gam; } /* * ResetLinear: (unlinearize) * * does not change all leaves to full GP models; * instead simply changes the prior gamma (from gamlin) * to allow for non-linear models */ void Model::ResetLinear(double gam) { base_prior->ResetLinear(gam); /* if LLM not allowed, then toggle GP in each of the leaves */ if(gam == 0) { unsigned int numLeaves = 1; Tree **leaves = t->leavesList(&numLeaves); for(unsigned int i=0; iForceNonlinear(); } } /* * Linburn: * * forced initialization of the Markov Chain using * the Bayesian Linear CART model. Must undo linear * settings before returning. Does nothing if Linear() * determines that the original gamlin[0] was 0 */ void Model::Linburn(unsigned int B, void *state) { double gam = Linear(); //if(gam) { if(verb > 0) MYprintf(OUTFILE, "\nlinear model init:\n"); rounds(NULL, B, B, state); ResetLinear(gam); //} } /* * Burnin: * * B rounds of burn in (with NULL preds) */ void Model::Burnin(unsigned int B, void *state) { if(verb >= 1 && B>0) MYprintf(OUTFILE, "\nburn in:\n"); rounds(NULL, B, B, state); } /* * StochApprox: * * B rounds of "burn-in" (with NULL preds), and stochastic * approximation turned on for jump-starting the pseudo-prior * for Simulated Tempering */ void Model::StochApprox(unsigned int B, void *state) { if(!its->DoStochApprox()) return; if(verb >= 1 && B>0) MYprintf(OUTFILE, "\nburn in: [with stoch approx (c0,n0)=(%g,%g)]\n", its->C0(), its->N0()); /* do the rounds of stochastic approximation */ its->ResetSA(); rounds(NULL, B, B, state); /* stop stochastic approximation and normalize the weights */ its->StopSA(); its->Normalize(); } /* * Sample: * * Gather R samples from the Markov Chain, for predictive data * provided by the preds variable. */ void Model::Sample(Preds *preds, unsigned int R, void *state) { if(R == 0) return; if(verb >= 1 && R>0) { MYprintf(OUTFILE, "\nSampling @ nn=%d pred locs:", preds->nn); if(trace) MYprintf(OUTFILE, " [with traces]"); MYprintf(OUTFILE, "\n"); } rounds(preds, 0, R, state); } /* * Predict: * * simply predict in rounds conditional on the (MAP) parameters theta; * i.e., don't draw base (GP) parameters or modify tree */ void Model::Predict(Preds *preds, unsigned int R, void *state) { if(R == 0) return; assert(preds); if(verb >=1) MYprintf(OUTFILE, "\nKriging @ nn=%d predictive locs:\n", preds->nn); /* get leaves of the tree */ unsigned int numLeaves; Tree **leaves = t->leavesList(&numLeaves); assert(numLeaves > 0); /* for helping with periodic interrupts */ time_t itime = time(NULL); for(unsigned int r=0; r0 && verb >= 1) PrintState(r+1, 0, NULL); /* produce leaves for parallel prediction */ if(parallel && PP && PP->Len() > PPMAX) produce(); /* process full posterior, and calculate linear area */ if(r % preds->mult == 0) { /* For random XX (eg sensitivity analysis), draw the predictive locations */ if(preds->nm > 0){ sens_sample(preds->XX, preds->nn, preds->d, preds->bnds, preds->shape, preds->mode, state); dupv(preds->M[r/preds->mult], preds->XX[0], preds->d * preds->nm); //printf("xx: \n"); printMatrix(preds->XX, preds->nn, preds->d, MYstdout); normalize(preds->XX, preds->rect, preds->nn, preds->d, 1.0); } /* keep track of MAP, and calculate importance sampling weight */ if(its->IT_ST_or_IS()) { preds->w[r/preds->mult] = 1.0; //Posterior(false); preds->itemp[r/preds->mult] = its->Itemp(); } /* predict for each leaf */ /* make sure to do this after calculation of preds->w[r], above */ for(unsigned int i=0; iDs2x) scalev(preds->Ds2x[0], preds->R * preds->nn, 1.0/preds->nn); } /* * Print: * * Prints to OUTFILE, the current (prior) parameter settings for the * model. */ void Model::Print(void) { params->Print(OUTFILE); base_prior->Print(OUTFILE); } /* * TraceNames * * write the names of the tree (or base) model traces * to the specified outfile. This function does not check * that trace = TRUE since it is also used by PrintTree() */ void Model::TraceNames(FILE * outfile, bool full) { assert(outfile); unsigned int len; char **trace_names = t->TraceNames(&len, full); for(unsigned int i=0; iTraceNames(&len, full); for(unsigned int i=0; iTrace(index, XXTRACEFILE); MYflush(XXTRACEFILE); /* unlock */ #ifdef PARALLEL pthread_mutex_unlock(l_trace_mut); #endif } /* * Temp: * * Return the importance annealing temperature * known by the model */ double Model::iTemp(void) { return its->Itemp(); } /* * DupItemps: * * duplicate the importance temperature * structure known by the model to one provided * in the argument */ void Model::DupItemps(Temper *new_its) { *new_its = *its; } /* * PrintLinarea: * * if traces were recorded, output the trace of the linareas * to an optfile opened just for the occasion */ void Model::PrintLinarea(void) { if(!trace || !lin_area) return; FILE *outfile = OpenFile("trace", "linarea"); print_linarea(lin_area, outfile); } /* * PrintHiertrace: * * collect the traces of the hiererchical base paameters * and append them to the trace file -- if unopened, then * open the file first -- do nothing if trace=FALSE */ void Model::PrintHiertrace(void) { if(!trace) return; /* append to traces of hierarchical parameters */ /* trace of GP parameters for each XX input location */ if(!HIERTRACEFILE) { HIERTRACEFILE = OpenFile("trace", "hier"); PriorTraceNames(HIERTRACEFILE, false); } unsigned int tlen; double *trace = base_prior->Trace(&tlen, false); printVector(trace, tlen, HIERTRACEFILE, MACHINE); free(trace); } /* * ProcessLinarea: * * collect the linarea statistics over time -- if * not allocated already, allocate lin_area; should only * be doing this if trace=TRUE and we are not forcing the * LLM */ void Model::ProcessLinarea(Tree **leaves, unsigned int numLeaves) { if(!trace) return; /* traces of aread under the LLM */ if(lin_area == NULL && base_prior->GamLin(0) > 0) { lin_area = new_linarea(); } if(lin_area) process_linarea(lin_area, numLeaves, leaves); else return; } tgp/src/rand_draws.h0000644000175100001440000000603412655414756014170 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __RAND_DRAWS_H__ #define __RAND_DRAWS_H__ #include #define CRAN 901 #define RK 902 #define ERAND 903 #define RNG RK void gamma_mult(double *x, double alpha, double beta, unsigned int cases, void *state); void gamma_mult_gelman(double *x, double alpha, double beta, unsigned int cases, void *state); void inv_gamma_mult_gelman(double *x, double alpha, double beta, unsigned int cases, void *state); void beta_mult(double *x, double alpha, double beta, unsigned int cases, void *state); void wishrnd(double **x, double **S, unsigned int n, unsigned int nu, void *state); void mvnrnd(double *x, double *mu, double **cov, unsigned int n, void *state); void mvnrnd_mult(double *x, double *mu, double **Sigma, unsigned int n, unsigned int cases, void *state); void rnor(double *x, void *state); void rnorm_mult(double *x, unsigned int n, void *state); double runi(void *state); void runif_mult(double* r, double a, double b, unsigned int n, void *state); void dsample(double *x_out, unsigned int *x_indx, unsigned int n, unsigned int num_probs, double *X, double *probs, void *state); void isample(int *x_out, unsigned int *x_indx, unsigned int n, unsigned int num_probs, int *X, double *probs, void *state); void isample_norep(int *x_out, unsigned int *x_indx, unsigned int n, unsigned int num_probs, int *X, double *probs, void *state); int sample_seq(int from, int to, void *state); double rgamma1(double aa, void *state); double rbet(double aa, double bb, void *state); unsigned int rpoiso(float xm, void *state); double* compute_probs(double* criteria, unsigned int nn, double alpha); void propose_indices(int *di, double prob, void *state); void get_indices(int *i, double *parameter); unsigned int* rand_indices(unsigned int N, void* state); void* newRNGstate(unsigned long s); void* newRNGstate_rand(void *s); void deleteRNGstate(void *seed); void printRNGstate(void *state, FILE* outfile); unsigned long three2lstate(int *state); #endif tgp/src/matern.cc0000644000175100001440000005214712655414756013476 0ustar hornikusers /******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "matrix.h" #include "lh.h" #include "rand_draws.h" #include "rand_pdf.h" #include "all_draws.h" #include "gen_covar.h" #include "rhelp.h" } #include "corr.h" #include "params.h" #include "model.h" #include "matern.h" #include #include #include #include #include #include #include using namespace std; #define BUFFMAX 256 #define PWR 1.0 /* * Matern: * * constructor function */ Matern::Matern(unsigned int dim, Base_Prior *base_prior) : Corr(dim, base_prior) { /* sanity checks */ assert(base_prior->BaseModel() == GP); assert( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == MATERN); /* set the prior */ prior = ((Gp_Prior*) base_prior)->CorrPrior(); assert(prior); /* check if we should really be starting in the LLM */ if(!prior->Linear() && !prior->LLM()) linear = false; /* get default nugget for starters */ nug = prior->Nug(); /* get defualt nu for starters, and assert that it is positive */ nu = ((Matern_Prior*) prior)->NU(); assert(nu > 0); /* allocate vector for K_bessel */ nb = (long) floor(nu)+1; bk = new_vector(nb); /* set up stuff for the range parameter */ d = ((Matern_Prior*) prior)->D(); xDISTx = NULL; nd = 0; dreject = 0; } /* * Matern (assignment operator): * * used to assign the parameters of one correlation * function to anothers. Both correlation functions * must already have been allocated. */ Corr& Matern::operator=(const Corr &c) { Matern *e = (Matern*) &c; /* copy nu parameter */ nu = e->nu; /* allocate a new bk if nb has changed */ if(floor(nu)+1 != nb) { free(bk); nb = (long) floor(nu)+1; bk = new_vector(nb); } /* copy "global" correllation stuff */ log_det_K = e->log_det_K; linear = e->linear; /* copy stuff for range parameter; don't copy nd */ d = e->d; dreject = e->dreject; /* copy nugget */ nug = e->nug; /* sanity checks */ assert(prior->CorrModel() == MATERN); assert(prior == ((Gp_Prior*) base_prior)->CorrPrior()); /* copy the covariance matrices -- no longer performed due the new economy argument in Gp/Base */ // Cov(e); return *this; } /* * ~Matern: * * destructor */ Matern::~Matern(void) { if(bk) free(bk); if(xDISTx) delete_matrix(xDISTx); xDISTx = NULL; } /* * Init: * * initialise this corr function with the parameters provided * from R via the vector of doubles */ void Matern::Init(double *dmat) { d = dmat[1]; NugInit(dmat[0], ! (bool) dmat[2]); } /* * Jitter: * * fill jitter[ ] with the variance inflation factor. That is, * the variance for an observation with covariates in the i'th * row of X will be s2*(1.0 + jitter[i]). In standard tgp, the * jitter is simply the nugget. But for calibration and mr tgp, * the jitter value depends upon X (eg real or simulated data). * */ double* Matern::Jitter(unsigned int n1, double **X) { double *jitter = new_vector(n1); for(unsigned int i=0; in); if(runi(state) > 0.5) return false; /* make the draw */ double nug_new = nug_draw_margin(n, col, nug, F, Z, K, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, prior->NugAlpha(), prior->NugBeta(), gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) linear, itemp, state); /* did we accept the draw? */ if(nug_new != nug) { nug = nug_new; success = true; swap_new(Vb, bmu, lambda); } return success; } /* * Update: (symmetric) * * compute correlation matrix K */ void Matern::Update(unsigned int n, double **X) { if(linear) return; assert(this->n == n); if(!xDISTx || nd != n) { if(xDISTx) delete_matrix(xDISTx); xDISTx = new_matrix(n, n); nd = n; } dist_symm(xDISTx, dim, X, n, PWR); matern_dist_to_K_symm(K, xDISTx, d, nu, bk, nug, n); //delete_matrix(xDISTx); } /* * Update: (symmetric) * * takes in a (symmetric) distance matrix and * returns a correlation matrix */ void Matern::Update(unsigned int n, double **K, double **X) { double ** xDISTx = new_matrix(n, n); dist_symm(xDISTx, dim, X, n, PWR); matern_dist_to_K_symm(K, xDISTx, d, nu, bk, nug, n); delete_matrix(xDISTx); } /* * Update: (non-symmetric) * * takes in a distance matrix and * returns a correlation matrix */ void Matern::Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX) { double **xxDISTx = new_matrix(n2, n1); dist(xxDISTx, dim, XX, n1, X, n2, PWR); matern_dist_to_K(K, xxDISTx, d, nu, bk, nug, n1, n2); delete_matrix(xxDISTx); } /* * Draw: * * draw parameters for a new correlation matrix; * returns true if the correlation matrix (passed in) * has changed; otherwise returns false */ int Matern::Draw(unsigned int n, double **F, double **X, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state) { int success = 0; bool lin_new; double q_fwd , q_bak, d_new; /* sometimes skip this Draw for linear models for speed */ if(linear && runi(state) > 0.5) return DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); /* proppose linear or not */ if(prior->Linear()) lin_new = true; else { q_fwd = q_bak = 1.0; d_proposal(1, NULL, &d_new, &d, &q_fwd, &q_bak, state); if(prior->LLM()) lin_new = linear_rand(&d_new, 1, prior->GamLin(), state); else lin_new = false; } /* if not linear than compute new distances */ /* allocate K_new, Ki_new, Kchol_new */ if(! lin_new) { if(!xDISTx || nd != n) { if(xDISTx) delete_matrix(xDISTx); xDISTx = new_matrix(n, n); nd = n; } dist_symm(xDISTx, dim, X, n, PWR); allocate_new(n); assert(n == this->n); } /* d; rebuilding K, Ki, and marginal params, if necessary */ if(prior->Linear()) d_new = d; else { Gp_Prior *gp_prior = (Gp_Prior*) base_prior; Matern_Prior* ep = (Matern_Prior*) prior; success = matern_d_draw_margin(n, col, d_new, d, F, Z, xDISTx, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, nug, nu, bk, q_bak/q_fwd, ep->DAlpha(), ep->DBeta(), gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) lin_new, itemp, state); } /* did we accept the new draw? */ if(success == 1) { d = d_new; linear = (bool) lin_new; swap_new(Vb, bmu, lambda); dreject = 0; } else if(success == -1) return success; else if(success == 0) dreject++; /* abort if we have had too many rejections */ if(dreject >= REJECTMAX) return -2; /* draw nugget */ bool changed = DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); success = success || changed; /* return true if anything has changed about the corr matrix */ return success; } /* * Combine: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ void Matern::Combine(Corr *c1, Corr *c2, void *state) { get_delta_d((Matern*)c1, (Matern*)c2, state); CombineNug(c1, c2, state); } /* * Split: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void Matern::Split(Corr *c1, Corr *c2, void *state) { propose_new_d((Matern*) c1, (Matern*) c2, state); SplitNug(c1, c2, state); } /* * get_delta_d: * * compute d from two ds (used in prune) */ void Matern::get_delta_d(Matern* c1, Matern* c2, void *state) { double dch[2]; int ii[2]; dch[0] = c1->d; dch[1] = c2->d; propose_indices(ii, 0.5, state); d = dch[ii[0]]; linear = linear_rand(&d, 1, prior->GamLin(), state); } /* * propose_new_d: * * propose new D parameters for possible * new children partitions. */ void Matern::propose_new_d(Matern* c1, Matern* c2, void *state) { int i[2]; double dnew[2]; Matern_Prior *ep = (Matern_Prior*) prior; propose_indices(i, 0.5, state); dnew[i[0]] = d; if(prior->Linear()) dnew[i[1]] = d; else dnew[i[1]] = d_prior_rand(ep->DAlpha(), ep->DBeta(), state); c1->d = dnew[0]; c2->d = dnew[1]; c1->linear = (bool) linear_rand(&(dnew[0]), 1, prior->GamLin(), state); c2->linear = (bool) linear_rand(&(dnew[1]), 1, prior->GamLin(), state); } /* * State: * * return a string depecting the state * of the (parameters of) correlation function */ char* Matern::State(unsigned int which) { char buffer[BUFFMAX]; #ifdef PRINTNUG string s = "(d="; #else string s = ""; #endif if(linear) sprintf(buffer, "0(%g)", d); else sprintf(buffer, "%g", d); s.append(buffer); #ifdef PRINTNUG sprintf(buffer, ", g=%g)", nug); s.append(buffer); #endif char* ret_str = (char*) malloc(sizeof(char) * (s.length()+1)); strncpy(ret_str, s.c_str(), s.length()); ret_str[s.length()] = '\0'; return ret_str; } /* * sum_b: * * return 1 if linear, 0 otherwise */ unsigned int Matern::sum_b(void) { if(linear) return 1; else return 0; } /* * ToggleLinear: * * make linear if not linear, otherwise * make not linear */ void Matern::ToggleLinear(void) { if(linear) { linear = false; } else { linear = true; } } /* * D: * * return the range parameter */ double Matern::D(void) { return d; } /* * NU: * * return the nu parameter */ double Matern::NU(void) { return nu; } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug). Does not * include hierarchical prior params; see log_HierPrior * below */ double Matern::log_Prior(void) { double prob = ((Corr*)this)->log_NugPrior(); prob += ((Matern_Prior*) prior)->log_Prior(d, linear); return prob; } /* * TraceNames: * * return the names of the parameters recorded by Matern::Trace() */ char** Matern::TraceNames(unsigned int* len) { *len = 4; char **trace = (char**) malloc(sizeof(char*) * (*len)); trace[0] = strdup("nug"); trace[1] = strdup("d"); trace[2] = strdup("b"); /* determinant of K */ trace[3] = strdup("ldetK"); return trace; } /* * Trace: * * return the current values of the parameters * to this correlation function */ double* Matern::Trace(unsigned int* len) { *len = 4; double *trace = new_vector(*len); trace[0] = nug; trace[1] = d; trace[2] = (double) !linear; /* determinant of K */ trace[3] = log_det_K; return trace; } /* * newCorr: * * construct and return a new isotropic exponential correlation * function with this module governing its prior parameterization */ Corr* Matern_Prior::newCorr(void) { return new Matern(dim, base_prior); } /* * Matern_Prior: * * constructor for the prior distribution for * the exponential correlation function */ Matern_Prior::Matern_Prior(unsigned int dim) : Corr_Prior(dim) { corr_model = MATERN; /* defaults */ d = 0.5; nu = 1.0; default_d_priors(); default_d_lambdas(); } /* * Init: * * read hiererchial prior parameters from a double-vector * */ void Matern_Prior::Init(double *dhier) { d_alpha[0] = dhier[0]; d_beta[0] = dhier[1]; d_alpha[1] = dhier[2]; d_beta[1] = dhier[3]; NugInit(&(dhier[4])); } /* * Dup: * * duplicate this prior for the isotropic exponential * power family */ Corr_Prior* Matern_Prior::Dup(void) { return new Matern_Prior(this); } /* * Matern_Prior (new duplicate) * * duplicating constructor for the prior distribution for * the exponential correlation function */ Matern_Prior::Matern_Prior(Corr_Prior *c) : Corr_Prior(c) { Matern_Prior *e = (Matern_Prior*) c; assert(e->corr_model == MATERN); corr_model = e->corr_model; dupv(gamlin, e->gamlin, 3); d = e->d; nu = e->nu; fix_d = e->fix_d; dupv(d_alpha, e->d_alpha, 2); dupv(d_beta, e->d_beta, 2); dupv(d_alpha_lambda, e->d_alpha_lambda, 2); dupv(d_beta_lambda, e->d_beta_lambda, 2); } /* * ~Matern_Prior: * * destructor the the prior distribution for * the exponential correlation function */ Matern_Prior::~Matern_Prior(void) { } /* * read_double: * * read prior parameterization from a vector of doubles * passed in from R */ void Matern_Prior::read_double(double *dparams) { /* read the parameters that have to to with the * nugget first */ read_double_nug(dparams); /* starting value for the range parameter */ d = dparams[1]; // MYprintf(MYstdout, "starting range=%g\n", d); /* reset dparams to start after the nugget gamlin params */ dparams += 13; /* initial parameter settings for alpha and beta */ get_mix_prior_params_double(d_alpha, d_beta, &(dparams[0]), "d"); dparams += 4; /* reset */ /* d hierarchical lambda prior parameters */ if((int) dparams[0] == -1) { fix_d = true; /*MYprintf(MYstdout, "fixing d prior\n");*/ } else { fix_d = false; get_mix_prior_params_double(d_alpha_lambda, d_beta_lambda, &(dparams[0]), "d lambda"); } dparams += 4; /* reset */ /* read the fixed nu parameter */ nu = dparams[0]; // MYprintf(MYstdout, "fixed nu=%g\n", nu); dparams += 1; /* reset */ } /* * read_ctrlfile: * * read prior parameterization from a control file */ void Matern_Prior::read_ctrlfile(ifstream *ctrlfile) { char line[BUFFMAX], line_copy[BUFFMAX]; /* read the parameters that have to do with the * nugget first */ read_ctrlfile_nug(ctrlfile); /* read the d parameter from the control file */ ctrlfile->getline(line, BUFFMAX); d = atof(strtok(line, " \t\n#")); MYprintf(MYstdout, "starting d=%g\n", d); /* read d and nug-hierarchical parameters (mix of gammas) */ ctrlfile->getline(line, BUFFMAX); get_mix_prior_params(d_alpha, d_beta, line, "d"); /* d hierarchical lambda prior parameters */ ctrlfile->getline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_d = true; MYprintf(MYstdout, "fixing d prior\n"); } else { fix_d = false; get_mix_prior_params(d_alpha_lambda, d_beta_lambda, line, "d lambda"); } /* read the (fixed) nu parameter */ ctrlfile->getline(line, BUFFMAX); nu = atof(strtok(line, " \t\n#")); MYprintf(MYstdout, "fixed nu=%g\n", nu); } /* * default_d_priors: * * set d prior parameters * to default values */ void Matern_Prior::default_d_priors(void) { d_alpha[0] = 1.0; d_beta[0] = 20.0; d_alpha[1] = 10.0; d_beta[1] = 10.0; } /* * default_d_lambdas: * * set d (lambda) hierarchical prior parameters * to default values */ void Matern_Prior::default_d_lambdas(void) { d_alpha_lambda[0] = 1.0; d_beta_lambda[0] = 10.0; d_alpha_lambda[1] = 1.0; d_beta_lambda[1] = 10.0; fix_d = false; //fix_d = true; } /* * D: * * return the default nu parameter setting * for the exponential correllation function */ double Matern_Prior::D(void) { return d; } /* * NU: * * return the nu parameter */ double Matern_Prior::NU(void) { return nu; } /* * DAlpha: * * return the alpha prior parameter setting to the gamma * distribution prior for the nu parameter */ double* Matern_Prior::DAlpha(void) { return d_alpha; } /* * DBeta: * * return the beta prior parameter setting to the gamma * distribution prior for the nu parameter */ double* Matern_Prior::DBeta(void) { return d_beta; } /* * Draw: * * draws for the hierarchical priors for the Matern * correlation function which are * contained in the params module */ void Matern_Prior::Draw(Corr **corr, unsigned int howmany, void *state) { if(!fix_d) { double *d = new_vector(howmany); for(unsigned int i=0; iD(); mixture_priors_draw(d_alpha, d_beta, d, howmany, d_alpha_lambda, d_beta_lambda, state); free(d); } /* hierarchical prior draws for the nugget */ DrawNugHier(corr, howmany, state); } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug) */ double Matern_Prior::log_Prior(double d, bool linear) { double prob = 0; /* force linear model */ if(gamlin[0] < 0) return prob; prob += log_d_prior_pdf(d, d_alpha, d_beta); /* force GP model */ if(gamlin[0] <= 0) return prob; /* using 1.0, because of 1.0 - lin_pdf, and will adjust later */ double lin_pdf = linear_pdf(&d, 1, gamlin); if(linear) prob += log(lin_pdf); else prob += log(1.0-lin_pdf); /* return the log pdf */ return prob; } /* * BasePrior: * * return the prior for the Base (eg Gp) model */ Base_Prior* Matern_Prior::BasePrior(void) { return base_prior; } /* * SetBasePrior: * * set the base_prior field */ void Matern_Prior::SetBasePrior(Base_Prior *base_prior) { this->base_prior = base_prior; } /* * Print: * * pretty print the correllation function parameters out * to a file */ void Matern_Prior::Print(FILE *outfile) { MYprintf(MYstdout, "corr prior: matern\n"); /* print nugget stuff first */ PrintNug(outfile); /* range parameter */ // MYprintf(outfile, "starting d=%g\n", d); /* nu, smoothness parameter */ MYprintf(MYstdout, "fixed nu=%g\n", nu); /* range gamma prior */ MYprintf(outfile, "d[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha[0], d_beta[0], d_alpha[1], d_beta[1]); /* range gamma hyperprior */ if(fix_d) MYprintf(outfile, "d prior fixed\n"); else { MYprintf(MYstdout, "d lambda[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha_lambda[0], d_beta_lambda[0], d_alpha_lambda[1], d_beta_lambda[1]); } } /* * log_HierPrior: * * return the log prior of the hierarchial parameters * to the correllation parameters (i.e., range and nugget) */ double Matern_Prior::log_HierPrior(void) { double lpdf; lpdf = 0.0; /* mixture prior for the range parameter, d */ if(!fix_d) { lpdf += mixture_hier_prior_log(d_alpha, d_beta, d_alpha_lambda, d_beta_lambda); } /* mixture prior for the nugget */ lpdf += log_NugHierPrior(); return lpdf; } /* * Trace: * * return the current values of the hierarchical * parameters to this correlation function: * nug(alpha,beta), d(alpha,beta), then linear */ double* Matern_Prior::Trace(unsigned int* len) { /* first get the hierarchical nug parameters */ unsigned int clen; double *c = NugTrace(&clen); /* calculate and allocate the new trace, which will include the nug trace */ *len = 4; double* trace = new_vector(clen + *len); trace[0] = d_alpha[0]; trace[1] = d_beta[0]; trace[2] = d_alpha[1]; trace[3] = d_beta[1]; /* then copy in the nug trace */ dupv(&(trace[*len]), c, clen); /* new combined length, and free c */ *len += clen; if(c) free(c); else assert(clen == 0); return trace; } /* * TraceNames: * * return the names of the traces recorded in Matern_Prior::Trace() */ char** Matern_Prior::TraceNames(unsigned int* len) { /* first get the hierarchical nug parameters */ unsigned int clen; char **c = NugTraceNames(&clen); /* calculate and allocate the new trace, which will include the nug trace */ *len = 4; char** trace = (char**) malloc(sizeof(char*) * (clen + *len)); trace[0] = strdup("d.a0"); trace[1] = strdup("d.g0"); trace[2] = strdup("d.a1"); trace[3] = strdup("d.g1"); /* then copy in the nug trace */ for(unsigned int i=0; i #include "gp.h" #include "base.h" //#define BUFFMAX 256 class Params { private: unsigned int d; /* dimenstion of the data */ unsigned int col; /* dimenstion of the design matrix */ double t_alpha; /* tree prior parameter alpha */ double t_beta; /* tree prior parameter beta */ unsigned int t_minpart; /* tree prior parameter minpart, smallest partition */ unsigned int t_splitmin; /* data col to start partitioning */ unsigned int t_basemax; /* data col to stop using the Base (then only use tree) */ Base_Prior *prior; public: /* start public functions */ Params(unsigned int d); Params(Params* params); ~Params(void); void read_ctrlfile(std::ifstream* ctrlfile); void read_double(double *dparams); void get_T_params(double *alpha, double *beta, unsigned int* minpart, unsigned int* splitmin, unsigned int *basemax); bool isTree(void); unsigned int T_minp(void); unsigned int T_smin(void); unsigned int T_bmax(void); Base_Prior* BasePrior(void); void Print(FILE *outfile); }; void get_mix_prior_params(double *alpha, double *beta, char *line, const char* which); void get_mix_prior_params_double(double *alpha, double *beta, double *alpha_beta, const char* which); #endif tgp/src/rhelp.h0000644000175100001440000000142212655414756013152 0ustar hornikusers#ifndef __RHELP_H__ #define __RHELP_H__ #include #include /* this is now covered by -D RPRINT flags in Makevars */ /*#define RPRINT*/ #ifndef RPRINT void warning(const char *str, ...); void error(const char *str, ...); #define DOUBLE_EPS 2.220446e-16 #define M_LN_SQRT_2PI 0.918938533204672741780329736406 #include #define MYstdout stdout #define MYstderr stderr #else // #include // #include // #include // #include #include extern FILE *MYstdout, *MYstderr; #endif // void R_FlushConsole(void); /* R < 2.3 does not have this in R.h (in Rinterface.h) */ void MYprintf(FILE *outfile, const char *str, ...); void MYflush(FILE *outfile); time_t MY_r_process_events(time_t itime); #endif tgp/src/sim.h0000644000175100001440000001062012655414756012630 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __SIM_H__ #define __SIM_H__ #include "corr.h" class Sim_Prior; /* * CLASS for the implementation of the single index model * power family of correlation functions */ class Sim : public Corr { private: double *d; /* index parameter parameter */ unsigned int dreject; /* d rejection counter */ public: Sim(unsigned int dim, Base_Prior *base_prior); virtual Corr& operator=(const Corr &c); virtual ~Sim(void); virtual void Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX); virtual void Update(unsigned int n1, double **X); virtual void Update(unsigned int n1, double **K, double **X); virtual int Draw(unsigned int n, double **F, double **X, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); virtual void Combine(Corr *c1, Corr *c2, void *state); virtual void Split(Corr *c1, Corr *c2, void *state); virtual char* State(unsigned int which); virtual bool DrawNugs(unsigned int n, double **X, double **F, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); virtual double* Trace(unsigned int* len); virtual char** TraceNames(unsigned int* len); virtual void Init(double *dexpsep); virtual double* Jitter(unsigned int n1, double **X); virtual double* CorrDiag(unsigned int n1, double **X); /* unused functions */ virtual unsigned int sum_b(void); virtual void ToggleLinear(void); void get_delta_d(Sim* c1, Sim* c2, void *state); void propose_new_d(Sim* c1, Sim* c2, void *state); void propose_new_d(double* d_new, double *q_fwd, double *q_bak, void *state); virtual double log_Prior(void); void draw_d_from_prior(double *d_new, void *state); double *D(void); }; /* * CLASS for the prior parameterization of the separable * exponential power family of correlation functions */ class Sim_Prior : public Corr_Prior { private: double *d; double **dp_cov_chol; /* prior standard deviation for proposals */ // double **dp_Rho; /* prior standard deviation for proposals */ double **d_alpha; /* d gamma-mixture prior alphas */ double **d_beta; /* d gamma-mixture prior beta */ bool fix_d; /* estimate d-mixture parameters or not */ double d_alpha_lambda[2]; /* d prior alpha lambda parameter */ double d_beta_lambda[2]; /* d prior beta lambda parameter */ public: Sim_Prior(unsigned int dim); Sim_Prior(Corr_Prior *c); virtual ~Sim_Prior(void); virtual void read_double(double *dprior); virtual void read_ctrlfile(std::ifstream* ctrlfile); virtual Corr_Prior* Dup(void); virtual void Draw(Corr **corr, unsigned int howmany, void *state); virtual Corr* newCorr(void); virtual void Print(FILE *outfile); virtual Base_Prior* BasePrior(void); virtual void SetBasePrior(Base_Prior *base_prior); virtual double log_HierPrior(void); virtual double* Trace(unsigned int* len); virtual char** TraceNames(unsigned int* len); virtual void Init(double *dhier); void draw_d_from_prior(double *d_new, void *state); double* D(void); double** DAlpha(void); double** DBeta(void); double** DpCov_chol(void); // double** DpRho(void); void default_d_priors(void); void default_d_lambdas(void); double log_Prior(double *d); double log_DPrior_pdf(double *d); void DPrior_rand(double *d_new, void *state); }; #endif tgp/src/mstructs.cc0000644000175100001440000003036612655414756014073 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "rand_draws.h" #include "matrix.h" } #include "mstructs.h" #include "temper.h" #include #include #include #define MEDBUFF 256 /* * new_preds: * * new preds structure makes it easier to pass around * the storage for the predictions and the delta * statistics */ Preds* new_preds(double **XX, unsigned int nn, unsigned int n, unsigned int d, double **rect, unsigned int R, bool pred_n, bool krige, bool it, bool delta_s2, bool improv, bool sens, unsigned int every) { /* allocate structure */ Preds* preds = (Preds*) malloc(sizeof(struct preds)); /* copy data size variables */ preds->nn = nn; preds->n = n; preds->d = d; preds->R = (int) ceil(((double)R)/every); preds->mult = every; /* allocations needed for sensitivity analysis */ if(sens){ /* sanity check */ assert(XX); /* XX initialized to zero is used for sens -- the XX * argument holds other information here, see below */ preds->XX=new_zero_matrix(nn,d); if(rect) preds->rect=new_dup_matrix(rect,2,d); else preds->rect = NULL; /* don't know why this is here */ /* copy information passed through the XX argument */ preds->bnds = new_dup_matrix(XX, 2, d); preds->shape = new_dup_vector(XX[2],d); preds->mode = new_dup_vector(XX[3],d); /* allocate M */ preds->nm = nn/(d+2); preds->M = new_zero_matrix(preds->R, d*preds->nm); } else { /* sens FALSE */ /* otherwise null when not used */ preds->mode = preds->shape = NULL; preds->bnds = preds->M = NULL; preds->nm = 0; /* special handling of rect when not doing sens */ assert(rect); preds->rect = new_dup_matrix(rect,2,d); preds->XX = new_normd_matrix(XX,nn,d,rect,NORMSCALE); } /* continue with allocations and assignment regardless * of whether sensitivity analysis is being performed */ /* keep track of importance tempering (IT) weights and inv-temps */ if(it) { preds->w = ones(preds->R, 1.0); preds->itemp = ones(preds->R, 1.0); } else { preds->w = preds->itemp = NULL; } /* samples from the posterior predictive distribution */ preds->ZZ = new_zero_matrix(preds->R, nn); preds->Zp = new_zero_matrix(preds->R, n*pred_n); /* allocations only necessary when saving kriging data */ if(krige) { preds->ZZm = new_zero_matrix(preds->R, nn); preds->ZZvm = new_zero_matrix(preds->R, nn); preds->ZZs2 = new_zero_matrix(preds->R, nn); preds->Zpm = new_zero_matrix(preds->R, n*pred_n); preds->Zpvm = new_zero_matrix(preds->R, n*pred_n); preds->Zps2 = new_zero_matrix(preds->R, n * pred_n); } else { preds->ZZm = preds->ZZvm = preds->ZZs2 = preds->Zpm = preds->Zpvm = preds->Zps2 = NULL; } /* allocations only necessary when calculating ALC and Improv * statistics */ if(delta_s2) preds->Ds2x = new_zero_matrix(preds->R, nn); else preds->Ds2x = NULL; if(improv) preds->improv = new_zero_matrix(preds->R, nn); else preds->improv = NULL; return preds; } /* * import_preds: * * Copy preds data from from to to. * "es not copy the sens information in the current implementation * (not sure whether this will be necessary at a later juncture). */ void import_preds(Preds* to, unsigned int where, Preds *from) { assert(where >= 0); assert(where <= to->R); assert(where + from->R <= to->R); assert(to->nn == from->nn); assert(to->n == from->n); assert(to->nm == from->nm); assert(to->d == to->d); if(from->w) dupv(&(to->w[where]), from->w, from->R); if(from->itemp) dupv(&(to->itemp[where]), from->itemp, from->R); if(from->ZZ) dupv(to->ZZ[where], from->ZZ[0], from->R * from->nn); if(from->ZZm) dupv(to->ZZm[where], from->ZZm[0], from->R * from->nn); if(from->ZZvm) dupv(to->ZZvm[where], from->ZZvm[0], from->R * from->nn); if(from->ZZs2) dupv(to->ZZs2[where], from->ZZs2[0], from->R * from->nn); if(from->Zp) dupv(to->Zp[where], from->Zp[0], from->R * from->n); if(from->Zpm) dupv(to->Zpm[where], from->Zpm[0], from->R * from->n); if(from->Zpvm) dupv(to->Zpvm[where], from->Zpvm[0], from->R * from->n); if(from->Zps2) dupv(to->Zps2[where], from->Zps2[0], from->R * from->n); if(from->Ds2x) dupv(to->Ds2x[where], from->Ds2x[0], from->R * from->nn); if(from->improv) dupv(to->improv[where], from->improv[0], from->R * from->nn); if(from->M) dupv(to->M[where], from->M[0], from->R * from->nm * from->d); } /* * combine_preds: * * create and return a new preds structure with the * combined contents of preds to and preds from. * (to and from must be of same dimenstion, but may * be of different size) */ Preds *combine_preds(Preds *to, Preds *from) { assert(from); if(to == NULL) return from; if(to->nn != from->nn) MYprintf(MYstderr, "to->nn=%d, from->nn=%d\n", to->nn, from->nn); assert(to->nn == from->nn); assert(to->d == from->d); assert(to->mult == from->mult); Preds *preds = new_preds(to->XX, to->nn, to->n, to->d, NULL, (to->R + from->R)*to->mult, (bool) ((to->Zp!=NULL)), (bool) ((to->Zps2!=NULL) || (to->ZZs2!=NULL)), (bool) (to->w != NULL), (bool) to->Ds2x, (bool) to->improv, ((bool) (to->nm>0)), to->mult); import_preds(preds, 0, to); import_preds(preds, to->R, from); delete_preds(to); delete_preds(from); return preds; } /* * delete_preds: * * destructor for preds structure */ void delete_preds(Preds* preds) { if(preds->w) free(preds->w); if(preds->itemp) free(preds->itemp); if(preds->XX) delete_matrix(preds->XX); if(preds->ZZ) delete_matrix(preds->ZZ); if(preds->ZZm) delete_matrix(preds->ZZm); if(preds->ZZvm) delete_matrix(preds->ZZvm); if(preds->ZZs2) delete_matrix(preds->ZZs2); if(preds->Zp) delete_matrix(preds->Zp); if(preds->Zpm) delete_matrix(preds->Zpm); if(preds->Zpvm) delete_matrix(preds->Zpvm); if(preds->Zps2) delete_matrix(preds->Zps2); if(preds->Ds2x) delete_matrix(preds->Ds2x); if(preds->improv) delete_matrix(preds->improv); if(preds->rect) delete_matrix(preds->rect); if(preds->bnds) delete_matrix(preds->bnds); if(preds->shape) free(preds->shape); if(preds->mode) free(preds->mode); if(preds->M) delete_matrix(preds->M); free(preds); } /* * fill_larg: * * full an LArg structure with the parameters to * the each_leaf function that will be forked using * pthreads */ void fill_larg(LArgs* larg, Tree *leaf, Preds* preds, int index, bool dnorm) { larg->leaf = leaf; larg->preds = preds; larg->index = index; larg->dnorm = dnorm; } /* * new_posteriors: * * creade a new Posteriors data structure for * recording the posteriors of different tree depths * and initialize */ Posteriors* new_posteriors(void) { Posteriors* posteriors = (Posteriors*) malloc(sizeof(struct posteriors)); posteriors->maxd = 1; posteriors->posts = (double *) malloc(sizeof(double) * posteriors->maxd); posteriors->trees = (Tree **) malloc(sizeof(Tree*) * posteriors->maxd); posteriors->posts[0] = -1e300*1e300; posteriors->trees[0] = NULL; return posteriors; } /* * delete_posteriors: * * free the memory used by the posteriors * data structure, and delete the trees saved therein */ void delete_posteriors(Posteriors* posteriors) { free(posteriors->posts); for(unsigned int i=0; imaxd; i++) { if(posteriors->trees[i]) { delete posteriors->trees[i]; } } free(posteriors->trees); free(posteriors); } /* * register_posterior: * * if the posterior for the tree *t is the current largest * seen (for its height), then save it in the Posteriors * data structure. */ void register_posterior(Posteriors* posteriors, Tree* t, double post) { unsigned int height = t->Height(); /* reallocate necessary memory */ if(height > posteriors->maxd) { posteriors->posts = (double*) realloc(posteriors->posts, sizeof(double) * height); posteriors->trees = (Tree**) realloc(posteriors->trees, sizeof(Tree*) * height); for(unsigned int i=posteriors->maxd; iposts[i] = -1e300*1e300; posteriors->trees[i] = NULL; } posteriors->maxd = height; } /* if this posterior is better, record it */ if(posteriors->posts[height-1] < post) { posteriors->posts[height-1] = post; if(posteriors->trees[height-1]) delete posteriors->trees[height-1]; posteriors->trees[height-1] = new Tree(t, true); } } /* * new_linarea: * * allocate memory for the linarea structure * that keep tabs on how much of the input domain * is under the linear model */ Linarea* new_linarea(void) { Linarea *lin_area = (Linarea*) malloc(sizeof(struct linarea)); lin_area->total = 1000; lin_area->ba = new_zero_vector(lin_area->total); lin_area->la = new_zero_vector(lin_area->total); lin_area->counts = (unsigned int *) malloc(sizeof(unsigned int) * lin_area->total); reset_linarea(lin_area); return lin_area; } /* * new_linarea: * * reallocate memory for the linarea structure * that keep tabs on how much of the input domain * is under the linear model */ Linarea* realloc_linarea(Linarea* lin_area) { assert(lin_area); lin_area->total *= 2; lin_area->ba = (double*) realloc(lin_area->ba, sizeof(double) * lin_area->total); lin_area->la = (double*) realloc(lin_area->la, sizeof(double) * lin_area->total); lin_area->counts = (unsigned int *) realloc(lin_area->counts,sizeof(unsigned int)*lin_area->total); for(unsigned int i=lin_area->size; itotal; i++) { lin_area->ba[i] = 0; lin_area->la[i] = 0; lin_area->counts[i] = 0; } return lin_area; } /* * delete_linarea: * * free the linarea data structure and * all of its fields */ void delete_linarea(Linarea* lin_area) { assert(lin_area); free(lin_area->ba); free(lin_area->la); free(lin_area->counts); free(lin_area); lin_area = NULL; } /* * reset_linearea: * * re-initialize the lineara data structure */ void reset_linarea(Linarea *lin_area) { assert(lin_area); for(unsigned int i=0; itotal; i++) lin_area->counts[i] = 0; zerov(lin_area->ba, lin_area->total); zerov(lin_area->la, lin_area->total); lin_area->size = 0; } /* * process_linarea: * * tabulate the area of the leaves which are under the * linear model (and the gp model) as well as the count of linear * boolean for each dimension */ void process_linarea(Linarea* lin_area, unsigned int numLeaves, Tree** leaves) { if(!lin_area) return; if(lin_area->size + 1 > lin_area->total) realloc_linarea(lin_area); double ba = 0.0; double la = 0.0; unsigned int sumi = 0; for(unsigned int i=0; iLinarea(&sum_b, &area); la += area * linear; ba += sum_b * area; sumi += sum_b; } lin_area->ba[lin_area->size] = ba; lin_area->la[lin_area->size] = la; lin_area->counts[lin_area->size] = sumi; (lin_area->size)++; } /* * print_linarea: * * print linarea stats to the outfile * doesn't do anything if linarea is false */ void print_linarea(Linarea *lin_area, FILE *outfile) { if(!lin_area) return; // FILE *outfile = OpenFile("trace", "linarea"); MYprintf(outfile, "count\t la ba\n"); for(unsigned int i=0; isize; i++) { MYprintf(outfile, "%d\t %g %g\n", lin_area->counts[i], lin_area->la[i], lin_area->ba[i]); } fclose(outfile); } tgp/src/exp_sep.cc0000644000175100001440000010004512655414756013642 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "matrix.h" #include "lh.h" #include "rand_draws.h" #include "rand_pdf.h" #include "all_draws.h" #include "gen_covar.h" #include "rhelp.h" } #include "corr.h" #include "params.h" #include "model.h" #include "exp_sep.h" #include #include #include #include #include #include using namespace std; #define BUFFMAX 256 #define PWR 2.0 /* * ExpSep: * * constructor function */ ExpSep::ExpSep(unsigned int dim, Base_Prior *base_prior) : Corr(dim, base_prior) { /* Sanity Checks */ assert(base_prior->BaseModel() == GP); assert( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == EXPSEP); /* set pointer to correllation prior from the base prior */ prior = ((Gp_Prior*) base_prior)->CorrPrior(); assert(prior); /* check if we should really be starting in the LLM */ if(!prior->Linear() && !prior->LLM()) linear = false; /* let the prior choose the starting nugget value */ nug = prior->Nug(); /* allocate and initialize (from prior) the range params */ d = new_dup_vector(((ExpSep_Prior*)prior)->D(), dim); /* start fully in the GP model, not LLM */ b = new_ones_ivector(dim, 1); pb = new_zero_vector(dim); /* memory allocated for effective range parameter -- deff = d*b */ d_eff = new_dup_vector(d, dim); /* counter of the number of d-rejections in a row */ dreject = 0; } /* * ExpSep (assignment operator): * * used to assign the parameters of one correlation * function to anothers. Both correlation functions * must already have been allocated */ Corr& ExpSep::operator=(const Corr &c) { ExpSep *e = (ExpSep*) &c; /* sanity check */ assert(prior == ((Gp_Prior*) base_prior)->CorrPrior()); /* copy everything */ log_det_K = e->log_det_K; linear = e->linear; dupv(d, e->d, dim); dupv(pb, e->pb, dim); dupv(d_eff, e->d_eff, dim); dupiv(b, e->b, dim); nug = e->nug; dreject = e->dreject; /* copy the covariance matrices -- no longer performed due to the new economy argument in Gp/Base */ // Cov(e); return *this; } /* * ~ExpSep: * * destructor */ ExpSep::~ExpSep(void) { free(d); free(b); free(pb); free(d_eff); } /* * Init: * * initialise this corr function with the parameters provided * from R via the vector of doubles */ void ExpSep::Init(double *dexpsep) { dupv(d, &(dexpsep[1]), dim); if(!prior->Linear() && prior->LLM()) linear_pdf_sep(pb, d, dim, prior->GamLin()); bool lin = true; for(unsigned int i=0; iLinear()) assert(lin); NugInit(dexpsep[0], lin); } /* * Jitter: * * fill jitter[ ] with the variance inflation factor. That is, * the variance for an observation with covariates in the i'th * row of X will be s2*(1.0 + jitter[i]). In standard tgp, the * jitter is simply the nugget. But for calibration and mr tgp, * the jitter value depends upon X (eg real or simulated data). * */ double* ExpSep::Jitter(unsigned int n1, double **X) { double *jitter = new_vector(n1); for(unsigned int i=0; in); /* with probability 0.5, skip drawing the nugget */ double ru = runi(state); if(ru > 0.5) return false; /* make the draw */ double nug_new = nug_draw_margin(n, col, nug, F, Z, K, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, prior->NugAlpha(), prior->NugBeta(), gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) linear, itemp, state); /* did we accept the draw? */ if(nug_new != nug) { nug = nug_new; success = true; swap_new(Vb, bmu, lambda); } return success; } /* * Update: (symmetric) * * computes the internal correlation matrix K, * (INCLUDES NUGGET) */ void ExpSep::Update(unsigned int n, double **K, double **X) { exp_corr_sep_symm(K, dim, X, n, d_eff, nug, PWR); } /* * Update: (symmetric) * * takes in a (symmetric) distance matrix and * returns a correlation matrix (INCLUDES NUGGET) */ void ExpSep::Update(unsigned int n, double **X) { /* no need to update internal K if we're at LLM */ if(linear) return; /* sanity check */ assert(this->n == n); /* compute K */ exp_corr_sep_symm(K, dim, X, n, d_eff, nug, PWR); } /* * Update: (non-symmetric) * * takes in a distance matrix and returns a * correlation matrix (DOES NOT INCLUDE NUGGET) */ void ExpSep::Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX) { exp_corr_sep(K, dim, XX, n1, X, n2, d_eff, PWR); } /* * propose_new_d: * * propose new d and b values. Sometimes propose d's and b's for all * dimensions jointly, sometimes do just the d's with b==1, and * other times do only those with b==0. I have found that this improves * mixing */ bool ExpSep::propose_new_d(double* d_new, int * b_new, double *pb_new, double *q_fwd, double *q_bak, void *state) { *q_bak = *q_fwd = 1.0; /* copy old values into the new ones */ dupv(d_new, d, dim); dupv(pb_new, pb, dim); dupiv(b_new, b, dim); /* 1/3 of the time (or for 1-d data) -- just draw all the ds jointly */ if(dim==1 || runi(state) < 0.3333333333) { /* RW proposal for all d-values */ d_proposal(dim, NULL, d_new, d, q_fwd, q_bak, state); /* if we are allowing the LLM, then we need to draw the b_new conditional on d_new; otherwise just return */ if(prior->LLM()) { if(dim==1 || runi(state) < 0.5) /* sometimes skip drawing the bs (unless 1-d) */ return linear_rand_sep(b_new,pb_new,d_new,dim,prior->GamLin(), state); else return linear; } else return false; /* just draw the ds with bs == 1 or bs == 0, choosing one of those randomly */ } else { /* choose bs == 1 or bs == 0 */ FIND_OP find_op = NE; if(runi(state) < 0.5) find_op = EQ; /* find those ds which coincide with find_op */ unsigned int len = 0; int* zero = find(d_eff, dim, find_op, 0.0, &len); /* if there are no d's which coincide with find_op, then there is nothing to propose, so just return with the current LLM setting */ if(len == 0) { free(zero); return linear; } /* otherwise, draw length(zero) new d values, only at the indices of d_new indicated by zero */ d_proposal(len, zero, d_new, d, q_fwd, q_bak, state); /* done if forcing Gp model (not allowing the LLM) */ if(! prior->LLM()) { free(zero); return false; } /* otherwise, need to draw bs (booleans) conditional on the proposed d_new -- only do this 1/2 the time */ /* sometimes skip drawing the bs */ if(runi(state) < 0.5) { /* gather the ds, bs, and pbs into the "short" vectors, as indexed by the zero-vector */ double *d_short = new_vector(len); double *pb_short = new_zero_vector(len); int *b_short = new_ones_ivector(len, 0); /* make ones give zeros */ copy_sub_vector(d_short, zero, d_new, len); /* draw new bs conditional on the new ds */ linear_rand_sep(b_short,pb_short,d_short,len,prior->GamLin(), state); /* copy the new bs and pbs into the big "new" proposals */ copy_p_vector(pb_new, zero, pb_short, len); copy_p_ivector(b_new, zero, b_short, len); /* clean up */ free(d_short); free(pb_short); free(b_short); free(zero); /* only return true if we have actiually jumpted to the LLM; i.e., only when all the b_new's are 0 */ for(unsigned int i=0; i 0.5) return DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); /* proposals happen when we're not forcing the LLM */ if(prior->Linear()) lin_new = true; else { /* allocate new d, b, and pb */ d_new = new_zero_vector(dim); b_new = new_ivector(dim); pb_new = new_vector(dim); /* make the RW proposal for d, and then b */ lin_new = propose_new_d(d_new, b_new, pb_new, &q_fwd, &q_bak, state); } /* calculate the effective model (d_eff = d*b), and allocate memory -- when we're not proposing the LLM */ double *d_new_eff = NULL; if(! lin_new) { /* calculate effective new d-vector, and determine if it is the same as the old one */ d_new_eff = new_zero_vector(dim); bool equal = true; for(unsigned int i=0; in); } } /* compute the acceptance ratio, unless we're forcing the LLM in which case we do nothing just return a successful "draw" */ if(prior->Linear()) success = 1; else { /* compute prior ratio and proposal ratio */ double pRatio_log = 0.0; double qRatio = q_bak/q_fwd; pRatio_log += ep->log_DPrior_pdf(d_new); pRatio_log -= ep->log_DPrior_pdf(d); /* MH acceptance ratio for the draw */ success = d_sep_draw_margin(d_new_eff, n, dim, col, F, X, Z, log_det_K,*lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, nug, qRatio, pRatio_log, gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) lin_new, itemp, state); /* see if the draw was accepted; if so, we need to copy (or swap) the contents of the new into the old */ if(success == 1) { swap_vector(&d, &d_new); /* d_eff is zero if we're in the LLM */ if(!lin_new && d_new_eff) swap_vector(&d_eff, &d_new_eff); else if(lin_new) zerov(d_eff, dim); linear = (bool) lin_new; /* copy b and pb */ swap_ivector(&b, &b_new); swap_vector(&pb, &pb_new); /* only copy if linear or a new d_eff */ if(linear || d_new_eff) swap_new(Vb, bmu, lambda); } } /* if we're not forcing the LLM, then clean up */ if(! prior->Linear()) { free(d_new); free(pb_new); free(b_new); } /* if we didn't happen to jump to the LLM, then we have more cleaning up to do */ if(!lin_new && d_new_eff) free(d_new_eff); /* something went wrong, abort; otherwise keep track of the number of d-rejections in a row */ if(success == -1) return success; else if(success == 0) dreject++; else dreject = 0; /* abort if we have had too many rejections */ if(dreject >= REJECTMAX) return -2; /* draw nugget */ bool changed = DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); success = success || changed; return success; } /* * Combine: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ void ExpSep::Combine(Corr *c1, Corr *c2, void *state) { get_delta_d((ExpSep*)c1, (ExpSep*)c2, state); CombineNug(c1, c2, state); } /* * Split: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void ExpSep::Split(Corr *c1, Corr *c2, void *state) { propose_new_d((ExpSep*) c1, (ExpSep*) c2, state); SplitNug(c1, c2, state); } /* * get_delta_d: * * compute d from two ds residing in c1 and c2 * and sample b conditional on the chosen d * * (used in prune) */ void ExpSep::get_delta_d(ExpSep* c1, ExpSep* c2, void *state) { /* create pointers to the two ds */ double **dch = (double**) malloc(sizeof(double*) * 2); dch[0] = c1->d; dch[1] = c2->d; /* randomly choose one of the d's */ int ii[2]; propose_indices(ii, 0.5, state); /* and copy the chosen one */ dupv(d, dch[ii[0]], dim); /* clean up */ free(dch); /* propose b conditional on the chosen d */ linear = linear_rand_sep(b, pb, d, dim, prior->GamLin(), state); /* compute d_eff = d * b for the chosen d and b */ for(unsigned int i=0; id for possible * new children partitions c1 and c2 * * (used in grow) */ void ExpSep::propose_new_d(ExpSep* c1, ExpSep* c2, void *state) { int i[2]; double **dnew = new_matrix(2, dim); /* randomply choose which of c1 and c2 will get a copy of this->d, and which will get a random d from the prior */ propose_indices(i, 0.5, state); /* from this->d */ dupv(dnew[i[0]], d, dim); /* from the prior */ draw_d_from_prior(dnew[i[1]], state); /* copy into c1 and c2 */ dupv(c1->d, dnew[0], dim); dupv(c2->d, dnew[1], dim); /* clean up */ delete_matrix(dnew); /* propose new b for c1 and c2, conditional on the two new d parameters */ c1->linear = (bool) linear_rand_sep(c1->b, c1->pb, c1->d, dim, prior->GamLin(), state); c2->linear = (bool) linear_rand_sep(c2->b, c2->pb, c2->d, dim, prior->GamLin(), state); /* compute d_eff = b*d for the two new b and d pairs */ for(unsigned int i=0; id_eff[i] = c1->d[i] * c1->b[i]; c2->d_eff[i] = c2->d[i] * c2->b[i]; } } /* * draw_d_from_prior: * * get draws of separable d parameter from * the prior distribution */ void ExpSep::draw_d_from_prior(double *d_new, void *state) { /* if forcing the linear, then there's nothing to draw; just copy d_new from this->d */ if(prior->Linear()) dupv(d_new, d, dim); /* otherwise draw from the prior */ else ((ExpSep_Prior*)prior)->DPrior_rand(d_new, state); } /* * State: * * return a string depecting the state * of the (parameters of) correlation function */ char* ExpSep::State(unsigned int which) { char buffer[BUFFMAX]; /* slightly different format if the nugget is going to get printed also */ #ifdef PRINTNUG string s = "(d"; sprintf(buffer, "%d=[", which); s.append(buffer); #else string s = ""; if(which == 0) s.append("d=["); else s.append("["); #endif /* if linear, then just put a zero and be done; otherwise, print the col d-values */ if(linear) sprintf(buffer, "0]"); else { for(unsigned int i=0; ilog_Prior(d, b, pb, linear); return prob; } /* * sum_b: * * return the count of the number of linearizing * booleans set to one (the number of linear dimensions) */ unsigned int ExpSep::sum_b(void) { unsigned int bs = 0; for(unsigned int i=0; icorr_model == EXPSEP); /* copy all parameters of the prior */ corr_model = e->corr_model; dupv(gamlin, e->gamlin, 3); d = new_dup_vector(e->d, dim); fix_d = e->fix_d; d_alpha = new_dup_matrix(e->d_alpha, dim, 2); d_beta = new_dup_matrix(e->d_beta, dim, 2); dupv(d_alpha_lambda, e->d_alpha_lambda, 2); dupv(d_beta_lambda, e->d_beta_lambda, 2); } /* * ~ExpSep_Prior: * * destructor for the prior parameterization of the separable * exponential power distribution function */ ExpSep_Prior::~ExpSep_Prior(void) { free(d); delete_matrix(d_alpha); delete_matrix(d_beta); } /* * read_double: * * read the double parameter vector giving the user-secified * prior parameterization specified in R */ void ExpSep_Prior::read_double(double *dparams) { /* read the parameters that have to to with the nugget */ read_double_nug(dparams); /* read the starting value(s) for the range parameter(s) */ for(unsigned int i=0; igetline(line, BUFFMAX); d[0] = atof(strtok(line, " \t\n#")); for(unsigned int i=1; igetline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_d = true; MYprintf(MYstdout, "fixing d prior\n"); } else { fix_d = false; get_mix_prior_params(d_alpha_lambda, d_beta_lambda, line, "d lambda"); } } /* * default_d_priors: * * set d prior parameters * to default values */ void ExpSep_Prior::default_d_priors(void) { for(unsigned int i=0; iparameters for the jth dimension from each of the "howmany" corr modules */ for(unsigned int i=0; iD())[j]; /* use those gathered d values to make a draw for the parameters for the prior of the jth d */ mixture_priors_draw(d_alpha[j], d_beta[j], d, howmany, d_alpha_lambda, d_beta_lambda, state); } /* clean up */ free(d); } /* hierarchical prior draws for the nugget */ DrawNugHier(corr, howmany, state); } /* * newCorr: * * construct and return a new separable exponential correlation * function with this module governing its prior parameterization */ Corr* ExpSep_Prior::newCorr(void) { return new ExpSep(dim, base_prior); } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug) */ double ExpSep_Prior::log_Prior(double *d, int *b, double *pb, bool linear) { double prob = 0; /* if forcing the LLM, just return zero (i.e. prior=1, log_prior=0) */ if(gamlin[0] < 0) return prob; /* sum the log priors for each of the d-parameters */ for(unsigned int i=0; ibase_prior = base_prior; } /* * Print: * * pretty print the correllation function parameters out * to a file */ void ExpSep_Prior::Print(FILE *outfile) { MYprintf(MYstdout, "corr prior: separable power\n"); /* print nugget stuff first */ PrintNug(outfile); /* range parameter */ /* MYprintf(outfile, "starting d=\n"); printVector(d, dim, outfile, HUMAN); */ /* range gamma prior, just print once */ MYprintf(outfile, "d[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha[0][0], d_beta[0][0], d_alpha[0][1], d_beta[0][1]); /* print many times, one for each dimension instead? */ /* for(unsigned int i=1; i #include "rand_draws.h" #include "rand_pdf.h" #include "lh.h" #include "matrix.h" #include "dopt.h" #include "rhelp.h" #include "gen_covar.h" #include #include #define PWR 2.0 double DOPT_D(unsigned int m) { return 0.001*sq(m); } double DOPT_NUG(void) { return 0.01; } /* * dopt_gp: * * R wrapper function for the dopt function below for a sequential * doptimal design. The chosen design, of nn_in points are taken * to from the candidates to be Xcand[fi,:] */ void dopt_gp(state_in, nn_in, X_in, n_in, m_in, Xcand_in, ncand_in, iter_in, verb_in, fi_out) int *state_in; unsigned int *nn_in, *n_in, *m_in, *ncand_in, *iter_in, *verb_in; double *X_in, *Xcand_in; int *fi_out; { unsigned int nn, n, m, ncand, iter, verb; double **Xall, **X, **Xcand, **fixed, **rect; unsigned long lstate; void *state; lstate = three2lstate(state_in); state = newRNGstate(lstate); /* integral dimension parameters */ n = (unsigned int) *n_in; m = (unsigned int) *m_in; nn = (unsigned int) *nn_in; ncand = (unsigned int) *ncand_in; iter = (unsigned int) *iter_in; verb = (unsigned int) *verb_in; Xall = new_matrix(n+ncand, m); dupv(Xall[0], X_in, n*m); dupv(Xall[n], Xcand_in, ncand*m); rect = get_data_rect(Xall, n+ncand, m); delete_matrix(Xall); /* copy X from input */ X = new_zero_matrix(n+nn, m); fixed = new_matrix(n, m); if(fixed) dupv(fixed[0], X_in, n*m); normalize(fixed, rect, n, m, 1.0); Xcand = new_zero_matrix(ncand, m); dupv(Xcand[0], Xcand_in, ncand*m); normalize(Xcand, rect, ncand, m, 1.0); delete_matrix(rect); /* call dopt */ dopt(X, fi_out, fixed, Xcand, m, n, ncand, nn, DOPT_D((unsigned)m), DOPT_NUG(), iter, verb, state); delete_matrix(X); if(fixed) delete_matrix(fixed); delete_matrix(Xcand); deleteRNGstate(state); } /* * dopt: * * produces a sequential D-optimal design where the fixed * configurations are automatically included in the design, * and n1 of the candidates Xcand are chosen by maximizing * the determinant of joint covariance matrix based on * X = cbind(fixed, Xcand[fi,:]) using stochastic search. * The chosen design is provided by the indices fi, and * the last n1 rows of X */ void dopt(X, fi, fixed, Xcand, m, n1, n2, n, d, nug, iter, verb, state) unsigned int m,n1,n2,n,iter,verb; /*double fixed[n1][m], Xcand[n2][m], X[n+n1][m], fi[n];*/ double **fixed, **Xcand, **X; int *fi; double d, nug; void *state; /* remember, column major! */ { unsigned int i,j, ai, fii, changes; double *aprobs, *fprobs; unsigned int *o, *avail; double **DIST, **K; double log_det, log_det_new; int a, f; assert(n2 >= n); /* MYprintf(MYstderr, "d=%g, nug=%g\n", d, nug); */ /* set fixed into X */ dup_matrix(X, fixed, n1, m); DIST = new_matrix(n+n1, n+n1); K = new_matrix(n+n1, n+n1); avail = new_uivector(n2-n); /* get indices to randomly permuted the Xcand matrix with */ o = rand_indices(n2, state); /* free = I(1:n); */ /* X = [fixed, Xcand(:,free)]; */ for(i=0; i n) { /* no need to do iterations if ncand == n */ changes = 0; for(i=0; i #include "rand_pdf.h" #include "rand_draws.h" #include "matrix.h" #include "linalg.h" #include "lh.h" #include "rhelp.h" #include #include #include #include #include "randomkit.h" /* for Windows and other OS's without drand support, * so the compiler won't warn */ double erand48(unsigned short xseed[3]); int getrngstate = 1; /* * newRNGstate: * * seeding the random number generator, * from jenise */ void* newRNGstate(s) unsigned long s; { switch (RNG) { case CRAN: #ifdef RPRINT if(getrngstate) GetRNGstate(); else warning("cannot generate multiple CRAN RNG states"); getrngstate = 0; return NULL; # else error("cannot use R RNG when not compiling from within R"); #endif case RK: { rk_state* state = (rk_state*) malloc(sizeof(rk_state)); rk_seed(s, state); return (void*) state; } case ERAND: { unsigned short *state = (unsigned short*) new_uivector(3); state[0] = s / 1000000; s = s % 1000000; state[1] = s / 1000; state[2] = s % 1000; return (void*) state; } default: error("RNG type not found"); } } /* * newRNGstate_rand: * * randomly generate a new RNG state based on a random draw from the * current state */ void* newRNGstate_rand(s) void *s; { unsigned long lstate; int state[3]; state[0] = 100*runi(s); state[1] = 100*runi(s); state[2] = 100*runi(s); lstate = three2lstate(state); return(newRNGstate(lstate)); } /* * three2lstate: * * given three integers (positive) , turning it into * a long-state for the RNG seed */ unsigned long three2lstate(int *state) { unsigned long lstate; assert(state[0] >= 0); assert(state[1] >= 0); assert(state[2] >= 0); lstate = state[0] * 1000000 + state[1] * 1000 + state[2]; return(lstate); } /* * deleteRNGstate: * * free memory for RNG seed */ void deleteRNGstate(void *state) { switch (RNG) { case CRAN: #ifdef RPRINT if(!getrngstate) PutRNGstate(); getrngstate = 1; break; #else error("cannot use R RNG when not compiling from within R"); #endif case RK: free((rk_state*) state); break; case ERAND: assert(state); free((unsigned short*) state); break; default: error("RNG type not found"); } } /* * printRNGstate: * * printRNGstate info out to the outfile */ void printRNGstate(void *state, FILE* outfile) { switch (RNG) { case CRAN: assert(!state); MYprintf(outfile, "RNG state CRAN comes from R\n"); break; case RK: assert(state); MYprintf(outfile, "RNG state RK using rk_seed\n"); break; case ERAND: { unsigned short *s = (unsigned short *) state; assert(s); MYprintf(outfile, "RNG state = %d %d %d\n", s[0], s[1], s[2]); } break; default: error("RNG type not found"); } } /* * runi: * * one from a uniform(0,1) * from jenise */ double runi(void *state) { switch (RNG) { case CRAN: assert(!state); return unif_rand(); case RK: { unsigned long rv; assert(state); rv = rk_random((rk_state*) state); /* MYprintf(MYstderr, "(%d)", ((int)(10000000 * (((double) rv)/RK_MAX)))); if(((int)(10000000 * (((double) rv)/RK_MAX))) == 7294478) assert(0); */ return ((double) rv) / RK_MAX; } case ERAND: assert(state); return erand48(state); default: error("RNG type not found"); } } /* * runif: * * n draws from a uniform(a,b) */ void runif_mult(double* r, double a, double b, unsigned int n, void *state) { double scale; int i; scale = b - a; for(i=0; i1.); e=sqrt((-2.*log(w))/w); x[0] = v2*e; x[1] = v1*e; } /* * rnorm_mult: * * multiple draws from the standard normal */ void rnorm_mult(x, n, state) unsigned int n; double *x; void *state; { unsigned int j; double aux[2]; if(n == 0) return; for(j=0;j 0); /* int done = 0; */ uniform0 = runi(state); uniform1 = runi(state); if (uniform0 > M_E/(alpha + M_E)) { random = 0.0 -log((alpha + M_E)*(1-uniform0)/(alpha*M_E)); if ( uniform1 > pow(random,alpha - 1)) return -1; else return random; } else { x = (alpha + M_E) * uniform0 / M_E; random = pow(x,1/alpha); if ( uniform1 > exp(-random)) return -1; else return random; } } /* * rgamma2: * * Generates a draw from a gamma distribution with alpha > 1 * * from William Brown */ double rgamma2(double alpha, void *state) { double uniform1,uniform2; double c1,c2,c3,c4,c5,w; double random; int done = 1; /* sanity check */ assert(alpha > 0); c1 = alpha - 1; c2 = (alpha - 1/(6 * alpha))/c1; c3 = 2 / c1; c4 = c3 + 2; c5 = 1 / sqrt(alpha); do { uniform1 = runi(state); uniform2 = runi(state); if (alpha > 2.5) { uniform1 = uniform2 + c5 * (1 - 1.86 * uniform1); } } while ((uniform1 >= 1) || (uniform1 <= 0)); w = c2 * uniform2 / uniform1; if ((c3 * uniform1 + w + 1/w) > c4) { if ((c3 * log(uniform1) - log(w) + w) >= 1) { done = 0; } } if (done == 0) return -1; random = c1 * w; return random; } /* * rgamma_wb: * * Generates from a general gamma(alpha,beta) distribution * from Willia Brown (via Milovan / Draper, UCSC) * Parametrization as in the Gelman's book ( E(x) = alpha/beta ) */ double rgamma_wb(double alpha, double beta, void *state) { double random = 0; /* sanity checks */ assert(alpha>0 && beta>0); if (alpha < 1) do { random = rgamma1(alpha, state)/beta; } while (random < 0 ); if (alpha == 1) random = rexpo(1.0, state)/beta; if (alpha > 1) do { random = rgamma2(alpha, state)/beta; } while (random < 0); return random; } /* * inv_gamma_mult_gelman: * * GELMAN PARAMATERIZATION; cases draws from a inv-gamma * distribution with parameters alpha and beta * x must be an alloc'd cases-array */ void inv_gamma_mult_gelman(x, alpha, beta, cases, state) unsigned int cases; double *x; double alpha, beta; void *state; { int i; /* sanity checks */ assert(alpha>0 && beta >0); /* get CASES draws from a gamma */ for(i=0; i< cases; i++) x[i] = 1.0 / rgamma_wb(alpha, beta, state); return; } /* * gamma_mult_gelman: * * GELMAN PARAMATERIZATION; cases draws from a gamma * distribution with parameters alpha and beta * x must be an alloc'd cases-array */ void gamma_mult_gelman(x, alpha, beta, cases, state) unsigned int cases; double *x; double alpha, beta; void *state; { int i; /* get CASES draws from a gamma */ for(i=0; i< cases; i++) x[i] = rgamma_wb(alpha, beta, state); return; } /* * rbeta: * * one random draw from the beta distribution * with parameters alpha and beta. */ double rbet(alpha, beta, state) double alpha, beta; void *state; { double g1,g2; g1 = rgamma_wb(alpha, 1.0, state); g2 = rgamma_wb(beta, 1.0, state); return g1/(g1+g2); } /* * beta_mult: * * cases draws from a beta distribtion with * parameters alpha and beta. * x must be an alloc'd cases-array */ void beta_mult(x, alpha, beta, cases, state) unsigned int cases; double *x; double alpha, beta; void *state; { int i; /* get CASES draws from a beta */ for(i=0; i< cases; i++) { x[i] = rbet(alpha,beta,state); } return; } /* * wishrnd: * * single n x n draw from a Wishart distribtion with * positive definite mean S, and degrees of freedom nu. * uses method from Gelman appendix (nu > n) * * x[n][n], S[n][n]; */ void wishrnd(x, S, n, nu, state) unsigned int n, nu; double **x, **S; void *state; { /*double alphaT[n][nu], alpha[nu][n], cov[n][n]; double mu[n];*/ double **alphaT, **alpha, **cov; double *mu; int i; /* sanity checks */ assert(n > 0); assert(nu > n); zero(x, n, n); /* draw from the multivariate normal */ cov = new_matrix(n,n); alphaT = new_matrix(n,nu); copyCovLower(cov, S, n, 1.0); mu = (double*) malloc(sizeof(double) * n); for(i=0; i 0); assert(n > 0); assert(probs[0] >= 0); cumprob[0] = probs[0]; for(i=1; i= 0); cumprob[i] = cumprob[i-1] + probs[i]; } if(cumprob[num_probs-1] < 1.0) cumprob[num_probs-1] = 1.0; for(i=0; i 0); assert(n > 0); assert(probs[0] >= 0); cumprob[0] = probs[0]; for(i=1; i= 0); cumprob[i] = cumprob[i-1] + probs[i]; } if(cumprob[num_probs-1] < 1.0) cumprob[num_probs-1] = 1.0; for(i=0; i indx) k = j-1; p[k] = p_old[j] / p_not; x[k] = x_old[j]; xi[k] = xi_old[j]; } free(x_old); free(p_old); free(xi_old); /* draw the ith sample */ isample(&out, &indx, 1, num_probs-i, x, p, state); x_out[i] = out; x_indx[i] = xi[indx]; assert(X[xi[indx]] == x_out[i]); } /* clean up */ free(p); free(x); free(xi); } /* * sample_seq: * * returns a single uniform sample from * the integral range [from...to]. */ int sample_seq(int from, int to, void *state) { unsigned int len, indx; int k_d; int *one2len; double *probs; if(from == to) return from; len = abs(from-to)+1; assert(from <= to); one2len = iseq(from,to); probs = ones(len, 1.0/len); isample(&k_d, &indx, 1, len, one2len, probs, state); free(one2len); free(probs); return (int) k_d; } /* * rpoiso: * * Draws frrom Pois(xm); * From NUMERICAL RECIPIES with a few minor modifications * * Returns as a floating-point number an integer value that is a * random deviate drawn from a Poisson distribution of mean xm * * NOT THREAD SAFE */ unsigned int rpoiso(float xm, void *state) { /* NOT THREAD SAFE */ static double sq,alxm,g,oldm=(-1.0); /*oldm is a flag for whether xm has changed since last call.*/ double em,t,y; if (xm < 12.0) { /*Use direct method.*/ if (xm != oldm) { oldm=xm; g=exp(-xm); /* If xm is new, compute the exponential. */ } em = 0.0-1.0; t=1.0; do { /* Instead of adding exponential deviates it is equivalent to multiply uniform deviates. We never actually have to take the log, merely compare to the pre-computed exponential. */ ++em; t *= runi(state); } while (t > g); } else { /* Use rejection method. */ if (xm != oldm) { /*If xm has changed since the last call, then precompute some functions that occur below.*/ oldm=xm; sq=sqrt(2.0*xm); alxm=log(xm); g=xm*alxm-lgammafn(xm+1.0); } do { do { /* y is a deviate from a Lorentzian comparison function. */ y=tan(M_PI*runi(state)); em=sq*y+xm; /* em is y, shifted and scaled. */ } while (em < 0.0); /* Reject if in regime of zero probability. */ em=floor(em); /* The trick for integer-valued distributions. */ t=0.9*(1.0+y*y)*exp(em*alxm-lgammafn(em+1.0)-g); /* The ratio of the desired distribution to the comparison function; * accept or reject by comparing to another uniform deviate. * The factor 0.9 is chosen so that t never exceeds 1. */ } while (runi(state) > t); } return (unsigned int) em; } /* * compute_probs: * * get probablity distribution based on the * some criteria; alpha is a power to be applied to the prob. */ double* compute_probs(double* criteria, unsigned int nn, double alpha) { double *probs; double sum; unsigned int i; probs = (double*) malloc(sizeof(double) * nn); sum = 0; for(i=0; i parameter[1]) { i[1] = 0; i[0] = 1; } else { i[1] = 1; i[0] = 0; } } /* * rand_indices: * * return a random permutation of the * indices 1...N */ unsigned int* rand_indices(unsigned int N, void *state) { int *o; double *nall = new_vector(N); runif_mult(nall, 0.0, 1.0, N, state); o = order(nall, N); free(nall); return (unsigned int *) o; } tgp/src/linalg.h0000644000175100001440000001121312655414756013305 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __LINALG_H__ #define __LINALG_H__ #include "matrix.h" #include "rhelp.h" #ifndef CBLAS_ENUM_DEFINED_H #define CBLAS_ENUM_DEFINED_H enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102 }; enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113, AtlasConj=114}; enum CBLAS_UPLO {CblasUpper=121, CblasLower=122}; enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132}; enum CBLAS_SIDE {CblasLeft=141, CblasRight=142}; #endif #define FORTPACK #define FORTBLAS #ifdef FORTPACK #define dpotrf dpotrf_ extern void dpotrf(char*, size_t*, double*, size_t*, long*); #define dtrsv dtrsv_ extern void dtrsv(char*, char*, char*, int*, double*, int*, double*, int*); #define dposv dposv_ /* extern void dposv(char *, int *, int *, double*, int *, double*, int *, int *); */ extern void dposv(char *, size_t *, size_t *, double*, size_t*, double*, size_t*, long*); #define dgesv dgesv_ extern void dgesv(int *,int *,double *,int*,int*,double*,int*,int*); #else #include #endif #ifdef FORTBLAS #define dgemm dgemm_ /* extern void dgemm(char*, char*, int*, int*, int*, double*, double*, int*, double*, int*, double*, double*, int*); */ extern void dgemm(char*, char*, size_t*, size_t*, size_t*, double*, double*, size_t*, double*, size_t*, double*, double*, size_t*); #define dsymm dsymm_ /* extern void dsymm(char*, char*, int*, int*, double*, double*, int*, double*, int*, double*, double*, int*); */ extern void dsymm(char*, char*, size_t*, size_t*, double*, double*, size_t*, double*, size_t*, double*, double*, size_t*); #define dgemv dgemv_ /* extern void dgemv(char*, int*, int*, double*, double*, int*, double*, int*, double*, double*, int*); */ extern void dgemv(char*, size_t*, size_t*, double*, double*, size_t*, double*, size_t*, double*, double*, size_t*); #define dsymv dsymv_ /*extern void dsymv(char*, int*, double*, double*, int*, double*, int*, double*, double*, int*); */ extern void dsymv(char*, size_t*, double*, double*, size_t*, double*, size_t*, double*, double*, size_t*); #define ddot ddot_ extern double ddot(size_t*, double*, size_t*, double*, size_t*); #define daxpy daxpy_ /* extern void daxpy(int*, double*, double*, int*, double*, int*); */ extern void daxpy(size_t*, double*, double*, size_t*, double*, size_t*); #define dtrsv dtrsv_ extern void dtrsv(char*, char*, char*, int*, double*, int*, double*, int*); #else #include #endif void linalg_dtrsv(const enum CBLAS_TRANSPOSE TA, int n, double **A, int lda, double *Y, int ldy); void linalg_daxpy(int n, double alpha, double *X, int ldx, double *Y, int ldy); double linalg_ddot(int n, double *X, int ldx, double *Y, int ldy); void linalg_dgemm(const enum CBLAS_TRANSPOSE TA, const enum CBLAS_TRANSPOSE TB, int m, int n, int k, double alpha, double **A, int lda, double **B, int ldb, double beta, double **C, int ldc); void linalg_dsymm(const enum CBLAS_SIDE side, int m, int n, double alpha, double **A, int lda, double **B, int ldb, double beta, double **C, int ldc); void linalg_dgemv(const enum CBLAS_TRANSPOSE TA, int m, int n, double alpha, double **A, int lda, double *X, int ldx, double beta, double *Y, int ldy); void linalg_dsymv(int n, double alpha, double **A, int lda, double *X, int ldx, double beta, double *Y, int ldy); int linalg_dposv(int n, double **Mutil, double **Mi); int linalg_dgesv(int n, double **Mutil, double **Mi); int linalg_dpotrf(int n, double **var); /* iterative */ int solve_cg_symm(double *x, double *x_star, double **A, double *b, double theta, unsigned int n); #endif tgp/src/all_draws.c0000644000175100001440000012004112655414756014002 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include #include #include "rand_pdf.h" #include "rand_draws.h" #include "matrix.h" #include "linalg.h" #include "gen_covar.h" #include "lik_post.h" #include "all_draws.h" #include "rhelp.h" #include #include /* constants used below */ #define GA 1.0 /* 5.0 */ #define PWR 2.0 /* calculate the prior probability of the LLM */ #define LINEAR(gamma, min, max, d) min + max / (1.0 + exp(0.0-gamma*(d-0.5))); /* minimum values for the nugget and s2_g0 */ #define NUGMIN 1e-10 #define S2G0MIN 1e-10 /* * mle_beta: * * compute the maximum likelihood estimate for the regression * coefficnents, beta; for use in the emperical Bayes BMLE * model */ void mle_beta(mle, n, col, F, Z) unsigned int n, col; double *Z, *mle; double **F; { double **aux1, **Vb; double *by; /* int info; */ /* zero out by and b */ by = new_zero_vector(col); zerov(mle, col); /* aux1 = F'F*/ aux1 = new_zero_matrix(col, col); linalg_dgemm(CblasTrans,CblasNoTrans,col,col,n, 1.0,F,n,F,n,0.0,aux1,col); /* Vb = inv(F'*F) */ Vb = new_id_matrix(col); /* info = */ linalg_dgesv(col, aux1, Vb); delete_matrix(aux1); /* by = Z*F */ linalg_dgemv(CblasTrans,n,col,1.0,F,n,Z,1,0.0,by,1); /* mle = by*Vb */ linalg_dsymv(col,1.0,Vb,col,by,1,0.0,mle,1); delete_matrix(Vb); free(by); } /* * compute_b_and_Vb_noK: * * b and Vb are needed by compute_lambda and beta_draw * and others: b and Vb must be pre-allocated. * These are two of the three "margin" variables. * DOES NOT INVOLVE THE COVARIANCE MATRIX (K) * * Z[n], b0[col], b[col], TiB0[col], by[col], F[col][n], Ki[n][n], * Ti[col][col], Vb[col][col]; */ void compute_b_and_Vb_noK(Vb, b, by, TiB0, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp) unsigned int n, col; double *Z, *b0, *b, *TiB0, *by, *Kdiag; double **F, **Ti, **Vb; double tau2, itemp; { double **Vbi, **Fgi; /* int info; */ unsigned int i, j; /* sanity check for inv-temperature */ assert(itemp >= 0); /* zero out by and b */ zerov(by, col); zerov(b, col); /* Vbi = F'*diag(1+g)*F + Ti/tau2; with tempering Vbi = itemp * F'*diag(1+g)*F + Ti/tau2 */ Vbi = new_dup_matrix(Ti, col, col); /* This is equivilant to multiplying F by a diagonal matrix with Kdiag., the covariance matrix for the llm. Used again below for b */ Fgi = new_dup_matrix(F, col, n); for(i=0; i= 0); /* itemp = pow(itemp, 2.0/n); */ /* init alloc */ TiB0 = new_vector(col); by = new_vector(col); compute_b_and_Vb_noK(Vb, b, by, TiB0, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp); /* lambda = Z*Z' + b0'*Ti*b0 - B'*VBi*B; */ /* as performed in many steps below */ /* adjust for beta[0]=mu in prior */ /* ZZ = Z'Z/(Kdiag) */ Zgi = new_dup_vector(Z, n); for(i=0; i tempered K is Kdiag/itemp */ ZZ = itemp * ZZ; /* clean up */ free(Zgi); /* Tib0 = by ... we already did this above */ /* b0Tib0 = b0 * by / tau2 */ b0Tib0 = linalg_ddot(col, b0, 1, TiB0, 1) / tau2; free(TiB0); /* B' * Vbi * B = b * by */ BVBiB = linalg_ddot(col,b,1,by,1); free(by); /* now for lambda */ lambda = ZZ + b0Tib0 - BVBiB; /* MYprintf(MYstderr, "noK: n=%d, itemp=%g, ZZ=%g, tau2=%g, b0Tib0/tau2=%g, BVBiB=%g, lambda=%g\n", n, itemp, ZZ, tau2, b0Tib0, BVBiB, lambda); */ /* this is here because when itemp=0 lambda should be 0, but sometimes there are numerical issues where we get e^-17 */ if(itemp == 0.0) lambda = 0.0; return lambda; } /* * compute_b_and_Vb: * * b and Vb are needed by compute_lambda and beta_draw * and others: b and Vb must be pre-allocated. * These are two of the three "margin" variables. * * Z[n], b0[col], b[col], TiB0[col], by[col], F[col][n], * Ki[n][n], Ti[col][col], Vb[col][col] */ void compute_b_and_Vb(Vb, b, by, TiB0, n, col, F, Z, Ki, Ti, tau2, b0, itemp) unsigned int n, col; double *Z, *b0, *b, *TiB0, *by; double **F, **Ki, **Ti, **Vb; double tau2, itemp; { double **KiF, **Vbi; /* int info; */ /* sanity check for temperature */ assert(itemp >= 0); /* KiF = Ki * F; when tempered KiF = itemp * Ki * F */ KiF = new_zero_matrix(col, n); linalg_dsymm(CblasLeft,n,col,itemp,Ki,n,F,n,0.0,KiF,n); /* aux1 = F'*KiF + Ti/tau2 */ Vbi = new_dup_matrix(Ti, col, col); linalg_dgemm(CblasTrans,CblasNoTrans,col,col,n, 1.0,F,n,KiF,n,1.0/tau2,Vbi,col); /* Vb = inv(F'*KiF + Ti/tau2) */ id(Vb, col); if(col==1) Vb[0][0] = 1.0/Vbi[0][0]; else /* info = */ linalg_dgesv(col, Vbi, Vb); delete_matrix(Vbi); /* by = Z*KiF + b0'*Ti/tau2 */ /* first set: by = b0'*Ti */ zerov(by, col); linalg_dsymv(col,1.0,Ti,col,b0,1,0.0,by,1); /* save the result for later */ dupv(TiB0, by, col); /* use vector stuff for the last part */ linalg_dgemv(CblasTrans,n,col,1.0,KiF,n,Z,1,1.0/tau2,by,1); delete_matrix(KiF); /* b = by*Vb */ zerov(b, col); if(col==1) b[0] = by[0]*Vb[0][0]; else linalg_dsymv(col,1.0,Vb,col,by,1,0.0,b,1); } /* * compute_lambda: * * code for computing the lambda intermediate variable * required by functions which use a marginalized posterior: * (margin_lik, sigma_no_beta, etc...) * * Z[n], b0[col], b[col]; F[col][n], Ki[n][n], Ti[col][col], Vb[col][col] */ double compute_lambda(Vb, b, n, col, F, Z, Ki, Ti, tau2, b0, itemp) unsigned int n, col; double *Z, *b0, *b; double **F, **Ki, **Ti, **Vb; double tau2, itemp; { /*double TiB0[col], KiZ[n], by[col];*/ double *TiB0, *KiZ, *by; double lambda, ZKiZ, BVBiB, b0Tib0; /* sanity check for inv-temperature */ assert(itemp >= 0); /* itemp = pow(itemp, 1.0/n); */ /* init alloc */ TiB0 = new_vector(col); KiZ = new_vector(n); by = new_vector(col); compute_b_and_Vb(Vb, b, by, TiB0, n, col, F, Z, Ki, Ti, tau2, b0, itemp); /* lambda = Z*Ki*Z' + b0'*Ti*b0 - B'*VBi*B; */ /* as performed in many steps below */ /* KiZ = Ki * Z; when tempered KiZ = itemp * Ki * Z */ zerov(KiZ, n); linalg_dsymv(n,itemp,Ki,n,Z,1,0.0,KiZ,1); /* ZKiZ = Z * KiZ */ ZKiZ = linalg_ddot(n,Z,1,KiZ,1); free(KiZ); /* Tib0 = by ... we already did this above */ /* b0Tib0 = b0 * Tib0 */ b0Tib0 = linalg_ddot(col, b0, 1, TiB0, 1); free(TiB0); /* B' * Vbi * B = b * by */ BVBiB = linalg_ddot(col,b,1,by,1); free(by); /* now for lambda */ lambda = ZKiZ + b0Tib0/tau2 - BVBiB; /* MYprintf(MYstderr, "n=%d, itemp=%g, ZKiZ=%g, tau2=%g, b0Tib0/tau2=%g, BVBiB=%g, lambda=%g\n", n, itemp, ZKiZ, tau2, b0Tib0/tau2, BVBiB, lambda); */ /* this is here because when itemp=0 lambda should be 0, but sometimes there are numerical issues where we get e^-17 */ if(itemp == 0.0) lambda = 0.0; return lambda; } /* * beta_draw_margin: * * Gibbs draw for Beta given bmu and Vb marginalzed parameters * * b[col], bmu[col], Vb[col][col] */ unsigned int beta_draw_margin(b, col, Vb, bmu, s2, state) unsigned int col; double *b, *bmu; double **Vb; double s2; void *state; { unsigned int i,j; /*double V[col][col];*/ double **V; int info; /* compute s2*Vb */ V = new_matrix(col, col); /*for(i=0; i 1) info = linalg_dpotrf(col, V); else info = 0; /* now get the draw using the choleski decomposition */ if(info != 0) zerov(b, col); else if(col > 1) mvnrnd(b, bmu, V, col, state); else { /* when beta[0]=mu then we only need one draw */ rnorm_mult(b, 1, state); b[0] *= sqrt(V[0][0]); b[0] += bmu[0]; } delete_matrix(V); return info; } /* * sigma2_draw_no_b_margin: * * draw sigma^2 without dependence on beta */ double sigma2_draw_no_b_margin(n, col, lambda, alpha0, beta0, state) unsigned int n, col; double alpha0, beta0, lambda; void *state; { double alpha, g, x; /* alpha = (alpha0 + length(Z) + length(b))/2; */ alpha = (alpha0 + n)/2; /* just in case */ if(lambda < 0) lambda = 0; /* g = (gamma0 + BLAH)/2; */ g = (beta0 + lambda)/2; /* s2 = 1/gamrnd(alpha, 1/g, 1) */ /* return 1.0 / (1.0/g * rgamma(alpha)); */ inv_gamma_mult_gelman(&x, alpha, g, 1, state); /* MYprintf(MYstderr, "alpha = %g, beta = %g => x = %g\n", alpha, g, x); */ return x; } /* * tau2_draw: * * draws from tau^2 given the rest of the parameters * NOTE: this code was not augmented to use Fb or ZmFb as arguments * because it was not in general use in the code when these * more global changes were made. * * b0[col], b[col], Ti[col][col]; */ double tau2_draw(col, Ti, s2, b, b0, alpha0, beta0, state) unsigned int col; double *b, *b0; double **Ti; double alpha0, beta0, s2; void *state; { /*double bmb0[col], Tibmb0[col];*/ double *bmb0, *Tibmb0; double right, alpha, g, x; /* bmb0 = b-b0 */ bmb0 = new_dup_vector(b, col); linalg_daxpy(col,-1.0,b0,1,bmb0,1); /* right = (bmb0)' * Ti * (bmb0) */ Tibmb0 = new_zero_vector(col); linalg_dsymv(col,1.0,Ti,col,bmb0,1,0.0,Tibmb0,1); right = linalg_ddot(col,bmb0,1,Tibmb0,1) / s2; free(bmb0); free(Tibmb0); /* alpha of gamma distribution */ alpha = (alpha0 + col)/2; /* beta of a gamma distribution */ g = (beta0 + right)/2; /* tau2 = 1/gamrnd(alpha, 1/g, 1) */ /* return 1.0 / (1.0/g * rgamma(alpha)); */ inv_gamma_mult_gelman(&x, alpha, g, 1, state); return x; } /* * gamma_mixture_pdf: * * PDF: mixture prior for d and nug, * works in log space -- returns the log density value */ double gamma_mixture_pdf(d, alpha, beta) double d; double alpha[2], beta[2]; { double p1, p2, lp; gampdf_log_gelman(&p1, &d, alpha[0], beta[0], 1); gampdf_log_gelman(&p2, &d, alpha[1], beta[1], 1); lp = log(0.5*(exp(p1)+exp(p2))); return(lp); } /* * log_d_prior_pdf: * * PDF: mixture prior for d * returns the log pdf */ double log_d_prior_pdf(d, alpha, beta) double d; double alpha[2], beta[2]; { return(gamma_mixture_pdf(d, alpha, beta)); } /* * d_prior_rand: * * rand draws from mixture prior for d */ double d_prior_rand(alpha, beta, state) double alpha[2], beta[2]; void *state; { return(gamma_mixture_rand(alpha, beta, state)); } /* * linear_rand: * * rand draws for the linearization boolean for d */ int linear_rand(d, n, gamlin, state) unsigned int n; double *d, *gamlin; void *state; { double p; if(gamlin[0] == 0) return 0; if(gamlin[0] < 0) return 1; p = linear_pdf(d, n, gamlin); if(runi(state) < p) return 1; else return 0; } /* * linear_rand_sep: * * rand draws for the linearization boolean for d * draws are returned via b (pre-allocated) * b has indicators OPPOSITE of the return value * (e.g. b[i]=0 -> linear d[i], b[i]=1 -> GP) */ int linear_rand_sep(b, pb, d, n, gamlin, state) unsigned int n; double *d, *gamlin, *pb; int *b; void *state; { int bb; unsigned int i; assert(b); assert(d); /* force the GP model */ if(gamlin[0] == 0) { for(i=0; i 0 && gamlin[1] >= 0 && gamlin[1] <= 1 && gamlin[2] >= 0 && gamlin[2] <= 1); /* product of LLM prob in each dimension */ for(i=0; i 0 && gamlin[1] >= 0 && gamlin[1] <= 1 && gamlin[2] >= 0 && gamlin[2] <= 1); /* calculate each dimension separately, save it, and then accumulate the product */ for(i=0; i0); for(i=0; i 0); /* && draw > 2e-20); */ return draw; } /* * unif_propose_pos: * * propose a new positive "ret" based on an old value "last" * by proposing uniformly in [3last/4, 4last/3], and return * the forward and backward probabilities; */ #define PNUM 3.0 #define PDENOM 4.0 double unif_propose_pos(last, q_fwd, q_bak, state) double last; double *q_fwd, *q_bak; void *state; { double left, right, ret; /* propose new d, and compute proposal probability */ left = PNUM*last/(PDENOM); right = PDENOM*last/(PNUM); assert(left > 0 && left < right); runif_mult(&ret, left, right, 1, state); *q_fwd = 1.0/(right - left); /* compute backwards probability */ left = PNUM*ret/(PDENOM); right = PDENOM*ret/(PNUM); assert(left >= 0 && left < right); *q_bak = 1.0/(right - left); assert(*q_bak > 0); /* make sure this is reversible */ assert(last >= left && last <= right); if(ret > 10e10) { warning("unif_propose_pos (%g) is bigger than max", ret); ret = 10; } assert(ret > 0); return ret; } /* * nug_draw: * * unif_propose_pos with adjustment for NUGMIN */ double nug_draw(last, q_fwd, q_bak, state) double last; double *q_fwd, *q_bak; void *state; { return unif_propose_pos(last-NUGMIN, q_fwd, q_bak, state) + NUGMIN; } /* * mixture_priors_ratio: * * evaluationg the posterior for proposed alpha and beta * values: parameters for the hierarchical d prior * * works in log space -- but returns in real (exponentiated) * probabilities */ double mixture_priors_ratio(double *alpha_new, double *alpha, double *beta_new, double *beta, double *d, unsigned int n, double *alpha_lambda, double *beta_lambda) { int i; double log_p, p, p_new; log_p = 0; /* ratio of p(d) under prior */ for(i=0; i alpha_new[0]) { a = mixture_priors_ratio(alpha_new, alpha, beta_new, beta, d, n, alpha_lambda, beta_lambda); a = a*(q_bak/q_fwd); /* accept or reject */ if(runi(state) >= a) { alpha_new[0] = alpha[0]; beta_new[0] = beta[0]; } } /* draws for alpha_new[1] and beta_new[1] conditional on alpha_new[1] and beta_new[1] */ alpha_new[1] = unif_propose_pos(alpha[1], &q_fwd, &q_bak, state); beta_new[1] = unif_propose_pos(beta[1], &q_fwd, &q_bak, state); if(beta_new[1] > alpha_new[1]) { a = mixture_priors_ratio(alpha_new, alpha, beta_new, beta, d, n, alpha_lambda, beta_lambda); a = a*(q_bak/q_fwd); /* accept or reject */ if(runi(state) >= a) { alpha_new[1] = alpha[1]; beta_new[1] = beta[1]; } } } /* * d_draw_margin: * * draws for d given the rest of the parameters * except b and s2 marginalized out * * F[col][n], DIST[n][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col] * Vb[col][col], Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n] b0[col], Z[n] * * return 1 if draw accepted, 0 if rejected, -1 if error */ int d_draw_margin(n, col, d, dlast, F, Z, DIST, log_det_K, lambda, Vb, K_new, Ki_new, Kchol_new, log_det_K_new, lambda_new, Vb_new, bmu_new, b0, Ti, T, tau2, nug, qRatio, d_alpha, d_beta, a0, g0, lin, itemp, state) unsigned int n, col; int lin; double **F, **DIST, **K_new, **Ti, **T, **Vb, **Vb_new, **Ki_new, **Kchol_new; double *b0, *Z; double d_alpha[2], d_beta[2]; double d, dlast, nug, a0, g0, lambda, tau2, log_det_K, qRatio, itemp; double *lambda_new, *bmu_new, *log_det_K_new; void *state; { double pd, pdlast, alpha; double *Kdiag; unsigned int m = 0; /* check if we are sticking with linear model */ assert(dlast != 0.0); /* Knew = dist_to_K(dist, d, nugget); compute lambda, Vb, and bmu, for the NEW d */ if(! lin) { /* regular */ dist_to_K_symm(K_new, DIST, d, nug, n); inverse_chol(K_new, Ki_new, Kchol_new, n); *log_det_K_new = log_determinant_chol(Kchol_new, n); *lambda_new = compute_lambda(Vb_new, bmu_new, n, col, F, Z, Ki_new, Ti, tau2, b0, itemp); } else { /* linear */ *log_det_K_new = n*log(1.0 + nug); Kdiag = ones(n,1.0+nug); *lambda_new = compute_lambda_noK(Vb_new, bmu_new, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp); free(Kdiag); } if(T[0][0] == 0) m = col; /* start computation of posterior distribution */ pd = post_margin(n,col,*lambda_new,Vb_new,*log_det_K_new,a0-m,g0,itemp); pd += log_d_prior_pdf(d, d_alpha, d_beta); pdlast = post_margin(n,col,lambda,Vb,log_det_K,a0-m,g0,itemp); pdlast += log_d_prior_pdf(dlast, d_alpha, d_beta); /* if(lin && pd > pdlast) MYprintf(MYstderr, "pd=%g, pdlast=%g, qRatio=%g\n", pd, pdlast, qRatio); */ /* compute acceptance prob */ /*alpha = exp(pd - pdlast + plin)*(q_bak/q_fwd);*/ alpha = exp(pd - pdlast)*qRatio; if(ISNAN(alpha)) return -1; if(runi(state) < alpha) return 1; else return 0; } /* * d_sep_draw_margin: * * draws for d given the rest of the parameters except b and s2 marginalized out * * F[col][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col] Vb[col][col], * Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n], b0[col], Z[n], dlast[dim], * d_alpha[dim][2], d_beta[dim][2] * * if input d=NULL and lin_new=0, then the MH ratio is just a prior ratio * (plus proposal probabilities) * * return 1 if draw accepted, 0 if rejected, -1 if error */ int d_sim_draw_margin(d, n, dim, col, F, X, Z, log_det_K, lambda, Vb, K_new, Ki_new, Kchol_new, log_det_K_new, lambda_new, Vb_new, bmu_new, b0, Ti, T, tau2, nug, qRatio, pRatio_log, a0, g0, itemp, state) unsigned int n, dim, col; double **F, **X, **K_new, **Ti, **T, **Vb, **Vb_new, **Ki_new, **Kchol_new; double *b0, *Z, *d, *log_det_K_new; double nug, a0, g0, lambda, tau2, log_det_K, qRatio, pRatio_log, itemp; double *lambda_new, *bmu_new; void *state; { double pd, pdlast, alpha; unsigned int m = 0; /* d could be null if d_new == d_new_eff, and in this case the acceptance ratio would be based solely on the prior (& qRatio) */ /* Knew = dist_to_K(dist, d, nugget) compute lambda, Vb, and bmu, for the NEW d */ sim_corr_symm(K_new, dim, X, n, d, nug, PWR); inverse_chol(K_new, Ki_new, Kchol_new, n); *log_det_K_new = log_determinant_chol(Kchol_new, n); *lambda_new = compute_lambda(Vb_new, bmu_new, n, col, F, Z, Ki_new, Ti, tau2, b0, itemp); if(d) { /* adjustment for BFLAT */ if(T[0][0] == 0) m = col; /* posteriors */ pd = post_margin(n,col,*lambda_new,Vb_new,*log_det_K_new,a0-m,g0,itemp); pdlast = post_margin(n,col,lambda,Vb,log_det_K,a0-m,g0,itemp); /* or, no posterior contribution */ } else { pd = 0.0; pdlast = 0.0; } /* compute acceptance prob; and accept or reject */ alpha = exp(pd - pdlast + pRatio_log)*qRatio; if(ISNAN(alpha)) return -1; if(runi(state) < alpha) return 1; else return 0; } /* * d_sep_draw_margin: * * draws for d given the rest of the parameters except b and s2 marginalized out * * F[col][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col] Vb[col][col], * Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n], b0[col], Z[n], dlast[dim], * d_alpha[dim][2], d_beta[dim][2] * * if input d=NULL and lin_new=0, then the MH ratio is just a prior ratio * (plus proposal probabilities) * * return 1 if draw accepted, 0 if rejected, -1 if error */ int d_sep_draw_margin(d, n, dim, col, F, X, Z, log_det_K, lambda, Vb, K_new, Ki_new, Kchol_new, log_det_K_new, lambda_new, Vb_new, bmu_new, b0, Ti, T, tau2, nug, qRatio, pRatio_log, a0, g0, lin, itemp, state) unsigned int n, dim, col; int lin; double **F, **X, **K_new, **Ti, **T, **Vb, **Vb_new, **Ki_new, **Kchol_new; double *b0, *Z, *d, *log_det_K_new; double nug, a0, g0, lambda, tau2, log_det_K, qRatio, pRatio_log, itemp; double *lambda_new, *bmu_new; void *state; { double pd, pdlast, alpha; double *Kdiag; unsigned int m = 0; /* d could be null if d_new == d_new_eff, and in this case the acceptance ratio would be based solely on the prior (& qRatio) */ /* Knew = dist_to_K(dist, d, nugget) compute lambda, Vb, and bmu, for the NEW d */ if(!lin && d) { /* regular */ exp_corr_sep_symm(K_new, dim, X, n, d, nug, PWR); inverse_chol(K_new, Ki_new, Kchol_new, n); *log_det_K_new = log_determinant_chol(Kchol_new, n); *lambda_new = compute_lambda(Vb_new, bmu_new, n, col, F, Z, Ki_new, Ti, tau2, b0, itemp); } else if(lin) { /* linear */ *log_det_K_new = n*log(1.0 + nug); Kdiag = ones(n, 1.0 + nug); *lambda_new = compute_lambda_noK(Vb_new, bmu_new, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp); free(Kdiag); } if(d || lin) { /* adjustment for BFLAT */ if(T[0][0] == 0) m = col; /* posteriors */ pd = post_margin(n,col,*lambda_new,Vb_new,*log_det_K_new,a0-m,g0,itemp); pdlast = post_margin(n,col,lambda,Vb,log_det_K,a0-m,g0,itemp); /* or, no posterior contribution */ } else { pd = 0.0; pdlast = 0.0; } /* compute acceptance prob; and accept or reject */ alpha = exp(pd - pdlast + pRatio_log)*qRatio; if(ISNAN(alpha)) return -1; if(runi(state) < alpha) return 1; else return 0; } /* * matern d_draw_margin: * * draws for d given the rest of the parameters * except b and s2 marginalized out * * F[col][n], DIST[n][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col] * Vb[col][col], Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n] b0[col], Z[n] * * return 1 if draw accepted, 0 if rejected, -1 if error */ int matern_d_draw_margin(n, col, d, dlast, F, Z, DIST, log_det_K, lambda, Vb, K_new, Ki_new, Kchol_new, log_det_K_new, lambda_new, Vb_new, bmu_new, b0, Ti, T, tau2, nug, nu, bk, qRatio, d_alpha, d_beta, a0, g0, lin, itemp, state) unsigned int n, col; int lin; double **F, **DIST, **K_new, **Ti, **T, **Vb, **Vb_new, **Ki_new, **Kchol_new; double *b0, *Z, *bk; double d_alpha[2], d_beta[2]; double d, dlast, nug, nu, a0, g0, lambda, tau2, log_det_K, qRatio, itemp; double *lambda_new, *bmu_new, *log_det_K_new; void *state; { double pd, pdlast, alpha; double *Kdiag; unsigned int m = 0; /* check if we are sticking with linear model */ assert(dlast != 0.0); /* Knew = dist_to_K(dist, d, nugget); compute lambda, Vb, and bmu, for the NEW d */ if(! lin) { /* regular */ matern_dist_to_K_symm(K_new, DIST, d, nu, bk, nug, n); inverse_chol(K_new, Ki_new, Kchol_new, n); *log_det_K_new = log_determinant_chol(Kchol_new, n); *lambda_new = compute_lambda(Vb_new, bmu_new, n, col, F, Z, Ki_new, Ti, tau2, b0, itemp); } else { /* linear */ *log_det_K_new = n*log(1.0 + nug); Kdiag = ones(n, 1.0 + nug); *lambda_new = compute_lambda_noK(Vb_new, bmu_new, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp); free(Kdiag); } if(T[0][0] == 0) m = col; /* start computation of posterior distribution */ pd = post_margin(n,col,*lambda_new,Vb_new,*log_det_K_new,a0-m,g0,itemp); pd += log_d_prior_pdf(d, d_alpha, d_beta); pdlast = post_margin(n,col,lambda,Vb,log_det_K,a0-m,g0,itemp); pdlast += log_d_prior_pdf(dlast, d_alpha, d_beta); /* compute acceptance prob */ /*alpha = exp(pd - pdlast + plin)*(q_bak/q_fwd);*/ alpha = exp(pd - pdlast)*qRatio; if(ISNAN(alpha)) return -1; if(runi(state) < alpha) return 1; else return 0; } /* * nug_draw_margin: * * draws for nug given the rest of the parameters * except b and s2 marginalized out * * F[col][n], K[n][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col], * Vb[col][col], Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n] b0[col], Z[n] */ double nug_draw_margin(n, col, nuglast, F, Z, K, log_det_K, lambda, Vb, K_new, Ki_new, Kchol_new, log_det_K_new, lambda_new, Vb_new, bmu_new, b0, Ti, T, tau2, nug_alpha, nug_beta, a0, g0, linear, itemp, state) unsigned int n, col; int linear; double **F, **K, **K_new, **Ti, **T, **Vb, **Vb_new, **Ki_new, **Kchol_new; double *b0, *Z, *log_det_K_new; double nug_alpha[2], nug_beta[2]; double nuglast, a0, g0, lambda, tau2, log_det_K, itemp; double *lambda_new, *bmu_new; void *state; { double q_fwd, q_bak, nug, pnug, pnuglast, alpha; double *Kdiag; unsigned int i; unsigned int m = 0; /* do nothing if the prior says to fix the nug */ if(nug_alpha[0] == 0) return nuglast; /* propose new d, and compute proposal probability */ nug = nug_draw(nuglast, &q_fwd, &q_bak, state); /* new covariace matrix based on new nug */ if(linear) { *log_det_K_new = n * log(1.0 + nug); Kdiag = ones(n, 1.0 + nug); *lambda_new = compute_lambda_noK(Vb_new, bmu_new, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp); free(Kdiag); } else { dup_matrix(K_new, K, n, n); for(i=0; i nug=%g : alpha=%g\n", nuglast, nug, alpha); */ if(runi(state) > alpha) { /* MYprintf(MYstderr, " -- rejected\n");*/ return nuglast; } else { /*MYprintf(MYstderr, " -- accepted\n");*/ return nug; } } /* * mr_nug_draw_margin: * * draws for nug given the rest of the parameters * except b and s2 marginalized out * * F[col][n], K[n][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col], * Vb[col][col], Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n] b0[col], Z[n] */ double* mr_nug_draw_margin(n, col, nug, nugfine, X, F, Z, K, log_det_K, lambda, Vb, K_new, Ki_new, Kchol_new, log_det_K_new, lambda_new, Vb_new, bmu_new, b0, Ti, T, tau2, nug_alpha, nug_beta, nugf_alpha, nugf_beta, delta, a0, g0, linear, itemp, state) unsigned int n, col; int linear; double **F, **K, **K_new, **Ti, **T, **Vb, **Vb_new, **Ki_new, **Kchol_new, **X; double *b0, *Z, *log_det_K_new; double nug_alpha[2], nug_beta[2], nugf_alpha[2], nugf_beta[2]; double nug, nugfine, a0, g0, lambda, tau2, log_det_K, delta, itemp; double *lambda_new, *bmu_new; void *state; { double q_fwd, q_bak, q_fwdf, q_bakf, pnug, pnuglast, alpha; unsigned int i; unsigned int m = 0; double* newnugs = new_vector(2); /* propose new d, and compute proposal probability */ newnugs[0] = nug_draw(nug, &q_fwd, &q_bak, state); newnugs[1] = nug_draw(nugfine, &q_fwdf, &q_bakf, state); /* new covariace matrix based on new nug */ if(linear) { double *Kdiag = new_vector(n); *log_det_K_new = 0.0; for(i=0; i alpha){ /* printf("nugs %g %g\n",nug, nugfine); */ /*printVector(newnugs, 2, MYstdout, HUMAN); */ newnugs[0] = nug; newnugs[1] = nugfine; } return newnugs; } /* * Ti_draw: * * draws for Ti given the rest of the parameters * * b0[col], s2[ch] b[ch][col], V[col][col], Ti[col][col] */ void Ti_draw(Ti, col, ch, b, bmle, b0, rho, V, s2, tau2, state) unsigned int col, ch, rho; double *b0, *s2, *tau2; double **b, **V, **Ti, **bmle; void *state; { double **sbb0, **S; double *bmb0; int i, nu /* , info*/; /* sbb0 = zeros(length(b0)); */ sbb0 = new_zero_matrix(col, col); S = new_id_matrix(col); /* for i=1:length(s2) sbb0 = sbb0 + (b(:,i)-b0) * (b(:,i)-b0)'/s2(i); end */ bmb0 = new_vector(col); for(i=0; i #include #include "model.h" #include "params.h" #include "temper.h" class Tgp { private: time_t itime; /* time stamp for periodic R interaction */ void *state; /* RNG (random number generator) state */ unsigned int n; /* n inputs (number of rows in X) */ unsigned int d; /* d covariates (number of cols in X) */ unsigned int nn; /* number of predictive locations (rows in XX) */ unsigned int nsplit; /* number of rows in Xsplit, nsplit likely n+nn */ bool trace; /* indicates whether traces for XX should be sent to files */ unsigned int B; /* number of burn-in rounds */ unsigned int T; /* total number of MCMC rounds (including burn-in) */ unsigned int E; /* sample from posterior (E)very somany rounds */ unsigned int R; /* number of times to (Re-) start over (>=1) */ int verb; /* indicates the verbosity of print statements */ double *tree; /* double-vector tree representation */ unsigned int treecol; /* number of cols in double-vector tree representation */ double *hier; /* double-vector hierarchical prior representation */ double *dparams; /* double-vector of user-specified parameterization */ Temper *its; /* set of inv-temperatures for importance tempering */ bool linburn; /* initialize with treed LM before burn in? */ bool pred_n; /* sample from posterior predictive at data locs? */ bool krige; /* gather kriging statistics? */ bool delta_s2; /* gather ALC statistics? */ int improv; /* gather IMPROV statistics -- at what power? */ bool sens; /* is this a Sensitivity Analysis? */ double **X; /* n-by-d input (design matrix) data */ double *Z; /* response vector of length n */ double **XX; /* nn-by-d (design matrix) of predictive locations */ double **Xsplit; /* (nsplit)-by-d rbind(X,XX) matrix for rect & tree splits */ Params *params; /* prior-parameters module */ double **rect; /* bounding rectangle of the (design matrix) data X */ Model *model; /* pointer to the (treed GP) model */ Preds *cump; /* data structure for gathering posterior pred samples */ Preds *preds; /* inv-temporary for posteior pred samples */ public: /* constructor and destructor */ Tgp(void *state, int n, int d, int nn, int B, int T, int E, int R, int linburn, bool pred_n, bool krige, bool delta_s2, int improv, bool sens, double *X, double *Z, double *XX, double *Xsplit, int nsplit, double *dparams, double *ditemps, bool trace, int verb, double *dtree, double *hier); ~Tgp(void); /* a function that should only be called just after constructor */ void Init(void); /* functions that do all the TGP modelling work */ void Rounds(void); void Predict(void); /* posterior predictive summary statistics */ void GetStats(bool report, double *Zp_mean, double *ZZ_mean, double *Zp_km, double *ZZ_km, double *Zp_kvm, double *ZZ_kvm, double *Zp_q, double *ZZ_q, bool zcov, double *Zp_s2, double *ZZ_s2, double *ZpZZ_s2, double *Zp_ks2, double *ZZ_ks2, double *Zp_q1, double *Zp_median, double *Zp_q2, double *ZZ_q1, double *ZZ_median, double *ZZ_q2, double *Ds2x, double *improvec, int numirank, int* irank, double *ess); /* Importance Tempering */ void GetPseudoPrior(double *ditemps); /* Sensitivity Analysis */ void Sens(int *ngrid_in, double *span_in, double *sens_XX, double *sens_ZZ_mean, double *sens_ZZ_q1,double *sens_ZZ_q2, double *sens_S, double *sens_T); /* printing */ void Print(FILE *outfile); int Verb(void); /* tree statistics */ void GetTreeStats(double *gpcs); }; /* input and output data processing */ double ** getXdataRect(double **X, unsigned int n, unsigned int d, double **XX, unsigned int nn); #endif tgp/src/all_draws.h0000644000175100001440000001701012655414756014010 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __ALL_DRAWS_H__ #define __ALL_DRAWS_H__ #define ALPHAMIN 0.1 unsigned int beta_draw_margin(double *b, unsigned int col, double **Vb, double *bmu, double s2, void *state); double sigma2_draw_no_b_margin(unsigned int n, unsigned int col, double lambda, double alpha0, double beta0, void *state); double compute_lambda_noK(double** Vb, double*b, unsigned int n, unsigned int col, double **F, double *Z, double **Ti, double tau2, double *b0, double* Kdiag, double itemp); double compute_lambda(double** Vb, double*b, unsigned int n, unsigned int col, double **F, double *Z, double **Ki, double **Ti, double tau2, double *b0, double itemp); void compute_b_and_Vb(double **Vb, double *b, double *by, double *TiB0, unsigned int n, unsigned int col, double **F, double *Z, double **Ki, double **Ti, double tau2, double *b0, double itemp); void compute_b_and_Vb_noK(double **Vb, double *b, double *by, double *TiB0, unsigned int n, unsigned int col, double **F, double *Z, double **Ti, double tau2, double *b0, double *Kdiag, double itemp); void Ti_draw(double **Ti, unsigned int col, unsigned int ch, double **b, double **bmle, double *b0, unsigned int rho, double **V, double *s2, double *tau2, void *state); void b0_draw(double *b0, unsigned int col, unsigned int ch, double **b, double *s2, double **Ti, double *tau2, double *mu, double **Ci, void *state); double gamma_mixture_pdf(double d, double *alpha, double *beta); double log_d_prior_pdf(double d, double *alpha, double *beta); double d_prior_rand(double *alpha, double *beta, void *state); double log_nug_prior_pdf(double nug, double *alpha, double *beta); double nug_prior_rand(double *alpha, double *beta, void *state); double gamma_mixture_rand(double *alpha, double *beta, void *state); void mixture_priors_draw(double *alpha, double *beta, double *d, unsigned int n, double *alpha_lambda, double *beta_lambda, void *state); void d_proposal(unsigned int n, int *p, double *d, double *dold, double *q_fwd, double *q_bak, void *state); double unif_propose_pos(double last, double *q_fwd, double *q_bak, void *state); double nug_draw(double last, double *q_fwd, double *q_bak, void *state); double mixture_priors_ratio(double *alpha_new, double* alpha, double *beta_new, double *beta, double *d, unsigned int n, double *alpha_lambda, double *beta_lambda); int d_draw_margin(unsigned int n, unsigned int col, double d, double dlast, double **F, double *Z, double **DIST, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double nug, double pRatio, double *d_alpha, double *d_beta, double a0, double g0, int lin, double itemp, void *state); int d_sep_draw_margin(double *d, unsigned int n, unsigned int dim, unsigned int col, double **F, double **X, double *Z, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double nug, double qRatio, double pRatio_log, double a0, double g0, int lin, double itemp, void *state); int d_sim_draw_margin(double *d, unsigned int n, unsigned int dim, unsigned int col, double **F, double **X, double *Z, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double nug, double qRatio, double pRatio_log, double a0, double g0, double itemp, void *state); int matern_d_draw_margin(unsigned int n, unsigned int col, double d, double dlast, double **F, double *Z, double **DIST, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double nug, double nu, double *bk, double pRatio, double *d_alpha, double *d_beta, double a0, double g0, int lin, double itemp, void *state); double nug_draw_margin(unsigned int n, unsigned int col, double nuglast, double **F, double *Z, double **K, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double *nug_alpha, double *nug_beta, double a0, double g0, int linear, double itemp, void *state); double* mr_nug_draw_margin(unsigned int n, unsigned int col, double nug, double nugfine, double **X, double **F, double *Z, double **K, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double *nug_alpha, double *nug_beta, double *nugf_alpha, double *nugf_beta, double delta, double a0, double g0, int linear, double itemp, void *state); void sigma2_prior_draw(double *a0, double *g0, double *s2, unsigned int nl, double a0_lambda, double g0_lambda, unsigned int *n, void *state); double tau2_draw(unsigned int col, double **Ti, double s2, double *b, double *b0, double alpha0, double beta0, void *state); double linear_pdf(double *d, unsigned int n, double *gamlin); double linear_pdf_sep(double *pb, double *d, unsigned int n, double *gamlin); int linear_rand(double *d, unsigned int n, double *gamlin, void *state); int linear_rand_sep(int *b, double *pb, double *d, unsigned int n, double *gamlin, void *state); void mle_beta(double *mle, unsigned int n, unsigned int col, double **F, double *Z); double mixture_hier_prior_log(double *alpha, double *beta, double *beta_lambda, double *alpha_lambda); double hier_prior_log(double alpha, double beta, double beta_lambda, double alpha_lambda); double tau2_prior_rand(double alpha, double beta, void *state); double log_tau2_prior_pdf(double tau2, double alpha, double beta); #endif tgp/src/predict.h0000644000175100001440000000765512655414756013510 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __PREDICT_H__ #define __PREDICT_H__ int predict_full(unsigned int n1, double *zp, double *zpm, double *zpvm, double *zps2, double *zpjitter, unsigned int n2, double *zz, double *zzm, double *zzvm, double *zzs2, double *zzjitter, double **Ds2xy, double *improv, double *Z, unsigned int col, double **F, double **K, double **Ki, double **W, double tau2, double **FF, double **xxKx, double ** xxKxx, double *KKdiag, double *b, double ss2, double Zmin, int err, void *state); void delta_sigma2(double *Ds2xy, unsigned int n1, unsigned int n2, unsigned int col, double ss2, double denom, double **FW, double tau2, double *fW, double *KpFWFiQx, double **FFrow, double **KKrow, double **xxKxx, unsigned int which_i); int predict_draw(unsigned int n, double *z, double *mean, double *s, int err, void *state); void expected_improv(unsigned int n, unsigned int nn, double *improv, double Zmin, double *zzmean, double *s); void predicted_improv(unsigned int n, unsigned int nn, double *improv, double Zmin, double *z, double *zz); double predictive_var(unsigned int n1, unsigned int col, double *Q, double *rhs, double *Wf, double *s2cor, double ss2, double *k, double *f, double **FW, double **W, double tau2, double **KpFWFi, double corr_diag); double predictive_mean(unsigned int n1, unsigned int col, double *FFrow, double *KKrow, double *b, double *KiZmFb); void predict_data(double *zmean, double *zs, unsigned int n1, unsigned int col, double **FFrow, double **K, double *b, double ss2, double *zpjitter, double *KiZmFb); void delta_sigma2(double *Ds2xy, unsigned int n1, unsigned int n2, unsigned int col, double ss2, double denom, double **FW, double tau2, double *fW, double *KpFWFiQx, double **FFrow, double ** KKrow, double **xxKxx, unsigned int which_i); void predict_delta(double *zzm, double *zzs2, double **Ds2xy, unsigned int n1, unsigned int n2, unsigned int col, double **FFrow, double **FW, double **W, double tau2, double ** KKrow, double **xxKxx, double **KpFWFi, double *b, double ss2, double *zzjitter, double *KiZmFb); void predict_no_delta(double *zzm, double *zzs2, unsigned int n1, unsigned int n2, unsigned int col, double **FFrow, double **FW, double **W, double tau2, double **KKrow, double **KpFWFi, double *b, double ss2, double *KKdiag, double *KiZmFb); void predict_help(unsigned int n1, unsigned int col, double *b, double **F, double *Z, double **W, double tau2, double **K, double **Ki, double **FW, double **KpFWFi, double *KiZmFb); unsigned int* GetImprovRank(int R, int nn, double **Imat_in, int g, int numirank, double *w); void move_avg(int nn, double* XX, double *YY, int n, double* X, double *Y, double frac); void sobol_indices(double *ZZ, unsigned int nn, unsigned int m, double *S, double *T); #endif tgp/src/gen_covar.c0000644000175100001440000003073012655414756014002 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #include #include #include #include #include #include "matrix.h" #include "linalg.h" #include "gen_covar.h" #include "rhelp.h" /* #define THRESH 0.5 */ /* * dist_symm: * * compute distance matrix all matices must be alloc'd * pwr is 1 (abs) or 2, anything else defaults to 1 (abs) * SYMMETRIC * * X[n][m], DIST[n][n] */ void dist_symm(DIST, m, X, n, pwr) unsigned int m,n; double **X, **DIST; double pwr; { int i,j,k; double diff; /* sanity check and initialize */ assert(DIST); i = k = j = 0; for(i=0; i 0) id(K, n); else zero(K, n, m); } else { /* complete the K calcluation as a function of DIST */ for(i=0; i 0 && m == n) for(i=0; i= 0); /* d=0 always results in Id matrix; nugget gets added in below */ if(d == 0.0) id(K, n); for(i=0; i 0) id(K, n); else zero(K, n, m); } else { for(i=0; i 0 && m == n) for(i=0; i= 0); /* d=0 should result in Id + nug on diagonal; nug is added in below */ if(d == 0.0) id(K, n); for(i=0; i #include #include #include #include #include using namespace std; #define BUFFMAX 256 #define PWR 2.0 /* * Sim: * * constructor function */ Sim::Sim(unsigned int dim, Base_Prior *base_prior) : Corr(dim, base_prior) { /* Sanity Checks */ assert(base_prior->BaseModel() == GP); assert( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == SIM); /* set pointer to correllation prior from the base prior */ prior = ((Gp_Prior*) base_prior)->CorrPrior(); assert(prior); /* no LLM for sim covariance */ assert(!prior->Linear() && !prior->LLM()); linear = false; /* let the prior choose the starting nugget value */ nug = prior->Nug(); /* allocate and initialize (from prior) the range params */ d = new_dup_vector(((Sim_Prior*)prior)->D(), dim); /* counter of the number of d-rejections in a row */ dreject = 0; } /* * Sim (assignment operator): * * used to assign the parameters of one correlation * function to anothers. Both correlation functions * must already have been allocated */ Corr& Sim::operator=(const Corr &c) { Sim *e = (Sim*) &c; /* sanity check */ assert(prior == ((Gp_Prior*) base_prior)->CorrPrior()); /* copy everything */ log_det_K = e->log_det_K; linear = e->linear; dupv(d, e->d, dim); nug = e->nug; dreject = e->dreject; return *this; } /* * ~Sim: * * destructor */ Sim::~Sim(void) { free(d); } /* * Init: * * initialise this corr function with the parameters provided * from R via the vector of doubles */ void Sim::Init(double *dsim) { dupv(d, &(dsim[1]), dim); NugInit(dsim[0], false); } /* * Jitter: * * fill jitter[ ] with the variance inflation factor. That is, * the variance for an observation with covariates in the i'th * row of X will be s2*(1.0 + jitter[i]). In standard tgp, the * jitter is simply the nugget. But for calibration and mr tgp, * the jitter value depends upon X (eg real or simulated data). * */ double* Sim::Jitter(unsigned int n1, double **X) { double *jitter = new_vector(n1); for(unsigned int i=0; in); /* with probability 0.5, skip drawing the nugget */ double ru = runi(state); if(ru > 0.5) return false; /* make the draw */ double nug_new = nug_draw_margin(n, col, nug, F, Z, K, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, prior->NugAlpha(), prior->NugBeta(), gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) linear, itemp, state); /* did we accept the draw? */ if(nug_new != nug) { nug = nug_new; success = true; swap_new(Vb, bmu, lambda); } return success; } /* * Update: (symmetric) * * takes in a (symmetric) distance matrix and * returns a correlation matrix (INCLUDES NUGGET) */ void Sim::Update(unsigned int n, double **K, double **X) { sim_corr_symm(K, dim, X, n, d, nug, PWR); } /* * Update: (symmetric) * * computes the internal correlation matrix K * (INCLUDES NUGGET) */ void Sim::Update(unsigned int n, double **X) { /* sanity checks */ assert(!linear); assert(this->n == n); /* compute K */ sim_corr_symm(K, dim, X, n, d, nug, PWR); } /* * Update: (non-symmetric) * * takes in a distance matrix and returns a * correlation matrix (DOES NOT INCLUDE NUGGET) */ void Sim::Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX) { sim_corr(K, dim, XX, n1, X, n2, d, PWR); } /* * propose_new_d: * * propose new d values. */ /* extern "C" { double orthant_miwa(int m, double *mu, double **Rho, int log2G, int conesonly, int *nconep); #define _orthant_miwa orthant_miwa } */ /* use code from Peter Craig: gridcalc.c orschm.c, orthant.c/h with minor modifications to get to compile */ void Sim::propose_new_d(double* d_new, double *q_fwd, double *q_bak, void *state) { /* pointer to sim prior */ Sim_Prior* sp = (Sim_Prior*) prior; /* calculate old signs */ /* double *signs = new_zero_vector(dim); for(unsigned int i=0; i 0) signs[i] = 1.0; else signs[i] = -1.0; } */ /* calculate probability of old signs */ /* double **P = new_zero_matrix(dim, dim); linalg_dgemm(CblasNoTrans,CblasNoTrans,dim,dim,1, 1.0,&signs,dim,&signs,1,0.0,P,dim); double **RhoP = new_dup_matrix(sp->DpRho(), dim, dim); for(unsigned int i=0; iDpCov_chol(), dim, state); *q_fwd = *q_bak = 1.0; /* random signs from same MVN */ /* mvnrnd(signs, NULL, sp->DpCov_chol(), dim, state); for(unsigned int i=0; i 0) signs[i] = 1.0; else signs[i] = -1.0; d_new[i] = signs[i] * fabs(d_new[i]); } */ /* calculate probability of proposed signs */ /* linalg_dgemm(CblasNoTrans,CblasNoTrans,dim,dim,1, 1.0,&signs,dim,&signs,1,0.0,P,dim); dup_matrix(RhoP, sp->DpRho(), dim, dim); for(unsigned int i=0; ilog_DPrior_pdf(d_new); pRatio_log -= ep->log_DPrior_pdf(d); /* MH acceptance ratio for the draw */ success = d_sim_draw_margin(d_new, n, dim, col, F, X, Z, log_det_K,*lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, nug, qRatio, pRatio_log, gp_prior->s2Alpha(), gp_prior->s2Beta(), itemp, state); /* see if the draw was accepted; if so, we need to copy (or swap) the contents of the new into the old */ if(success == 1) { swap_vector(&d, &d_new); swap_new(Vb, bmu, lambda); } /* iclean up */ free(d_new); /* something went wrong, abort; otherwise keep track of the number of d-rejections in a row */ if(success == -1) return success; else if(success == 0) dreject++; else dreject = 0; /* abort if we have had too many rejections */ if(dreject >= REJECTMAX) return -2; /* draw nugget */ bool changed = DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); success = success || changed; return success; } /* * Combine: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ void Sim::Combine(Corr *c1, Corr *c2, void *state) { get_delta_d((Sim*)c1, (Sim*)c2, state); CombineNug(c1, c2, state); } /* * Split: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void Sim::Split(Corr *c1, Corr *c2, void *state) { propose_new_d((Sim*) c1, (Sim*) c2, state); SplitNug(c1, c2, state); } /* * get_delta_d: * * compute d from two ds residing in c1 and c2 * and sample b conditional on the chosen d * * (used in prune) */ void Sim::get_delta_d(Sim* c1, Sim* c2, void *state) { /* create pointers to the two ds */ double **dch = (double**) malloc(sizeof(double*) * 2); dch[0] = c1->d; dch[1] = c2->d; /* randomly choose one of the d's */ int ii[2]; propose_indices(ii, 0.5, state); /* and copy the chosen one */ dupv(d, dch[ii[0]], dim); /* clean up */ free(dch); } /* * propose_new_d: * * propose new D parameters using this->d for possible * new children partitions c1 and c2 * * (used in grow) */ void Sim::propose_new_d(Sim* c1, Sim* c2, void *state) { int i[2]; double **dnew = new_matrix(2, dim); /* randomply choose which of c1 and c2 will get a copy of this->d, and which will get a random d from the prior */ propose_indices(i, 0.5, state); /* from this->d */ dupv(dnew[i[0]], d, dim); /* from the prior */ draw_d_from_prior(dnew[i[1]], state); /* copy into c1 and c2 */ dupv(c1->d, dnew[0], dim); dupv(c2->d, dnew[1], dim); /* clean up */ delete_matrix(dnew); } /* * draw_d_from_prior: * * get draws of separable d parameter from * the prior distribution */ void Sim::draw_d_from_prior(double *d_new, void *state) { ((Sim_Prior*)prior)->DPrior_rand(d_new, state); } /* * State: * * return a string depecting the state * of the (parameters of) correlation function */ char* Sim::State(unsigned int which) { char buffer[BUFFMAX]; /* slightly different format if the nugget is going to get printed also */ #ifdef PRINTNUG string s = "(d"; sprintf(buffer, "%d=[", which); s.append(buffer); #else string s = ""; if(which == 0) s.append("d=["); else s.append("["); #endif for(unsigned int i=0; ilog_Prior(d); return prob; } /* * D: * * return the vector of range parameters for the * separable exponential family of correlation function */ double* Sim::D(void) { return d; } /* * Trace: * * return the current values of the parameters * to this correlation function */ double* Sim::Trace(unsigned int* len) { /* calculate the length of the trace vector, and allocate */ *len = 1 + dim + 1; double *trace = new_vector(*len); /* copy the nugget */ trace[0] = nug; /* copy the d-vector of range parameters */ dupv(&(trace[1]), d, dim); /* determinant of K */ trace[1+dim] = log_det_K; return(trace); } /* * TraceNames: * * return the names of the parameters recorded in Sim::Trace() */ char** Sim::TraceNames(unsigned int* len) { /* calculate the length of the trace vector, and allocate */ *len = 1 + dim + 1; char **trace = (char**) malloc(sizeof(char*) * (*len)); /* copy the nugget */ trace[0] = strdup("nug"); /* copy the d-vector of range parameters */ for(unsigned int i=0; icorr_model == SIM); /* copy all parameters of the prior */ corr_model = e->corr_model; dupv(gamlin, e->gamlin, 3); d = new_dup_vector(e->d, dim); dp_cov_chol = new_dup_matrix(e->dp_cov_chol, dim, dim); // dp_Rho = new_dup_matrix(e->dp_Rho, dim, dim); fix_d = e->fix_d; d_alpha = new_dup_matrix(e->d_alpha, dim, 2); d_beta = new_dup_matrix(e->d_beta, dim, 2); dupv(d_alpha_lambda, e->d_alpha_lambda, 2); dupv(d_beta_lambda, e->d_beta_lambda, 2); } /* * ~Sim_Prior: * * destructor for the prior parameterization of the separable * exponential power distribution function */ Sim_Prior::~Sim_Prior(void) { free(d); delete_matrix(dp_cov_chol); // delete_matrix(dp_Rho); delete_matrix(d_alpha); delete_matrix(d_beta); } /* * read_double: * * read the double parameter vector giving the user-secified * prior parameterization specified in R */ void Sim_Prior::read_double(double *dparams) { /* read the parameters that have to to with the nugget */ read_double_nug(dparams); /* read the starting value(s) for the range parameter(s) */ for(unsigned int i=0; igetline(line, BUFFMAX); d[0] = atof(strtok(line, " \t\n#")); for(unsigned int i=1; igetline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_d = true; MYprintf(MYstdout, "fixing d prior\n"); } else { fix_d = false; get_mix_prior_params(d_alpha_lambda, d_beta_lambda, line, "d lambda"); } } /* * default_d_priors: * * set d prior parameters * to default values */ void Sim_Prior::default_d_priors(void) { for(unsigned int i=0; iparameters for the jth dimension from each of the "howmany" corr modules */ for(unsigned int i=0; iD())[j]); /* use those gathered d values to make a draw for the parameters for the prior of the jth d */ mixture_priors_draw(d_alpha[j], d_beta[j], d, howmany, d_alpha_lambda, d_beta_lambda, state); } /* clean up */ free(d); } /* hierarchical prior draws for the nugget */ DrawNugHier(corr, howmany, state); } /* * newCorr: * * construct and return a new separable exponential correlation * function with this module governing its prior parameterization */ Corr* Sim_Prior::newCorr(void) { return new Sim(dim, base_prior); } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug) */ double Sim_Prior::log_Prior(double *d) { double prob = 0; /* if forcing the LLM, just return zero (i.e. prior=1, log_prior=0) */ assert(gamlin[0] <= 0); /* sum the log priors for each of the d-parameters */ for(unsigned int i=0; ibase_prior = base_prior; } /* * Print: * * pretty print the correllation function parameters out * to a file */ void Sim_Prior::Print(FILE *outfile) { MYprintf(MYstdout, "corr prior: separable power\n"); /* print nugget stuff first */ PrintNug(outfile); /* range parameter */ /* MYprintf(outfile, "starting d=\n"); printVector(d, dim, outfile, HUMAN); */ /* range gamma prior, just print once */ MYprintf(outfile, "d[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha[0][0], d_beta[0][0], d_alpha[0][1], d_beta[0][1]); /* print many times, one for each dimension instead? */ /* for(unsigned int i=1; i #include #include using namespace std; #include /* * Params: * * the usual constructor function */ Params::Params(unsigned int dim) { d = dim; /* * the rest of the parameters will be read in * from the control file (Params::read_ctrlfile), or * from a double vector passed from R (Params::read_double) */ col = dim+1; t_alpha = 0.95; /* alpha: tree priors */ t_beta = 2; /* beta: tree priors */ t_minpart = 5; /* minpart: tree priors, smallest partition */ t_splitmin = 0; /* data column where we start partitioning */ t_basemax = dim; /* last data column before we stop using the base model */ prior = NULL; } /* * Params: * * duplication constructor function */ Params::Params(Params *params) { /* generic and tree parameters */ d = params->d; col = params->col; /* copy the tree parameters */ t_alpha = params->t_alpha; t_beta = params->t_beta; t_minpart = params->t_minpart; t_splitmin = params->t_splitmin; t_basemax = params->t_basemax; /* copy the Gp prior */ assert(params->prior); prior = new Gp_Prior(params->prior); ((Gp_Prior*)prior)->CorrPrior()->SetBasePrior(prior); } /* * ~Params: * * the usual destructor, nothing fancy */ Params::~Params(void) { delete prior; } /* * read_double: * * takes params from a double array, * for use with communication with R */ void Params::read_double(double *dparams) { /* read tree prior values alpha, beta and minpart */ // printVector(dparams, 5, MYstdout, HUMAN); t_alpha = dparams[0]; t_beta = dparams[1]; t_minpart = (unsigned int) dparams[2]; /* read tree prior values splitmin and basemax */ t_splitmin = ((unsigned int) dparams[3]) - 1; assert(t_splitmin >= 0 && t_splitmin < d); t_basemax = ((unsigned int) dparams[4]); assert(t_basemax > 0 && t_basemax <= d); /* read the mean function form */ int mf = (int) dparams[5]; MEAN_FN mean_fn = LINEAR; switch (mf) { case 0: mean_fn=LINEAR; /* MYprintf(MYstdout, "linear mean\n"); */ break; case 1: mean_fn=CONSTANT;/* MYprintf(MYstdout, "constant mean\n");*/ break; default: error("bad mean function %d", (int)dparams[5]); break; } prior = new Gp_Prior(/*d*/ t_basemax, mean_fn); /* read the rest of the parameters into the corr prior module */ prior->read_double(&(dparams[6])); } /* * read_ctrlfile: * * read all of the parameters from the control file */ void Params::read_ctrlfile(ifstream* ctrlfile) { char line[BUFFMAX]; /* read the tree-parameters (alpha, beta and minpart) from the control file */ ctrlfile->getline(line, BUFFMAX); t_alpha = atof(strtok(line, " \t\n#")); t_beta = atof(strtok(NULL, " \t\n#")); t_minpart = atoi(strtok(NULL, " \t\n#")); assert(t_minpart > 1); /* read in splitmin and basemax */ t_splitmin = atoi(strtok(NULL, " \t\n#")) - 1; assert(t_splitmin >= 0 && t_splitmin < d); t_basemax = atoi(strtok(NULL, " \t\n#")); assert(t_basemax > 0 && t_basemax <= d); /* read the mean function form */ /* LINEAR, CONSTANT, or TWOLEVEL */ MEAN_FN mean_fn = LINEAR; ctrlfile->getline(line, BUFFMAX); if(!strncmp(line, "linear", 6)) { mean_fn = LINEAR; MYprintf(MYstdout, "mean function: linear\n"); } else if(!strncmp(line, "constant", 8)) { mean_fn = CONSTANT; MYprintf(MYstdout, "mean function: constant\n"); } else { error("%s is not a valid mean function", strtok(line, "\t\n#")); } /* This will be needed for MrTgp */ prior = new Gp_Prior(/*d*/ t_basemax, mean_fn); /* prints the tree prior parameter settings */ Print(MYstdout); /* read the rest of the parameters into the corr prior module */ prior->read_ctrlfile(ctrlfile); } /* * get_T_params: * * pass back the tree prior parameters * t_alpha nad t_beta */ void Params::get_T_params(double *alpha, double *beta, unsigned int *minpart, unsigned int *splitmin, unsigned int *basemax) { *alpha = t_alpha; *beta = t_beta; *minpart = t_minpart; *splitmin = t_splitmin; *basemax = t_basemax; } /* * isTree: * * return true if the tree-prior allows tree growth, * and false otherwise */ bool Params::isTree(void) { if(t_alpha > 0 && t_beta > 0) return true; else return false; } /* * T_minp: * * return minimim partition data number */ unsigned int Params::T_minp(void) { return t_minpart; } /* * T_smin: * * return minimim partition column number */ unsigned int Params::T_smin(void) { return t_splitmin; } /* * T_bmax: * * return maximum Base model column number */ unsigned int Params::T_bmax(void) { return t_basemax; } /* * get_mix_prior_params: * * reading the mixture hierarchical priors from a string */ void get_mix_prior_params(double *alpha, double *beta, char *line, const char* which) { alpha[0] = atof(strtok(line, " \t\n#")); assert(alpha[0] > 0); beta[0] = atof(strtok(NULL, " \t\n#")); assert(beta[0] > 0); alpha[1] = atof(strtok(NULL, " \t\n#")); assert(alpha[1] > 0); beta[1] = atof(strtok(NULL, " \t\n#")); assert(beta[1] > 0); /* MYprintf(MYstdout, "%s[a,b][0,1]=[%g,%g],[%g,%g]\n", which, alpha[0], beta[0], alpha[1], beta[1]); */ } /* * get_mix_prior_params_double: * * reading the mixture hierarchical priors from a string * zero-values in alpha[0] indicate that the prior fixes * the parameter to beta[0] in the prior */ void get_mix_prior_params_double(double *alpha, double *beta, double *alpha_beta, const char* which) { alpha[0] = alpha_beta[0]; assert(alpha[0] >= 0); beta[0] = alpha_beta[1]; assert(beta[0] >= 0); alpha[1] = alpha_beta[2]; assert(alpha[1] >= 0); beta[1] = alpha_beta[3]; assert(beta[1] >= 0); /* MYprintf(MYstdout, "%s[a,b][0,1]=[%g,%g],[%g,%g]\n", which, alpha[0], beta[0], alpha[1], beta[1]); */ } /* * BasePrior: * * return the Base (e.g., Gp) prior module */ Base_Prior* Params::BasePrior(void) { return prior; } /* * Print: * * print the settings of the tree parameters -- these * are currently the only parameters governed by the * module */ void Params::Print(FILE *outfile) { MYprintf(outfile, "T[alpha,beta,nmin,smin,bmax]=[%g,%g,%d,%d,%d]\n", t_alpha, t_beta, t_minpart, t_splitmin+1, t_basemax); } tgp/src/list.cc0000644000175100001440000001047612655414756013162 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "rhelp.h" } #include "list.h" #include #include #include /* * the usual constructor function * for NODE */ LNode::LNode(void* entry) { this->entry = entry; prev = next = NULL; list = NULL; } /* * the usual destructor function * for NODE */ LNode::~LNode(void) { } /* * return the next node in the list */ LNode* LNode::Next(void) { return next; } /* * return the previous node in the list */ LNode* LNode::Prev(void) { return prev; } /* * return the data entry for the node */ void* LNode::Entry(void) { return entry; } /* ************************ * BEGIN List FUNCTIONS * ************************ */ /* * the usual constructor function * for LIST */ List::List(void) { first = last = curr = NULL; len = 0; } /* * the usual destructor function * for LIST */ List::~List(void) { curr = first; if(curr) warning("nonempty list deleted"); while(curr) { LNode* temp = curr; curr = curr->next; delete temp; } } /* * insert a new node at the beginning * of the list */ LNode* List::EnQueue(void* entry) { if(first == NULL) { assert(last == NULL); assert(len == 0); first = new LNode(entry); last = first; } else { assert(last != NULL); assert(len > 0); LNode* newnode = new LNode(entry); newnode->next = first; assert(first->prev == NULL); first->prev = newnode; first = newnode; } len++; first->list = this; return first; } /* * remove a node from the end * of the list */ void * List::DeQueue(void) { if(last == NULL) { assert(first == NULL); assert(len == 0); return NULL; } else { LNode* temp = last; if(first == last) { first = NULL; } else { assert(last->prev != NULL); last->prev->next = NULL; } last = last->prev; len--; assert(len >= 0); void* entry = temp->Entry(); temp->list = NULL; delete temp; return entry; } } /* * check if the list is empty */ bool List::isEmpty(void) { if(first == NULL) { assert(last == NULL); assert(len == 0); return true; } else { assert(last != NULL); assert(len > 0); return false; } } /* * return the length of the list */ unsigned int List::Len(void) { return len; } /* * detach and delete the node from the list */ void* List::detach_and_delete(LNode* node) { assert(node); if(node->list == NULL) { void* entry = node->Entry(); delete node; return entry; } assert(node->list == this); if(node == first) { assert(node->prev == NULL); if(node == last) { /* first and last (one node list) */ assert(node->next == NULL); first = last = NULL; } else { /* first but not last */ assert(node->next != NULL); first = node->next; node->next = NULL; first->prev = NULL; } } else if(node == last) { /* last but not first */ assert(node->next == NULL); assert(node->prev != NULL); last = node->prev; node->prev = NULL; last->next = NULL; } else { /* not last or first */ node->prev->next = node->next; node->next->prev = node->prev; node->next = NULL; node->prev = NULL; } void* entry = node->Entry(); node->list = NULL; delete node; node = NULL; len--; assert(len >= 0); return entry; } /* * return the first node in the list */ LNode* List::First(void) { return first; } tgp/src/mr_exp_sep.cc0000644000175100001440000012547312655414756014354 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "matrix.h" #include "lh.h" #include "lik_post.h" #include "rand_draws.h" #include "rand_pdf.h" #include "all_draws.h" #include "gen_covar.h" #include "rhelp.h" } #include "corr.h" #include "params.h" #include "model.h" #include "mr_exp_sep.h" #include #include #include #include #include #include using namespace std; #define BUFFMAX 256 #define PWR 2.0 /* * MrExpSep: * * constructor function; should be the same as ExpSep, * but for delta and nugaux */ MrExpSep::MrExpSep(unsigned int dim, Base_Prior *base_prior) : Corr(dim, base_prior) { K= new_id_matrix(n); /* Sanity Checks */ assert(base_prior->BaseModel() == GP); assert( ((Gp_Prior*) base_prior)->CorrPrior()->CorrModel() == MREXPSEP); /* set pointer to correllation priot from the base prior */ prior = ((Gp_Prior*) base_prior)->CorrPrior(); assert(prior); /* let the prior choose the starting nugget value */ nug = prior->Nug(); /* allocate and initialize (from prior) the range params */ d = new_dup_vector(((MrExpSep_Prior*)prior)->D(), 2*dim); /* start fully in the GP model, not the LLM */ b = new_ones_ivector(2*dim, 1); pb = new_zero_vector(2*dim); /* memory allocated for effective range parameter -- deff = d*b */ d_eff = new_dup_vector(d, 2*dim); /* counter of the number of d-rejections in a row */ dreject = 0; /* get the fine variance discount factor, and observation nugget for thefine level proc -- both fro prior */ delta = ((MrExpSep_Prior*)prior)->Delta(); nugaux = ((MrExpSep_Prior*)prior)->Nugaux(); } /* * MrExpSep (assignment operator): * * used to assign the parameters of one correlation * function to anothers. Both correlation functions * must already have been allocated */ Corr& MrExpSep::operator=(const Corr &c) { MrExpSep *e = (MrExpSep*) &c; /* sanity check */ assert(prior == ((Gp_Prior*) base_prior)->CorrPrior()); /* copy everything */ log_det_K = e->log_det_K; linear = e->linear; dim = e->dim; dupv(d, e->d, 2*dim); dupv(pb, e->pb, 2*dim); dupv(d_eff, e->d_eff, 2*dim); dupiv(b, e->b, 2*dim); nug = e->nug; dreject = e->dreject; /* copy the covariance matrices -- no longer performed due to the new economy argument in Gp/Base */ // Cov(e); return *this; } /* * ~MrExpSep: * * destructor */ MrExpSep::~MrExpSep(void) { free(d); free(b); free(pb); free(d_eff); } /* * Init: * * initialise this corr function with the parameters provided * from R via the vector of doubles */ void MrExpSep::Init(double *dmrexpsep) { dupv(d, &(dmrexpsep[3]), dim*2); if(!prior->Linear() && prior->LLM()) linear_pdf_sep(pb, d, dim, prior->GamLin()); bool lin = true; for(unsigned int i=0; i<2*dim; i++) { b[i] = (int) dmrexpsep[2*dim+1+i]; lin = lin && !b[i]; d_eff[i] = d[i] * b[i]; } if(prior->Linear()) assert(lin); NugInit(dmrexpsep[0], lin); nugaux = dmrexpsep[1]; delta = dmrexpsep[2]; } /* * Jitter: * * fill jitter[ ] with the observation variance factor. That is, * the variance for an observation at the same location as * data point 'i' will be s2*(jitter[i]). In standard tgp, the * jitter is simply the nugget. But for calibration and mr tgp, * the jitter value depends upon X (eg real or simulated data). * */ double* MrExpSep::Jitter(unsigned int n1, double **X) { double *jitter = new_vector(n1); for(unsigned int i=0; in); /* with probability 0.5, skip drawing the nugget */ if(runi(state) > 0.5) return false; /* make the draw */ if(!K) Update(n, K, X); double* new_nugs = mr_nug_draw_margin(n, col, nug, nugaux, X, F, Z, K, log_det_K, *lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, prior->NugAlpha(), prior->NugBeta(), ((MrExpSep_Prior*) prior)->Nugaux_alpha(), ((MrExpSep_Prior*) prior)->Nugaux_beta(), delta, gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) linear, itemp, state); /* did we accept the draw? */ if(new_nugs[0] != nug) { nug = new_nugs[0]; nugaux = new_nugs[1]; success = true; swap_new(Vb, bmu, lambda); } /* clean up */ free(new_nugs); return success; } /* * Update: (symmetric) * * computes the internal correlation matrix K, * (INCLUDES NUGGET) */ void MrExpSep::Update(unsigned int n, double **K, double **X) { corr_symm(K, dim+1, X, n, d_eff, nug, nugaux, delta, PWR); } /* * Update: (symmetric) * * takes in a (symmetric) distance matrix and * returns a correlation matrix (INCLUDES NUGGET) */ void MrExpSep::Update(unsigned int n, double **X) { /* no need to update internal K if we're at LLM */ if(linear) return; /* sanity check */ assert(this->n == n); /* compute K */ corr_symm(K, dim+1, X, n, d_eff, nug, nugaux, delta, PWR); } /* * Update: (non-symmetric) * * takes in a distance matrix and returns a * correlation matrix (DOES NOT INCLUDE NUGGET) */ void MrExpSep::Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX) { corr_unsymm(K, dim+1, XX, n1, X, n2, d_eff, delta, PWR); } /* * propose_new_d: * * propose new d and b values. Sometimes propose d's and b's for all * dimensions jointly, sometimes do just the d's with b==1, and * other times do only those with b==0. I have found that this improves * mixing */ bool MrExpSep::propose_new_d(double* d_new, int * b_new, double *pb_new, double *q_fwd, double *q_bak, void *state) { *q_bak = *q_fwd = 1.0; /* copy old values */ dupv(d_new, d, 2*dim); dupv(pb_new, pb, 2*dim); dupiv(b_new, b, 2*dim); /* RW proposal for all d-values */ d_proposal(2*dim, NULL, d_new, d, q_fwd, q_bak, state); /* if we are allowing the LLM, then we need to draw the b_new conditional on d_new; otherwise just return */ /* only drawing the first dim booleans (i.e. coarse model only) */ if(prior->LLM()) return linear_rand_sep(b_new,pb_new,d_new,dim,prior->GamLin(),state); else return false; } /* * Draw: * * draw parameters for a new correlation matrix; * returns true if the correlation matrix (passed in) * has changed; otherwise returns false */ int MrExpSep::Draw(unsigned int n, double **F, double **X, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state) { int success = 0; bool lin_new; double q_fwd, q_bak; /* get more accessible pointers to the priors */ MrExpSep_Prior* ep = (MrExpSep_Prior*) prior; Gp_Prior *gp_prior = (Gp_Prior*) base_prior; /* pointers to proposed settings of parameters */ double *d_new = NULL; int *b_new = NULL; double *pb_new = NULL; /* proposals happen when we're not forcing the LLM */ if(prior->Linear()) lin_new = true; else { /* allocate new d, b, and pb */ d_new = new_zero_vector((2*dim)); b_new = new_ivector((2*dim)); pb_new = new_vector((2*dim)); /* make the RW proposal for d, and then b */ lin_new = propose_new_d(d_new, b_new, pb_new, &q_fwd, &q_bak, state); } /* calculate the effective model (d_eff = d*b), and allocate memory -- when we're not proposing the LLM */ double *d_new_eff = NULL; if(! lin_new) { d_new_eff = new_zero_vector((2*dim)); for(unsigned int i=0; i<(2*dim); i++) d_new_eff[i] = d_new[i]*b_new[i]; /* allocate K_new, Ki_new, Kchol_new */ allocate_new(n); /* sanity check */ assert(n == this->n); } /* compute the acceptance ratio, unless we're forcing the LLM in which case we do nothing just return a successful "draw" */ if(prior->Linear()) success = 1; else { /* compute prior ratio and proposal ratio */ double pRatio_log = 0.0; double qRatio = q_bak/q_fwd; pRatio_log += ep->log_DPrior_pdf(d_new); pRatio_log -= ep->log_DPrior_pdf(d); /* MH acceptance ratio for the draw */ success = d_draw(d_new_eff, n, col, F, X, Z, log_det_K,*lambda, Vb, K_new, Ki_new, Kchol_new, &log_det_K_new, &lambda_new, Vb_new, bmu_new, gp_prior->get_b0(), gp_prior->get_Ti(), gp_prior->get_T(), tau2, nug, nugaux, qRatio, pRatio_log, gp_prior->s2Alpha(), gp_prior->s2Beta(), (int) lin_new, itemp, state); /* see if the draw was acceptedl; if so, we need to copy (or swap) the contents of the new into the old */ if(success == 1) { swap_vector(&d, &d_new); /* d_eff is zero if we're in the LLM */ if(!lin_new) swap_vector(&d_eff, &d_new_eff); else zerov(d_eff, (2*dim)); linear = (bool) lin_new; /* copy b and pb */ swap_ivector(&b, &b_new); swap_vector(&pb, &pb_new); swap_new(Vb, bmu, lambda); } } /* if we're not forcing the LLM, then we have some cleadimg up to do */ if(! prior->Linear()) { free(d_new); free(pb_new); free(b_new); } /* if we didn't happen to jump to the LLM, then we have more cleaning up to do */ if(!lin_new) free(d_new_eff); /* something went wrong, abort; otherwise keep track of the number of d-rejections in a row */ if(success == -1) return success; else if(success == 0) dreject++; else dreject = 0; /* abort if we have had too many rejections */ if(dreject >= REJECTMAX) return -2; /* draw nuggets */ bool changed = DrawNugs(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); bool deltasuccess = DrawDelta(n, X, F, Z, lambda, bmu, Vb, tau2, itemp, state); success = success || changed || deltasuccess; return success; } /* * Combine*: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ double MrExpSep::CombineNugaux(MrExpSep *c1, MrExpSep *c2, void *state) { double nugch[2]; int ii[2]; nugch[0] = c1->Nugaux(); nugch[1] = c2->Nugaux(); propose_indices(ii,0.5, state); return nugch[ii[0]]; } double MrExpSep::CombineDelta(MrExpSep *c1, MrExpSep *c2, void *state) { double deltach[2]; int ii[2]; deltach[0] = c1->Delta(); deltach[1] = c2->Delta(); propose_indices(ii,0.5, state); return deltach[ii[0]]; } /* * Combine: * * used in tree-prune steps, chooses one of two * sets of parameters to correlation functions, * and choose one for "this" correlation function */ void MrExpSep::Combine(Corr *c1, Corr *c2, void *state) { get_delta_d((MrExpSep*)c1, (MrExpSep*)c2, state); CombineNug(c1, c2, state); nugaux = CombineNugaux((MrExpSep*)c1, (MrExpSep*)c2, state); delta = CombineDelta((MrExpSep*)c1, (MrExpSep*)c2, state); } /* * Split*: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void MrExpSep::SplitNugaux(MrExpSep *c1, MrExpSep *c2, void *state) { int i[2]; double nugnew[2]; propose_indices(i, 0.5, state); nugnew[i[0]] = nugaux; nugnew[i[1]] = ((MrExpSep_Prior*)prior)->NugauxDraw(state); c1->SetNugaux(nugnew[0]); c2->SetNugaux(nugnew[1]); } void MrExpSep::SplitDelta(MrExpSep *c1, MrExpSep *c2, void *state) { int i[2]; double deltanew[2]; propose_indices(i, 0.5, state); deltanew[i[0]] = delta; deltanew[i[1]] = ((MrExpSep_Prior*)prior)->DeltaDraw(state); c1->SetDelta(deltanew[0]); c2->SetDelta(deltanew[1]); } /* * Split: * * used in tree-grow steps, splits the parameters * of "this" correlation function into a parameterization * for two (new) correlation functions */ void MrExpSep::Split(Corr *c1, Corr *c2, void *state) { propose_new_d((MrExpSep*) c1, (MrExpSep*) c2, state); SplitNug(c1, c2, state); SplitNugaux((MrExpSep*)c1, (MrExpSep*)c2, state); SplitDelta((MrExpSep*)c1, (MrExpSep*)c2, state); } void MrExpSep::SetNugaux(double nugauxnew){ nugaux = nugauxnew; } void MrExpSep::SetDelta(double deltanew){ delta = deltanew; } /* * get_delta_d: * * compute d from two ds residing in c1 and c2 * and sample b conditional on the chosen d * * (used in prune) */ void MrExpSep::get_delta_d(MrExpSep* c1, MrExpSep* c2, void *state) { /* ceate pointers to the two ds */ double **dch = (double**) malloc(sizeof(double*) * 2); dch[0] = c1->d; dch[1] = c2->d; /* randomly choose one of the ds */ int ii[2]; propose_indices(ii, 0.5, state); /* and copy the chosen one */ dupv(d, dch[ii[0]], (2*dim)); /* clean up */ free(dch); /* propose b conditional on the chosen d */ /* propose linear model only in coarse dimensions */ linear = linear_rand_sep(b, pb, d, dim, prior->GamLin(), state); /* compute d_eff = d * b for the chosen d and b */ for(unsigned int i=0; i<(2*dim); i++) d_eff[i] = d[i] * b[i]; } /* * propose_new_d: * * propose new D parameters for possible * new children partitions. */ void MrExpSep::propose_new_d(MrExpSep* c1, MrExpSep* c2, void *state) { int i[2]; double **dnew = new_matrix(2, (2*dim)); /* randomply choose which of c1 and c2 will get a copy of this->d, and which will get a random d from the prior */ propose_indices(i, 0.5, state); /* =from this->d */ dupv(dnew[i[0]], d, (2*dim)); /* from the prior */ draw_d_from_prior(dnew[i[1]], state); /* copy into c1 and c2 */ dupv(c1->d, dnew[0], (2*dim)); dupv(c2->d, dnew[1], (2*dim)); /* clean up */ delete_matrix(dnew); /* propose new b for c1 and c2, conditional on the two new d parameters */ c1->linear = (bool) linear_rand_sep(c1->b, c1->pb, c1->d, (2*dim), prior->GamLin(), state); c2->linear = (bool) linear_rand_sep(c2->b, c2->pb, c2->d, (2*dim), prior->GamLin(), state); /* compute d_eff = b*d for the two new b and d pairs */ for(unsigned int i=0; i<(2*dim); i++) { c1->d_eff[i] = c1->d[i] * c1->b[i]; c2->d_eff[i] = c2->d[i] * c2->b[i]; } } /* * d_draw: * * draws for d given the rest of the parameters except b and s2 marginalized out * * F[col][n], Kchol[n][n], K_new[n][n], Ti[col][col], T[col][col] Vb[col][col], * Vb_new[col][col], Ki_new[n][n], Kchol_new[n][n], b0[col], Z[n], dlast[dim*2], * d_alpha[dim*2][2], d_beta[dim*2][2] * * return 1 if draw accepted, 0 if rejected, -1 if error */ int MrExpSep::d_draw(double *d, unsigned int n, unsigned int col, double **F, double **X, double *Z, double log_det_K, double lambda, double **Vb, double **K_new, double **Ki_new, double **Kchol_new, double *log_det_K_new, double *lambda_new, double **VB_new, double *bmu_new, double *b0, double **Ti, double **T, double tau2, double nug, double nugaux, double qRatio, double pRatio_log, double a0, double g0, int lin, double itemp, void *state) { double pd, pdlast, alpha; unsigned int m = 0; /* Knew = dist_to_K(dist, d, nugget) compute lambda, Vb, and bmu, for the NEW d */ if(! lin) { /* regular */ corr_symm(K_new, dim+1, X, n, d, nug, nugaux, delta, PWR); inverse_chol(K_new, Ki_new, Kchol_new, n); *log_det_K_new = log_determinant_chol(Kchol_new, n); *lambda_new = compute_lambda(Vb_new, bmu_new, n, col, F, Z, Ki_new, Ti, tau2, b0, itemp); } else { /* linear */ *log_det_K_new = 0.0; double *Kdiag = new_vector(n); for(unsigned int i=0; iget_b0(); double a0 = gp_prior->s2Alpha(); double g0 = gp_prior->s2Beta(); /* allocate K_new, Ki_new, Kchol_new */ if(! linear) assert(n == this->n); if(runi(state) > 0.5) return false; double q_fwd; double q_bak; double pdelta; double pnewdelta; /* make the draw */ double newdelta = unif_propose_pos(delta, &q_fwd, &q_bak, state); // printf("%g %g\n", delta, newdelta); /* new covariace matrix based on new nug */ if(linear) { log_det_K_new = 0.0; double *Kdiag = new_vector(n); for(unsigned int i=0; iget_Ti(), tau2, b0, Kdiag, itemp); free(Kdiag); } else{ corr_symm(K_new, dim+1, X, n, d, nug, nugaux, newdelta, PWR); inverse_chol(K_new, Ki_new, Kchol_new, n); log_det_K_new = log_determinant_chol(Kchol_new, n); lambda_new = compute_lambda(Vb_new, bmu_new, n, col, F, Z, Ki_new, gp_prior->get_Ti(), tau2, b0, itemp); } if((gp_prior->get_T())[0][0] == 0) m = col; pnewdelta = gamma_mixture_pdf(newdelta, ep->Delta_alpha(), ep->Delta_beta()); pnewdelta += post_margin(n,col,lambda_new,Vb_new,log_det_K_new,a0-m,g0,itemp); pdelta = gamma_mixture_pdf(delta, ep->Delta_alpha(), ep->Delta_beta()); pdelta += post_margin(n,col,*lambda,Vb,log_det_K,a0-m,g0,itemp); /* accept or reject */ double alpha = exp(pnewdelta - pdelta)*(q_bak/q_fwd); if(runi(state) < alpha) { success = true; delta = newdelta; swap_new(Vb, bmu, lambda); } return success; } /* * draw_d_from_prior: * * get draws of separable d parameter from * the prior distribution */ void MrExpSep::draw_d_from_prior(double *d_new, void *state) { if(prior->Linear()) dupv(d_new, d, (2*dim)); else ((MrExpSep_Prior*)prior)->DPrior_rand(d_new, state); } /* * corr_symm: * * compute a (symmetric) correllation matrix from a seperable * exponential correllation function * * X[n][m], K[n][n] */ void MrExpSep::corr_symm(double **K, unsigned int m, double **X, unsigned int n, double *d, double nug, double nugaux, double delta, double pwr) { unsigned int i,j,k; double diff, fine; i = k = j = 0; for(i=0; ilog_Prior(d, b, pb, linear); return prob; } /* * sum_b: * * return the count of the number of linearizing * booleans set to one (the number of linear dimensions) */ unsigned int MrExpSep::sum_b(void) { unsigned int bs = 0; for(unsigned int i=0; i<(2*dim); i++) if(!b[i]) bs ++; /* sanity check */ if(bs == (2*dim)) assert(linear); return bs; } /* * ToggleLinear: * * make linear if not linear, otherwise * make not linear */ void MrExpSep::ToggleLinear(void) { if(linear) { /* force a full GP model */ linear = false; for(unsigned int i=0; i<(2*dim); i++) b[i] = 1; } else { /* force a full LLM */ linear = true; for(unsigned int i=0; i<(2*dim); i++) b[i] = 0; } /* set d_Eff = d * b */ for(unsigned int i=0; i<(2*dim); i++) d_eff[i] = d[i] * b[i]; } /* * D: * * return the vector of range parameters for the * separable exponential family of correlation function */ double* MrExpSep::D(void) { return d; } /* * Delta: * * return the fine fidelity discount factor, delta. */ double MrExpSep::Delta(void) { return delta; } /* * Nugaux: * * * return the fine fidelity observational error */ double MrExpSep::Nugaux(void) { return nugaux; } /* * TraceNames: * * return the names of the parameters recorded in MrExpSep::Trace() */ char** MrExpSep::TraceNames(unsigned int* len) { /* calculate the length of the trace vector, and allocate */ *len = 3 + 3*(dim) + 1; char **trace = (char**) malloc(sizeof(char*) * (*len)); /* copy the nugget */ trace[0] = strdup("nugc"); trace[1] = strdup("nugf"); trace[2] = strdup("delta"); /* copy the d-vector of range parameters */ for(unsigned int i=0; i<2*dim; i++) { trace[3+i] = (char*) malloc(sizeof(char) * (3 + (dim)/10 + 1)); sprintf(trace[3+i], "d%d", i+1); } /* copy the booleans */ for(unsigned int i=0; icorr_model == MREXPSEP); /* copy all parameters of the prior */ corr_model = e->corr_model; dupv(gamlin, e->gamlin, 3); dim = e->dim; d = new_dup_vector(e->d, (2*dim)); fix_d = e->fix_d; d_alpha = new_dup_matrix(e->d_alpha, (2*dim), 2); d_beta = new_dup_matrix(e->d_beta, (2*dim), 2); dupv(d_alpha_lambda, e->d_alpha_lambda, 2); dupv(d_beta_lambda, e->d_beta_lambda, 2); delta = e->delta; nugaux = e->nugaux; delta_alpha = new_dup_vector(e->delta_alpha, 2); delta_beta = new_dup_vector(e->delta_beta, 2); nugaux_alpha = new_dup_vector(e->nugaux_alpha, 2); nugaux_beta = new_dup_vector(e->nugaux_beta, 2); } /* * ~MrExpSep_Prior: * * destructor for the prior parameterization of the separable * exponential power distribution function */ MrExpSep_Prior::~MrExpSep_Prior(void) { free(d); delete_matrix(d_alpha); delete_matrix(d_beta); free(delta_alpha); free(delta_beta); free(nugaux_alpha); free(nugaux_beta); } /* * read_double: * * read the double parameter vector giving the user-secified * prior parameterization specified in R */ void MrExpSep_Prior::read_double(double *dparams) { /* read the parameters that have to to with the nugget */ read_double_nug(dparams); /* read the starting value(s) for the range parameter(s) */ for(unsigned int i=0; i<(2*dim); i++) d[i] = dparams[1]; /*MYprintf(MYstdout, "starting d="); printVector(d, (2*dim), MYstdout, HUMAN); */ /* reset the d parameter to after nugget and gamlin params */ dparams += 13; /* read d gamma mixture prior parameters */ double alpha[2], beta[2]; get_mix_prior_params_double(alpha, beta, dparams, "d"); for(unsigned int i=0; igetline(line, BUFFMAX); d[0] = atof(strtok(line, " \t\n#")); for(unsigned int i=1; i<(2*dim); i++) d[i] = d[0]; MYprintf(MYstdout, "starting d=", d); printVector(d, (2*dim), MYstdout, HUMAN); /* read d and nug-hierarchical parameters (mix of gammas) */ double alpha[2], beta[2]; ctrlfile->getline(line, BUFFMAX); get_mix_prior_params(alpha, beta, line, "d"); for(unsigned int i=0; i<(2*dim); i++) { dupv(d_alpha[i], alpha, 2); dupv(d_beta[i], beta, 2); } /* get the d prior mixture */ ctrlfile->getline(line, BUFFMAX); get_mix_prior_params(alpha, beta, line, "d"); dupv(delta_alpha, alpha, 2); dupv(delta_beta, beta, 2); /* get the nugget prior mixture */ ctrlfile->getline(line, BUFFMAX); get_mix_prior_params(alpha, beta, line, "nug"); dupv(nugaux_alpha, alpha, 2); dupv(nugaux_beta, beta, 2); /* d hierarchical lambda prior parameters */ ctrlfile->getline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_d = true; MYprintf(MYstdout, "fixing d prior\n"); } else { fix_d = false; get_mix_prior_params(d_alpha_lambda, d_beta_lambda, line, "d lambda"); } } /* * default_d_priors: * * set d prior parameters * to default values */ void MrExpSep_Prior::default_d_priors(void) { for(unsigned int i=0; i<(2*dim); i++) { d_alpha[i][0] = 1.0; d_beta[i][0] = 20.0; d_alpha[i][1] = 10.0; d_beta[i][1] = 10.0; } } /* * default_d_lambdas: * * set d (lambda) hierarchical prior parameters * to default values */ void MrExpSep_Prior::default_d_lambdas(void) { d_alpha_lambda[0] = 1.0; d_beta_lambda[0] = 10.0; d_alpha_lambda[1] = 1.0; d_beta_lambda[1] = 10.0; fix_d = false; } /* * D: * * return the default range parameter vector */ double* MrExpSep_Prior::D(void) { return d; } /* * Delta: * * return the fine fidelity discount factor, delta. */ double MrExpSep_Prior::Delta(void) { return delta; } /* * Nugaux: * * return the fine fidelity observation error. */ double MrExpSep_Prior::Nugaux(void) { return nugaux; } /* * DAlpha: * * return the default/starting alpha matrix for the range * parameter mixture gamma prior */ double** MrExpSep_Prior::DAlpha(void) { return d_alpha; } /* * DBeta: * * return the default/starting beta matrix for the range * parameter mixture gamma prior */ double** MrExpSep_Prior::DBeta(void) { return d_beta; } /* * DeltaAlpha: * * return the default/starting alpha matrix for the scaled variance * parameter mixture gamma prior */ double* MrExpSep_Prior::Delta_alpha(void) { return delta_alpha; } /* * DeltaBeta: * * return the default/starting beta matrix for the scaled variance * parameter mixture gamma prior */ double* MrExpSep_Prior::Delta_beta(void) { return delta_beta; } /* * Nugaux_Alpha: * * return the default/starting alpha for the fine nugget * parameter mixture gamma prior */ double* MrExpSep_Prior::Nugaux_alpha(void) { return nugaux_alpha; } /* * Nugaux_Beta: * * return the default/starting beta matrix for the fine nugget * parameter mixture gamma prior */ double* MrExpSep_Prior::Nugaux_beta(void) { return nugaux_beta; } /* * DeltaDraw: * * sample a delta value from the prior */ double MrExpSep_Prior::DeltaDraw(void *state) { return gamma_mixture_rand(delta_alpha, delta_beta, state); } /* * NugauxDraw: * * sample a nugaux value from the prior */ double MrExpSep_Prior::NugauxDraw(void *state) { return nug_prior_rand(nugaux_alpha, nugaux_beta, state); } /* * Draw: * * draws for the hierarchical priors for the MrExpSep * correlation function which are contained in the params module * * inputs are howmany number of corr modules */ void MrExpSep_Prior::Draw(Corr **corr, unsigned int howmany, void *state) { /* don't do anything if we're fixing the prior for d */ if(!fix_d) { /* for gathering the d-s of each of the corr models; repeatedly used for each dimension */ double *d = new_vector(howmany); /* for each dimension */ for(unsigned int j=0; j<(2*dim); j++) { /* gather all of the d->parameters for the jth dimension from each of the "howmany" corr modules */ for(unsigned int i=0; iD())[j]; /* use those gathered d values to make a draw for the parameters for the prior of the jth d */ mixture_priors_draw(d_alpha[j], d_beta[j], d, howmany, d_alpha_lambda, d_beta_lambda, state); } /* clean up */ free(d); } /* hierarchical prior draws for the nugget */ DrawNugHier(corr, howmany, state); } /* * newCorr: * * construct and return a new separable MrExponential correlation * function with this module governing its prior parameterization */ Corr* MrExpSep_Prior::newCorr(void) { return new MrExpSep(dim, base_prior); } /* * log_Prior: * * compute the (log) prior for the parameters to * the correlation function (e.g. d and nug) */ double MrExpSep_Prior::log_Prior(double *d, int *b, double *pb, bool linear) { double prob = 0; /* if forcing the LLM, just return zero (i.e. prior=1, log_prior=0) */ if(gamlin[0] < 0) return prob; /* sum the log priors for each of the d-parameters */ for(unsigned int i=0; i<(2*dim); i++) prob += log_d_prior_pdf(d[i], d_alpha[i], d_beta[i]); /* if not allowing the LLM, then we're done */ if(gamlin[0] <= 0) return prob; /* otherwise, get the prob of each of the booleans */ double lin_pdf = linear_pdf_sep(pb, d, (2*dim), gamlin); /* either use the calculated lin_pdf value */ double lprob = 0.0; if(linear) lprob = log(lin_pdf); else { /* or the sum of the individual pbs */ for(unsigned int i=0; i<(2*dim); i++) { /* probability of linear, or not linear */ if(b[i] == 0) lprob += log(pb[i]); else lprob += log(1.0 - pb[i]); } } prob += lprob; return prob; } /* * log_Dprior_pdf: * * return the log prior pdf value for the vector * of range parameters d */ double MrExpSep_Prior::log_DPrior_pdf(double *d) { double p = 0; for(unsigned int i=0; i<(2*dim); i++) { p += log_d_prior_pdf(d[i], d_alpha[i], d_beta[i]); } return p; } /* * DPrior_rand: * * draw from the joint prior distribution for the * range parameter vector d */ void MrExpSep_Prior::DPrior_rand(double *d_new, void *state) { for(unsigned int j=0; j<(2*dim); j++) d_new[j] = d_prior_rand(d_alpha[j], d_beta[j], state); } /* * BasePrior: * * return the prior for the Base (eg Gp) model */ Base_Prior* MrExpSep_Prior::BasePrior(void) { return base_prior; } /* * SetBasePrior: * * set the base_prior field */ void MrExpSep_Prior::SetBasePrior(Base_Prior *base_prior) { this->base_prior = base_prior; } /* * Print: * * pretty print the correllation function parameters out * to a file */ void MrExpSep_Prior::Print(FILE *outfile) { MYprintf(MYstdout, "corr prior: separable power\n"); /* print nugget stuff first */ PrintNug(outfile); /* range parameter */ /* MYprintf(outfile, "starting d=\n"); printVector(d, (2*dim), outfile, HUMAN); */ /* range gamma prior, just print once */ MYprintf(outfile, "d[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha[0][0], d_beta[0][0], d_alpha[0][1], d_beta[0][1]); /* print many times, one for each dimension instead? */ /*for(unsigned int i=0; i<(2*dim); i++) { MYprintf(outfile, "d[a,b][%d][0,1]=[%g,%g],[%g,%g]\n", i, d_alpha[i][0], d_beta[i][0], d_alpha[i][1], d_beta[i][0]); }*/ /* range gamma hyperprior */ if(fix_d) MYprintf(outfile, "d prior fixed\n"); else { MYprintf(MYstdout, "d lambda[a,b][0,1]=[%g,%g],[%g,%g]\n", d_alpha_lambda[0], d_beta_lambda[0], d_alpha_lambda[1], d_beta_lambda[1]); } } /* * log_HierPrior: * * return the log prior of the hierarchial parameters * to the correllation parameters (i.e., range and nugget) */ double MrExpSep_Prior::log_HierPrior(void) { double lpdf; lpdf = 0.0; /* mixture prior for the range parameter, d */ if(!fix_d) { for(unsigned int i=0; i class Exp_Prior; /* * CLASS for the implementation of the exponential * power family of correlation functions */ class Exp : public Corr { private: double d; /* kernel correlation width parameter */ double **xDISTx; /* n x n, matrix of euclidean distances to the x spatial locations */ unsigned int nd; /* for keeping track of the current size of xDISTx (nd x nd) */ unsigned int dreject; /* d rejection counter */ public: Exp(unsigned int dim, Base_Prior *base_prior); virtual Corr& operator=(const Corr &c); virtual ~Exp(void); virtual void Update(unsigned int n1, unsigned int n2, double **K, double **X, double **XX); virtual void Update(unsigned int n1, double **X); virtual void Update(unsigned int n1, double **K, double **X); virtual int Draw(unsigned int n, double **F, double **X, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); virtual void Combine(Corr *c1, Corr *c2, void *state); virtual void Split(Corr *c1, Corr *c2, void *state); virtual char* State(unsigned int which); virtual double log_Prior(void); virtual unsigned int sum_b(void); virtual void ToggleLinear(void); virtual bool DrawNugs(unsigned int n, double **X, double **F, double *Z, double *lambda, double **bmu, double **Vb, double tau2, double itemp, void *state); virtual double* Trace(unsigned int* len); virtual char** TraceNames(unsigned int* len); virtual void Init(double *dexp); virtual double* Jitter(unsigned int n1, double **X); virtual double* CorrDiag(unsigned int n1, double **X); void get_delta_d(Exp* c1, Exp* c2, void *state); void propose_new_d(Exp* c1, Exp* c2, void *state); double D(void); }; /* * CLASS for the prior parameterization of exponential * power family of correlation functions */ class Exp_Prior : public Corr_Prior { private: double d; double d_alpha[2]; /* d gamma-mixture prior alphas */ double d_beta[2]; /* d gamma-mixture prior beta */ bool fix_d; /* estimate d-mixture parameters or not */ double d_alpha_lambda[2]; /* d prior alpha lambda parameter */ double d_beta_lambda[2]; /* d prior beta lambda parameter */ public: Exp_Prior(unsigned int dim); Exp_Prior(Corr_Prior *c); virtual ~Exp_Prior(void); virtual void read_double(double *dprior); virtual void read_ctrlfile(std::ifstream* ctrlfile); virtual void Draw(Corr **corr, unsigned int howmany, void *state); virtual Corr_Prior* Dup(void); virtual Corr* newCorr(void); virtual void Print(FILE *outfile); virtual Base_Prior* BasePrior(void); virtual void SetBasePrior(Base_Prior *base_prior); virtual double log_HierPrior(void); virtual double* Trace(unsigned int* len); virtual char** TraceNames(unsigned int* len); virtual void Init(double *dhier); double D(void); double* DAlpha(void); double* DBeta(void); void default_d_priors(void); void default_d_lambdas(void); double log_Prior(double d, bool linear); bool LinearRand(double d, void *state); }; #endif tgp/src/gp.cc0000644000175100001440000014012312655414756012606 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ extern "C" { #include "matrix.h" #include "rhelp.h" #include "all_draws.h" #include "gen_covar.h" #include "predict.h" #include "predict_linear.h" #include "rand_draws.h" #include "rand_pdf.h" #include "lik_post.h" } #include "params.h" #include "exp.h" #include "exp_sep.h" #include "matern.h" #include "mr_exp_sep.h" #include "sim.h" #include "tree.h" #include "model.h" #include "gp.h" #include "base.h" #include #include #include using namespace std; #include class Gp_Prior; /* * Gp: * * constructor for the base Gp model; * most things are set to null values */ Gp::Gp(unsigned int d, Base_Prior *prior, Model *model) : Base(d, prior, model) { /* data size; alread done in Base */ /* this->n = 0; this->d = d; nn = 0; */ /* null everything */ F = FF = xxKx = xxKxx = NULL; Z = NULL; corr = NULL; b = new_zero_vector(this->col); Vb = new_id_matrix(this->col); bmu = new_zero_vector(this->col); bmle = new_zero_vector(this->col); lambda = 0; } /* * Gp: * * duplication constructor; params and "new" variables are also set to * NULL values; the economy argument allows a memory efficient * duplication which does not copy the covariance matrices, as these * can be recreated as necessary. */ Gp::Gp(double **X, double *Z, Base *old, bool economy) : Base(X, Z, old, economy) { assert(old->BaseModel() == GP); Gp* gp_old = (Gp*) old; /* F; copied from tree -- this should prolly be regenerated from scratch */ if(gp_old->F) F = new_dup_matrix(gp_old->F, col, n); else F = NULL; /* gp/linear parameters */ lambda = gp_old->lambda; s2 = gp_old->s2; tau2 = gp_old->tau2; /* beta parameters */ assert(gp_old->Vb); Vb = new_dup_matrix(gp_old->Vb, col, col); assert(gp_old->bmu); bmu = new_dup_vector(gp_old->bmu, col); assert(gp_old->bmle); bmle = new_dup_vector(gp_old->bmle, col); assert(gp_old->b); b = new_dup_vector(gp_old->b, col); /* correllation prior parameters are duplicated above in Base(X, Z, old) */ corr_prior = ((Gp_Prior*)prior)->CorrPrior(); /* correlation function; not using a corr->Dup() function * so as not to re-duplicate the correlation function * prior -- so generate a new one from the copied * prior and then use the copy constructor */ corr = corr_prior->newCorr(); *corr = *(gp_old->corr); /* if we're not being economical about memory, then copy the covariance matrices, etc., from the old correlation module */ if(!economy) corr->Cov(gp_old->corr); /* things that must be NULL */ FF = xxKx = xxKxx = NULL; } /* * Dup: * * create a new Gp base model from an old one; cannot use old->X * and old->Z because they are pointers to the old copy of the * treed partition from which this function is likely to have been * called. The economy argument allows a memory efficient * duplication which does not copy the covariance matrices, as these * can be recreated as necessary. * * This function basically allows tree to duplicate the base model * without knowing what it is. */ Base* Gp::Dup(double **X, double *Z, bool economy) { return new Gp(X, Z, this, economy); } /* * ~Gp: * * destructor function for the base Gp model */ Gp::~Gp(void) { Clear(); ClearPred(); if(b) free(b); if(corr) delete corr; if(Vb) delete_matrix(Vb); if(bmu) free(bmu); if(bmle) free(bmle); if(FF) delete_matrix(FF); } /* * init: * * initialize all of the parameters to this * tree partion */ void Gp::Init(double *dgp) { /* set base and corr priors */ Gp_Prior *p = (Gp_Prior*) prior; corr_prior = p->CorrPrior(); assert(corr_prior->BasePrior() == prior); /* re-init partition */ /* not sure if this is necessary when dgp != NULL */ Clear(); ClearPred(); /* see if we should read the parameterization from dgp */ if(dgp) { /* dgp[0] is lambda (which we're just recomputing for now) */ s2 = dgp[1]; tau2 = dgp[2]; dupv(b, &(dgp[3]), col); /* dgp[3+col + col + col*col] is bmu and Vb (which we're also just recomputing for now) */ if(!corr) corr = corr_prior->newCorr(); corr->Init(&(dgp[3+col + col + col*col])); /* could probably put id-Vb and zero-bmu/bmle, but don't need to because the gp is always init-ed with these in place anyways (base->Init(NULL) in tree constructor) */ } else { /* or instead init params from the prior */ /* partition parameters */ dupv(b, p->B(), col); s2 = p->S2(); tau2 = p->Tau2(); /* marginalized parameters */ id(Vb, this->col); zerov(bmu, this->col); zerov(bmle, this->col); lambda = 0; /* correlation function and variance parameters */ if(corr) delete corr; corr = corr_prior->newCorr(); } } /* * Clear: * * delete the current partition */ void Gp::Clear(void) { if(F) delete_matrix(F); X = F = NULL; Z = NULL; n = 0; if(corr) corr->deallocate_new(); } /* * ClearPred: * * destroys the predictive matrices for the * partition (usually used after a prune) */ void Gp::ClearPred(void) { if(xxKx) delete_matrix(xxKx); if(xxKxx) delete_matrix(xxKxx); if(FF) delete_matrix(FF); XX = FF = xxKx = xxKxx = NULL; nn = 0; } /* * Update: * * initializes a new partition at this (leaf) node based on * the current parameter settings */ void Gp::Update(double **X, unsigned int n, unsigned int d, double *Z) { /*checks */ assert(X && Z); if(F == NULL) assert(this->n == 0 && this->X == NULL && this->Z == NULL); else assert(this->n == n && this->X == X && this->Z == Z); /* data assignments */ this->X = X; this->n = n; this->Z = Z; if(! Linear()) corr->allocate_new(n); if(F == NULL) { F = new_matrix(this->col,n); X_to_F(n, X, F); } corr->Update(n, X); corr->Invert(n); if(((Gp_Prior*)prior)->BetaPrior() == BMLE) mle_beta(bmle, n, col, F, Z); wmean_of_rows(&mean, &Z, 1, n, NULL); } /* * UpdatePred: * * initializes the partition's predictive variables at this * (leaf) node based on the current parameter settings */ void Gp::UpdatePred(double **XX, unsigned int nn, unsigned int d, bool Ds2xy) { assert(this->XX == NULL); if(XX == NULL) { assert(nn == 0); return; } this->XX = XX; this->nn = nn; assert(!FF && !xxKx); FF = new_matrix(this->col,nn); X_to_F(nn, XX, FF); if(! Linear()) { xxKx = new_matrix(n,nn); corr->Update(nn, n, xxKx, X, XX); } if(Ds2xy && ! Linear()) { assert(!xxKxx); xxKxx = new_matrix(nn,nn); corr->Update(nn, xxKxx, XX); } } /* * Draw: * * draw new values for the parameters using a mixture of Gibbs and MH steps * (covariance matrices are recomputed, and old predictive ones invalidated * where appropriate) */ bool Gp::Draw(void *state) { Gp_Prior *p = (Gp_Prior*) prior; /* * start with draws from the marginal posterior of the corr function */ /* correlation function */ int success, i; for(i=0; i<5; i++) { success = corr->Draw(n, F, X, Z, &lambda, &bmu, Vb, tau2, itemp, state); if(success != -1) break; } /* handle possible errors in corr->Draw() */ if(success == -1) MYprintf(MYstderr, "NOTICE: max tree warnings (%d), ", i); else if(success == -2) MYprintf(MYstderr, "NOTICE: mixing problem, "); if(success < 0) { MYprintf(MYstderr, "backup to model\n"); return false; } /* check the updated-ness of xxKx and xxKxx */ if(success && xxKx) { delete_matrix(xxKx); if(xxKxx) { delete_matrix(xxKxx); } xxKx = xxKxx = NULL; } /* * then go to the others */ /* s2 */ if(p->BetaPrior() == BFLAT) s2 = sigma2_draw_no_b_margin(n, col, lambda, p->s2Alpha()-col,p->s2Beta(), state); else s2 = sigma2_draw_no_b_margin(n, col, lambda, p->s2Alpha(), p->s2Beta(), state); /* if beta draw is bad, just use mean, then zeros */ unsigned int info = beta_draw_margin(b, col, Vb, bmu, s2, state); if(info != 0) b[0] = mean; /* tau2: last because of Vb and lambda */ if(p->BetaPrior() != BFLAT && p->BetaPrior() != B0NOT && p->BetaPrior() != BMZNOT) tau2 = tau2_draw(col, p->get_Ti(), s2, b, p->get_b0(), p->tau2Alpha(), p->tau2Beta(), state); /* NOTE: that Compute() still needs to be called here, but we are delaying it until after the draws for the hierarchical params */ return true; } /* * predict: * * predict with the gaussian process model. It is assumed that, * if the argments are not null, then they are allocated with the * correct sizes */ void Gp::Predict(unsigned int n, double *zp, double *zpm, double *zpvm, double *zps2, unsigned int nn, double *zz, double *zzm, double *zzvm, double *zzs2, double **ds2xy, double *improv, double Zmin, bool err, void *state) { assert(this->n == n); assert(this->nn == nn); unsigned int warn = 0; /* try to make some predictions, but first: choose LLM or Gp */ if(Linear()) { /* under the limiting linear */ double *Kdiag = corr->CorrDiag(n,X); double *KKdiag = corr->CorrDiag(nn,XX); predict_full_linear(n, zp, zpm, zpvm, zps2, Kdiag, nn, zz, zzm, zzvm, zzs2, KKdiag, ds2xy, improv, Z, col, F, FF, bmu, s2, Vb, Zmin, err, state); if(Kdiag) free(Kdiag); if(KKdiag) free(KKdiag); } else { /* full Gp prediction */ double *zpjitter = corr->Jitter(n, X); double *zzjitter = corr->Jitter(nn, XX); double *KKdiag; if(!xxKxx) KKdiag = corr->CorrDiag(nn,XX); else KKdiag = NULL; warn = predict_full(n, zp, zpm, zpvm, zps2, zpjitter, nn, zz, zzm, zzvm, zzs2, zzjitter, ds2xy, improv, Z, col, F, corr->get_K(), corr->get_Ki(), ((Gp_Prior*)prior)->get_T(), tau2, FF, xxKx, xxKxx, KKdiag, bmu, s2, Zmin, err, state); if(zpjitter) free(zpjitter); if(zzjitter) free(zzjitter); if(KKdiag) free(KKdiag); } /* print warnings if there were any */ if(warn) warning("(%d) from predict_full: n=%d, nn=%d", warn, n, nn); } /* * match: * * match the high-level linear parameters */ void Gp::Match(Base* old) { assert(old->BaseModel() == GP); Gp* gp_old = (Gp*) old; *corr = *(gp_old->corr); dupv(b, gp_old->b, col); s2 = gp_old->s2; tau2 = gp_old->tau2; } /* * Combine: * * used by the tree prune operation. Combine the relevant parameters * of two child Gps into this (the parent) Gp */ void Gp::Combine(Base *l, Base *r, void *state) { assert(l->BaseModel() == GP); assert(r->BaseModel() == GP); Gp* l_gp = (Gp*) l; Gp* r_gp = (Gp*) r; corr->Combine(l_gp->corr, r_gp->corr, state); tau2 = combine_tau2(l_gp->tau2, r_gp->tau2, state); } /* * Split: * * used by the tree grow operation. Split the relevant parameters * of parent Gp into two (left & right) children Gps */ void Gp::Split(Base *l, Base *r, void *state) { double tau2_new[2]; assert(l->BaseModel() == GP); assert(r->BaseModel() == GP); Gp *l_gp = (Gp*) l; Gp *r_gp = (Gp*) r; corr->Split(l_gp->corr, r_gp->corr, state); /* new tau2 parameters for the leaves */ split_tau2(tau2_new, state); l_gp->tau2 = tau2_new[0]; r_gp->tau2 = tau2_new[1]; } /* * split_tau2: * * propose new tau2 parameters for possible new children partitions. */ void Gp::split_tau2(double *tau2_new, void *state) { int i[2]; Gp_Prior *p = (Gp_Prior*) prior; /* make the larger partition more likely to get the smaller d */ propose_indices(i, 0.5, state); tau2_new[i[0]] = tau2; if(p->BetaPrior() == BFLAT || p->BetaPrior() == B0NOT) tau2_new[i[1]] = tau2; else tau2_new[i[1]] = tau2_prior_rand(p->tau2Alpha()/2, p->tau2Beta()/2, state); } /* * combine_tau2: * * combine left and right childs tau2 into a single tau2 */ double combine_tau2(double l_tau2, double r_tau2, void *state) { double tau2ch[2]; int ii[2]; tau2ch[0] = l_tau2; tau2ch[1] = r_tau2; propose_indices(ii, 0.5, state); return tau2ch[ii[0]]; } /* * Posterior: * * called by tree: for these Gps, the Posterior is the same as * the marginal Likelihood due to the proposals coming from priors */ double Gp::Posterior(void) { return MarginalLikelihood(itemp); } /* * MarginalLikelihood: * * computes the marginalized likelihood/posterior for this (leaf) node */ double Gp::MarginalLikelihood(double itemp) { assert(F != NULL); Gp_Prior *p = (Gp_Prior*) prior; /* the main posterior for the correlation function */ double post = post_margin_rj(n, col, lambda, Vb, corr->get_log_det_K(), p->get_T(), tau2, p->s2Alpha(), p->s2Beta(), itemp); #ifdef DEBUG if(ISNAN(post)) warning("nan in posterior"); if(!R_FINITE(post)) warning("inf in posterior"); #endif return post; } /* * Likelihood: * * computes the MVN (log) likelihood for this (leaf) node */ double Gp::Likelihood(double itemp) { /* sanity check */ assert(F != NULL); /* getting the covariance matrix and its determinant */ double **Ki; double *Kdiag; if(Linear()){ Ki = NULL; Kdiag = corr->CorrDiag(n, X); } else { Ki = corr->get_Ki(); Kdiag = NULL; } double log_det_K = corr->get_log_det_K(); /* the main posterior for the correlation function */ double llik = gp_lhood(Z, n, col, F, b, s2, Ki, log_det_K, Kdiag, itemp); if(Kdiag) free(Kdiag); #ifdef DEBUG if(ISNAN(llik)) warning("nan in likelihood"); if(!R_FINITE(llik)) warning("inf in likelihood"); #endif return llik; } /* * FullPosterior: * * return the full posterior (pdf) probability of * this Gaussian Process model */ double Gp::FullPosterior(double itemp) { /* calculate the likelihood of the data */ double post = Likelihood(itemp); /* for adding in priors */ Gp_Prior *p = (Gp_Prior*) prior; /* calculate the prior on the beta regression coeffs */ if(p->BetaPrior() == B0 || p->BetaPrior() == BMLE) { double **V = new_dup_matrix(p->get_T(), col, col); scalev(V[0], col*col, s2*tau2); post += mvnpdf_log(b, p->get_b0(), V, col); delete_matrix(V); } /* add in the correllation prior */ post += corr->log_Prior(); /* add in prior for s2 */ post += log_tau2_prior_pdf(s2, p->s2Alpha()/2.0, p->s2Beta()/2.0); /* add in prior for tau2 */ if(p->BetaPrior() != BFLAT && p->BetaPrior() != B0NOT) { post += log_tau2_prior_pdf(tau2, p->tau2Alpha()/2.0, p->tau2Beta()/2.0); } return post; } /* * MarginalPosterior: * * return the full marginal posterior (pdf) probability of * this Gaussian Process model -- i.e., with beta and s2 integrated out */ double Gp::MarginalPosterior(double itemp) { /* for adding in priors */ Gp_Prior *p = (Gp_Prior*) prior; double post = post_margin_rj(n, col, lambda, Vb, corr->get_log_det_K(), p->get_T(), tau2, p->s2Alpha(), p->s2Beta(), itemp); //assert(R_FINITE(post)); /* don't need to include prior for beta or s2, because its alread included in the above calculation */ /* add in the correllation prior */ post += corr->log_Prior(); /* don't need to include prior for beta, because its alread included in the above calculation */ /* add in prior for tau2 */ if(p->BetaPrior() != BFLAT && p->BetaPrior() != B0NOT) { post += log_tau2_prior_pdf(tau2, p->tau2Alpha()/2, p->tau2Beta()/2); } return post; } /* * Compute: * * compute marginal parameters: Vb, b, and lambda * how this is done depents on whether or not this is a * linear model or a Gp, and then also depends on the beta * prior model. */ void Gp::Compute(void) { Gp_Prior *p = (Gp_Prior*) prior; double *b0 = ((Gp_Prior*)p)->get_b0();; double** Ti = ((Gp_Prior*)p)->get_Ti(); /* sanity check for a valid partition */ assert(F); /* get the right b0 depending on the beta prior */ switch(p->BetaPrior()) { case BMLE: dupv(b0, bmle, col); break; case BFLAT: assert(b0[0] == 0.0 && Ti[0][0] == 0.0 && tau2 == 1.0); break; case B0NOT: assert(b0[0] == 0.0 && Ti[0][0] == 1.0 && tau2 == p->Tau2()); break; case BMZNOT: case BMZT: /*assert(b0[0] == 0.0 && Ti[0][0] == 1.0);*/ break; case B0: break; } /* compute the marginal parameters */ if(Linear()){ double *Kdiag = corr->CorrDiag(n, X); lambda = compute_lambda_noK(Vb, bmu, n, col, F, Z, Ti, tau2, b0, Kdiag, itemp); free(Kdiag); } else lambda = compute_lambda(Vb, bmu, n, col, F, Z, corr->get_Ki(), Ti, tau2, b0, itemp); } /* * all_params: * * copy this node's parameters (s2, tau2, d, nug) to * be return by reference, and return a pointer to b */ double* Gp::all_params(double *s2, double *tau2, Corr **corr) { *s2 = this->s2; *tau2 = this->tau2; *corr = this->corr; return b; } /* * get_b: * * returns the beta vector parameter */ double* Gp::get_b(void) { return b; } /* * get_Corr: * * return a pointer to the correlleation structure */ Corr* Gp::get_Corr(void) { return corr; } /* * printFullNode: * * print everything intertesting about the current tree node to a file */ void Gp::printFullNode(void) { Gp_Prior *p = (Gp_Prior*) prior; assert(X); matrix_to_file("X_debug.out", X, n, col-1); assert(F); matrix_to_file("F_debug.out", F, col, n); assert(Z); vector_to_file("Z_debug.out", Z, n); if(XX) matrix_to_file("XX_debug.out", XX, nn, col-1); if(FF) matrix_to_file("FF_debug.out", FF, col, n); if(xxKx) matrix_to_file("xxKx_debug.out", xxKx, n, nn); if(xxKxx) matrix_to_file("xxKxx_debug.out", xxKxx, nn, nn); assert(p->get_T()); matrix_to_file("T_debug.out", p->get_T(), col, col); assert(p->get_Ti()); matrix_to_file("Ti_debug.out", p->get_Ti(), col, col); corr->printCorr(n); assert(p->get_b0()); vector_to_file("b0_debug.out", p->get_b0(), col); assert(bmu); vector_to_file("bmu_debug.out", bmu, col); assert(Vb); matrix_to_file("Vb_debug.out", Vb, col, col); } /* * Var: * * return some notion of variance for this gaussian process */ double Gp::Var(void) { return s2; } /* * X_to_F: * * F is just a column of ones and then the X (design matrix) * * X[n][col], F[col][n] */ void Gp::X_to_F(unsigned int n, double **X, double **F) { unsigned int i,j; switch( ((Gp_Prior*) prior)->MeanFn() ){ case LINEAR: for(i=0; iTrace(&clen); /* calculate and allocate the new trace, which will include the corr trace */ *len = col + 3; /* add in bmu and Vb when full=TRUE */ if(full) *len += col + col*col; /* allocate the trace vector */ double* trace = new_vector(clen + *len); /* lambda (or phi in the paper) */ trace[0] = lambda; /* copy sigma^2 and tau^2 */ trace[1] = s2; trace[2] = tau2; /* then copy beta */ dupv(&(trace[3]), b, col); /* add in bmu and Vb when full=TRUE */ if(full) { dupv(&(trace[3+col]), bmu, col); dupv(&(trace[3+2*col]), Vb[0], col*col); } /* then copy in the corr trace */ dupv(&(trace[*len]), c, clen); /* new combined length, and free c */ *len += clen; if(c) free(c); else assert(clen == 0); return trace; } /* * TraceNames: * * returns the names of the traces recorded by Gp:Trace() */ char** Gp::TraceNames(unsigned int* len, bool full) { /* first get the correllation function parameters */ unsigned int clen; char **c = corr->TraceNames(&clen); /* calculate and allocate the new trace, which will include the corr trace */ *len = col + 3; /* add in bmu and Vb when full=TRUE */ if(full) *len += col + col*col; /* allocate the trace vector */ char** trace = (char**) malloc(sizeof(char*) * (clen + *len)); /* lambda (or phi in the paper) */ trace[0] = strdup("lambda"); /* copy sigma^2 and tau^2 */ trace[1] = strdup("s2"); trace[2] = strdup("tau2"); /* then copy beta */ for(unsigned int i=0; iitemp; if(this->itemp != itemp) { this->itemp = itemp; if(isleaf) Compute(); } return olditemp; } /* * Constant: * * return true of the model being fit is actually the * constant model */ bool Gp::Constant(void) { if(col == 1 && Linear()) return true; else return false; } /* * Gp_Prior: * * the usual constructor function */ Gp_Prior::Gp_Prior(unsigned int d, MEAN_FN mean_fn) : Base_Prior(d) { /* set the name & dim of the base model */ base_model = GP; /* * the rest of the parameters will be read in * from the control file (Gp_Prior::read_ctrlfile), or * from a double vector passed from R (Gp_Prior::read_double) */ corr_prior = NULL; beta_prior = BFLAT; /* B0, BMLE (Emperical Bayes), BFLAT, or B0NOT, BMZT, BMZNOT */ /* LINEAR, CONSTANT, or 2LEVEL, which determines col */ this->mean_fn = mean_fn; switch(mean_fn) { case CONSTANT: col = 1; break; case LINEAR: col = d+1; break; default: error("unrecognized mean function: %d", mean_fn); } /* regression coefficients */ b = new_zero_vector(col); s2 = 1.0; /* variance parammer */ tau2 = 1.0; /* linear variance parammer */ default_s2_priors(); /* set s2_a0 and s2_g0 */ default_s2_lambdas(); /* set s2_a0_lambda and s2_g0_lambda */ default_tau2_priors(); /* set tau2_a0 and tau2_g0 */ default_tau2_lambdas(); /* set tau2_a0_lambda and tau2_g0_lambda */ /* * other computed hierarchical priors */ /* mu = zeros(1,col)'; */ /* TREE.b0 = zeros(col,1); */ b0 = new_zero_vector(col); mu = new_zero_vector(col); rho = col+1; /* Ci = diag(ones(1,col)); */ /* Note: do not change this from an ID matrix, because there is code below (particularly log_Prior) which assumes it is */ Ci = new_id_matrix(col); /* V = diag(2*ones(1,col)); */ V = new_id_matrix(col); for(unsigned int i=0; iInit(&(hier[4+col+col*col])); } /* * InitT: * * (re-) initialize the T matrix based on the choice of beta * prior (assume memory has already been allocated). This is * required for the asserts in the Compute function. Might * consider getting rid of this later. */ void Gp_Prior::InitT(void) { assert(Ti && T && Tchol); if(beta_prior == BFLAT) { zero(Ti, col, col); zero(T, col, col); zero(Tchol, col, col); } else { id(Ti, col); id(T, col); id(Tchol, col); } } /* * Dup: * * duplicate the Gp_Prior, and set the corr prior properly */ Base_Prior* Gp_Prior::Dup(void) { Gp_Prior *prior = new Gp_Prior(this); prior->CorrPrior()->SetBasePrior(prior); return prior; } /* * Gp_Prior: * * duplication constructor function */ Gp_Prior::Gp_Prior(Base_Prior *prior) : Base_Prior(prior) { assert(prior); assert(prior->BaseModel() == GP); Gp_Prior *p = (Gp_Prior*) prior; /* linear parameters */ mean_fn = p->mean_fn; beta_prior = p->beta_prior; s2 = p->s2; tau2 = p->tau2; b = new_dup_vector(p->b, col); b0 = new_dup_vector(p->b0, col); mu = new_dup_vector(p->mu, col); rho = p->rho; /* linear prior matrices */ Ci = new_dup_matrix(p->Ci, col, col); V = new_dup_matrix(p->V, col, col); rhoVi = new_dup_matrix(p->rhoVi, col, col); T = new_dup_matrix(p->T, col, col); Ti = new_dup_matrix(p->Ti, col, col); Tchol = new_dup_matrix(p->Tchol, col, col); /* variance parameters */ s2_a0 = p->s2_a0; s2_g0 = p->s2_g0; s2_a0_lambda = p->s2_a0_lambda; s2_g0_lambda = p->s2_g0_lambda; fix_s2 = p->fix_s2; /* linear variance parameters */ tau2_a0 = p->tau2_a0; tau2_g0 = p->tau2_g0; tau2_a0_lambda = p->tau2_a0_lambda; tau2_g0_lambda = p->tau2_g0_lambda; fix_tau2 = p->fix_tau2; /* corr prior */ assert(p->corr_prior); corr_prior = p->corr_prior->Dup(); } /* * ~Gp_Prior: * * the usual destructor, nothing fancy */ Gp_Prior::~Gp_Prior(void) { free(b); free(mu); free(b0); delete_matrix(Ci); delete_matrix(V); delete_matrix(rhoVi); delete_matrix(T); delete_matrix(Ti); delete_matrix(Tchol); delete corr_prior; } /* * read_double * * takes params from a double array, * for use with communication with R */ void Gp_Prior::read_double(double * dparams) { int bp = (int) dparams[0]; /* read the beta linear prior model */ switch (bp) { case 0: beta_prior=B0; /* MYprintf(MYstdout, "linear prior: b0 hierarchical\n"); */ break; case 1: beta_prior=BMLE; /* MYprintf(MYstdout, "linear prior: emperical bayes\n"); */ break; case 2: beta_prior=BFLAT; /* MYprintf(MYstdout, "linear prior: flat\n"); */ break; case 3: beta_prior=B0NOT; /* MYprintf(MYstdout, "linear prior: cart\n"); */ break; case 4: beta_prior=BMZT; /* MYprintf(MYstdout, "linear prior: b0 fixed with free tau2\n"); */ break; case 5: beta_prior=BMZNOT; /* MYprintf(MYstdout, "linear prior: b0 fixed with fixed tau2\n"); */ break; default: error("bad linear prior model %d", (int)dparams[0]); break; } /* must properly initialize T, based on beta_prior */ InitT(); /* reset dparams to after the above parameters */ dparams += 1; /* read starting/prior beta linear regression parameter (mean) vector */ dupv(b, dparams, col); if(beta_prior != BFLAT) dupv(b0, dparams, col); /* MYprintf(MYstdout, "starting beta="); printVector(b, col, MYstdout, HUMAN); */ dparams += col; /* reset */ /* reading the starting/prior beta linear regression parameter (inv-cov) matrix */ if(beta_prior != BFLAT) { dupv(Ti[0], dparams, col*col); inverse_chol(Ti, T, Tchol, col); } dparams += col*col; /* read starting (initial values) parameter */ s2 = dparams[0]; if(beta_prior != BFLAT) tau2 = dparams[1]; // MYprintf(MYstdout, "starting s2=%g tau2=%g\n", s2, tau2); /* read s2 hierarchical prior parameters */ s2_a0 = dparams[2]; s2_g0 = dparams[3]; // MYprintf(MYstdout, "s2[a0,g0]=[%g,%g]\n", s2_a0, s2_g0); dparams += 4; /* reset */ /* s2 hierarchical lambda prior parameters */ if((int) dparams[0] == -1) { fix_s2 = true; /* MYprintf(MYstdout, "fixing s2 prior\n"); */ } else { s2_a0_lambda = dparams[0]; s2_g0_lambda = dparams[1]; // MYprintf(MYstdout, "s2 lambda[a0,g0]=[%g,%g]\n", s2_a0_lambda, s2_g0_lambda); } /* read tau2 hierarchical prior parameters */ if(beta_prior != BFLAT && beta_prior != B0NOT) { tau2_a0 = dparams[2]; tau2_g0 = dparams[3]; // MYprintf(MYstdout, "tau2[a0,g0]=[%g,%g]\n", tau2_a0, tau2_g0); } dparams += 4; /* reset */ /* tau2 hierarchical lambda prior parameters */ if(beta_prior != BFLAT && beta_prior != B0NOT) { if((int) dparams[0] == -1) { fix_tau2 = true; /* MYprintf(MYstdout, "fixing tau2 prior\n"); */ } else { tau2_a0_lambda = dparams[0]; tau2_g0_lambda = dparams[1]; // MYprintf(MYstdout, "tau2 lambda[a0,g0]=[%g,%g]\n", // tau2_a0_lambda, tau2_g0_lambda); } } dparams += 2; /* reset */ /* read the corr model */ switch ((int) dparams[0]) { case 0: corr_prior = new Exp_Prior(d); //MYprintf(MYstdout, "correlation: isotropic power exponential\n"); break; case 1: corr_prior = new ExpSep_Prior(d); //MYprintf(MYstdout, "correlation: separable power exponential\n"); break; case 2: corr_prior = new Matern_Prior(d); //MYprintf(MYstdout, "correlation: isotropic matern\n"); break; case 3: corr_prior = new MrExpSep_Prior(d-1); //MYprintf(MYstdout, "correlation: two-level seperable power mixture\n"); case 4: corr_prior = new Sim_Prior(d); //MYprintf(MYstdout, "correlation: sim power exponential\n"); break; default: error("bad corr model %d", (int)dparams[0]); } /* set the gp_prior for this corr_prior */ corr_prior->SetBasePrior(this); /* read the rest of the parameters into the corr prior module */ corr_prior->read_double(&(dparams[1])); } /* * read_ctrlfile: * * takes params from a control file */ void Gp_Prior::read_ctrlfile(ifstream *ctrlfile) { char line[BUFFMAX], line_copy[BUFFMAX]; /* check that col is valid for the mean function */ /* later we will just enforce this inside the C code, rather than reading col through the control file */ if(mean_fn == LINEAR && col != d+1) error("col should be d+1 for linear mean function"); else if(mean_fn == CONSTANT && col != 1) error("col should be 1 for constant mean function"); /* read the beta prior model */ /* B0, BMLE (Emperical Bayes), BFLAT, or B0NOT, BMZT, BMZNOT */ ctrlfile->getline(line, BUFFMAX); if(!strncmp(line, "bmznot", 7)) { beta_prior = BMZNOT; MYprintf(MYstdout, "beta prior: b0 fixed with fixed tau2 \n"); } else if(!strncmp(line, "bmzt", 5)) { beta_prior = BMZT; MYprintf(MYstdout, "beta prior: b0 fixed with free tau2 \n"); } else if(!strncmp(line, "bmle", 4)) { beta_prior = BMLE; MYprintf(MYstdout, "beta prior: emperical bayes\n"); } else if(!strncmp(line, "bflat", 5)) { beta_prior = BFLAT; MYprintf(MYstdout, "beta prior: flat \n"); } else if(!strncmp(line, "b0not", 5)) { beta_prior = B0NOT; MYprintf(MYstdout, "beta prior: cart \n"); } else if(!strncmp(line, "b0", 2)) { beta_prior = B0; MYprintf(MYstdout, "beta prior: b0 hierarchical \n"); } else { error("%s is not a valid beta prior", strtok(line, "\t\n#")); } /* must properly initialize T, based on beta_prior */ InitT(); /* read the beta regression coefficients from the control file */ ctrlfile->getline(line, BUFFMAX); read_beta(line); MYprintf(MYstdout, "starting beta="); printVector(b, col, MYstdout, HUMAN); /* read the s2 and tau2 initial parameter from the control file */ ctrlfile->getline(line, BUFFMAX); s2 = atof(strtok(line, " \t\n#")); if(beta_prior != BFLAT) tau2 = atof(strtok(NULL, " \t\n#")); MYprintf(MYstdout, "starting s2=%g tau2=%g\n", s2, tau2); /* read the s2-prior parameters (s2_a0, s2_g0) from the control file */ ctrlfile->getline(line, BUFFMAX); s2_a0 = atof(strtok(line, " \t\n#")); s2_g0 = atof(strtok(NULL, " \t\n#")); MYprintf(MYstdout, "s2[a0,g0]=[%g,%g]\n", s2_a0, s2_g0); /* read the tau2-prior parameters (tau2_a0, tau2_g0) from the ctrl file */ ctrlfile->getline(line, BUFFMAX); if(beta_prior != BFLAT && beta_prior != B0NOT) { tau2_a0 = atof(strtok(line, " \t\n#")); tau2_g0 = atof(strtok(NULL, " \t\n#")); MYprintf(MYstdout, "tau2[a0,g0]=[%g,%g]\n", tau2_a0, tau2_g0); } /* read the s2-prior hierarchical parameters * (s2_a0_lambda, s2_g0_lambda) from the control file */ fix_s2 = false; ctrlfile->getline(line, BUFFMAX); strcpy(line_copy, line); if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_s2 = true; MYprintf(MYstdout, "fixing s2 prior\n"); } else { s2_a0_lambda = atof(strtok(line, " \t\n#")); s2_g0_lambda = atof(strtok(NULL, " \t\n#")); MYprintf(MYstdout, "s2 lambda[a0,g0]=[%g,%g]\n", s2_a0_lambda, s2_g0_lambda); } /* read the s2-prior hierarchical parameters * (tau2_a0_lambda, tau2_g0_lambda) from the control file */ fix_tau2 = false; ctrlfile->getline(line, BUFFMAX); strcpy(line_copy, line); if(beta_prior != BFLAT && beta_prior != B0NOT) { if(!strcmp("fixed", strtok(line_copy, " \t\n#"))) { fix_tau2 = true; MYprintf(MYstdout, "fixing tau2 prior\n"); } else { tau2_a0_lambda = atof(strtok(line, " \t\n#")); tau2_g0_lambda = atof(strtok(NULL, " \t\n#")); MYprintf(MYstdout, "tau2 lambda[a0,g0]=[%g,%g]\n", tau2_a0_lambda, tau2_g0_lambda); } } /* read the correlation model type */ /* EXP, EXPSEP, MATERN or MREXPSEP */ ctrlfile->getline(line, BUFFMAX); if(!strncmp(line, "expsep", 6)) { corr_prior = new ExpSep_Prior(d); // MYprintf(MYstdout, "correlation: separable power exponential\n"); } else if(!strncmp(line, "exp", 3)) { corr_prior = new Exp_Prior(d); // MYprintf(MYstdout, "correlation: isotropic power exponential\n"); } else if(!strncmp(line, "matern", 6)) { corr_prior = new Matern_Prior(d); // MYprintf(MYstdout, "correlation: isotropic matern\n"); } else if(!strncmp(line, "mrexpsep", 8)) { corr_prior = new MrExpSep_Prior(d-1); // MYprintf(MYstdout, "correlation: multi-res seperable power\n"); } else if(!strncmp(line, "sim", 3)) { corr_prior = new Sim_Prior(d); // MYprintf(MYstdout, "correlation: sim power exponential\n"); } else { error("%s is not a valid correlation model", strtok(line, "\t\n#")); } /* set the gp_prior for this corr_prior */ corr_prior->SetBasePrior(this); /* read the rest of the parameters into the corr prior module */ corr_prior->read_ctrlfile(ctrlfile); } /* * default_s2_priors: * * set s2 prior parameters * to default values */ void Gp_Prior::default_s2_priors(void) { s2_a0 = 5; s2_g0 = 10; } /* * default_tau2_priors: * * set tau2 prior parameters * to default values */ void Gp_Prior::default_tau2_priors(void) { tau2_a0 = 5; tau2_g0 = 10; } /* * default_tau2_priors: * * set tau2 (lambda) hierarchical prior parameters * to default values */ void Gp_Prior::default_tau2_lambdas(void) { tau2_a0_lambda = 0.2; tau2_g0_lambda = 10; fix_tau2 = false; } /* * default_s2_lambdas: * * set s2 (lambda) hierarchical prior parameters * to default values */ void Gp_Prior::default_s2_lambdas(void) { s2_a0_lambda = 0.2; s2_g0_lambda = 10; fix_s2 = false; } /* * read_beta: * * read starting beta from the control file and * save it for later use */ void Gp_Prior::read_beta(char *line) { b[0] = atof(strtok(line, " \t\n#")); for(unsigned int i=1; iPrint(outfile); } /* * Draws: * * draws for the parameters to the hierarchical priors * depends on the top level-leaf parameters. * Also prints the state based on round r */ void Gp_Prior::Draw(Tree** leaves, unsigned int numLeaves, void *state) { double **b, **bmle, *s2, *tau2; unsigned int *n; Corr **corr; /* allocate temporary parameters for each leaf node */ allocate_leaf_params(col, &b, &s2, &tau2, &n, &corr, leaves, numLeaves); if(beta_prior == BMLE) bmle = new_matrix(numLeaves, col); else bmle = NULL; /* for use in b0 and Ti draws */ /* collect bmle parameters from the leaves */ if(beta_prior == BMLE) for(unsigned int i=0; iGetBase()))->Bmle(), col); /* draw hierarchical parameters */ if(beta_prior == B0 || beta_prior == BMLE) { b0_draw(b0, col, numLeaves, b, s2, Ti, tau2, mu, Ci, state); Ti_draw(Ti, col, numLeaves, b, bmle, b0, rho, V, s2, tau2, state); if(mean_fn == CONSTANT) this->T[0][0] = 1.0/Ti[0][0]; else inverse_chol(Ti, (this->T), Tchol, col); } /* update the corr and sigma^2 prior params */ /* tau2 prior first */ if(!fix_tau2 && beta_prior != BFLAT && beta_prior != B0NOT && beta_prior != BMZNOT) { unsigned int *colv = new_ones_uivector(numLeaves, col); sigma2_prior_draw(&tau2_a0,&tau2_g0,tau2,numLeaves,tau2_a0_lambda, tau2_g0_lambda,colv,state); free(colv); } /* subtract col from n for sigma2_prior_draw when using flat BETA prior */ if(beta_prior == BFLAT) for(unsigned int i=0; i= col); n[i] -= col; } /* then sigma2 prior */ if(!fix_s2) sigma2_prior_draw(&s2_a0,&s2_g0,s2,numLeaves,s2_a0_lambda, s2_g0_lambda,n,state); /* then corr prior */ corr_prior->Draw(corr, numLeaves, state); /* clean up the garbage */ deallocate_leaf_params(b, s2, tau2, n, corr); if(beta_prior == BMLE) delete_matrix(bmle); } /* * get_Ti: * * return Ti: inverse of the covariance matrix * for Beta prior */ double** Gp_Prior::get_Ti(void) { return Ti; } /* * get_T: * * return T: covariance matrix for the Beta prior */ double** Gp_Prior::get_T(void) { return T; } /* * get_b0: * * return b0: prior mean for Beta */ double* Gp_Prior::get_b0(void) { return b0; } /* * ForceLinear: * * Toggle the entire partition into Linear Model mode */ void Gp::ForceLinear(void) { if(! Linear()) { corr->ToggleLinear(); Update(X, n, d, Z); Compute(); } } /* * ForceNonlinear: * * Toggle the entire partition into GP mode */ void Gp::ForceNonlinear(void) { if(Linear()) { corr->ToggleLinear(); Update(X, n, d, Z); Compute(); } } /* * Linear: * * return true if this leav is under a linear model * false otherwise */ bool Gp::Linear(void) { return corr->Linear(); } /* * sum_b: * * return the count of the dimensions under the LLM */ unsigned int Gp::sum_b(void) { return corr->sum_b(); } /* * Bmle * * return ML estimate for beta */ double* Gp::Bmle(void) { return bmle; } /* * State: * * return some Gp state information (corr state information * in particular, for printing in the main meta model */ char* Gp::State(unsigned int which) { assert(corr); return(corr->State(which)); } /* * allocate_leaf_params: * * allocate arrays to hold the current parameter * values at each leaf (of numLeaves) of the tree */ void allocate_leaf_params(unsigned int col, double ***b, double **s2, double **tau2, unsigned int **n, Corr ***corr, Tree **leaves, unsigned int numLeaves) { *b = new_matrix(numLeaves, col); *s2 = new_vector(numLeaves); *tau2 = new_vector(numLeaves); *corr = (Corr **) malloc(sizeof(Corr *) * numLeaves); *n = new_uivector(numLeaves); /* collect parameters from the leaves */ for(unsigned int i=0; iGetBase()); dupv((*b)[i], gp->all_params(&((*s2)[i]), &((*tau2)[i]), &((*corr)[i])), col); (*n)[i] = gp->N(); } } /* * deallocate_leaf_params: * * deallocate arrays used to hold the current parameter * values at each leaf of numLeaves */ void deallocate_leaf_params(double **b, double *s2, double *tau2, unsigned int *n, Corr **corr) { delete_matrix(b); free(s2); free(tau2); free(corr); free(n); } /* * newBase: * * generate a new Gp base model whose * parameters have priors from the from this class */ Base* Gp_Prior::newBase(Model *model) { return new Gp(d, (Base_Prior*) this, model); } /* * log_HierPrior: * * return the (log) prior density of the Gp base * hierarchical prior parameters, e.g., B0, W (or T), * etc., and additionaly add in the prior of the parameters * to the correllation model prior */ double Gp_Prior::log_HierPrior(void) { double lpdf = 0.0; /* start with the b0 prior, if this part of the model is on */ if(beta_prior == B0 || beta_prior == BMLE) { /* this is probably overkill because Ci is an ID matrix */ lpdf += mvnpdf_log_dup(b0, mu, Ci, col); /* then do the wishart prior for T (which is called W in the paper) */ lpdf += wishpdf_log(Ti, rhoVi, col, rho); } /* hierarchical GP variance */ if(!fix_s2) lpdf += hier_prior_log(s2_a0, s2_g0, s2_a0_lambda, s2_g0_lambda); /* hierarchical Linear varaince */ if(!fix_tau2 && beta_prior != BFLAT && beta_prior != B0NOT) lpdf += hier_prior_log(tau2_a0, tau2_g0, tau2_a0_lambda, tau2_g0_lambda); /* then add the hierarchical part for the correllation function */ lpdf += corr_prior->log_HierPrior(); /* return the resulting log pdf*/ return lpdf; } /* * TraceNames: * * returns the names of the traces of the hierarchal parameters * recorded in Gp_Prior::Trace() */ char** Gp_Prior::TraceNames(unsigned int* len, bool full) { /* first get the correllation function parameters */ unsigned int clen; char **c = corr_prior->TraceNames(&clen); /* calculate and allocate the new trace, which will include the corr trace */ *len = 4 + col; /* if full=TRUE then add in Ti */ if(full) *len += col*col; /* allocate trace vector */ char** trace = (char**) malloc(sizeof(char*) * (clen + *len)); /* copy sigma^2 and tau^2 */ trace[0] = strdup("s2.a0"); trace[1] = strdup("s2.g0"); trace[2] = strdup("tau2.a0"); trace[3] = strdup("tau2.g0"); /* then copy beta */ for(unsigned int i=0; iTrace(&clen); /* calculate and allocate the new trace, which will include the corr trace */ *len = 4 + col; /* if full=TRUE, add in Ti */ if(full) *len += col*col; /* allocate the trace vector */ double* trace = new_vector(clen + *len); /* copy sigma^2 and tau^2 */ trace[0] = s2_a0; trace[1] = s2_g0; trace[2] = tau2_a0; trace[3] = tau2_g0; /* then copy beta */ dupv(&(trace[4]), b0, col); /* if full=TRUE, then add in Ti */ if(full) { dupv(&(trace[4+col]), Ti[0], col*col); } /* then copy in the corr trace */ dupv(&(trace[*len]), c, clen); /* new combined length, and free c */ *len += clen; if(c) free(c); else assert(clen == 0); return trace; } /* * GamLin: * * return gamlin[which] from corr_prior; must have * 0 <= which <= 2 */ double Gp_Prior::GamLin(unsigned int which) { assert(which < 3); double *gamlin = corr_prior->GamLin(); return gamlin[which]; } tgp/src/matrix.h0000644000175100001440000002424112655414756013350 0ustar hornikusers/******************************************************************************** * * Bayesian Regression and Adaptive Sampling with Gaussian Process Trees * Copyright (C) 2005, University of California * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) * ********************************************************************************/ #ifndef __MATRIX_H__ #define __MATRIX_H__ #include typedef enum FIND_OP {LT=101, LEQ=102, EQ=103, GEQ=104, GT=105, NE=106} FIND_OP; typedef enum PRINT_PREC {HUMAN=1001, MACHINE=1002} PRINT_PREC; typedef struct rect { unsigned int d; double **boundary; FIND_OP *opl; FIND_OP *opr; } Rect; Rect* new_rect(unsigned int d); Rect* new_dup_rect(Rect* oldR); Rect* new_drect(double **drect, int d); void delete_rect(Rect* rect); unsigned int matrix_constrained(int *p, double **X, unsigned int n1, unsigned int n2, Rect *rect); void print_rect(Rect *r, FILE* outfile); double rect_area(Rect* rect); double rect_area_maxd(Rect* rect, unsigned int maxd); void rect_unnorm(Rect* r, double **rect, double normscale); double **get_data_rect(double **X, unsigned int N, unsigned int d); void normalize(double **Xall, double **rect, int N, int d, double normscale); void zero(double **M, unsigned int n1, unsigned int n2); int isZero(double **M, unsigned int m, int sym); void id(double **M, unsigned int n); double ** new_id_matrix(unsigned int n); double ** new_zero_matrix(unsigned int n1, unsigned int n2); int ** new_zero_imatrix(unsigned int n1, unsigned int n2); double ** new_matrix(unsigned int m, unsigned int n); double ** new_matrix_bones(double *v, unsigned int n1, unsigned int n2); int ** new_imatrix_bones(int *v, unsigned int n1, unsigned int n2); int ** new_t_imatrix(int** M, unsigned int n1, unsigned int n2); int ** new_imatrix(unsigned int n1, unsigned int n2); double ** new_t_matrix(double** M, unsigned int n1_old, unsigned int n2_old); double ** new_dup_matrix(double** M, unsigned int n1, unsigned int n2); int ** new_dup_imatrix(int** M, unsigned int n1, unsigned int n2); double ** new_shift_matrix(double** M, unsigned int n1, unsigned int n2); void dup_matrix(double** M1, double **M2, unsigned int n1, unsigned int n2); void dup_imatrix(int** M1, int **M2, unsigned int n1, unsigned int n2); void swap_matrix(double **M1, double **M2, unsigned int n1, unsigned int n2); double ** new_bigger_matrix(double** M, unsigned int n1, unsigned int n2, unsigned int n1_new, unsigned int n2_new); int ** new_bigger_imatrix(int** M, unsigned int n1, unsigned int n2, unsigned int n1_new, unsigned int n2_new); double ** new_normd_matrix(double** M, unsigned int n1, unsigned int n2, double **rect, double normscale); void delete_matrix(double** m); void delete_imatrix(int** m); void check_means(double *mean, double *q1, double *median, double *q2, unsigned int n); void center_columns(double **M, double *center, unsigned int n1, unsigned int n2); void center_rows(double **M, double *center, unsigned int n1, unsigned int n2); void norm_columns(double **M, double *norm, unsigned int n1, unsigned int n2); void sum_of_columns_f(double *s, double **M, unsigned int n1, unsigned int n2, double(*f)(double)); void sum_of_columns(double *s, double **M, unsigned int n1, unsigned int n2); void sum_of_each_column_f(double *s, double **M, unsigned int *n1, unsigned int n2, double(*f)(double)); void wmean_of_columns(double *mean, double **M, unsigned int n1, unsigned int n2, double *weight); void wvar_of_columns(double *var, double **M, unsigned int n1, unsigned int n2, double *weight); void wmean_of_columns_f(double *mean, double **M, unsigned int n1, unsigned int n2, double *weight, double(*f)(double)); void wmean_of_rows(double *mean, double **M, unsigned int n1, unsigned int n2, double *weight); void wmean_of_rows_f(double *mean, double **M, unsigned int n1, unsigned int n2, double *weight, double(*f)(double)); void wcov_of_columns(double **cov, double **M, double *mean, unsigned int n1, unsigned int n2, double *weight); void wcovx_of_columns(double **cov, double **M1, double **M2, double *mean1, double *mean2, unsigned int T, unsigned int n1, unsigned int n2, double *weight); void add_matrix(double a, double **M1, double b, double **M2, unsigned int n1, unsigned int n2); double **new_p_submatrix(int *p, double **v, unsigned int nrows, unsigned int ncols, unsigned int col_offset); void sub_p_matrix(double **V, int *p, double **v, unsigned int nrows, unsigned int lenp, unsigned int col_offset); double **new_p_submatrix_rows(int *p, double **v, unsigned int nrows, unsigned int ncols, unsigned int row_offset); void sub_p_matrix_rows(double **V, int *p, double **v, unsigned int ncols, unsigned int lenp, unsigned int row_offset); void copy_p_matrix(double **V, int *p1, int *p2, double **v, unsigned int n1, unsigned int n2); void add_p_matrix(double a, double **V, int *p1, int *p2, double b, double **v, unsigned int n1, unsigned int n2); double* ones(unsigned int n, double scale); double* dseq(double from, double to, double by); int* iseq(double from, double to); int* find(double *V, unsigned int n, FIND_OP op, double val, unsigned int* len); int* find_col(double **V, int *p, unsigned int n, unsigned int var, FIND_OP op, double val, unsigned int* len); double kth_smallest(double a[], int n, int k); double quick_select(double arr[], int n, int k); void quantiles_of_columns(double **Q, double *q, unsigned int m, double **M, unsigned int n1, unsigned int n2, double *w); void quantiles(double *qs, double *q, unsigned int m, double *v, double *w, unsigned int n); void printMatrix(double **M, unsigned int n, unsigned int col, FILE *outfile); void printIMatrix(int **matrix, unsigned int n, unsigned int col, FILE *outfile); void printMatrixT(double **M, unsigned int n, unsigned int col, FILE *outfile); void mean_to_file(const char *file_str, double **M, unsigned int T, unsigned int n); void vector_to_file(const char* file_str, double *quantiles, unsigned int n); void matrix_to_file(const char* file_str, double** matrix, unsigned int n1, unsigned int n2); void intmatrix_to_file(const char* file_str, int** matrix, unsigned int n1, unsigned int n2); void matrix_t_to_file(const char* file_str, double** matrix, unsigned int n1, unsigned int n2); void printVector(double *v, unsigned int n, FILE *outfile, PRINT_PREC type); void printSymmMatrixVector(double **m, unsigned int n, FILE *outfile, PRINT_PREC type); void ivector_to_file(const char* file_str, int *vector, unsigned int n); void uivector_to_file(const char *file_str, unsigned int *iv, unsigned int n); double* new_dup_vector(double* vold, unsigned int n); double* new_zero_vector(unsigned int n); double* new_vector(unsigned int n); void dupv(double *v, double* vold, unsigned int n); void dup_col(double **M, unsigned int col, double *v, unsigned int n); void swap_vector(double **v1, double **v2); void zerov(double*v, unsigned int n); void add_vector(double a, double *v1, double b, double *v2, unsigned int n); void add_p_vector(double a, double *V, int *p, double b, double *v, unsigned int n); void copy_p_vector(double *V, int *p, double *v, unsigned int n); void copy_sub_vector(double *V, int *p, double *v, unsigned int n); double* new_sub_vector(int *p, double *v, unsigned int n); void scalev(double *v, unsigned int n, double scale); void scalev2(double *v, unsigned int n, double *scale); void centerv(double *v, unsigned int n, double scale); void normv(double *v, unsigned int n, double* norm); double sum_fv(double *v, unsigned int n, double(*f)(double)); double sumv(double *v, unsigned int n); double meanv(double *v, unsigned int n); int equalv(double *v1, double *v2, int n); int* new_ivector(unsigned int n); int* new_dup_ivector(int *iv, unsigned int n); void dupiv(int *iv_new, int *iv, unsigned int n); void zeroiv(int*v, unsigned int n); void swap_ivector(int **v1, int **v2); int *new_ones_ivector(unsigned int n, int scale); int *new_zero_ivector(unsigned int n); void iones(int *iv, unsigned int n, int scale); void printIVector(int *iv, unsigned int n, FILE *outfile); void copy_p_ivector(int *V, int *p, int *v, unsigned int n); void copy_sub_ivector(int *V, int *p, int *v, unsigned int n); int* new_sub_ivector(int *p, int *v, unsigned int n); int sumiv(int *v, unsigned int n); int meaniv(int *iv, unsigned int n); void add_ivector(int *v1, int *v2, unsigned int n); unsigned int* new_uivector(unsigned int n); unsigned int* new_dup_uivector(unsigned int *iv, unsigned int n); void dupuiv(unsigned int *iv_new, unsigned int *iv, unsigned int n); void zerouiv(unsigned int *v, unsigned int n); unsigned int *new_ones_uivector(unsigned int n, unsigned int scale); unsigned int *new_zero_uivector(unsigned int n); void uiones(unsigned int *iv, unsigned int n, unsigned int scale); void printUIVector(unsigned int *iv, unsigned int n, FILE *outfile); void copy_p_uivector(unsigned int *V, int *p, unsigned int *v, unsigned int n); void copy_sub_uivector(unsigned int *V, int *p, unsigned int *v, unsigned int n); unsigned int* new_sub_uivector(int *p, unsigned int *v, unsigned int n); unsigned int sumuiv(unsigned int *v, unsigned int n); unsigned int meanuiv(unsigned int *iv, unsigned int n); double max(double *v, unsigned int n, unsigned int *which); double min(double *v, unsigned int n, unsigned int *which); double sq(double x); double MYfmax(double a, double b); double MYfmin(double a, double b); double vmult(double *v1, double *v2, int n); #endif tgp/NAMESPACE0000644000175100001440000000171312654547265012323 0ustar hornikusers# Load the shared object useDynLib(tgp) # Exports export(blm, btlm, bcart, bgp, bgpllm, btgp, btgpllm, default.itemps, dopt.gp, exp2d.Z, exp2d.rand, friedman.1.data, fried.bool, interp.loess, itemps.barplot, hist2bar, lhs, mapT, optim.step.tgp, optim.ptgpf, partition, sens, tgp.default.params, tgp.design, tgp.trees, mean0.range1) # Import all packages listed as Imports or Depends importFrom(maptree, draw.tree) ## required for new CRAN checks importFrom("grDevices", "rainbow", "terrain.colors") importFrom("graphics", "abline", "axis", "barplot", "boxplot", "contour", "image", "legend", "lines", "mtext", "par", "persp", "plot", "points", "segments", "text", "title") importFrom("stats", "loess", "optim", "optimize", "predict", "proj", "rnorm", "runif") importFrom("utils", "data", "read.table") # S3 S3method(print, tgp) S3method(plot, tgp) S3method(predict, tgp) S3method(print, tgptraces) tgp/demo/0000755000175100001440000000000012506600653012011 5ustar hornikuserstgp/demo/fried.R0000644000175100001440000000346612506600653013236 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### f <- friedman.1.data(200) ff <- friedman.1.data(1000) X <- f[,1:10]; Z <- f$Y XX <- ff[,1:10] ################################################### ### chunk number 3: ################################################### fr.btlm <- btlm(X=X, Z=Z, XX=XX, tree=c(0.95,2), pred.n=FALSE, verb=0) fr.btlm.mse <- sqrt(mean((fr.btlm$ZZ.mean - ff$Ytrue)^2)) fr.btlm.mse ################################################### ### chunk number 4: ################################################### fr.bgpllm <- bgpllm(X=X, Z=Z, XX=XX, pred.n=FALSE, verb=0) fr.bgpllm.mse <- sqrt(mean((fr.bgpllm$ZZ.mean - ff$Ytrue)^2)) fr.bgpllm.mse ################################################### ### chunk number 5: ################################################### XX1 <- matrix(rep(0,10), nrow=1) fr.bgpllm.tr <- bgpllm(X=X, Z=Z, XX=XX1, pred.n=FALSE, trace=TRUE, m0r1=FALSE, verb=0) ################################################### ### chunk number 6: ################################################### trace <- fr.bgpllm.tr$trace$XX[[1]] apply(trace[,27:36], 2, mean) ################################################### ### chunk number 7: ################################################### mean(fr.bgpllm.tr$trace$linarea$ba) ################################################### ### chunk number 8: ################################################### summary(trace[,9:10]) ################################################### ### chunk number 9: ################################################### apply(trace[,11:15], 2, mean) tgp/demo/sin.R0000644000175100001440000000457412506600653012737 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### X <- seq(0,20,length=100) XX <- seq(0,20,length=99) Z <- (sin(pi*X/5) + 0.2*cos(4*pi*X/5)) * (X <= 9.6) lin <- X>9.6; Z[lin] <- -1 + X[lin]/10 Z <- Z + rnorm(length(Z), sd=0.1) ################################################### ### chunk number 3: ################################################### sin.bgp <- bgp(X=X, Z=Z, XX=XX, verb=0) ################################################### ### chunk number 4: bgp ################################################### plot(sin.bgp, main='GP,', layout='surf') ################################################### ### chunk number 5: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 6: ################################################### sin.btlm <- btlm(X=X, Z=Z, XX=XX) ################################################### ### chunk number 7: btlm ################################################### plot(sin.btlm, main='Linear CART,', layout='surf') ################################################### ### chunk number 8: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 9: btlmtrees ################################################### tgp.trees(sin.btlm) ################################################### ### chunk number 10: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 11: ################################################### sin.btgp <- btgp(X=X, Z=Z, XX=XX, verb=0) ################################################### ### chunk number 12: btgp ################################################### plot(sin.btgp, main='treed GP,', layout='surf') ################################################### ### chunk number 13: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() tgp/demo/exp.R0000644000175100001440000000605612506600653012737 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) library(maptree) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z XX <- exp2d.data$XX ################################################### ### chunk number 3: ################################################### exp.bgp <- bgp(X=X, Z=Z, XX=XX, corr="exp", verb=0) ################################################### ### chunk number 4: bgp ################################################### plot(exp.bgp, main='GP,') ################################################### ### chunk number 5: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 6: ################################################### exp.btgp <- btgp(X=X, Z=Z, XX=XX, corr="exp", verb=0) ################################################### ### chunk number 7: btgp ################################################### plot(exp.btgp, main='treed GP,') ################################################### ### chunk number 8: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 9: btgptrees ################################################### tgp.trees(exp.btgp) ################################################### ### chunk number 10: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 11: ################################################### exp.btgpllm <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", R=2) ################################################### ### chunk number 12: btgpllm ################################################### plot(exp.btgpllm, main='treed GP LLM,') ################################################### ### chunk number 13: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 14: 1dbtgpllm1 ################################################### plot(exp.btgpllm, main='treed GP LLM,', proj=c(1)) ################################################### ### chunk number 15: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 16: 1dbtgpllm2 ################################################### plot(exp.btgpllm, main='treed GP LLM,', proj=c(2)) ################################################### ### chunk number 17: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() tgp/demo/as.R0000644000175100001440000000435312506600653012544 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### exp2d.data <- exp2d.rand(lh=0, dopt=10) X <- exp2d.data$X Z <- exp2d.data$Z Xcand <- lhs(1000, rbind(c(-2,6),c(-2,6))) ################################################### ### chunk number 3: ################################################### exp1 <- btgpllm(X=X, Z=Z, pred.n=FALSE, corr="exp", verb=0) ################################################### ### chunk number 4: mapt ################################################### tgp.trees(exp1) ################################################### ### chunk number 5: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 6: ################################################### XX <- tgp.design(200, Xcand, exp1) XX <- rbind(XX, c(-sqrt(1/2),0)) ################################################### ### chunk number 7: cands ################################################### plot(exp1$X, pch=19, cex=0.5) points(XX) mapT(exp1, add=TRUE) ################################################### ### chunk number 8: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 9: ################################################### exp.as <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", improv=TRUE, Ds2x=TRUE, verb=0) ################################################### ### chunk number 10: expas ################################################### par(mfrow=c(1,3), bty="n") plot(exp.as, main="tgpllm,", layout="as", as="alm") plot(exp.as, main="tgpllm,", layout='as', as='alc') plot(exp.as, main="tgpllm,", layout='as', as='improv') ################################################### ### chunk number 11: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() tgp/demo/traces.R0000644000175100001440000000605112506600653013417 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### exp2d.data <- exp2d.rand(n2=150, lh=0, dopt=10) X <- exp2d.data$X Z <- exp2d.data$Z XX <- rbind(c(0,0),c(2,2),c(4,4)) ################################################### ### chunk number 3: ################################################### out <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", bprior="b0", pred.n=FALSE, Ds2x=TRUE, R=10, #BTE=c(2000,5000,10), trace=TRUE, verb=0) ################################################### ### chunk number 4: ################################################### out$trace ################################################### ### chunk number 5: XXd ################################################### trXX <- out$trace$XX; ltrXX <- length(trXX) y <- trXX[[1]]$d for(i in 2:ltrXX) y <- c(y, trXX[[i]]$d) plot(log(trXX[[1]]$d), type="l", ylim=range(log(y)), ylab="log(d)", main="range (d) parameter traces") names <- "XX[1,]" for(i in 2:ltrXX) { lines(log(trXX[[i]]$d), col=i, lty=i) names <- c(names, paste("XX[", i, ",]", sep="")) } legend("bottomleft", names, col=1:ltrXX, lty=1:ltrXX) ################################################### ### chunk number 6: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 7: ################################################### linarea <- mean(out$trace$linarea$la) linarea ################################################### ### chunk number 8: la ################################################### hist(out$trace$linarea$la) ################################################### ### chunk number 9: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 10: ################################################### m <- matrix(0, nrow=length(trXX), ncol=3)#ncol=5) for(i in 1:length(trXX)) m[i,] <- as.double(c(out$XX[i,], mean(trXX[[i]]$b))) m <- data.frame(cbind(m, 1-m[,3])) names(m)=c("XX1","XX2","b","pllm") m ################################################### ### chunk number 11: alc ################################################### trALC <- out$trace$preds$Ds2x y <- trALC[,1] for(i in 2:ncol(trALC)) y <- c(y, trALC[,i]) plot(log(trALC[,1]), type="l", ylim=range(log(y)), ylab="Ds2x", main="ALC: samples from Ds2x") names <- "XX[1,]" for(i in 2:ncol(trALC)) { lines(log(trALC[,i]), col=i, lty=i) names <- c(names, paste("XX[", i, ",]", sep="")) } legend("bottomright", names, col=1:ltrXX, lty=1:ltrXX) ################################################### ### chunk number 12: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() tgp/demo/moto.R0000644000175100001440000000500512506600653013112 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### library(MASS) X <- data.frame(times=mcycle[,1]) Z <- data.frame(accel=mcycle[,2]) ################################################### ### chunk number 3: ################################################### moto.bgp <- bgp(X=X, Z=Z, verb=0) ################################################### ### chunk number 4: bgp ################################################### plot(moto.bgp, main='GP,', layout='surf') ################################################### ### chunk number 5: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 6: ################################################### moto.btlm <- btlm(X=X, Z=Z, verb=0) ################################################### ### chunk number 7: btlm ################################################### plot(moto.btlm, main='Bayesian CART,', layout='surf') ################################################### ### chunk number 8: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 9: ################################################### moto.btgpllm <- btgpllm(X=X, Z=Z, bprior="b0", verb=0) moto.btgpllm.p <- predict(moto.btgpllm) ## using MAP ################################################### ### chunk number 10: btgp ################################################### par(mfrow=c(1,2)) plot(moto.btgpllm, main='treed GP LLM,', layout='surf') plot(moto.btgpllm.p, center='km', layout='surf') ################################################### ### chunk number 11: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 12: btgpq ################################################### par(mfrow=c(1,2)) plot(moto.btgpllm, main='treed GP LLM,', layout='as') plot(moto.btgpllm.p, as='ks2', layout='as') ################################################### ### chunk number 13: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() tgp/demo/sens.R0000644000175100001440000001060512506600653013106 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### f <- friedman.1.data(250) ################################################### ### chunk number 3: ################################################### Xf <- f[, 1:6] Zf <- f$Y sf <- sens(X=Xf, Z=Zf, nn.lhs=600, model=bgpllm, verb=0) ################################################### ### chunk number 4: ################################################### names(sf$sens) ################################################### ### chunk number 5: sens-full ################################################### plot(sf, layout="sens", legendloc="topleft") ################################################### ### chunk number 6: ################################################### graphics.off() ################################################### ### chunk number 7: sens-mains ################################################### par(mar=c(4,2,4,2), mfrow=c(2,3)) plot(sf, layout="sens", maineff=t(1:6)) ################################################### ### chunk number 8: ################################################### graphics.off() ################################################### ### chunk number 9: sens-indices ################################################### plot(sf, layout="sens", maineff=FALSE) ################################################### ### chunk number 10: ################################################### graphics.off() ################################################### ### chunk number 11: ################################################### X <- airquality[,2:4] Z <- airquality$Ozone rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- rep(2,3) ################################################### ### chunk number 12: sens-udraw ################################################### Udraw <- lhs(300, rect=rect, mode=mode, shape=shape) par(mfrow=c(1,3), mar=c(4,2,4,2)) for(i in 1:3){ hist(Udraw[,i], breaks=10,xlab=names(X)[i], main="",ylab="", border=grey(.9), col=8) } ################################################### ### chunk number 13: ################################################### graphics.off() ################################################### ### chunk number 14: ################################################### s.air <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, rect=rect, shape=shape, mode=mode, verb=0)) ################################################### ### chunk number 15: sens-air1 ################################################### plot(s.air, layout="sens") ################################################### ### chunk number 16: ################################################### graphics.off() ################################################### ### chunk number 17: ################################################### rect[2,] <- c(0,5) mode[2] <- 2 shape[2] <- 2 ################################################### ### chunk number 18: ################################################### sens.p <- suppressWarnings(sens(X=X,Z=Z,nn.lhs=300, model=NULL, rect=rect, shape=shape, mode=mode)) ################################################### ### chunk number 19: sens-air2 ################################################### s.air2 <- predict(s.air, BTE=c(1,1000,1), sens.p=sens.p, verb=0) plot(s.air2, layout="sens") ################################################### ### chunk number 20: ################################################### graphics.off() ################################################### ### chunk number 21: ################################################### X$Temp[X$Temp >70] <- 1 X$Temp[X$Temp >1] <- 0 rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- c(2,2,0) s.air <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, rect=rect, shape=shape, mode=mode, verb=0, basemax=2)) ################################################### ### chunk number 22: sens-air3 ################################################### plot(s.air, layout="sens") ################################################### ### chunk number 23: ################################################### graphics.off() tgp/demo/optim.R0000644000175100001440000000677412506600653013302 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### rosenbrock <- function(x){ x <- matrix(x, ncol=2) 100*(x[,1]^2 - x[,2])^2 + (x[,1] - 1)^2 } ################################################### ### chunk number 3: ################################################### rosenbrock(c(1,1)) ################################################### ### chunk number 4: ################################################### rect <- cbind(c(-1,-1),c(5,5)) X <- lhs(40, rect) Z <- rosenbrock(X) ################################################### ### chunk number 5: ################################################### XX <- lhs(200, rect) rfit <- bgp(X,Z,XX,improv=c(1,10), verb=0) ################################################### ### chunk number 6: ################################################### cbind(rfit$improv,XX)[rfit$improv$rank <= 10,] ################################################### ### chunk number 7: optim-fit1 ################################################### plot(rfit, as="improv") ################################################### ### chunk number 8: ################################################### graphics.off() ################################################### ### chunk number 9: optim-fit2 ################################################### rfit2 <- predict(rfit, XX=XX, BTE=c(1,1000,1), improv=c(5,20), verb=0) plot(rfit2, layout="as", as="improv") ################################################### ### chunk number 10: ################################################### graphics.off() ################################################### ### chunk number 11: ################################################### f <- function(x) { exp2d.Z(x)$Z } ################################################### ### chunk number 12: ################################################### rect <- rbind(c(-2,6), c(-2,6)) X <- lhs(20, rect) Z <- f(X) ################################################### ### chunk number 13: ################################################### out <- progress <- NULL for(i in 1:20) { ## get recommendations for the next point to sample out <- optim.step.tgp(f, X=X, Z=Z, rect=rect, prev=out, verb=0) ## add in the inputs, and newly sampled outputs X <- rbind(X, out$X) Z <- c(Z, f(out$X)) ## keep track of progress and best optimum progress <- rbind(progress, out$progress) } ################################################### ### chunk number 14: optim-progress ################################################### par(mfrow=c(1,2)) matplot(progress[,1:2], main="x progress", xlab="rounds", ylab="x[,1:2]", type="l", lwd=2) plot(log(progress$improv), type="l", main="max log improv", xlab="rounds", ylab="max log(improv)") ################################################### ### chunk number 15: ################################################### graphics.off() ################################################### ### chunk number 16: ################################################### out$progress[1:2] ################################################### ### chunk number 17: ################################################### formals(optim)$method ################################################### ### chunk number 18: ################################################### formals(optim.ptgpf)$method tgp/demo/00Index0000755000175100001440000000161112506600653013145 0ustar hornikuserslinear Bayesian LM and GP LLM on linear data from vignette 1 sin Bayesian linear CART, GP, treed GP on sinusoidal data from vignette 1 exp Bayesian GP, treed GP, and treed GP LLM on exponential data from vignette 1 moto Bayesian GP, treed GP, and treed GP LLM on motorcycle accident data from vignette 1 fried Bayesian linear CART and GP LLM on first Friedman data from vignette 1 as adaptive sampling on exponential data from vignette 1 traces demonstration, visualization and interpretation of parameter traces from vignette 1 pred example of a collaborative tgp with predict.tgp from vignette 1 cat using tgp with categorical (i.e., non-real-valued) inputs from vignette 2 sens sensitivity analysis for inputs/covariates from vignette 2 optim sequential optimization of black-box functions from vignette 2 it importance tempering improved mixing in the RJ-MCMC for tgp from vignette 2 tgp/demo/linear.R0000644000175100001440000000377312506600653013420 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### # 1-d linear data input and predictive data X <- seq(0,1,length=50) # inputs XX <- seq(0,1,length=99) # predictive locations Z <- 1 + 2*X + rnorm(length(X),sd=0.25) # responses ################################################### ### chunk number 3: ################################################### lin.blm <- blm(X=X, XX=XX, Z=Z) ################################################### ### chunk number 4: blm ################################################### plot(lin.blm, main='Linear Model,', layout='surf') abline(1,2,lty=3,col='blue') ################################################### ### chunk number 5: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 6: ################################################### lin.gpllm <- bgpllm(X=X, XX=XX, Z=Z) ################################################### ### chunk number 7: gplm ################################################### plot(lin.gpllm, main='GP LLM,', layout='surf') abline(1,2,lty=4,col='blue') ################################################### ### chunk number 8: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 9: ################################################### lin.gpllm.tr <- bgpllm(X=X, XX=0.5, Z=Z, pred.n=FALSE, trace=TRUE, verb=0) mla <- mean(lin.gpllm.tr$trace$linarea$la) mla ################################################### ### chunk number 10: ################################################### 1-mean(lin.gpllm.tr$trace$XX[[1]]$b1) tgp/demo/it.R0000644000175100001440000002171712506600653012560 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### geo <- default.itemps(type="geometric") har <- default.itemps(type="harmonic") sig <- default.itemps(type="sigmoidal") ################################################### ### chunk number 3: it-itemps ################################################### par(mfrow=c(2,1)) all <- cbind(geo$k, har$k, sig$k) matplot(all, pch=21:23, main="inv-temp ladders", xlab="indx", ylab="itemp") legend("topright", pch=21:23, c("geometric","harmonic","sigmoidal"), col=1:3) matplot(log(all), pch=21:23, main="log(inv-temp) ladders", xlab="indx", ylab="itemp") ################################################### ### chunk number 4: ################################################### graphics.off() ################################################### ### chunk number 5: ################################################### ESS <- function(w) { mw <- mean(w) cv2 <- sum((w-mw)^2)/((length(w)-1)*mw^2) ess <- length(w)/(1+cv2) return(ess) } ################################################### ### chunk number 6: ################################################### exp2d.data<-exp2d.rand() X<-exp2d.data$X Z<-exp2d.data$Z ################################################### ### chunk number 7: ################################################### its <- default.itemps(m=10) exp.btlm <- btlm(X=X,Z=Z, bprior="b0", R=2, itemps=its, pred.n=FALSE, BTE=c(1000,3000,2)) ################################################### ### chunk number 8: ################################################### exp.btlm$ess ################################################### ### chunk number 9: ################################################### library(MASS) moto.it <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), bprior="b0", R=3, itemps=geo, trace=TRUE, pred.n=FALSE, verb=0) ################################################### ### chunk number 10: ################################################### moto.it$ess$combined ################################################### ### chunk number 11: ################################################### p <- moto.it$trace$post ESS(p$wlambda) ################################################### ### chunk number 12: ################################################### ESS(p$w) ################################################### ### chunk number 13: ################################################### as.numeric(c(sum(p$itemp == 1), moto.it$ess$each[1,2:3])) ################################################### ### chunk number 14: ################################################### moto.reg <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), R=3, bprior="b0", trace=TRUE, pred.n=FALSE, verb=0) ################################################### ### chunk number 15: ################################################### L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(moto.reg$trace$post$height, p$height, hw)) ################################################### ### chunk number 16: it-moto-height ################################################### barplot(b, beside=TRUE, col=1:3, xlab="tree height", ylab="counts", main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) ################################################### ### chunk number 17: ################################################### graphics.off() ################################################### ### chunk number 18: it-moto-ktrace ################################################### plot(log(moto.it$trace$post$itemp), type="l", ylab="log(k)", xlab="samples", main="trace of log(k)") ################################################### ### chunk number 19: ################################################### graphics.off() ################################################### ### chunk number 20: it-moto-khist ################################################### b <- itemps.barplot(moto.it, plot.it=FALSE) barplot(t(cbind(moto.it$itemps$counts, b)), col=1:2, beside=TRUE, ylab="counts", xlab="itemps", main="inv-temp observation counts") legend("topleft", c("observation counts", "posterior samples"), fill=1:2) ################################################### ### chunk number 21: ################################################### graphics.off() ################################################### ### chunk number 22: ################################################### moto.it.sig <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), R=3, bprior="b0", krige=FALSE, itemps=sig, verb=0) ################################################### ### chunk number 23: ################################################### moto.it.sig$ess$combined ################################################### ### chunk number 24: it-moto-pred ################################################### plot(moto.it.sig) ################################################### ### chunk number 25: ################################################### graphics.off() ################################################### ### chunk number 26: ################################################### Xcand <- lhs(10000, rbind(c(-6,6),c(-6,6))) X <- dopt.gp(400, X=NULL, Xcand)$XX Z <- exp2d.Z(X)$Z ################################################### ### chunk number 27: ################################################### exp.reg <- btgpllm(X=X, Z=Z, BTE=c(2000,52000,10), bprior="b0", trace=TRUE, krige=FALSE, R=10, verb=0) ################################################### ### chunk number 28: it-exp-pred ################################################### plot(exp.reg) ################################################### ### chunk number 29: ################################################### graphics.off() ################################################### ### chunk number 30: ################################################### h <- exp.reg$post$height[which.max(exp.reg$posts$lpost)] h ################################################### ### chunk number 31: it-exp-mapt ################################################### tgp.trees(exp.reg, "map") ################################################### ### chunk number 32: ################################################### graphics.off() ################################################### ### chunk number 33: ################################################### its <- default.itemps(k.min=0.02) exp.it <- btgpllm(X=X, Z=Z, BTE=c(2000,52000,10), bprior="b0", trace=TRUE, krige=FALSE, itemps=its, R=10, verb=0) ################################################### ### chunk number 34: ################################################### exp.it$gpcs exp.reg$gpcs ################################################### ### chunk number 35: ################################################### p <- exp.it$trace$post data.frame(ST=sum(p$itemp == 1), nIT=ESS(p$w), oIT=exp.it$ess$combined) ################################################### ### chunk number 36: ################################################### L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(exp.reg$trace$post$height, p$height, hw)) ################################################### ### chunk number 37: it-exp-height ################################################### barplot(b, beside=TRUE, col=1:3, xlab="tree height", ylab="counts", main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) ################################################### ### chunk number 38: ################################################### graphics.off() ################################################### ### chunk number 39: it-exp-trace-height ################################################### ylim <- range(p$height, exp.reg$trace$post$height) plot(p$height, type="l", main="trace of tree heights", xlab="t", ylab="height", ylim=ylim) lines(exp.reg$trace$post$height, col=2) legend("topright", c("tempered", "reg MCMC"), lty=c(1,1), col=1:2) ################################################### ### chunk number 40: ################################################### graphics.off() ################################################### ### chunk number 41: it-expit-pred ################################################### plot(exp.it) ################################################### ### chunk number 42: it-expit-trees ################################################### tgp.trees(exp.it, "map") ################################################### ### chunk number 43: ################################################### graphics.off() tgp/demo/pred.R0000644000175100001440000000431012506600653013064 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) library(maptree) ##options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### library(MASS) out <- btgpllm(X=mcycle[,1], Z=mcycle[,2], bprior="b0", pred.n=FALSE, verb=0) save(out, file="out.Rsave") out <- NULL ################################################### ### chunk number 3: ################################################### load("out.Rsave") XX <- seq(2.4, 56.7, length=200) out.kp <- predict(out, XX=XX, pred.n=FALSE) ################################################### ### chunk number 4: ################################################### out.p <- predict(out, XX=XX, pred.n=FALSE, BTE=c(0,1000,1)) ################################################### ### chunk number 5: ################################################### out2 <- predict(out, XX, pred.n=FALSE, BTE=c(0,2000,2), krige=FALSE) ################################################### ### chunk number 6: kp ################################################### plot(out.kp, center="km", as="ks2") ################################################### ### chunk number 7: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 8: p ################################################### plot(out.p) ################################################### ### chunk number 9: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 10: 2 ################################################### plot(out2) ################################################### ### chunk number 11: ################################################### rl <- readline("press RETURN to continue: ") graphics.off() ################################################### ### chunk number 12: ################################################### unlink("out.Rsave") tgp/demo/cat.R0000644000175100001440000000644712506600653012716 0ustar hornikusers################################################### ### chunk number 1: ################################################### library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) ################################################### ### chunk number 2: ################################################### fb.train <- fried.bool(500) X <- fb.train[,1:13]; Z <- fb.train$Y fb.test <- fried.bool(1000) XX <- fb.test[,1:13]; ZZ <- fb.test$Ytrue ################################################### ### chunk number 3: ################################################### names(X) ################################################### ### chunk number 4: ################################################### fit1 <- bcart(X=X, Z=Z, XX=XX, verb=0) rmse1 <- sqrt(mean((fit1$ZZ.mean - ZZ)^2)) rmse1 ################################################### ### chunk number 5: cat-fbcart-mapt ################################################### tgp.trees(fit1, "map") ################################################### ### chunk number 6: ################################################### graphics.off() ################################################### ### chunk number 7: ################################################### fit2 <- btlm(X=X, Z=Z, XX=XX, verb=0) rmse2 <- sqrt(mean((fit2$ZZ.mean - ZZ)^2)) rmse2 ################################################### ### chunk number 8: cat-fbtlm-trees ################################################### tgp.trees(fit2, "map") ################################################### ### chunk number 9: ################################################### graphics.off() ################################################### ### chunk number 10: ################################################### fit3 <- btlm(X=X, Z=Z, XX=XX, basemax=10, verb=0) rmse3 <- sqrt(mean((fit3$ZZ.mean - ZZ)^2)) rmse3 ################################################### ### chunk number 11: cat-fbtlm-mapt ################################################### tgp.trees(fit3, "map") ################################################### ### chunk number 12: ################################################### graphics.off() ################################################### ### chunk number 13: ################################################### fit4 <- btgpllm(X=X, Z=Z, XX=XX, verb=0) rmse4 <- sqrt(mean((fit4$ZZ.mean - ZZ)^2)) rmse4 ################################################### ### chunk number 14: ################################################### fit4$gpcs ################################################### ### chunk number 15: ################################################### fit5 <- btgpllm(X=X, Z=Z, XX=XX, basemax=10, verb=0) rmse5 <- sqrt(mean((fit5$ZZ.mean - ZZ)^2)) rmse5 ################################################### ### chunk number 16: cat-fb-mapt ################################################### h <- fit1$post$height[which.max(fit1$posts$lpost)] tgp.trees(fit5, "map") ################################################### ### chunk number 17: ################################################### graphics.off() ################################################### ### chunk number 18: ################################################### fit6 <- btgpllm(X=X, Z=Z, XX=XX, basemax=10, splitmin=11, verb=0) rmse6 <- sqrt(mean((fit6$ZZ.mean - ZZ)^2)) rmse6 tgp/data/0000755000175100001440000000000012506600653011776 5ustar hornikuserstgp/data/exp2d.rda0000644000175100001440000001646212655414756013535 0ustar hornikusers՛y̺t_ZY~\W~}~?_;?s{~7Ϯ8Y^:vunugwݟ'#}-< }crDw>\^߮gw-鮥tvג/ݶٽKna=]ߺy)nw-?1yv҂هݶZn[J;kZJӺkZJGkŜZJk)}?%]K\mWQbNMv!2r=g)O2Ohֻ37xrG=JlOp_W#Gȗ˂]N6VtڧhNe9o9(pWoJFH:P3C5B+fqG 0dɽ7jނo׶>׼a}梈ymS獽swaK|H=(~u73y`,« f(6xsS_ke8o^1` [zGBt6Ƚ9rbYUݶ%m~}i֯h#V<{Y͔Şܞ+4i4c÷둝%jaQnQi2*j_`LnzOߛ^Uyb8)~gdCW`j5F<^q>(#rMW[{id4v;{}Əq-3N"d",D_5 5,j;isy#22JtwE,06jʭ<}a>MBld1=awݒ[:b'\v6rtwuCcN<~o4d"(wsqhEWl`/RE8*WtQs!RA{Qg5T9C$uJ_KdK=t­w1#&Nxq;v GMykJ4ژ\"vwچvO;{բicooEm Vd76񄎧lMNBv߳rFT'owܶ ٦0in.5xŮiuDm2x$1rsuamc>_JJ=z)̱v v:{slգ VcZ}1UY$fS( xkp vYytux]ԙ;-\6YHM% YO C93۰\_ iv,ɥniإYxQ2d}_vqd4YAhm_i-Ϝlk[A::>zV?.h "z7R0W'x}S"rP0>iqH]{ /]?Ltvr9SV:,j|yMc~?h=򨴺>[f~ve8OҽhK 465 v>Mz׃Жy<އK5j+-6}h%]Y?6iKO5_'L0_3NV)?{/鏘32 w'}.ч:?*gO^LoNzͷHfm.[<^YagFrN}gwy\vRRSGL;b!f4wzg8)8C~ &_-_˺zХƨFQ_jМU:3Jd;XɈ7w6w\/~9z-ΝY .Y,Wܧ:b1QG0UZ}z~L7`j} 5e}q$oJvU4Z>uFǿׄF>2@z.pFzl/`; \~yPdPJz64nFs؈즓_=|8SD鳫|%f̔Xpu8 nj9 ?qf_!{0[8|w̋ōWRUVmbdiGLČG|(SlYWۺ-@wI);:[j5d6ZOHf]{}Cb\9A|^\-XFwdopq#f>f*__?_?9oX㠿;v~A'b?7}oH7P+7OXSis}!>b$+bm6?~y_|q?F׍R'IOT\nYhB}IݥOWJ"ź)FkDGMI\Q;pND}+ZxiH6Vy!6}.}pHbSGL;b#f)yYdswZ-}`~O3hfCo6D鮣aVCsjl|jҟ^#~$(u+ASNxo)4ZR?&*YQ3.[S{-l~Lfi?͌$-d=v$fndM``ނm3,&c\]DW,H|W: ?='IOKfO2tлu^(Mk_W"CaWގ盌vWh V墜DzEgS杻シ+Q[|vۼ2G}Xf|A]77umߓ"*V[3yCMAayȃ3(\9Exzilq+OV+[fS´ 13N#>:4ߣ@:b{zLn3z][w<׆=DhE[>2_57Ԟ>=LE) og^QӊRw,/U/OUw3{Gl1ά@q_ 4:.ihΔϓD~[{i9mXC~bayP!p|E#Z)f??/hя@C?&Y$_$FK@c~]9lA,{VJeY.) (i > > > >      ! ! ! ! !13!! !!B|48@48@4@#F4h@#F 4h$H@#F4 h(Q@F4.и@ 4.и@ 4.и@4x@4x@4>@4>@4>@M4@M4@M4!Є@M4!Є@M4!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKp .!%\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%$\BKHp .!%P \BK(p .%P \BK(p .%P \BK(p .%P \BK(p .%P \BK(p .%o?F%VJtgp/R/0000755000175100001440000000000012506600653011266 5ustar hornikuserstgp/R/lhs.R0000644000175100001440000000554212506600653012205 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## lhs: ## ## generate a Latin Hypercube Sample of size n within the rectangle ## provided. The default "prior" for the sample is uniform, but the ## shape and mode arguments can be used to describe a beta distribution ## in each dimension. The actual sample is generated C-side "lhs" <- function(n, rect, shape=NULL, mode=NULL) { ## sanity checks if(length(n) != 1) stop(paste("length(n) should be 1, you have", length(n))) if(n < 0) stop(paste("n should be positive, you have", n)) if(n == 0) return(NULL) ## get and check the rectangle dimensions if(is.null(dim(rect))) { ncol <- length(rect); d <- 1 } else { ncol <- ncol(rect); d <- dim(rect)[1] } if(ncol != 2) stop("ncol(rect) must be 2") ## check the shape argument should be positive and of length if(!is.null(shape) && length(shape) != d && all(shape > 0)) stop(paste("For beta sampling, length(shape) should be ", d, ", you have ", length(shape), ", and all positive", sep="")) if(is.null(shape)) shape <- -1 ## check the mode argument is positive and of length 1 if(!is.null(mode) && length(mode) != d && all(mode > 0)) stop(paste("To specify sampling modes, length(mode) should be ", d, ", you have ", length(mode), ", and all positive", sep="")) if(is.null(mode)) mode <- -1 ## choose a random state for the C code state <- sample(seq(0,999), 3) ## run the C code ll <- .C("lh_sample", state = as.integer(state), n = as.integer(n), d = as.integer(d), rect = as.double(rect), # no need to transpose shape = as.double(shape), mode = as.double(mode), s = double(n*d), PACKAGE="tgp" ) ## just return the samples return(t(matrix(ll$s, nrow=d))) } tgp/R/tgp.default.params.R0000644000175100001440000003303612506600653015115 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.default.params: ## ## create a default parameter vector for tgp-class models with ## the specified dimension, mean function, correllation model ## and other augmentations specified in ... ## ## Note that the choice of bprior can negate the usefulness of ## (or override) some of the parameters, particularly the hierarchical ## parameters tau2.p and tau2.lam "tgp.default.params" <- function(d, meanfn=c("linear", "constant") , corr=c("expsep", "exp", "mrexpsep", "matern", "sim"), splitmin=1, basemax=d, ...) { ## check the d argument, other check in tgp.check.params if(length(d) != 1) stop("d should be an integer scalar >= 1") ## check the splitmin argument, other check in tgp.check.params if(length(splitmin) != 1) stop("splitmin should be an integer scalar >= 1") ## check the basemax argument, other check in tgp.check.params if(length(basemax) != 1) stop("basemax should be an integer scalar >= 1") ## setting of col, the dim of (1,X) based on the mean function meanfn <- match.arg(meanfn) if(meanfn == "linear") { col <- d+1 } else if(meanfn == "constant"){ col <- 1 ## not sure why I ever had this code here ## if(basemax != d) { ## warning("must have basemax = d for constant mean function") ## basemax <- d ## } } ## adjust the starting beta and Wi values on basemax beta <- rep(0, min(col, basemax+1)) Wi <- diag(1, length(beta)) ## check the corr argument, and augment splitmin ## if fitting a multi-resolution model corr <- match.arg(corr) ## PERHAPS THIS SHOULD BE DONE IN THE C CODE SO THAT WHEN WE PRINT WITHIN C IT MAKES MORE SENSE if(corr=="mrexpsep") splitmin <- splitmin + 1 ## parameters shared by all models params <- list( tree=c(0.5,2,max(c(10,basemax+2)), # tree prior params ,, splitmin, basemax), # (continued) col=col, # defined above, based on meanfn meanfn=meanfn, # one of "linear" or "constant" bprior="bflat", # linear prior (b0, bmle, bflat, b0not, or bmzt) beta=beta, # start/prior vals for beta Wi=Wi, # start/prior vals for Wi s2tau2=c(1,1), # start vals for s2, and tau2 s2.p=c(5,10), # s2 prior params (initial values) and s2.lam=c(0.2,10), # s2 hierarc inv-gamma prior params (or "fixed") tau2.p=c(5,10), # tau2 prior params (initial values) and tau2.lam=c(0.2,0.1), # tau2 hierarch inv-gamma prior params (or "fixed") corr=corr, # correlation model (exp, expsep, matern, sim) gd=c(0.1, 0.5), # start vals for nug and d nug.p=c(1,1,1,1), # nug gamma-mix prior params (initial values) nug.lam="fixed", # nug hierarch gamma-mix prior params (or "fixed") gamma=c(10,0.2,0.7), # gamma linear pdf parameter d.p=c(1.0,20.0,10.0,10.0), # d gamma-mix prior params (initial values) delta.p=c(), # delta parameter for high fidelity variance nugf.p=c(), # residual process nugget gamma-mix prior params d.lam="fixed", # d lambda hierarch gamma-mix prior params (or "fixed") dp.sim=diag(0.2,basemax), # d-proposal covariance for sim correlaton nu=c() # matern correlation smoothing parameter ) ## parameters specific to multi-resolution corr model if(corr == "mrexpsep"){ mrd.p <- c(1,10,1,10) # gamma-mix params for the discr process (this for 'wigl') params$d.p <- c(params$d.p, mrd.p) params$delta.p <- c(1,1,1,1) params$nugf.p <- c(1,1,1,1) } ## Replace the parameters with ellipsis arguments, ## these should match the entries of params, or be "minpart" plist <- list( ... ) args <- names(plist) if(length(plist)>0) { pmatch <- match(args, c(names(params), "minpart")) for(i in 1:length(plist)){ if(args[i] == "minpart") params$tree[3] <- plist[[i]] else if(!is.na(pmatch[[i]])) params[[pmatch[i]]]<- plist[[i]] else stop(paste("your argument \"", args[i], "\" is not recognized", sep="")) } } return(params) } ## tgp.check.params: ## ## check that the parameter list describes a proper hierarchical parameter ## vector (of dimension d) -- and simultabiously convert the list into ## a double-vector to be passed to the C-side of tgp via .C "tgp.check.params" <- function(params, d) { ## check the number of parameters if(is.null(params)) return(matrix(-1)); if(length(params) != 22) { stop(paste("Number of params should be 22, you have", length(params), "\n")); } ## tree prior parameters if(length(params$tree) != 5) { stop(paste("length of params$tree should be 5, you have", length(params$tree), "\n")); } ## check tree minpart is bigger than input dimension basemax <- params$tree[5] if(params$tree[3] <= basemax) { stop(paste("tree minpart", params$tree[3], "should be > basemax =", basemax, "\n")); } ## check tree splitmin is <= than input dimension if(params$tree[4] < 1 || params$tree[4] > d) { stop(paste("tree splitmin", params$tree[4], "should be >= 1 and <= d =", d, "\n")); } ## check tree basemax is > splitmin and <= than input dimension if(basemax < 1 || params$tree[5] > d) { stop(paste("tree basemax", basemax, "should be >= 1 and <= d =", d, "\n")); } ## tree alpha and beta parameters p <- c(as.numeric(params$tree)) ## assign the mean function if(params$meanfn == "linear") { meanfn <- 0; if(params$col != d+1) stop(paste("col=", params$col, " should be d+1=", d+1, "with linear mean function", sep="")) } else if(params$meanfn == "constant"){ meanfn <- 1; if(params$col != 1) stop(paste("col=", params$col, " should be 1 with constant mean function", sep="")) } else { cat(paste("params$meanfn =", params$meanfn, "not valid\n")); meanfn <- 0; } p <- c(p, meanfn) ## beta linear prior model ## check the type of beta prior, and possibly augment by p0 if(params$bprior == "b0") { p <- c(p,0); } else if(params$bprior == "bmle") { p <- c(p, 1); } else if(params$bprior == "bflat") { p <- c(p, 2); } else if(params$bprior == "b0not") { p <- c(p, 3); } else if(params$bprior == "bmzt") { p <- c(p, 4); } else if(params$bprior == "bmznot") { p <- c(p, 5); } else { stop(paste("params$bprior =", params$bprior, "not valid\n")); } ## initial settings of beta linear prior mean parameters if(length(params$beta) != min(params$col, basemax+1)) { stop(paste("length of params$beta should be", min(params$col, basemax+1), "you have", length(params$beta), "\n")); } ## finally, set the params$beta p <- c(p, as.numeric(params$beta)) ## initial settings of the beta linear prior correlation parameters if(nrow(params$Wi) != length(params$beta) && ncol(params$Wi) != nrow(params$Wi)) { stop(paste("params$Wi should be", length(params$beta), "x", length(params$beta), "you have", nrow(params$Wi), "x", ncol(params$Wi), "\n")); } ## finally, set the params$Wi p <- c(p, as.numeric(params$Wi)) ## initial settings of variance parameters if(length(params$s2tau2) != 2) { stop(paste("length of params$s2tau2 should be 2 you have", length(params$s2tau2), "\n")); } p <- c(p, as.numeric(params$s2tau2)) ## sigma^2 prior parameters if(length(params$s2.p) != 2) { stop(paste("length of params$s2.p should be 2 you have", length(params$s2.p), "\n")); } p <- c(p, as.numeric(params$s2.p)) ## hierarchical prior parameters for sigma^2 (exponentials) or "fixed" if(length(params$s2.lam) != 2 && params$s2.lam[1] != "fixed") { stop(paste("length of params$s2.lam should be 2 or fixed, you have", params$s2.lam, "\n")); } if(params$s2.lam[1] == "fixed") p <- c(p, rep(-1, 2)) else p <- c(p, as.numeric(params$s2.lam)) ## tau^2 prior parameters if(length(params$tau2.p) != 2) { stop(paste("length of params$tau2.p should be 2 you have", length(params$tau2.p),"\n")); } p <- c(p, as.numeric(params$tau2.p)) ## hierarchical prior parameters for tau^2 (exponentials) or "fixed" if(length(params$tau2.lam) != 2 && params$tau2.lam[1] != "fixed") { stop(paste("length of params$s2.lam should be 2 or fixed, you have", params$tau2.lam, "\n")); } if(params$tau2.lam[1] == "fixed") p <- c(p, rep(-1, 2)) else p <- c(p, as.numeric(params$tau2.lam)) ## correllation model if(params$corr == "exp") { p <- c(p, 0); } else if(params$corr == "expsep") { p <- c(p, 1); } else if(params$corr == "matern") { p <- c(p, 2); } else if(params$corr == "mrexpsep") { p <- c(p,3) } else if(params$corr == "sim") { p <- c(p,4) } else { stop(paste("params$corr =", params$corr, "not valid\n")); } ## initial settings of variance parameters if(length(params$gd) != 2) { stop(paste("length of params$gd should be 2 you have", length(params$gd), "\n")); } p <- c(p, as.numeric(params$gd)) ## mixture of gamma (initial) prior parameters for nug if(length(params$nug.p) == 1 && params$nug.p[1] == 0) params$nug.p <- rep(0,4) if(length(params$nug.p) != 4) { stop(paste("length of params$nug.p should be 4 you have", length(params$nug.p),"\n")); } if(params$nug.p[1] == 0) params$nug.p[2] <- params$gd[1] p <- c(p, as.numeric(params$nug.p)) ## hierarchical prior params for nugget g (exponentials) or "fixed" if(length(params$nug.lam) != 4 && params$nug.lam[1] != "fixed") { stop(paste("length of params$nug.lam should be 4 or fixed, you have", params$nug.lam, "\n")); } if(params$nug.lam[1] == "fixed") p <- c(p, rep(-1, 4)) else p <- c(p, as.numeric(params$nug.lam)) ## gamma theta1 theta2 LLM prior params if(length(params$gamma) != 3) { stop(paste("length of params$gamma should be 3, you have", length(params$gamma),"\n")); } if(params$gamma[1] > 0 && params$corr == "sim") stop("cannot have sim corr with LLM") if(!prod(params$gamma[2:3] > 0)) stop("all params$gamma[2:3] must be positive\n") if(sum(params$gamma[2:3]) >= 1.0) stop("sum(gamma[2:3]) > 1 not allowed\n") p <- c(p, as.numeric(params$gamma)) ## mixture of gamma (initial) prior parameters for range parameter d ## if(length(params$d.p) == 1 && params$d.p[1] == 0) params$d.p <- rep(0,4) if(length(params$d.p) != 8 && params$corr == "mrexpsep") { stop(paste("length of params$d.p should be 8 you have", length(params$d.p),"\n")); } else if( length(params$d.p) != 4 && params$corr != "mrexpsep" ) { stop(paste("length of params$d.p should be 4 you have", length(params$d.p),"\n")); } if(params$d.p[1] == 0) params$d.p[2] <- params$gd[2] if(length(params$d.p) == 8 && params$d.p[5] == 0) params$d.p[6] <- params$gd[2] ## finally, set the params$d.p p <- c(p, as.numeric(params$d.p)) ## delta.p -- only do this if we are using mrexpsep if(length(params$delta.p) != 4 && params$corr == "mrexpsep") { stop(paste("length of params$delta.p should be 4 you have", length(params$delta.p),"\n")); } if(params$corr == "mrexpsep") p<- c(p, as.numeric(params$delta.p)) ## nugf.p -- only do this if we are using mrexpsep if(length(params$nugf.p) != 4 && params$corr == "mrexpsep") { stop(paste("length of params$delta.p should be 4 you have", length(params$nug.p),"\n")); } if(params$corr == "mrexpsep") p<- c(p, as.numeric(params$nugf.p)) ## hierarchical prior params for range d (exponentials) or "fixed" if(length(params$d.lam) != 4 && params$d.lam[1] != "fixed") { stop(paste("length of params$d.lam should be 4 or fixed, you have", length(params$d.lam),"\n")); } if(params$d.lam[1] == "fixed") p <- c(p, rep(-1, 4)) else p <- c(p, as.numeric(params$d.lam)) ## add sd for proposals for sim-d parameters if(params$corr == "sim") { if(nrow(params$dp.sim) != basemax || ncol(params$dp.sim) != basemax) stop("dp.sim should be ", basemax, "x", basemax, "\n"); p <- c(p,as.numeric(params$dp.sim)) } ## nu smoothness parameter for Matern correlation function if(params$corr == "matern") { if(params$nu < 0) stop(paste("nu should be greater than zero, you have", params$nu, "\n")) } p <- c(p, as.numeric(params$nu)) ## return the constructed double-vector of parameters for C return(p) } tgp/R/predict.tgp.R0000644000175100001440000002054712506600653013644 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## predict.tgp: ## ## generic the master tgp R function which takes most of its inputs ## from a tgp-object. Most of the changeable outputs have to do with ## sampling from the posterior predictive distribution (hence a predict ## method). It checks for valid inputs and then calls the C-side via .C ## on those inputs -- and then calls the post-processing code accordingly "predict.tgp" <- function(object, XX=NULL, BTE=c(0,1,1), R=1, MAP=TRUE, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, trace=FALSE, verb=0, ...) { ## (quitely) double-check that tgp is clean before-hand tgp.cleanup(message="NOTICE", verb=verb, rmfiles=TRUE); ## what to do if fatally interrupted? on.exit(tgp.cleanup(verb=verb, rmfiles=TRUE)) if(object$params$corr == "mrexpsep" && !is.null(sens.p)) stop("Sorry, sensitivity analysis is not yet available for corr=\"mrexpsep\"") ## get names Xnames <- names(object$X) response <- names(object$Z) ## check XX XX <- check.matrix(XX)$X if(is.null(XX)) { nn <- 0; XX<- matrix(0); nnprime <- 0 } else { nn <- nrow(XX); nnprime <- nn if(ncol(XX) != object$d) stop("mismatched column dimension of object$X and XX"); } ## check that pred.n, krige, MAP, and Ds2x is true or false if(length(pred.n) != 1 || !is.logical(pred.n)) stop("pred.n should be TRUE or FALSE") if(length(krige) != 1 || !is.logical(krige)) stop("krige should be TRUE or FALSE") if(length(zcov) != 1 || !is.logical(zcov)) stop("zcov should be TRUE or FALSE") if(length(MAP) != 1 || !is.logical(MAP)) stop("MAP should be TRUE or FALSE") if(length(Ds2x) != 1 || !is.logical(Ds2x)) stop("Ds2x should be TRUE or FALSE") ## check the form of the improv-power argument if(length(improv) == 2) { numirank <- improv[2]; improv <- improv[1] } else { numirank <- NULL } if(length(improv) != 1 || !(is.logical(improv) || is.numeric(improv)) || (is.numeric(improv) && improv <= 0)) stop(paste("improv [", improv, "] should be TRUE, FALSE, or a positive integer (power)", sep="")) g <- as.numeric(improv) ## check numirank, which is improv[2] in input if(is.null(numirank) && improv) numirank <- max(min(10, nn), 0.1*nn) else if(!is.null(numirank) && numirank > nn) stop("improv[2] must be <= nrow(XX)") else if(is.null(numirank)) numirank <- 0 ## check for inconsistent XX and Ds2x/improv if(nn == 0 && (Ds2x || improv)) warning("need to specify XX locations for Ds2x and improv") ## check the sanity of input arguments if(nn > 0 && sum(dim(XX)) > 0 && ncol(XX) != object$d) stop("XX has bad dimensions") if(BTE[1] < 0 || BTE[2] <= 0 || BTE[1] >= BTE[2]) stop("bad B and T: must have 0<=B=E") ## might scale Z to mean of 0 range of 1 if(object$m0r1) { Zm0r1 <- mean0.range1(object$Z); Z <- Zm0r1$X } else { Z <- object$Z; Zm0r1 <- NULL } ## get infor about the tree m <- which.max(object$posts$lpost) t2c <- tree2c(object$trees[[object$posts$height[m]]]) # RNG seed state <- sample(seq(0,999), 3) ## get itemps from object, but set c0n0 <- c(0,0) ## so no stochastic approx happens object$itemps$c0n0 <- c(0,0) itemps <- check.itemps(object$itemps, object$params) ## if performing a sensitivity analysis, set up XX if(!is.null(sens.p)){ nnprime <- 0 if(nn > 0) warning("XX generated online in sensitivity analyses") sens.par <- check.sens(sens.p, object$d) nn <- sens.par$nn; nn.lhs <- sens.par$nn.lhs; XX <- sens.par$XX ngrid <- sens.par$ngrid; span <- sens.par$span MEgrid <- as.double(sens.par$MEgrid) if(verb >= 1) cat(paste("Predict at", nn, "LHS XX locs for sensitivity analysis\n")) } else{ nn.lhs <- ngrid <- 0; MEgrid <- span <- double(0) } ## calculate the number of sampling rounds S = R*(BTE[2]-BTE[1])/BTE[3] ## run the C code ll <- .C("tgp", ## begin inputs state = as.integer(state), X = as.double(t(object$X)), n = as.integer(object$n), d = as.integer(object$d), Z = as.double(Z), XX = as.double(t(XX)), nn = as.integer(nn), Xsplit = as.double(t(object$Xsplit)), nsplit = as.integer(nrow(object$Xsplit)), trace = as.integer(trace), BTE = as.integer(BTE), R = as.integer(R), linburn = as.integer(FALSE), zcov = as.integer(zcov), g = as.integer(c(g, numirank)), dparams = as.double(object$dparams), itemps = as.double(itemps), verb = as.integer(verb), tree = as.double(c(ncol(t2c),t(t2c))), hier = as.double(object$posts[m,3:ncol(object$posts)]), MAP = as.integer(MAP), sens.ngrid = as.integer(ngrid), sens.span = as.double(span), sens.Xgrid = MEgrid, ## output dimensions for checking NULL pred.n = as.integer(pred.n), nnprime = as.integer(nnprime), krige = as.integer(krige), bDs2x = as.integer(Ds2x), improv = as.integer(as.logical(improv) * nnprime), ## begin outputs Zp.mean = double(pred.n * object$n), ZZ.mean = double(nnprime), Zp.km = double(krige * pred.n * object$n), ZZ.km = double(krige * nnprime), Zp.vark = double(krige * pred.n * object$n), ZZ.vark = double(krige * nnprime), Zp.q = double(pred.n * object$n), ZZ.q = double(nnprime), Zp.s2 = double(pred.n * (zcov*object$n^2) + (!zcov)*object$n), ZZ.s2 = double(zcov*nnprime^2 + (!zcov)*nnprime^2), ZpZZ.s2 = double(pred.n * object$n * nnprime * zcov), Zp.ks2 = double(krige * pred.n * object$n), ZZ.ks2 = double(krige * nnprime), Zp.q1 = double(pred.n * object$n), Zp.med = double(pred.n * object$n), Zp.q2 = double(pred.n * object$n), ZZ.q1 = double(nnprime), ZZ.med = double(nnprime), ZZ.q2 = double(nnprime), Ds2x = double(Ds2x * nnprime), improv = double(as.logical(improv) * nnprime), irank = integer(as.logical(improv) * nnprime), ess = double(1 + itemps[1]*2), gpcs = double(4), sens.ZZ.mean = double(ngrid*object$d), sens.ZZ.q1 = double(ngrid*object$d), sens.ZZ.q2 = double(ngrid*object$d), sens.S = double(object$d*S*!is.null(sens.p)), sens.T = double(object$d*S*!is.null(sens.p)), ## end outputs PACKAGE = "tgp") ## post-process before returning ll <- tgp.postprocess(ll, Xnames, response, pred.n, zcov, Ds2x, improv, sens.p, Zm0r1, object$params, TRUE) return(ll) } ## tree2c ## ## converts the list-and-data.frame style tree contained in ## the tgp-class object into a C-style double-vector so that ## the C-side can start from the MAP tree contained in the object "tree2c" <- function(t) { ## change var into a numeric vector var <- as.character(t$var) var[var == ""] <- -1 var <- as.numeric(var) ## to return tr <- data.frame(rows=t$rows, var=var) tr <- cbind(tr, t[,8:ncol(t)]) ## order the rows by the row column o <- order(tr[,1]) tr <- tr[o,] return(as.matrix(tr)) } tgp/R/tgp.design.R0000644000175100001440000001261612506600653013461 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.design: ## ## choose howmany of Xcand candidate locations according to a treed ## D-optimal design using the MAP tree contained in the tgp-class ## object. iter specifies the number of iterations in the stochastic ## ascent method "tgp.design" <- function(howmany, Xcand, out, iter=5000, verb=0) { ## get partitioned candidates and dat locaitons Xcand.parts <- partition(Xcand, out) X.parts <- partition(out$X, out) ## initialize selected candidates to none XX <- NULL ## subsample some from each partition cat(paste("\nsequential treed D-Optimal design in ", length(Xcand.parts), " partitions\n", sep="")) for(i in 1:length(Xcand.parts)) { nn <- ceiling(howmany*(nrow(Xcand.parts[[i]]))/(nrow(Xcand))) if(verb > 0) cat(paste("dopt.gp (", i, ") choosing ", nn, " new inputs from ", nrow(Xcand.parts[[i]]), " candidates\n", sep="")) dout <- dopt.gp(nn, X.parts[[i]], Xcand.parts[[i]], iter, max(verb-1,0)); XX <- rbind(XX, dout$XX) } return(XX) } ## tgp.partition: ## ## group X into a list containg each region as partitioned ## by the tree -- i is used to index root of the tree structure ## when applied recursively. This functio is used exclusively ## by the partition function below "tgp.partition" <- function(X, tree, i) { ## error or leaf node if(length(X) == 0) { stop("no X's found in partition\n") } if(tree$var[i] == "") return(list(X)); ## make sure X is a matrix if(is.null(nrow(X))) X <- matrix(X, ncol=1) ## gather the appropriate operations from the ith tree node var <- as.integer(as.character(tree$var[i]))+1 gt <- (1:nrow(X))[X[,var] > tree$val[i]] leq <- setdiff(1:nrow(X), gt) ## calculate the left and right tree node rows l <- (1:nrow(tree))[tree$rows == 2*tree$rows[i]] r <- (1:nrow(tree))[tree$rows == 2*tree$rows[i]+1] ## recurse on left and right subtrees if(length(leq) > 0) Xl <- tgp.partition(as.matrix(X[leq,]), tree, l) else Xl <- NULL if(length(gt) > 0) Xr <- tgp.partition(as.matrix(X[gt,]), tree, r) else Xr <- NULL return(c(Xl,Xr)) } ## partition: ## ## return a list of X location in each region of the MAP ## treed partition contained in the tgp-class object in out "partition" <- function(X, out) { m <- which.max(out$posts$lpost) tree <- out$trees[[out$posts$height[m]]] return(tgp.partition(X, tree, 1)) } ## dopt.gp: ## ## create a sequential D-optimal design of size under a GP model ## from candidates Xcand assuming that X locations are already in ## the design. The stochastic ascent algorithm uses iter rounds. ## Uses a C-side routine via .C "dopt.gp" <- function(nn, X=NULL, Xcand, iter=5000, verb=0) { if(nn == 0) return(NULL); ## check iterations if(length(iter) != 1 && iter <= 0) stop("iter must be a positive integer") ## check Kverbiterations if(length(verb) != 1 && iter < 0) stop("verb must be a non-negative integer") ## check X inputs Xnames <- names(X) X <- check.matrix(X)$X ## check the Xcand inputs if(is.null(Xcand)) stop("XX cannot be NULL") Xcand <- check.matrix(Xcand)$X ## check if X is NULL if(!is.null(X)) { n <- nrow(X); m <- ncol(X) X <- t(X) ## for row-major in .C } else { n <- 0; m <- ncol(Xcand) } ## check that cols of Xcand match X if(ncol(Xcand) != m) stop("mismatched column dimension of X and Xcand"); ncand <- nrow(Xcand) ## reduce nn if it is too big if(nn > nrow(Xcand)) { warning("nn greater than dim(Xcand)[1]"); nn <- nrow(Xcand); } ## choose a random state for the C code state <- sample(seq(0,999), 3) ## run the C code ll <- .C("dopt_gp", state = as.integer(state), nn = as.integer(nn), ## transpose of X is taken above X = as.double(X), n = as.integer(n), m = as.integer(m), Xcand = as.double(t(Xcand)), ncand = as.integer(ncand), iter = as.integer(iter), verb = as.integer(verb), fi = integer(nn), PACKAGE="tgp" ) ## deal with X, and names of X ll$X <- framify.X(ll$X, Xnames, m) ll$Xcand <- framify.X(ll$Xcand, Xnames, m) ll$XX <- ll$Xcand[ll$fi,] if(is.matrix(Xcand)) ll$XX <- matrix(as.matrix(ll$XX), ncol=ncol(Xcand)) ## dont return some of the things used by C ll$n <- NULL; ll$m <- NULL; ll$state <- NULL return(ll) } tgp/R/print.tgp.R0000644000175100001440000001076412506600653013346 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## print.tgp ## ## generic print method for tgp-class objects ## (doesn't do much now except list the fields of the tgp-class list "print.tgp" <- function(x, ...) { cat("\nThis is a 'tgp' class object. ", "It is basically a list with the following entries:\n", fill=TRUE) print(names(x), quote=FALSE) cat("\nSee ?btgp for an explanation of the individual entries. ", "See plot.tgp and tgp.trees for help with visualization.\n", fill=TRUE) cat("The $trace field, if it exists, is of class 'tgptraces'", "and has its own print statement\n", fill=TRUE) } ## print.tgptraces ## ## generic print method for tgptraces-class objects ## describes the contents of each field in the list, as well as ## sub-fields where appropriate. Some fields may be empty, or have ## sub-fields which depend on the type of analysis, and this ## is indicated "print.tgptraces" <- function(x, ...) { cat("\nThis 'tgptraces'-class object contains traces of the parameters\n") cat("to a tgp model. Access is as a list:\n\n") ## info about XX cat(paste("1.) $XX contains the traces of GP parameters for ", length(x$XX), " predictive\n", sep="")) cat(" locations\n\n") if(length(x$XX) > 0) { if(length(x$XX) == 1) { cat(paste("\n$XX[[1]]" , sep="")) } else { cat(paste(" Each of $XX[[1]] ... $XX[[", length(x$XX), "]]", sep="")) } cat(paste(" is a data frame with the\n columns representing GP parameters:\n\n", sep="")) print(names(x$XX[[1]]), quote=FALSE) } else cat(" ** The $XX list is empty because XX=NULL, or T-B=0\n") ## info about hierarchial params cat("\n2.) $hier has a trace of the hierarchical params:\n", sep="", fill=TRUE) if(!is.null(names(x$hier))) print(names(x$hier), quote=FALSE) else cat(" ** $hier is empty because T-B=0\n") ## info about linarea cat("\n3.) $linarea has a trace of areas under the LLM. It is a \n") cat(" data frame with columns:\n\n") cat(" count: number of booleans b=0, indicating LLM\n") cat(" la: area of domain under LLM\n") cat(" ba: area of domain under LLM weighed by dim\n") if(length(x$linarea) <= 0) { cat("\n ** $linarea is empty since you fit a model which \n") cat(" ** either forced the LLM (btlm, blm), or disallowed\n") cat(" ** it (bgp, btgp)\n") } ## info about parts cat("\n4.) $parts contains all of the partitions visited. Use the\n") cat(" tgp.plot.parts.[1d,2d] functions for visuals\n") if(length(x$parts) <= 0) { cat("\n ** $parts is empty since you fit a non-treed model\n") } ## info about posts cat("\n5.) $post is a data frame with columns showing the following:\n") cat(" log posterior ($lpost), tree height ($height) and leaves\n") cat(" ($leaves), IS weights ($w), tempered log posterior ($tlpost),\n") cat(" inv-temp ($itemp), and weights adjusted for ESS ($wlambda)\n") if(is.null(x$post)) cat("\n ** $posts is empty since T-B=0\n") ## info about ZZ cat("\n6.) $preds is a list containing data.frames for samples from\n") cat(" the posterior predictive distributions data (X) locations\n") cat(" (if pred.n=TRUE: $Zp, $Zp.km, $Zp.ks2) and (XX) locations\n") cat(" (if XX != NULL: $ZZ, $ZZ.km, $ZZ.ks2), with $Ds2x when\n") cat(" input argument ds2x=TRUE, and $improv when improv=TRUE\n\n") if(length(x$preds) <= 0) { cat(" ** $preds is empty because pred.n=FALSE and XX=NULL, or T-B=0\n\n") } } tgp/R/btgp.R0000644000175100001440000001514712506600653012355 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## btgp: ## ## tgp implementation of the Bayesian treed Gaussian process model "btgp" <- function(X, Z, XX=NULL, meanfn="linear", bprior="bflat", corr="expsep", tree=c(0.5,2), BTE=c(2000,7000,2), R=1, m0r1=TRUE, linburn=FALSE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, nu=1.5, trace=FALSE, verb=1, ...) { n <- nrow(X) if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n); d <- 1 } else { d <- ncol(X) } params <- tgp.default.params(d, meanfn=meanfn, corr=corr, ...) params$bprior <- bprior params$tree[1:length(tree)] <- tree params$gamma <- c(0,0.2,0.7) # no llm if(corr == "matern") params$nu<-nu if(linburn && corr == "sim") stop("cannot do linburn for SIM model") return(tgp(X,Z,XX,BTE,R,m0r1,linburn,params,itemps,pred.n,krige,zcov, Ds2x,improv,sens.p,trace,verb)) } ## bcart: ## ## tgp implementation of the Bayesian CART model of Chipman et al "bcart" <- function(X, Z, XX=NULL, bprior="bflat", tree=c(0.5,2), BTE=c(2000,7000,2), R=1, m0r1=TRUE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, trace=FALSE, verb=1, ...) { return(btlm(X,Z,XX,meanfn="constant", bprior,tree,BTE,R,m0r1,itemps,pred.n,krige, zcov,Ds2x,improv,sens.p,trace,verb,...)) } ## bgp: ## ## tgp implementation of a Bayesian Gaussian process model "bgp" <- function(X, Z, XX=NULL, meanfn="linear", bprior="bflat", corr="expsep", BTE=c(1000,4000,2), R=1, m0r1=TRUE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, nu=1.5, trace=FALSE, verb=1, ... ) { n <- dim(X)[1] if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n); d <- 1 } else { d <- dim(X)[2] } params <- tgp.default.params(d, meanfn=meanfn, corr=corr,...) params$bprior <- bprior params$tree[1:2] <- c(0,0) # no tree params$gamma <- c(0,0.2,0.7) # no llm if(corr == "matern") params$nu <- nu return(tgp(X,Z,XX,BTE,R,m0r1,FALSE,params,itemps,pred.n,krige,zcov,Ds2x, improv,sens.p,trace,verb)) } ## bgpllm: ## ## tgp implementation of a Bayesian Gaussian Process with ## jumps to the Limiting Linear Model "bgpllm" <- function(X, Z, XX=NULL, meanfn="linear", bprior="bflat", corr="expsep", gamma=c(10,0.2,0.7), BTE=c(1000,4000,2), R=1, m0r1=TRUE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, nu=1.5, trace=FALSE, verb=1, ...) { n <- dim(X)[1] if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n); d <- 1 } else { d <- dim(X)[2] } params <- tgp.default.params(d, meanfn=meanfn, corr=corr, ...) params$bprior <- bprior params$gamma <- gamma params$tree[1:2] <- c(0,0) # no tree if(corr == "matern"){ params$nu <- nu; } if(corr == "mrexpsep"){ stop("Sorry, the LLM is not yet available for corr=\"mrexpsep\"")} if(corr == "sim"){ stop("Sorry, the LLM is not available for corr=\"sim\"")} return(tgp(X,Z,XX,BTE,R,m0r1,FALSE,params,itemps,pred.n,krige,zcov,Ds2x, improv,sens.p,trace, verb)) } ## blm: ## ## tgp implementation of a Bayesian hierarchical Linear Model "blm" <- function(X, Z, XX=NULL, meanfn="linear", bprior="bflat", BTE=c(1000,4000,3), R=1, m0r1=TRUE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, trace=FALSE, verb=1, ...) { n <- dim(X)[1] if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n); d <- 1 } else { d <- dim(X)[2] } params <- tgp.default.params(d, meanfn=meanfn, ...) params$bprior <- bprior params$tree[1:2] <- c(0,0) # no tree params$gamma <- c(-1,0.2,0.7) # force llm params$nug.p <- 0 ## force a fixed nugget params$gd[1] <- 0 ## fix the nugget at zero return(tgp(X,Z,XX,BTE,R,m0r1,FALSE,params,itemps,pred.n, krige,zcov,Ds2x,improv,sens.p,trace,verb)) } ## btgpllm: ## ## tgp implementation of a Bayesian treed Gaussian Process model ## with jumps to the Limiting Linear Model "btgpllm" <- function(X, Z, XX=NULL, meanfn="linear", bprior="bflat", corr="expsep", tree=c(0.5,2), gamma=c(10,0.2,0.7), BTE=c(2000,7000,2), R=1, m0r1=TRUE, linburn=FALSE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, nu=1.5, trace=FALSE, verb=1, ...) { n <- nrow(X) if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n); d <- 1 } else { d <- ncol(X) } params <- tgp.default.params(d, meanfn=meanfn, corr=corr,...) params$bprior <- bprior params$tree[1:length(tree)] <- tree params$gamma <- gamma if(corr == "matern"){ params$nu <- nu } if(corr == "mrexpsep"){ stop("Sorry, the LLM is not yet available for corr=\"mrexpsep\"")} if(corr == "sim"){ stop("Sorry, the LLM is not available for corr=\"sim\"")} return(tgp(X,Z,XX,BTE,R,m0r1,linburn,params,itemps,pred.n,krige,zcov, Ds2x,improv,sens.p,trace,verb)) } "btlm" <- function(X, Z, XX=NULL, meanfn="linear", bprior="bflat", tree=c(0.5,2), BTE=c(2000,7000,2), R=1, m0r1=TRUE, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=FALSE, sens.p=NULL, trace=FALSE, verb=1, ...) { n <- nrow(X) if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n); d <- 1 } else { d <- ncol(X) } params <- tgp.default.params(d, meanfn=meanfn, ...) params$bprior <- bprior params$tree[1:length(tree)] <- tree params$gamma <- c(-1,0.2,0.7) # no llm params$nug.p <- 0 ## force a nugget params$gd[1] <- 0 ## fix the nugget at zero return(tgp(X,Z,XX,BTE,R,m0r1,FALSE,params,itemps,pred.n,krige,zcov, Ds2x,improv,sens.p, trace,verb)) } tgp/R/check.matrix.R0000644000175100001440000000655412506600653014003 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## check.matrix: ## ## check/enfore that the X matrix has the proper dimensions ## (and the same number or rows as length(Z)) removing invalid rows ## (of Z too), i.e., NA, NaN, Inf "check.matrix" <- function(X, Z=NULL) { ## format X if(is.null(X)) return(NULL) n <- nrow(X) if(is.null(n)) { n <- length(X); X <- matrix(X, nrow=n) } X <- as.matrix(X) ## if a Z is provided to go along with X if(!is.null(Z)) { ## format Z ## Z <- as.vector(matrix(Z, ncol=1)[,1]) Z <- as.vector(as.matrix(Z)) if(length(Z) != n) stop("mismatched row dimension in X and Z") ## calculate locations of NAs NaNs and Infs in Z nna <- (1:n)[!is.na(Z) == 1] nnan <- (1:n)[!is.nan(Z) == 1] ninf <- (1:n)[!is.infinite(Z) == 1] if(length(nna) < n) warning(paste(n-length(nna), "NAs removed from input vector")) if(length(nnan) < n) warning(paste(n-length(nnan), "NaNs removed from input vector")) if(length(ninf) < n) warning(paste(n-length(ninf), "Infs removed from input vector")) neitherZ <- intersect(nna, intersect(nnan, ninf)) } else neitherZ <- (1:n) ## calculate row locations of NAs NaNs and Infs in X nna <- (1:n)[apply(!is.na(X), 1, prod) == 1] nnan <- (1:n)[apply(!is.nan(X), 1, prod) == 1] ninf <- (1:n)[apply(!is.infinite(X), 1, prod) == 1] if(length(nna) < n) warning(paste(n-length(nna), "NAs removed from input matrix")) if(length(nnan) < n) warning(paste(n-length(nnan), "NaNs removed from input matrix")) if(length(ninf) < n) warning(paste(n-length(ninf), "Infs removed from input matrix")) neitherX <- intersect(nna, intersect(nnan, ninf)) ## oops, no data: if(length(neitherX) == 0) stop("no valid (non-NA NaN or Inf) data found") ## combine good X and Z rows neither <- intersect(neitherZ, neitherX) X <- matrix(X[neither,], nrow=length(neither)) Z <- Z[neither] return(list(X=X, Z=Z)) } ## famify.X ## ## change an X matrix into a data frame with the names specified ## used by tgp.postprocess to convert a matrix enforced by check.matrix ## back into the data frame it started as "framify.X" <- function(X, Xnames, d) { X <- data.frame(t(matrix(X, nrow=d))) if(is.null(Xnames)) { nms <- c(); for(i in 1:d) { nms <- c(nms, paste("x", i, sep="")) } names(X) <- nms } else { names(X) <- Xnames } return(X) } tgp/R/tgp.cleanup.R0000644000175100001440000001141412506600653013632 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.cleanup ## ## gets called when the C-side is aborted by the R-side and enables ## the R-side to clean up the memory still allocaed to the C-side, ## as well as whatever files were left open on the C-side "tgp.cleanup" <- function(message="INTERRUPT", verb, rmfiles=TRUE) { .C("tgp_cleanup", PACKAGE = "tgp") ## remove the trace (and other) files? if(rmfiles) { if(file.exists(paste("./", "best_parts_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed best_parts_1.out\n", sep="")) unlink("best_parts_1.out") } if(file.exists(paste("./", "tree_m0_posts.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed tree_m0_posts.out\n", sep="")) unlink("tree_m0_posts.out") } if(file.exists(paste("./", "trace_parts_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_parts_1.out\n", sep="")) unlink("trace_parts_1.out") } if(file.exists(paste("./", "trace_post_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_post_1.out\n", sep="")) unlink("trace_post_1.out") } if(file.exists(paste("./", "trace_wlambda_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_wlambda_1.out\n", sep="")) unlink("trace_wlambda_1.out") } if(file.exists(paste("./", "trace_hier_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_hier_1.out\n", sep="")) unlink("trace_hier_1.out") } if(file.exists(paste("./", "trace_linarea_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_linarea_1.out\n", sep="")) unlink("trace_linarea_1.out") } if(file.exists(paste("./", "trace_XX_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_XX_1.out\n", sep="")) unlink("trace_XX_1.out") } if(file.exists(paste("./", "trace_Zp_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_Zp_1.out\n", sep="")) unlink("trace_Zp_1.out") } if(file.exists(paste("./", "trace_Zpkm_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_Zpkm_1.out\n", sep="")) unlink("trace_Zpkm_1.out") } if(file.exists(paste("./", "trace_Zpks2_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_Zpks2_1.out\n", sep="")) unlink("trace_Zpks2_1.out") } if(file.exists(paste("./", "trace_ZZ_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_ZZ_1.out\n", sep="")) unlink("trace_ZZ_1.out") } if(file.exists(paste("./", "trace_ZZkm_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_ZZkm_1.out\n", sep="")) unlink("trace_ZZkm_1.out") } if(file.exists(paste("./", "trace_ZZks2_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_ZZks2_1.out\n", sep="")) unlink("trace_ZZks2_1.out") } if(file.exists(paste("./", "trace_improv_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_improv_1.out\n", sep="")) unlink("trace_improv_1.out") } if(file.exists(paste("./", "trace_Ds2x_1.out", sep=""))) { if(verb >= 1) cat(paste(message, ": removed trace_Ds2x_1.out\n", sep="")) unlink("trace_Ds2x_1.out") } ## get all of the names of the tree files tree.files <- list.files(pattern="tree_m0_[0-9]+.out") ## for each tree file if(length(tree.files > 0)) { for(i in 1:length(tree.files)) { if(verb >= 1) cat(paste(message, ": removed ", tree.files[i], "\n", sep="")) if(rmfiles) unlink(tree.files[i]) } } } if(verb >= 1 && message == "INTERRUPT") cat("\n") } tgp/R/optim.tgp.R0000644000175100001440000001301412506600653013331 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## optim.ptgpf: ## ## find the minima of the MAP predictive (kriging) surface ## encoded in the tgp object, starting at the specified spot ## restrected to the provided rectangle with the specified ## method -- eventually we should be calclating and using GP ## derivative information optim.ptgpf <- function(start, rect, tgp.obj, method=c("L-BFGS-B", "Nelder-Mead", "BFGS", "CG", "SANN", "optimize")) { ## check the method argument method <- match.arg(method) ## ptgpf: ## ## predict at x for the MAP tgp object, to be used by optim ## for finding the minimum of the MAP kriging surface ptgpf <- function(x, tgp.obj, rect=NULL) { ## only need to check rectangle when 2-d or more if(!is.null(rect)) for(i in nrow(rect)) if(x[i] < rect[i,1] || x[i] > rect[i,2]) return(Inf) ## necessary b/c check.matrix doesn't know correct ncol if(!is.null(rect)) x <- matrix(x, ncol=nrow(rect)) ## run predict out <- predict(tgp.obj, XX=x, pred.n=FALSE) return(as.vector(out$ZZ.km)) } ## optimize is for 1-d data only if(method == "optimize") { if(nrow(rect) != 1) ## check if optimize method is appropriate stop("method=\"optimize\" only valid for 1-d functions") opt <- optimize(ptgpf, interval=rect[1,], tgp.obj=tgp.obj) return(list(par=opt$minimum, value=opt$objective, convergence=1)) } ## otherwise use optim in some way if(method == "L-BFGS-B") { ## use the boundary informatoin in rect opt <- optim(par=start, ptgpf, method=method, tgp.obj=tgp.obj, rect=rect, lower=rect[,1], upper=rect[,2]) } else { ## otheriwise, apply a method without boundaries opt <- optim(par=start, ptgpf, method=method, tgp.obj=tgp.obj, rect=rect) } ## return return(opt) } ## tgp.cands: ## ## create NN candidate locations (XX) either via Latin Hypercube ## sample (LHS), or sequential treed D-optimal design (based on an ## initial LHS tgp.cands <- function(tgp.obj, NN, cands=c("lhs", "tdopt"), rect, X, verb=0) { ## check the cands argument cands <- match.arg(cands) ## return a latin hypercibe sample if(cands == "lhs") return(lhs(NN, rect)) ## return a sequential treed D-optimal sample from initial LHS cands Xcand <- lhs(10*NN, rect) if(is.null(tgp.obj)) XX <- dopt.gp(NN, X=X, Xcand, verb=verb)$XX else XX <- tgp.design(NN, Xcand, tgp.obj, verb=verb) XX <- matrix(XX, ncol=ncol(X)) return(XX) } ## optim.tgp: ## execute one step in a search for the global optimum (minimum) of a ## noisy function (f) bounded in rect with starting (X,Z) data provided: ## fit a tgp model and predict creating NN+{1,2} candidates and ## select the one (or two) which give have the highest expected improv ## statistic. NN of the candidates come from cands (lhs or tdopt), ## plus one which is the location of the minima found (e.g.,) via calling ## optim (with particular method) on the MAP btgpm predictive surface ## (passed in with prev). When as != "none" an additional candidate ## is also selected, which has the highest expected alc or alm statistic ## The new X (which may be 1-3 rows) are returned optim.step.tgp <- function(f, rect, model=btgp, prev=NULL, X=NULL, Z=NULL, NN=20*length(rect), improv=c(1,5), cands=c("lhs", "tdopt"), method=c("L-BFGS-B", "Nelder-Mead", "BFGS", "CG", "SANN", "optimize"), ...) { ## lhs should verify that the rect makes sense rect <- matrix(rect, ncol=2) ## XX a predictive grid XX <- tgp.cands(prev$obj, NN, cands, rect, X) ## add optim results in as a predictive location XX <- rbind(XX, as.numeric(prev$progress[1,1:nrow(rect)])) Xboth <- rbind(X,XX) ## fit a tgp model out <- model(X=X, Z=Z, XX=XX, improv=improv, ...) ## find the predicted minimum m <- which.min(c(out$Zp.mean, out$ZZ.mean)) Xm <- Xboth[m,] ## find the optimum with kriging, and record in opt opt <- optim.ptgpf(Xm, rect, out, method) opt <- data.frame(matrix(c(opt$par, opt$value), nrow=1)) names(opt) <- c(paste("x", 1:nrow(rect), sep=""), "z") ## X & from tgp-improv ir <- out$improv[,2] Ximprov <- matrix(XX[ir <= improv[2],], nrow=sum(ir <= improv[2])) ## assemble the info about the current minimum, and return as <- data.frame(improv=max(out$improv[,1])) r <- list(X=Ximprov, progress=cbind(opt, as), obj=out) return(r) } tgp/R/default.itemps.R0000644000175100001440000002051512506600653014340 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## default.itemps: ## ## create a default inverse temperature ladder for importance ## tempering (IT) together with pseudo-prior and parameters ## for calibrating it by stochastic approximation. There are three ## choices of ladder as specified by type "default.itemps" <- function(m=40, type=c("geometric", "harmonic", "sigmoidal"), k.min=0.1, c0n0=c(100,1000), lambda=c("opt", "naive", "st")) { ## check m argument if(length(m) != 1 || m <= 0) stop("m should be a positive integer") ## check type argument type <- match.arg(type) ## check k.min argument if(length(k.min) != 1 || k.min >= 1 || k.min < 0) stop("k.min should be a integer satisfying 0 <= k.min < 1") ## check the c0n0 argument if(length(c0n0) != 2 || !prod(c0n0 >= 0)) stop("c0n0 should be a nonnegative 2-vector") ## check the lambda argument lambda <- match.arg(lambda) ## check if importance sampling only if(m == 1) return(list(c0n0=c(0,0), k=k.min, pk=1, lambda="naive")) if(type == "geometric") { ## calculate the delta for the geometric which reaches ## k.min in m steps delta <- k.min^(1/(1-m)) - 1 ## geometric temperature ladder i <- 1:m k <- (1+delta)^(1-i) } else if(type == "harmonic") { ## calculate the delta for the geometric which reaches ## k.min in m steps delta <- ((1/k.min) - 1)/(m-1) ## harmonic temperature ladder i <- 1:m k <- 1/(1+ delta*(i-1)) } else { ## sigmoid ## calculate the indices which provide the sigmoid which ## begins at 1 and ends at k.min with m steps x <- c(1,k.min) ends <- log((1.01-x)/x) t <- seq(ends[1], ends[2], length=m) ## logistic/sigmoid temperature ladder k <- 1.01 - 1.01/(1+exp(-t)) } ## return the generated ladder, as above, with a vector of ## observation counts for tgp to update return(list(c0n0=c0n0, k=k, pk=rep(1/m, m), lambda=lambda)) } ## check.itemps: ## ## check the itemps create by hand or from default.itemps or ## as modified by tgp or predict tgp and assembled inside ## the tgp.postprocess function "check.itemps" <- function(itemps, params) { ## if null, then just make one temperature (1.0) with all the prob if(is.null(itemps)) return(c(1,0,0,1,1,0,1)) ## if it is a list or a data frame else if(is.list(itemps) || is.data.frame(itemps)) { ## get the four fields c0n0 <- itemps$c0n0 pk <- itemps$pk lambda <- itemps$lambda k <- itemps$k counts <- itemps$counts ## check for non-null k m <- length(k) if(m == 0) stop("must specify k vector in list") ## check for null pk if(is.null(pk)) pk <- rep(1/m, m) ## check the dims are right if(m != length(pk)) stop("length(itemps$k) != length(itemps$pk)") ## put into decreasing order o <- order(k, decreasing=TRUE) k <- k[o] pk <- pk[o] ## checks k if(prod(k >= 0)!=1) stop("should have 0 <= itemps$k") if((m > 1 || k != 1) && params$bprior != "b0") warning("recommend params$bprior == \"b0\" for itemps$k != 1", immediate.=TRUE) ## checks for pk if(prod(pk > 0)!=1) stop("all itemps$pk should be positive") ## init and checks for c0n0 if(! is.null(c0n0)) { if(length(c0n0) != 2 || !prod(c0n0 >= 0)) stop("itemps$c0n0 should be a nonnegative 2-vector") } else c0n0 <- c(100,1000) ## check lambda if(! is.null(lambda)) { if(lambda == "opt") lambda <- 1 else if(lambda == "naive") lambda <- 2 else if(lambda == "st") { if(k[1] != 1.0) stop("cannot use lambda=\"st\" when itemps$k[1] != 1.0\n") lambda <- 3 } else stop(paste("lambda = ", lambda, "is not valid\n", sep="")) } else lambda <- 1 ## check the counts vector if(! is.null(counts)) { if(m != length(counts)) stop("length(itemps$k) != length(itemps$counts)") } else counts <- rep(0,m) ## return a double-version of the ladder return(c(m, c0n0, k, pk, counts, lambda)) } ## if it is a matrix else if(is.matrix(itemps)) { ## check dims of matrix if(ncol(itemps) != 2) stop("ncol(itemps) should be 2") ## get the two fields pk <- itemps[,2] k <- itemps[,1] m <- length(k) ## put into decreasing order o <- order(k, decreasing=TRUE) k <- k[o] pk <- pk[o] ## checks k if(prod(k >= 0)!=1) stop("should have 0 <= itemps[,1]") if((m > 1 || k != 1) && params$bprior != "b0") warning("recommend params$bprior == \"b0\" for itemps[,1] != 1", immediate.=TRUE) ## checks for pk if(prod(pk > 0)!=1) stop("all probs in itemps[,2] should be positive") ## return a double-version with a counts vector at the end return(c(m, 100, 1000, k, pk, 1, rep(0,m))) } ## if itemps is a vector else if(is.vector(itemps)) { ## get length of inverse temperature ladder m <- length(itemps) ## checks for itemps if(prod(itemps >= 0)!=1) stop("should have 0 <= itemps ") if((length(itemps) > 1 || itemps != 1) && params$bprior != "b0") warning("recommend params$bprior == \"b0\" for itemps != 1", immediate.=TRUE) ## return a double-version with a counts vector at the end return(c(m, 100, 1000, itemps, rep(1/m, m), 1, rep(0,m))) } else stop("invalid form for itemps") } ## hist2bar: ## ## make a barplot to compare the (discrete) histograms ## of each column of the input argument x hist2bar <- function(x) { ## make a matrix if(is.vector(x)) x <- matrix(x, ncol=1) ## calculate the number of, and allocate the space for, ## the bins, b, of the histogram r <- range(as.numeric(x)) b <- matrix(0, ncol=ncol(x), nrow=r[2]-r[1]+1) ## calculate the histogram height of each bin for(i in r[1]:r[2]) for(j in 1:ncol(x)) b[i-r[1]+1,j] <- sum(x[,j] == i) ## make have thr right data.frame format so that ## it will place nice with the barplot function, ## and return b <- data.frame(b) row.names(b) <- r[1]:r[2] return(t(b)) } ## itemps.barplot: ## ## make a histogram (via barplot) of the number of times ## each inverse-temperature was visited in the ST-MCMC ## chain. Requires that traces were collected itemps.barplot <- function(obj, main=NULL, xlab="itemps", ylab="counts", plot.it=TRUE, ...) { ## check to make sure traces were collected if(is.null(obj$trace)) stop(paste("no traces in tgp-object;", "re-run the b* function with argument \"trace=TRUE\"")) ## check to make sure tempering was used if(is.null(obj$itemps)) stop("no itemps in tgp-object") ## create a bin for each inverse-temperature bins <- rep(0,length(obj$itemps$k)) ## count and store the number in the first bin m <- obj$trace$post$itemp == obj$itemps$k[1] bins[1] <- sum(m) ## count and store the number in the rest of the bins for(i in 2:length(obj$itemps$k)) { m <- obj$trace$post$itemp == obj$itemps$k[i] if(sum(m) == 0) next; bins[i] <- sum(m) } ## make into a data frame for convenient barplotting bins <- data.frame(bins) row.names(bins) <- signif(obj$itemps$k,3) ## make the barplot histogram if(plot.it==TRUE) { smain <- paste(main, "itemp counts") barplot(t(bins), xlab=xlab, ylab=ylab, ...) } ## return the barplot structure for plotting later return(invisible(bins)) } tgp/R/tgp.plot.slice.R0000644000175100001440000002445112506600653014264 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.plot.slice: ## ## plot the 2-d slice of the tgp-class object out specified by the slice ## argument, and other usual plotting arguments and specified center ## and as (error) specifications "tgp.plot.slice" <- function(out, pparts=TRUE, slice=NULL, map=NULL, as=NULL, center="mean", layout="both", main=NULL, xlab=NULL, ylab=NULL, zlab=NULL, pc="pc", gridlen=40, span=0.1,...) { ## choose center as median or mean (i.e., X & Z data) ## (this hasn't been tested since the addition of the tgp.choose.center() function center <- tgp.choose.center(out, center); Z.mean <- center$Z cname <- center$name; X <- center$X ## get X locations for calculating slice locs <- getlocs(X) ## will call stop() if something is wrong with the slice d <- check.slice(slice, out$d, locs) ## deal with axis labels if(is.null(xlab)) xlab <- names(out$X)[d[1]] if(is.null(ylab)) ylab <- names(out$X)[d[2]] if(is.null(zlab)) zlab <- out$response fixed <- names(out$X)[slice$x]; to <- slice$z slice.str <- paste("(", fixed, ") fixed to (", to, ")", sep="") smain <- paste(main, " ", zlab, " ", cname, ", with ", slice.str, sep="") ## for ALC and EGO plotting as <- tgp.choose.as(out, as); XX <- as$X ZZ.q <- as$criteria emain <- paste(main, " ", zlab, " ", as$name, ", with ", slice.str, sep="") ##emain <- paste(main, zlab, as$name) ## depict the slice in terms of index variables p* if(length(slice$x) > 1) { p <- seq(1,nrow(X))[apply(X[,slice$x] == slice$z, 1, prod) == 1] pp <- seq(1,nrow(XX))[apply(XX[,slice$x] == slice$z, 1, prod) == 1] pn <- seq(1,out$n)[apply(out$X[,slice$x] == slice$z, 1, prod) == 1] ppn <- seq(1,out$nn)[apply(out$XX[,slice$x] == slice$z, 1, prod) == 1] } else { ppn <- seq(1,out$nn)[(out$XX[,slice$x] == slice$z)] pn <- seq(1,out$n)[out$X[,slice$x] == slice$z] p <- seq(1,nrow(X))[X[,slice$x] == slice$z] pp <- seq(1,nrow(XX))[XX[,slice$x] == slice$z] } ## check to makes sure there is actually some data in the slice if(length(p) == 0) { print(slice) stop("no points in the specified slice\n") } ## prepare for plotting if(layout == "both") par(mfrow=c(1,2), bty="n") ## else par(mfrow=c(1,1), bty="n") Xd.1 <- X[,d[1]]; Xd.2 <- X[,d[2]] XXd.1 <- XX[,d[1]]; XXd.2 <- XX[,d[2]] if(pc == "c") { # double-image plot if(layout == "both" || layout == "surf") { slice.image(Xd.1,Xd.2,p,Z.mean,main=smain,xlab=xlab,ylab=ylab, gridlen=gridlen,span=span,...) if(pparts & !is.null(out$parts)) { tgp.plot.parts.2d(out$parts, d, slice); } if(length(pn) > 0) points(out$X[pn,d[1]], out$X[pn,d[2]], pch=20) if(length(ppn) > 0) points(out$XX[ppn,d[1]], out$X[ppn,d[2]], pch=21) } if(layout == "both" || layout == "as") { slice.image(XXd.1,XXd.2,pp,ZZ.q,main=emain,xlab=xlab,ylab=ylab, gridlen=gridlen,span=span,...) if(pparts & !is.null(out$parts)) { tgp.plot.parts.2d(out$parts, d, slice); } if(length(pn) > 0) points(out$X[pn,d[1]], out$X[pn,d[2]], pch=20) if(length(ppn) > 0) points(out$XX[ppn,d[1]], out$XX[ppn,d[2]], pch=21) if(substr(as$name,1,1) == "I") text(out$XX[ppn,d[1]], out$XX[ppn,d[2]], labels=out$improv[ppn,2], ...) } } else if(pc == "pc") { # perspactive and image plot if(layout == "both" || layout == "surf") slice.persp(Xd.1,Xd.2,p,Z.mean,main=smain,xlab=xlab,ylab=ylab,zlab=zlab, gridlen=gridlen,span=span,...) if(layout == "both" || layout == "as") { slice.image(XXd.1,XXd.2,pp,ZZ.q,main=emain,xlab=xlab,ylab=ylab, gridlen=gridlen,span=span,...) if(length(pn) > 0) points(out$X[pn,d[1]], out$X[pn,d[2]], pch=20) if(length(ppn) > 0) points(out$XX[ppn,d[1]], out$XX[ppn,d[2]], pch=21) if(pparts & !is.null(out$parts)) { tgp.plot.parts.2d(out$parts, d, slice); } if(substr(as$name,1,1) == "I") text(out$XX[,proj[1]], out$XX[,proj[2]], labels=out$improv[ppn,2], ...) } } } ## slice.contour: ## ## contour plot of the slice or projection -- not currently ## used in any tgp plotting function "slice.contour" <- function(x,y,p,z,levels=NULL,xlab="x",ylab="y",main="",xlim=NULL,ylim=NULL, ...) { g <- slice.interp(x,y,p,z,xlim,ylim) if(missing(ylim)) ylim <- range(y) if(missing(xlim)) xlim <- range(x) if(is.null(levels)) { contour(g,xlab=xlab,ylab=ylab,main=main,xlim=xlim,ylim=ylim,...) } else { contour(g,levels=levels,xlab=xlab,ylab=ylab,main=main,xlim=xlim,ylim=ylim,...) } } ## slice.image: ## ## image plot of the slice or projection -- used in pc="c" "slice.image" <- function(x,y,p,z,xlim=NULL, ylim=NULL, gridlen=c(40,40), span=0.05, col=terrain.colors(128), ...) { g <- slice.interp(x,y,p,z,xlim,ylim,gridlen=gridlen,span=span) if(missing(ylim)) ylim <- range(y) if(missing(xlim)) xlim <- range(x) image(g, col=col,xlim=xlim,ylim=ylim,...) } ## slice.image.contour: ## ## double image and contour plot of the slice or projection -- not ## currently used in any tgp plotting function "slice.image.contour" <- function(x,y,p,z, xlim=NULL, ylim=NULL, gridlen=c(40,40), span=0.05, ...) { g <- slice.interp(x,y,p,z,xlim,ylim,gridlen=gridlen,span=span) if(missing(ylim)) ylim <- range(y) if(missing(xlim)) xlim <- range(x) image(g, col=terrain.colors(128),xlim=xlim,ylim=ylim,...) contour(g, add=TRUE,...) } ## slice.persp: ## ## perspective plot of the slice or projections -- used when ## pc="p" "slice.persp" <- function(x,y,p,z,theta=-30,phi=20,xlim=NULL, ylim=NULL, gridlen=c(40,40), span=0.05, ...) { g <- slice.interp(x,y,p,z,xlim,ylim,gridlen=gridlen,span=span) if(missing(ylim)) ylim <- range(y) if(missing(xlim)) xlim <- range(x) persp(g, theta=theta, phi=phi, axes=TRUE, box=TRUE, xlim=xlim, ylim=ylim, ...) } ## slice.interp: ## ## interpolate the x, y, z data specified onto a regular 2-d ## grid, perhaps making a slice specified by the p-vector indicating ## which entries of x, y, and z should be used. This is necessary ## in order to plot using persp, contour, image, etc. ## loess is used for interpolation "slice.interp" <- function(x, y, p=NULL, z, xlim=NULL, ylim=NULL, gridlen=c(40,40), span=0.05, ...) { ## check gridlen if(length(gridlen) != 2) stop("length(gridlen) should be 2") # check and/or default the projection parameter p if(is.null(p)) p <- 1:length(x) else p <- as.integer(p) if(any(p <= 0) || any(p > length(x))) stop("invalid p (third arg: value unknown)") # make projection x <- x[p]; y <- y[p]; z <- z[p] if(!is.null(xlim)) { # crop (zoom in) x p <- x>=xlim[1] & x<=xlim[2] x <- x[p]; y <- y[p]; z <- z[p] } if(!is.null(ylim)) { # crop (zoom in) y p <- y>=ylim[1] & y<=ylim[2] x <- x[p]; y <- y[p]; z <- z[p] } # use loess return(interp.loess(x,y,z, duplicate="mean", gridlen=gridlen, span=span, ...)) } ## check.slice: ## ## checks to make sure the slice argument to plot.tgp is of a ## format that make sens for the input dimension and data locations ## provided from the getlocs function "check.slice" <- function(slice, dim, locs) { ## check to make sure the slice requested is valid numfix <- dim-2; if(length(slice$x) != numfix && length(slice$x) == length(slice$z)) { print(locs) stop(paste("must fix", numfix, "variables, each at one of the above locations\n")) } ## check to make sure enough dimensions have been fixed d <- setdiff(seq(1:dim), slice$x) if(length(d) != 2) stop(paste(length(d)-2, "more dimensions need to be fixed\n", sep="")) ## will stop if the slice is not ok, ## otherwise returns the remaining (unfixed) dimensions return(d) } ## getlocs: ## ## get the grid of locations for the data -- these are the locations ## used in the locs argument of check.slice "getlocs" <- function(X) { db <- dim(X); Xsort <- apply(X, 2, sort) unique <- (Xsort[1:(db[1]-1),] != Xsort[2:db[1],]) locs.list <- list() for(i in 1:db[2]) { locs <- c(Xsort[unique[,i],i], Xsort[db[1],i]) count <- rep(0,length(locs)) for(j in 1:length(locs)) { count[j] = sum(Xsort[,i] == locs[j]) } ll.i <- list(locs=locs,count=count) locs.list[[i]] <- ll.i } return(locs.list) } ## interp.loess: ## ## interolate x,y,z onto a regular 2-d grid of size gridlen. ## this function is meant to mimic the interp function in the ## akima library which can be buggy. It luse a loess smoother ## instead, with the span provided "interp.loess" <- function(x, y, z, gridlen = c(40,40), span=0.1, ...) { ## check the gridlen argument if(length(gridlen) == 1) gridlen <- rep(gridlen, 2) if(length(gridlen) != 2) stop("length(gridlen) should be 2") if(length(x) != length(y) && length(y) != length(z)) stop("length of x, y and z must be equal") if(length(x) < 30 && span < 0.5) { warning("with less than 30 points, suggest span >> 0.5 or use akima", immediate. = TRUE) cat(paste("currently trying span =", span, "for", length(x), "points\n")) } xo <- seq(min(x), max(x), length=gridlen[1]) yo <- seq(min(y), max(y), length=gridlen[2]) xyz.loess <- suppressWarnings(loess(z ~ x + y, data.frame(x=x, y=y), span=span, ...)) g <- expand.grid(x=xo, y=yo) g.pred <- predict(xyz.loess, g) return(list(x=xo, y=yo, z=matrix(g.pred, nrow=gridlen))) } tgp/R/plot.tgp.R0000644000175100001440000001422212506600653013161 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; withx even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## plot.tgp: ## ## generic plot method for tgp-class objects -- handles sensitivity and ## multi-resolution plots through other interfaces after some pre-processing. ## Standard tgp 1-d plots are handled directly, and 2-d projections and slices ## are also handled through other interfaces after a small amount of ## pre-processing "plot.tgp" <- function(x, pparts=TRUE, proj=NULL, slice=NULL, map=NULL, as=NULL, center="mean", layout="both", main=NULL, xlab=NULL, ylab=NULL, zlab=NULL, pc="pc", gridlen=c(40,40), span=0.1, legendloc="topright", maineff=TRUE, mrlayout="both", rankmax=20, ...) { ## check for valid layout if(layout != "both" && layout != "surf" && layout != "as" && layout != "sens") stop("layout argument must be \"both\", \"surf\", \"as\", or \"sens\""); ## check if 'as' plots can be made if(x$nn == 0 && (!is.null(as) && (as != "s2" && as != "ks2"))) { if(layout == "both") { cat("cannot make \"as\" plot since x$nn=0, default to layout = \"surf\"\n") layout <- "surf" } else if(layout == "as") stop("cannot make \"as\" plot since x$nn=0\n") } ## sensitivity plots if(layout == "sens"){ if(x$sens$par$ngrid==0){ ## make sure that a sens can be plotted cat("Cannot make sensitivity plots without sens.* matrices.\n") layout = "both" } else { ## plot the sens sens.plot(x, legendloc=legendloc, maineff=maineff, ...) return(invisible()); } } ## plots for multi-resolution tgp if(x$params$corr == "mrexpsep"){ ## the "both" method uses the mr.plot function if(mrlayout == "both"){ mr.plot(x,pparts=pparts, proj=proj, center=center, layout="both", main=main, xlab=xlab, ylab=ylab, zlab=zlab, legendloc=legendloc, gridlen=gridlen, span=span, ...) return(invisible()) ## whereas the "coarse" and "fine" methods use the regular ## tgp plotting methods with some minor changes depending on the res } else if(mrlayout == "coarse") { xTemp <- x; x <- mr.checkrez(x, res=0) if((length(x$Zp.mean)+length(x$ZZ.mean)) < 5) stop("Cannot plot 'coarse' with less than 5 predictive locations.\n") } else { ## same thing for the fine resolution xTemp <- x; x <- mr.checkrez(x, res=1) if((length(x$Zp.mean)+length(x$ZZ.mean)) < 5) stop("Cannot plot 'fine' with less than 5 predictive locations.\n") } } ## standard tgp plotting if(x$d == 1) { # plotting 1d data if(layout=="both") par(mfrow=c(1,2), bty="n") # else par(mfrow=c(1,1), bty="n") # construct/get graph labels if(is.null(xlab)) xlab <- names(x$X)[1] if(is.null(ylab)) ylab <- x$response # plot means and errors if(layout == "both" || layout == "surf") { ## choose mean or median for center center <- tgp.choose.center(x, center) Z.mean <- center$Z; smain <- paste(main, ylab, center$name) X <- center$X[,1] o <- order(X) ## plot the data plot(x$X[,1],x$Z, xlab=xlab, ylab=ylab, main=smain,...) # plot the center (mean) lines(X[o], Z.mean[o], ...) ## and 0.5 and 0.95 quantiles if(center$name == "kriging mean") { Zb.q1 <- Z.mean + 1.96*sqrt(c(x$Zp.ks2, x$ZZ.ks2)) Zb.q2 <- Z.mean - 1.96*sqrt(c(x$Zp.ks2, x$ZZ.ks2)) } else { Zb.q1 <- c(x$Zp.q1, x$ZZ.q1) Zb.q2 <- c(x$Zp.q2, x$ZZ.q2) } ## add the predictive 90% error-bars lines(X[o], Zb.q1[o], col=2, ...) lines(X[o], Zb.q2[o], col=2, ...) # plot parts if(pparts & !is.null(x$parts) ) { tgp.plot.parts.1d(x$parts) } } # adaptive sampling plotting # first, figure out which stats to plot if(layout != "surf") { # && !is.null(as)) { ## collect the error statistics that the user has requested as <- tgp.choose.as(x, as) Z.q <- as$criteria X <- as$X # then plot them o <- order(X[,1]); plot(X[o,1], Z.q[o], type="l", ylab=as$name, xlab=xlab, main=paste(main, as$name), ...) ## plot parts if(pparts & !is.null(x$parts)) { tgp.plot.parts.1d(x$parts) } ## if improv, then add order too if(substr(as$name,1,1) == "I") { ranks <- x$improv[,2] <= rankmax text(X[ranks,1], Z.q[ranks], labels=x$improv[ranks,2], pos=3, ...) } } } else if(x$d >= 2) { # 2-d plotting if(x$d == 2 || is.null(slice)) { # 2-d slice projection plot tgp.plot.proj(x, pparts=pparts, proj=proj, map=map, as=as, center=center, layout=layout, main=main, xlab=xlab, ylab=ylab, zlab=zlab, pc=pc, gridlen=gridlen, span=span, rankmax=rankmax, ...) } else { # 2-d slice plot tgp.plot.slice(x, pparts=pparts, slice=slice, map=map, as=as, center=center, layout=layout, main=main, xlab=xlab, ylab=ylab, zlab=zlab, pc=pc, gridlen=gridlen, span=span, ...) } } else { ## ERROR cat(paste("Sorry: no plot defind for ", x$d, "-d tgp data\n", sep="")) } ## reset the original tgp object for mr.tgp if(x$params$corr == "mrexpsep"){ x <- xTemp } } tgp/R/mean0.range1.R0000644000175100001440000000566012506600653013574 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## mean0.range1: ## ## translate the input columns (X.m) to each (independently) ## have a mean of zero and a range of one -- as used by Chipman ## et al. Also save the necessary mean and range information ## so that the transformation can be undone later "mean0.range1" <- function(X.m) { ## checks and coersion into a matrix if(is.null(X.m)) return(NULL) else if(is.null(dim(X.m))) X <- matrix(X.m, ncol=1) else X <- X.m ## initialize the information necesary for undoing undo <- list() undo$min <- rep(0, ncol(X)) undo$max <- rep(0, ncol(X)) undo$amean <- rep(0, ncol(X)) ## make the transformation in each dimension for(i in 1:ncol(X)) { undo$min[i] <- min(X[,i]) undo$max[i] <- max(X[,i]) X[,i] <- X[,i] / (max(X[,i]) - min(X[,i])) undo$amean[i] <- mean(X[,i]) X[,i] <- X[,i] - mean(X[,i]) } ## convert input vectors back into vectors if(is.null(dim(X.m))) X.m <- as.vector(X) else X.m <- X ## return both the transformed data and the info to undo return(list(X=X,undo=undo)) } ## undo.mean0.range1: ## ## using the info saved by mean0.range1, undo the transformation ## on X -- usually the undo is performed on new data that is curently ## on the scale of the transformed X, but should be reported on the ## scale of the original (unransformed) X "undo.mean0.range1" <- function(X.m, undo, nomean=FALSE, s2=FALSE) { ## checks and coerse into a matrix if(is.null(X.m)) return(NULL) else if(is.null(dim(X.m))) X <- matrix(X.m, ncol=1) else X <- X.m ## undo in each column of X for(i in 1:(dim(X)[2])) { if(!nomean) X[,i] <- X[,i] + undo$amean[i] if(s2) X[,i] <- X[,i]*(undo$max[i] - undo$min[i])^2 else X[,i] <- X[,i]*(undo$max[i] - undo$min[i]) } ## convert input vectors back into vectors if(is.null(dim(X.m))) X.m <- as.vector(X) else X.m <- X ## return the undone transformation return(X.m) } tgp/R/mapT.R0000644000175100001440000000732312506600653012317 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## mapT: ## ## plot the Maximum a Posteriori tree in a tgp-class object, ## or add it to an existing plot -- The proj argument allows ## only some dimensions to be plotted "mapT" <- function(out, proj=NULL, slice=NULL, add=FALSE, lwd=2, ...) { ## simple for 1-d data, projection plot if(out$d == 1) { proj <- 1; slice <- NULL } ## otherwise, many options for >= 2-d data if(out$d > 2 && !is.null(slice)) { # slice plot ## will call stop() if something is wrong with the slice d <- check.slice(slice, out$d, getlocs(out$X)) ## plot the parts tgp.plot.parts.2d(out$parts, d, slice); } else { # projection plot ## will call stop() if something is wrong with the proj proj <- check.proj(proj) ## 1-d projection if(length(proj) == 1) { if(add == FALSE) plot(out$X[,proj], out$Z, ...) tgp.plot.parts.1d(out$parts[,proj], lwd=lwd) } else { ## 2-d projection if(add == FALSE) plot(out$X[,proj], ...) tgp.plot.parts.2d(out$parts[,proj], lwd=lwd) } } } ## tgp.plot.parts.1d: ## ## plot the partitings of 1-d tgp$parts output -- used ## by mapT and plot.tgp "tgp.plot.parts.1d" <- function(parts, lwd=2) { j <- 3 if(is.null(dim(parts))) dp <- length(parts) else { dp <- nrow(parts) parts <- parts[,1] } is <- seq(2, dp, by=4) m <- max(parts[is]) for(i in is) { if(parts[i] == m) next; abline(v=parts[i], col=j, lty=j, lwd=lwd); j <- j + 1 } } ## tgp.plot.parts.2d: ## ## plot the partitings of 2-d tgp$parts output -- used ## by mapT and plot.tgp via tgp.plot.slide and tgp.plot.proj ## the what argument specifies the slice, and trans can make ## rotations "tgp.plot.parts.2d" <- function(parts, dx=c(1,2), what=NULL, trans=matrix(c(1,0,0,1), nrow=2), col=NULL, lwd=3) { if(length(what) > 0) { indices <- c() for(i in seq(1,nrow(parts),4)) { opl <- i+2; opr <- i+3; if(parts[opl,what$x] == 104 && parts[opr,what$x] == 102 && what$z >= parts[i,what$x] && what$z <= parts[i+1,what$x]) { indices <- c(i, indices) } else if(parts[opl,what$x] == 105 && parts[opr,what$x] == 102 && what$z > parts[i,what$x] && what$z <= parts[i+1,what$x]) { indices <- c(i, indices) } } } else { indices <- seq(1,dim(parts)[1],4); } j <- 1 for(i in indices) { a <- parts[i,dx[1]]; b <- parts[i+1,dx[1]]; c <- parts[i,dx[2]]; d <- parts[i+1,dx[2]]; x <- c(a, b, b, a, a); y <- c(c, c, d, d, c); xy <- as.matrix(cbind(x,y)) %*% trans if(is.null(col)) { lines(xy, col=j, lty=j, lwd=lwd); } else { lines(xy, col=col, lty=1, lwd=lwd); } j <- j+1 } } tgp/R/sens.R0000644000175100001440000001761012506600653012366 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## check.sens: ## ## function to check the sens.p argument provided as input ## to the sens or b* functions, depending on the imput dimension ## d "check.sens" <- function(sens.p, d) { ## sanity checks if(d==1) stop("You don't need sensitivity analysis for a single variable.") if(length(sens.p)!=(4*d+3)) stop("bad sens length.") ## nn.lhs is 'nm' in the .cc code. nn.lhs <- sens.p[1] nn <-nn.lhs*(d+2) ## The XX matrix is of the correct size for within the .cc code. ## This may or may not be necessary. ## The first 3 rows contain the LHS parameters to begin with. XX <- matrix(rep(0,nn*d),nrow=nn, ncol=d) XX[1:2,] <- matrix(sens.p[2:(2*d+1)], nrow=2) ## this is rect ## check shape for validity, and copy to XX shape <- XX[3,] <- sens.p[(2*d+2):(3*d+1)] if(length(shape) != d || !all(shape >= 0)) { print(shape) stop(paste("shape should be a non-negative ", d, "-vector", sep="")) } ## check mode for validity, and copy to XX mode <- XX[4,] <- sens.p[(3*d+2):(4*d+1)] if(length(mode) != d) { print(mode) stop(paste("mode should be a ", d, "-vector", sep="")) } ## check each coordinate of the mode argument for(i in 1:d){ if(mode[i] < XX[1,i] || mode[i] > XX[2,i]){ stop(paste("mode ", i, " should be within bounds [", XX[1,i],", ", XX[2,i],"]", sep="")) } } ## Create the Main Effect Grid ngrid <- sens.p[4*d+2] span <- sens.p[4*d+3] if((span > 1) || (span < 0)) stop("Bad smoothing span -- must be in (0,1).") MEgrid <- matrix(ncol=d, nrow=ngrid) for(i in 1:d){ MEgrid[,i] <- seq(XX[1,i], XX[2,i], length=ngrid) } ## return list(nn=nn, nn.lhs=nn.lhs, ngrid=ngrid, span=span, XX=XX, MEgrid=MEgrid) } ## sens: ## ## code for performaing a sensitivity analysis using the specified ## model and nn.lhs LHS re-sampled predictive grid for each of the T ## rounds under a beta prior specified by shape and mode "sens" <- function(X, Z, nn.lhs, model=btgp, ngrid=100, span=0.3, BTE=c(3000,8000,10), rect=NULL, shape=NULL, mode=NULL, ...) { ## the format for rect is the same as rect in LHS (ncol=2, nrow=d). Xnames <- names(X) XZ <- check.matrix(X, Z) X <- data.frame(XZ$X); names(X) <- Xnames; Z <- XZ$Z; ## process the rect, shape and mode arguments d <- ncol(as.matrix(X)) if(is.null(rect)) rect <- t(apply(as.matrix(X),2,range)) else if(nrow(rect) != d || ncol(rect) != 2) stop(paste("rect should be a ", d, "x2-vector", sep="")) ## check the shape LHS parameter vector if(is.null(shape)) shape <- rep(1,d) else if(length(shape) != d || !all(shape >= 0)) { print(shape) stop(paste("shape should be a non-negative ", d, "-vector", sep="")) } ## check the mode LHS parameter vector if(is.null(mode)) mode <- apply(as.matrix(X),2,mean) else if(length(mode) != d) { print(mode) stop(paste("mode should be a ", d, "-vector", sep="")) } ## check the LHS rectangle in the categorical variable context for(i in 1:d){ if(shape[i]==0){ if(rect[i,1] != 0 || rect[i,2] != 1){ print(rect[i,]) stop(paste("rect must be [0,1] for categorical variables (i=", i,", shape[i]=",shape[i],").", sep="")) } } } ## build the sens parameter sens.p <- c(nn.lhs,t(rect),shape,mode,ngrid,span) ## run the b* function (model) with the sens parameter, or otherwise ## just return the parameter vector and do nothing if(!is.null(model)){ return(model(X,Z,sens.p=sens.p,BTE=BTE,...)) } else{ return(sens.p) } } ## sens.plot: ## ## function for plotting the results of a sensitivity analysis -- ## intended to be used instead of plot.tgp. The type of plot retulting ## depends on whether main effects are to be plotted or not "sens.plot" <- function(s, maineff=TRUE, legendloc="topright", ...) { ## colors used for each effect (col of X) cols = rainbow(s$d) ## extract some useful things from the tgp-object 's' nom <- names(s$X) sens <- s$sens Zmean <- sens$ZZ.mean Zq1 <- sens$ZZ.q1 Zq2 <- sens$ZZ.q2 ## if maineff is logical then the S & T stats will get plotted if(is.logical(maineff)){ ## put X on a mean 0 range 1 scale X <- mean0.range1(sens$Xgrid)$X ## plot the main effects or not? if(maineff){ par(mfrow=c(1,3), ...) X <- mean0.range1(sens$Xgrid)$X ## plot each of the main effects in the same window -- start with the 1st plot(X[,1], Zmean[,1], main="Main Effects", ylab="response", xlab="scaled input", col=cols[1], typ="l", lwd=2, ylim=range(as.vector(Zmean)), ...) ## and then proceed with the rest for(i in 2:s$d){ if(nlevels(factor(Zmean[,i]))==3){ ## discrete response ... Taddy is this right? segments(-.5, Zmean[1,i], 0, Zmean[1,i], lwd=2, col=cols[i]) segments(0, Zmean[nrow(Zmean),i], .5, Zmean[nrow(Zmean),i], lwd=2, col=cols[i]) } else{ lines(X[,i], Zmean[,i], lwd=2, col=cols[i]) } ## continuous response } ## add a legend to the plot so we can see which colours are for which effects legend(x=legendloc, legend = names(s$X), col=cols, fill=cols) } else{ par(mfrow=c(1,2), ...) } ## plot the S and T statistics ## S stats first boxplot(data.frame(sens$S), names=names(s$X), main="1st order Sensitivity Indices", xlab="input variables", ylab="", ...) ## then T stats T0 <- sens$T T0[sens$T<0] <- 0 boxplot(data.frame(T0), names=names(s$X), main="Total Effect Sensitivity Indices", xlab="input variables", ylab="", ...) } else { ## only make a main effects plots ## set up the plot X <- sens$Xgrid ME <- c(maineff) pdim <- dim(as.matrix(maineff)) par(mfrow=pdim, ...) ## for each Main Effect for(i in ME){ ## discrete response ... Taddy is this right? if(nlevels(factor(Zmean[,i]))==3){ plot(c(0,1) ,c(Zmean[1,i],Zmean[nrow(Zmean),i]), main="", ylab="response", xlab=nom[i], col=cols[i], pch=20, cex=2, xlim=c(-.5,1.5), xaxt="n", ylim=c(min(Zq1[,i]), max(Zq2[,i]))) axis(1, at=c(0,1)) segments(-.1, Zq1[1,i], .1, Zq1[1,i], lwd=2, col=cols[i], lty=2) segments(.9, Zq1[nrow(Zq1),i], 1.1, Zq1[nrow(Zq1),i], lwd=2, col=cols[i], lty=2) segments(-.1, Zq2[1,i], .1, Zq2[1,i], lwd=2, col=cols[i], lty=2) segments(.9, Zq2[nrow(Zq2),i], 1.1, Zq2[nrow(Zq2),i], lwd=2, col=cols[i], lty=2) } else{ ## continuous response plot(X[,i], Zmean[,i], main="", ylab="response", xlab=nom[i], col=cols[i], typ="l", lwd=2, ylim=c(min(Zq1[,i]), max(Zq2[,i])), ...) lines(X[,i], Zq1[,i], col=cols[i], lty=2) lines(X[,i], Zq2[,i], col=cols[i], lty=2) } } ## add a title to the plot mtext(text="Main effects: mean and 90 percent interval", line=-2, outer=TRUE, font=2) } } tgp/R/tgp.read.traces.R0000644000175100001440000001640712506600653014405 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.read.traces: ## ## read the traces contained in the files written by the tgp C-side, ## process them as appropriate, and then delete the trace files ## returning a tgptraces-class object "tgp.read.traces" <- function(n, nn, d, corr, verb, rmfiles=TRUE) { trace <- list() if(verb >= 1) cat("\nGathering traces\n") ## read the parameter traces for each XX location trace$XX <- tgp.read.XX.traces(nn, d, corr, verb, rmfiles) ## read trace of hierarchical parameters if(file.exists(paste("./", "trace_hier_1.out", sep=""))) { trace$hier <- read.table("trace_hier_1.out", header=TRUE) if(rmfiles) unlink("trace_hier_1.out") if(verb >= 1) cat(" hier-params done\n") } ## read trace of linear area calulations if(file.exists(paste("./", "trace_linarea_1.out", sep=""))) { trace$linarea <- read.table("trace_linarea_1.out", header=TRUE) if(rmfiles) unlink("trace_linarea_1.out") if(verb >= 1) cat(" linarea done\n") } ## read full trace of partitions if(file.exists(paste("./", "trace_parts_1.out", sep=""))) { trace$parts <- read.table("trace_parts_1.out") if(rmfiles) unlink("trace_parts_1.out") if(verb >= 1) cat(" parts done\n") } ## read the posteriors and weights as a function of height if(file.exists(paste("./", "trace_post_1.out", sep=""))) { trace$post <- read.table("trace_post_1.out", header=TRUE) if(rmfiles) unlink("trace_post_1.out") if(verb >= 1) cat(" posts done\n") } ## read the weights adjusted for ess if(file.exists(paste("./", "trace_wlambda_1.out", sep=""))) { trace$post$wlambda <- scan("trace_wlambda_1.out", quiet=TRUE) if(rmfiles) unlink("trace_wlambda_1.out") if(verb >= 1) cat(" lambda done\n") } ## predictions at data (X) locations if(file.exists(paste("./", "trace_Zp_1.out", sep=""))) { trace$preds$Zp <- read.table("trace_Zp_1.out", header=FALSE) names(trace$preds$Zp) <- paste("X", 1:n, sep="") if(rmfiles) unlink("trace_Zp_1.out") if(verb >= 1) cat(" Zp done\n") } ## kriging means at data (X) locations if(file.exists(paste("./", "trace_Zpkm_1.out", sep=""))) { trace$preds$Zp.km <- read.table("trace_Zpkm_1.out", header=FALSE) names(trace$preds$Zp.km) <- paste("X", 1:n, sep="") if(rmfiles) unlink("trace_Zpkm_1.out") if(verb >= 1) cat(" Zp.km done\n") } ## kriging vars at data (X) locations if(file.exists(paste("./", "trace_Zpks2_1.out", sep=""))) { trace$preds$Zp.ks2 <- read.table("trace_Zpks2_1.out", header=FALSE) names(trace$preds$Zp.ks2) <- paste("XX", 1:n, sep="") if(rmfiles) unlink("trace_Zpks2_1.out") if(verb >= 1) cat(" Zp.ks2 done\n") } ## predictions at XX locations if(file.exists(paste("./", "trace_ZZ_1.out", sep="")) && nn>0) { trace$preds$ZZ <- read.table("trace_ZZ_1.out", header=FALSE) names(trace$preds$ZZ) <- paste("XX", 1:nn, sep="") if(rmfiles) unlink("trace_ZZ_1.out") if(verb >= 1) cat(" ZZ done\n") } ## kriging means at XX locations if(file.exists(paste("./", "trace_ZZkm_1.out", sep="")) && nn>0) { trace$preds$ZZ.km <- read.table("trace_ZZkm_1.out", header=FALSE) names(trace$preds$ZZ.km) <- paste("XX", 1:nn, sep="") if(rmfiles) unlink("trace_ZZkm_1.out") if(verb >= 1) cat(" ZZ.km done\n") } ## kriging vars at XX locations if(file.exists(paste("./", "trace_ZZks2_1.out", sep="")) && nn>0) { trace$preds$ZZ.ks2 <- read.table("trace_ZZks2_1.out", header=FALSE) names(trace$preds$ZZ.ks2) <- paste("XX", 1:nn, sep="") if(rmfiles) unlink("trace_ZZks2_1.out") if(verb >= 1) cat(" ZZ.ks2 done\n") } ## Ds2x samples at the XX locations if(file.exists(paste("./", "trace_Ds2x_1.out", sep="")) && nn>0) { trace$preds$Ds2x <- read.table("trace_Ds2x_1.out", header=FALSE) names(trace$preds$Ds2x) <- paste("XX", 1:nn, sep="") if(rmfiles) unlink("trace_Ds2x_1.out") if(verb >= 1) cat(" Ds2x done\n") } ## improv samples at the XX locations if(file.exists(paste("./", "trace_improv_1.out", sep="")) && nn>0) { trace$preds$improv <- read.table("trace_improv_1.out", header=FALSE) names(trace$preds$improv) <- paste("XX", 1:nn, sep="") if(rmfiles) unlink("trace_improv_1.out") if(verb >= 1) cat(" improv done\n") } ## assign class tgptraces to the returned object class(trace) <- "tgptraces" return(trace) } ## tgp.read.XX.traces ## ## particular function for reading the trace_XX_1.out file ## which contains traces of all GP (Base Model) parameters ## according to each XX location -- and then removes the file. "tgp.read.XX.traces" <- function(nn, dim, corr, verb=1, rmfiles=TRUE) { ## do nothing if there is no XX trace file file <- paste("./", "trace_XX_1.out", sep="") if(! file.exists(file)) return(NULL) ## calculate and count the names to the traces nam <- names(read.table(file, nrows=0, header=TRUE)) count <- length(nam) nam <- nam[2:length(nam)] ## read the rest of the trace file tr <- t(matrix(scan(file, quiet=TRUE, skip=1), nrow=count)) if(rmfiles) unlink(file) if(nn > 0) { traces <- list() for(i in 1:nn) { ## make tr into a matrix if it has only one entry (vector) if(is.null(dim(tr))) tr <- matrix(tr, nrow=1) ## find those rows which correspond to XX[i,] o <- tr[,1] == i ## print(c(sum(o), nrow(tr))) ## progress meter, overstimate % done, because things speed up if(verb >= 1) { if(i==nn) cat(" XX 100% done \r") else cat(paste(" XX ", round(100*log2(sum(o))/log2(nrow(tr))), "% done \r", sep="")) } ## save the ones for X[i,] traces[[i]] <- data.frame(tr[o,2:count]) ## remove the XX[i,] ones from t if(i!=nn) tr <- tr[!o,] ## reorder the trace file, and get rid of first column ## they could be out of order if using pthreads ## indx <- c(traces[[i+1]][,1] + 1) ## traces[[i+1]] <- traces[[i+1]][indx,2:(ncol-1)] ## assign the names if(sum(o) == 1) traces[[i]] <- t(traces[[i]]) names(traces[[i]]) <- nam } if(verb >= 1) cat("\n") } else { if(verb >= 1) { cat(paste(" no XX ", "traces\n", sep="")) } traces <- NULL; } return(traces) } tgp/R/friedman.1.data.R0000644000175100001440000000553112506600653014251 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## friedman.1.data: ## ## generate a random sample of size n from Friedman's 10-d ## first data set used to validate the MARS method -- the ## response depends linearly and non-linearly on the first ## five inputs only "friedman.1.data" <- function(n=100) { X <- matrix(runif(n*10), nrow=n) Ytrue <- 10*sin(pi*X[,1]*X[,2]) + 20*(X[,3]-0.5)^2 + 10*X[,4] + 5*X[,5] Y <- Ytrue + rnorm(n, 0, 1) return(data.frame(X,Y,Ytrue)) } ## fried.bool: ## ## generate a random sample of size n from a boolean segmented ## version of Friedman's 10-d first data set used to validate the ## MARS method -- the response depends linearly and non-linearly ## on the first five inputs only, but now which part of the function ## is on depends on an indicator 1:4 "fried.bool" <- function(n=100) { ## a function that is a sum of parts f1 <- function(X) { 10*sin(pi*X[,1]*X[,2]) } f2 <- function(X) { 20*(X[,3]-0.5)^2 } f3 <- function(X) { 10*X[,4] + 5*X[,5] } f4 <- function(X) { 10*sin(pi*X[,5]*X[,4]) + 20*(X[,3]-0.5)^2 + 10*X[,2] + 5*X[,1] } fs <- list(f1, f2, f3, f4) ## boolean codings of 1:4 BoolI <- rbind(c(0,0,0), c(0,0,1), c(0,1,0), c(1,0,0)) ## sample n indicators in 1:4 and record their boolean coding I <- sample(c(1,2,3,4), n, replace=TRUE) Imat <-matrix(BoolI[I,], nrow=n) ## n random inputs U(0,1) in 10 dimensions X <- matrix(runif(n*10), nrow=n) ## allocate space for the true response Ytrue <- rep(0, n) ## calculate responses for each of the four groups for(i in 1:4) { indx <- I == i if(sum(indx) == 0) next; indx <- (1:n)[indx] XX <- matrix(X[indx,], ncol=10) Ytrue[indx] <- fs[[i]](XX) } ## add some noise Y <- Ytrue + rnorm(n, 0, 1) ## return the inputs, bookean coding and outputs return(data.frame(X=X, I=Imat, Y, Ytrue)) } tgp/R/exp2d.R0000644000175100001440000001112712506600653012435 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## for R CMD CHECK if(getRversion() >= "2.15.1") utils::globalVariables("exp2d", package="tgp") ## exp2d.Z: ## ## sample from he 2-d exponential data at locations X with ## normal mean-zero random deviates with sd specified "exp2d.Z" <- function(X, sd=0.001) { if(is.null(X)) return(NULL); if(is.null(ncol(X))) X <- matrix(X, ncol=length(X)) ## check the number of columns if(ncol(X) != 2) stop(paste("X should be a matrix (or data frame) with 2 columns, you have", ncol(X))) ## calculate the Z data Ztrue <- X[,1] * exp(- X[,1]^2 - X[,2]^2) ## add randomness for random sample Z <- Ztrue + rnorm(nrow(X),mean=0,sd=sd) ## return a data frame object return(data.frame(Z=Z,Ztrue=Ztrue)) } ## exp2d.rand: ## ## samplig from the 2-d exponential data using the data file ## or a d-optimal (and/or) LH design and random evaluations from ## the exp2d.Z function. n1 samples are taken from the interesting ## region, and n2 from outside. "exp2d.rand" <- function(n1=50, n2=30, lh=NULL, dopt=1) { ## check the sanity of the inputs if(n1 < 0 || n2 < 0) { stop("n1 and n2 must be >= 0") } ## use Latin Hybpercube sampling if(!is.null(lh)) { ## start with the interesting region Xcand <- lhs(n1*dopt, rbind(c(-2,2), c(-2,2))) if(dopt > 2) { X <- dopt.gp(n1, NULL, Xcand)$XX } else { X <- Xcand } ## check if n2 is a 1-vector or a 3-vector if(length(n2) == 1) n2 <- rep(ceiling(n2/3), 3) else if(length(n2 != 3)) stop(paste("length of n2 should be 1 or 3, you have", length(n2))) ## check validity of dopt if(length(dopt) != 1 || dopt < 1) stop(paste("dopt should be a scalar >= 1, you have", dopt)) ## do the remaining three (uninteresting) quadtants Xcand <- lhs(n2[1]*dopt, rbind(c(2,6), c(-2,2))) Xcand <- rbind(Xcand, lhs(n2[2]*dopt, rbind(c(2,6), c(2,6)))) Xcand <- rbind(Xcand, lhs(n2[3]*dopt, rbind(c(-2,2), c(2,6)))) ## see if we need d-optimal subsample if(dopt > 2) { X <- rbind(X, dopt.gp(sum(n2), NULL, Xcand)$XX) } else { X <- rbind(X, Xcand) } ## calculate the Z data Zdata <- exp2d.Z(X); Ztrue <- Zdata$Ztrue; Z <- Zdata$Z ## now get the size of the XX vector (for each quadtant) if(length(lh) == 1) lh <- rep(ceiling(lh/4), 4) else if(length(lh) != 4) stop(paste("length of lh should be 0 (for grid), 1 or 4, you have", length(lh))) ## fill the XX vector XX <- lhs(lh[1]*dopt, rbind(c(-2,2), c(-2,2))) XX <- rbind(XX, lhs(lh[2]*dopt, rbind(c(2,6), c(-2,2)))) XX <- rbind(XX, lhs(lh[3]*dopt, rbind(c(2,6), c(2,6)))) XX <- rbind(XX, lhs(lh[4]*dopt, rbind(c(-2,2), c(2,6)))) ## see if we need d-optimal subsample if(length(X) > 0 && dopt > 2) { XX <- dopt.gp(sum(lh), X, XX)$XX } ## calculate the ZZ data ZZdata <- exp2d.Z(XX); ZZtrue <- ZZdata$Ztrue; ZZ <- Zdata$Z } else { ## make sure we have enough data to fulfill the request if(n1 + n2 >= 441) { stop("n1 + n2 must be <= 441") } ## dopt = TRUE doesn't make sense here if(dopt != 1) { warning("argument dopt != 1 only makes sens when !is.null(lh)") } ## load the data data(exp2d, envir=environment()); n <- dim(exp2d)[1] ## get the X columns si <- (1:n)[1==apply(exp2d[,1:2] <= 2, 1, prod)] s <- c(sample(si, size=n1, replace=FALSE), sample(setdiff(1:n, si), n2, replace=FALSE)) X <- as.matrix(exp2d[s,1:2]); ## get the XX predictive columns ss <- setdiff(1:n, s) XX <- exp2d[ss, 1:2]; ## read the Z response columns Z <- as.vector(exp2d[s,3]); Ztrue <- as.vector(exp2d[s,4]); ## read the ZZ response columns ZZ <- as.vector(exp2d[ss,3]); ZZtrue <- as.vector(exp2d[ss,4]); } return(list(X=X, Z=Z, Ztrue=Ztrue, XX=XX, ZZ=ZZ, ZZtrue=ZZtrue)) } tgp/R/mrtgp.R0000644000175100001440000001401412506600653012542 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## mr.plot: ## ## plotting function for multiresolution tgp-class objects ## (i.e., those with corr=="mrexpsep") -- called by plot.tgp "mr.plot" <- function(x, pparts=TRUE, proj=NULL, center="mean", layout="both", main=NULL, xlab=NULL, ylab=NULL, zlab=NULL, legendloc="topright", gridlen=c(40,40), span=0.1, ...) { ## 1-d plot of 1-d data described by two columns (resolutions) if( x$d==2 ){ ## create plot window par(mfrow=c(1,1)) ## construct axis x&y labels if(is.null(xlab)){xlab <- names(x$X)[2]} if(is.null(ylab)){ylab <- x$response} ## collect the input and predictive data and pred outputs center <- tgp.choose.center(x, center) o <- order(center$X[,2]) X <- center$X[o,] Z <- center$Z[o] smain <- paste(main, ylab, center$name) ## collect quantiles Z.q1 <- c(x$Zp.q1, x$ZZ.q1)[o] Z.q2 <- c(x$Zp.q2, x$ZZ.q2)[o] ## plot the coarse and fine input data plot(x$X[x$X[,1]==0,2],x$Z[x$X[,1]==0], ylim=range(c(Z,x$Z)), xlab=xlab, ylab=ylab, main=smain, col=4) lines(x$X[x$X[,1]==1,2],x$Z[x$X[,1]==1], type="p", pch=20, col=2) ## add a legend if(! is.null(legendloc)) legend(legendloc, lty=c(1,2,1,2), col=c("blue", "blue", "red", "red"), c(paste("coarse", center$name), "coarse 90% CI", paste("fine", center$name), "fine 90% CI")) ## extract the coarse and fine resolutions f<-X[,1]==1 c<-X[,1]==0 ## add the coarse and fine mean and quantiles lines(X[c,2], Z[c], col=4) lines(X[f,2], Z[f], col=2) lines(X[f,2], Z.q1[f], col=2, lty=3) lines(X[f,2], Z.q2[f], col=2, lty=3) lines(X[c,2], Z.q1[c], col=4, lty=3) lines(X[c,2], Z.q2[c], col=4, lty=3) if(pparts) tgp.plot.parts.1d(x$parts[,2]) } else { ## make a projection for data is >= 2-d ## create plot window par(mfrow=c(1,2)) if(is.null(proj)) proj <- c(1,2) ## create axis lables -- augment proj argument by one column proj <- proj+1 if(is.null(xlab)){xlab <- names(x$X)[proj[1]]} if(is.null(ylab)){ylab <- names(x$X)[proj[2]]} ## collect the input and predictive data and pred outputs ## this plot only plots the mean or median, no errors center <- tgp.choose.center(x, center) X <- center$X; Z <- center$Z ## separate X and Z into coarse and fine c<-X[,1]==0; f<-X[,1]==1 Xc <- as.data.frame(X[c,proj]) Xf <- as.data.frame(X[f,proj]) Zc <- Z[c]; Zf <- Z[f] ## initialize the projection vectors p* nXc <- nrow(Xc); pc <- seq(1,nXc) nXf <- nrow(Xf); pf <- seq(1,nXf) dX <- nrow(X) ## plot the coarse predictive (mean or median) surface smain <- paste(main, x$response, "coarse", center$name) slice.image(Xc[,1], Xc[,2], p=pc, z=Zc, xlab=xlab, ylab=ylab, main=smain, gridlen=gridlen,span=span, xlim=range(X[,proj[1]]), ylim=range(X[,proj[2]]), ...) ## add inputs and predictive locations points(x$X[x$X[,1]==0,proj], pch=20, ...) points(x$XX[x$XX[,1]==0,proj], pch=21, ...) # plot parts if(pparts & !is.null(x$parts)) { tgp.plot.parts.2d(x$parts, dx=proj)} ## plot the fine predictive (mean or median) surface smain <- paste(main, x$response, "fine", center$name) slice.image(Xf[,1], Xf[,2], p=pf, z=Zf, xlab=xlab, ylab=ylab, main=smain, gridlen=gridlen, span=span, xlim=range(X[,proj[1]]), ylim=range(X[,proj[2]]), ...) ## add inputs and predictive locations points(x$X[x$X[,1]==1,proj], pch=20, ...) points(x$XX[x$XX[,1]==1,proj],pch=21, ...) # plot parts if(pparts & !is.null(x$parts)) { tgp.plot.parts.2d(x$parts, dx=proj)} } } ## mr.checkrez: ## ## used for extreacting the predictive surface information for ## one of the two resolutions so that the surface for that ## resolution can be plotted using the regualr tgp plotting ## machinery in plot.tgp "mr.checkrez" <- function(b, res) { ## select input data at the desired resolution b$d <- b$d-1 rdata <- b$X[,1]==res b$n <- sum(rdata) cnames=names(b$X)[-1] b$X <- as.data.frame(b$X[rdata,-1]) colnames(b$X) <- cnames b$Z <- b$Z[rdata] ## predictive data at input locations for the desired resolution b$Zp.mean <- b$Zp.mean[rdata] b$Zp.km <- b$Zp.km[rdata] b$Zp.q <- b$Zp.q[rdata] b$Zp.s2 <- b$Zp.s2[rdata] b$Zp.ks2 <- b$Zp.ks2[rdata] b$Zp.q1 <- b$Zp.q1[rdata] b$Zp.q2<- b$Zp.q2[rdata] b$Zp.med <- b$Zp.med[rdata] ## predictive data at the predictive locations for the desired resolution rpred <- b$XX[,1]==res b$nn <- sum(rpred) b$XX <- as.data.frame(b$XX[rpred,-1]) colnames(b$XX) <- cnames b$ZZ <- b$ZZ[rpred] b$ZZ.mean <- b$ZZ.mean[rpred] b$ZZ.km <- b$ZZ.km[rpred] b$ZZ.q <- b$ZZ.q[rpred] b$ZZ.s2 <- b$ZZ.s2[rpred] b$ZZ.ks2 <- b$ZZ.ks2[rpred] b$ZZ.q1 <- b$ZZ.q1[rpred] b$ZZ.q2<- b$ZZ.q2[rpred] b$ZZ.med <- b$ZZ.med[rpred] b$improv <- b$improv[rpred,] b$parts <- b$parts[,-1] return(b) } tgp/R/tgp.R0000644000175100001440000002154412506600653012211 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp: ## ## the master tgp R function which checks for valid inputs and ## calls the C-side via .C on those inputs -- and then calls the ## post-processing code accordingly "tgp" <- function(X, Z, XX=NULL, BTE=c(2000,7000,2), R=1, m0r1=FALSE, linburn=FALSE, params=NULL, itemps=NULL, pred.n=TRUE, krige=TRUE, zcov=FALSE, Ds2x=FALSE, improv=TRUE, sens.p=NULL, trace=FALSE, verb=1, rmfiles=TRUE) { ## (quitely) double-check that tgp is clean before-hand tgp.cleanup(message="NOTICE", verb=verb, rmfiles=TRUE); ## what to do if fatally interrupted? on.exit(tgp.cleanup(verb=verb, rmfiles=rmfiles)) ## check for two unsupported combinations of modeling options if(params$corr == "mrexpsep" && linburn) stop("Sorry, the linear burn-in is not available for corr=\"mrexpsep\"") if(params$corr == "mrexpsep" && !is.null(sens.p)) stop("Sorry, sensitivity analysis is not available for corr=\"mrexpsep\"") ## get names Xnames <- names(X) response <- names(Z) ## check X and Z XZ <- check.matrix(X, Z) X <- XZ$X; Z <- XZ$Z n <- nrow(X); d <- ncol(X) if(is.null(n)) stop("nrow(X) is NULL") ## check XX XX <- check.matrix(XX)$X if(is.null(XX)) { nn <- 0; XX <- matrix(0); nnprime <- 0 } else { nn <- nrow(XX); nnprime <- nn if(ncol(XX) != d) stop("mismatched column dimension of X and XX"); } ## check that trace is true or false) if(length(trace) != 1 || !is.logical(trace)) stop("trace argument should be TRUE or FALSE") else if(trace) { if(3*(10+d)*(BTE[2]-BTE[1])*R*(nn+1)/BTE[3] > 1e+7) warning(paste("for memory/storage reasons, ", "trace not recommended when\n", "\t 3*(10+d)*(BTE[2]-BTE[1])*R*(nn+1)/BTE[3]=", 3*(10+d)*(BTE[2]-BTE[1])*R*(nn+1)/BTE[3], " > 1e+7.\n", "\t Try reducing nrow(XX)", sep=""), immediate.=TRUE) } ## check that pred.n, krige, and Ds2x is true or false if(length(pred.n) != 1 || !is.logical(pred.n)) stop("pred.n should be TRUE or FALSE") if(length(krige) != 1 || !is.logical(krige)) stop("krige should be TRUE or FALSE") if(length(zcov) != 1 || !is.logical(zcov)) stop("zcov should be TRUE or FALSE") if(length(Ds2x) != 1 || !is.logical(Ds2x)) stop("Ds2x should be TRUE or FALSE") ## check the form of the improv-power argument if(length(improv) == 2) { numirank <- improv[2]; improv <- improv[1] } else { numirank <- NULL } if(length(improv) != 1 || !(is.logical(improv) || is.numeric(improv)) || (is.numeric(improv) && improv <= 0)) stop(paste("improv [", improv, "] should be TRUE, FALSE, or a positive integer (power)", sep="")) g <- as.numeric(improv) ## check numirank, which is improv[2] in input if(is.null(numirank) && improv) numirank <- nn ## max(min(10, nn), 0.1*nn) else if(!is.null(numirank) && numirank > nn) stop("improv[2] must be <= nrow(XX)") else if(is.null(numirank)) numirank <- 0 ## check for inconsistent XX and Ds2x/improv if(nn == 0 && (Ds2x || improv)) warning("need to specify XX locations for Ds2x and improv") ## check the sanity of input arguments if(nn > 0 && sum(dim(XX)) > 0 && ncol(XX) != d) stop("XX has bad dimensions") if(length(Z) != n) stop("Z does not have length == nrow(Z)") if(BTE[1] < 0 || BTE[2] <= 0 || BTE[1] > BTE[2]) stop("bad B and T: must have 0<=B<=T") if(BTE[3] <= 0 || ((BTE[2]-BTE[1] != 0) && (BTE[2]-BTE[1] < BTE[3]))) stop("bad E arg: if T-B>0, then must have T-B>=E") if((BTE[2] - BTE[1]) %% BTE[3] != 0) stop("E must divide T-B") if(R < 0) stop("R must be positive") ## deal with params if(is.null(params)) params <- tgp.default.params(d) ## check if X is of full rank if(params$meanfn == "linear" && class(try(solve(t(X[,1:params$tree[5]]) %*% X[,1:params$tree[5]]), silent=TRUE)) == "try-error") { stop("X[,1:", params$tree[5], "]-matrix is not of full rank", sep="") } ## convert params into a double-vector for passing to C dparams <- tgp.check.params(params, d); if(is.null(dparams)) stop("Bad Parameter List") ## check starting importance-tempering inv-temp itemps <- check.itemps(itemps, params) ## might scale Z to mean of 0 range of 1 if(m0r1) { Zm0r1 <- mean0.range1(Z); Z <- Zm0r1$X } else Zm0r1 <- NULL ## if performining a sensitivity analysis, set up XX ## if(!is.null(sens.p)) { if(nn > 0) warning("XX generated online in sensitivity analyses") nnprime <- 0 sens.par <- check.sens(sens.p, d) nn <- sens.par$nn; nn.lhs <- sens.par$nn.lhs; XX <- sens.par$XX ngrid <- sens.par$ngrid; span <- sens.par$span MEgrid <- as.double(sens.par$MEgrid) if(verb >= 2) cat(paste("Predict at", nn, "LHS XX locs for sensitivity analysis\n")) } else{ nn.lhs <- ngrid <- 0; MEgrid <- span <- double(0) } ## construct the set of candidate split locations Xsplit <- X if(is.null(sens.p) && nn > 0) Xsplit <- rbind(Xsplit, XX) ## for sens S = R*(BTE[2]-BTE[1])/BTE[3] # RNG seed state <- sample(seq(0,999), 3) ## run the C code ll <- .C("tgp", ## begin inputs state = as.integer(state), X = as.double(t(X)), n = as.integer(n), d = as.integer(d), Z = as.double(Z), XX = as.double(t(XX)), nn = as.integer(nn), Xsplit = as.double(t(Xsplit)), nsplit = as.integer(nrow(Xsplit)), trace = as.integer(trace), BTE = as.integer(BTE), R = as.integer(R), linburn = as.integer(linburn), zcov = as.integer(zcov), g = as.integer(c(g, numirank)), dparams = as.double(dparams), itemps = as.double(itemps), verb = as.integer(verb), tree = as.double(-1), hier = as.double(-1), MAP = as.integer(0), sens.ngrid = as.integer(ngrid), sens.span = as.double(span), sens.Xgrid = as.double(MEgrid), ## output dimensions for checking NULL pred.n = as.integer(pred.n), nnprime = as.integer(nnprime), krige = as.integer(krige), bDs2x = as.integer(Ds2x), bimprov = as.integer(as.logical(improv) * nnprime), ## begin outputs Zp.mean = double(pred.n * n), ZZ.mean = double(nnprime), Zp.km = double(krige * pred.n * n), ZZ.km = double(krige * nnprime), Zp.vark = double(krige * pred.n * n), ZZ.vark = double(krige * nnprime), Zp.q = double(pred.n * n), ZZ.q = double(nnprime), Zp.s2 = double(pred.n * (zcov*n^2 + (!zcov)*n)), ZZ.s2 = double(zcov*nnprime^2 + (!zcov)*nnprime), ZpZZ.s2 = double(pred.n * n * nnprime * zcov), Zp.ks2 = double(krige * pred.n * n), ZZ.ks2 = double(krige * nnprime), Zp.q1 = double(pred.n * n), Zp.med = double(pred.n * n), Zp.q2 = double(pred.n * n), ZZ.q1 = double(nnprime), ZZ.med = double(nnprime), ZZ.q2 = double(nnprime), Ds2x = double(Ds2x * nnprime), improv = double(as.logical(improv) * nnprime), irank = integer(as.logical(improv) * nnprime), ess = double(1 + itemps[1]*2), gpcs = double(4), sens.ZZ.mean = double(ngrid*d), sens.ZZ.q1 = double(ngrid*d), sens.ZZ.q2 = double(ngrid*d), sens.S = double(d*S*!is.null(sens.p)), sens.T = double(d*S*!is.null(sens.p)), ## end outputs PACKAGE = "tgp") ## all post-processing is moved into a new function so it ## can be shared by predict.tgp() ll <- tgp.postprocess(ll, Xnames, response, pred.n, zcov, Ds2x, improv, sens.p, Zm0r1, params, rmfiles) return(ll) } tgp/R/tgp.trees.R0000644000175100001440000000663712506600653013340 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.trees: ## ## plot the MAP tree found at each tree in the Markov chain ## for the tgp-class object (or, possibly constrin the plotting ## to certain heights -- requires the maptree library for plotting "tgp.trees" <- function(out, heights=NULL, main=NULL, ...) { ## get the full set of heights if none specified, and length if(is.null(heights)) heights <- out$posts$height else if(heights == "map") { ## only plot the MAP heights <- out$post$height[which.max(out$posts$lpost)] } howmany <- length(heights) ## calculate how many sub-windows to make with par if(howmany > 1) { h <- howmany if(sum(out$posts$height == 1) >= 1) { h <- h - 1; } rows <- floor(sqrt(h)); cols <- floor(h / rows) while(rows * cols < h) cols <- cols + 1 par(mfrow=c(rows, cols), bty="n") } else par(mfrow=c(1,1), bty="n") ## create a vector of names for the main text section of each plot names <- names(out$X) if(is.null(names)) { for(i in 1:out$d) { names <- c(names, paste("x", i, sep="")) } } ## plot each tree for(j in 1:howmany) { if(is.null(out$trees[[heights[j]]])) next; p <- (1:length(out$posts$height))[out$posts$height == heights[j]] tgp.plot.tree(out$trees[[heights[j]]], names, out$posts[p,], main=main, ...); } } ## tgp.plot.tree: ## ## actually use maptree to plot each tree specified in the ## tree frame with specified name and posterior probability "tgp.plot.tree" <- function(frame, names, posts, main=NULL, ...) { ## don't plot (null) trees of height one if(dim(frame)[1] == 1) { cat(paste("NOTICE: skipped plotting tree of height 1, with lpost =", posts$lpost, "\n")) return() } ## concatenate the log-posterior probability to the main text main <- paste(main, " height=", posts$height, ", log(p)=", posts$lpost, sep="") ## create a frame vector that maptree understands frame[,2] <- as.character(frame[,2]) n.i <- frame[,2] != "" frame[n.i,2] <- names[as.numeric(frame[n.i,2])+1] frame[,2] <- factor(frame[,2]) splits <- as.matrix(data.frame(cutleft=as.character(frame[,6]), cutright=as.character(frame[,7]))) new.frame <- data.frame(frame[,2:5], splits=I(splits), row.names=frame[,1]) tree <- list(frame=new.frame) ## draw the tree and add a title draw.tree(tree, ...) title(main) } tgp/R/tgp.choose.R0000644000175100001440000000754112506600653013471 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* ## tgp.choose.as: ## ## pick which type of "errors" to be returned, either for ## plotting purposes or for adaprive sampling purposes "tgp.choose.as" <- function(out, as) { ## choose AS stats to plot ## default quantile diffs (as=NULL), or predictive variance (as="s2") if(is.null(as) || as == "s2" || as == "ks2") { ## use fulle data, XX & X X <- out$XX ## choose quantile diffs or s2 if(is.null(as)) { criteria <- c(out$Zp.q, out$ZZ.q) name <- "quantile diff (error)" if(!is.null(out$Zp.q)) X <- rbind(out$X, X) } else if(as == "ks2") { criteria = c(out$Zp.ks2, out$ZZ.ks2) name <- "kriging var" if(!is.null(out$Zp.ks2)) X <- rbind(out$X, X) } else { if(is.matrix(out$Zp.s2)) criteria <- c(diag(out$Zp.s2), diag(out$ZZ.s2)) else criteria <- c(out$Zp.s2, out$ZZ.s2) name <- "pred var" if(!is.null(out$Zp.s2)) X <- rbind(out$X, X) } } else { ## only use predictive data X <- out$XX ## default choice is ALM stats (quantile diffs) criteria <- out$ZZ.q name <- "ALM stats" ## choose ALC or EGO stats if(as == "alc") { if(is.null(out$Ds2x)) cat("NOTICE: out$Ds2x is NULL, using ALM\n") else { criteria <- out$Ds2x; name <- "ALC stats" } } else if(as == "improv") { if(is.null(out$improv)) cat("NOTICE: out$improv is NULL, using ALM\n") else { criteria <- out$improv[,1]; name <- paste("Improv stats (g=", out$g[1], ")", sep="") } } else if(as != "alm") warning(paste("as criteria \"", as, "\" not recognized; defaulting to \"alm\"", sep="")) } ## there might be nothing to plot if(is.null(criteria)) stop("no predictive data, so nothing to plot") ## return return(list(X=X, criteria=criteria, name=name)) } ## tgp.choose.center: ## ## pick which type of center (mean, median, kriging mean, etc) ## to be returned, mostly for plotting purposes "tgp.choose.center" <- function(out, center) { X <- out$XX ## check center description if(center != "mean" && center != "med" && center != "km") { warning(paste("center = \"", center, "\" invalid, defaulting to \"mean\"\n", sep="")) center <- "mean" } ## choose center as median or mean if(center == "med") { name <- "median"; Z <- c(out$Zp.med, out$ZZ.med) if(!is.null(out$Zp.med)) X <- rbind(out$X, X) } else if(center == "km") { name <- "kriging mean"; Z <- c(out$Zp.km, out$ZZ.km) if(!is.null(out$Zp.km)) X <- rbind(out$X, X) } else { name <- "mean"; Z <- c(out$Zp.mean, out$ZZ.mean) if(!is.null(out$Zp.mean)) X <- rbind(out$X, X) } ## there might be nothing to plot if(is.null(Z)) stop("no predictive data, so nothing to plot") ## return return(list(X=X, Z=Z, name=name)) } tgp/R/tgp.postprocess.R0000644000175100001440000002133512506600653014572 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* "tgp.postprocess" <- function(ll, Xnames, response, pred.n, zcov, Ds2x, improv, sens.p, Zm0r1, params, rmfiles=TRUE) { ## deal with X, and names of X, as well as Xsplit ll$X <- framify.X(ll$X, Xnames, ll$d) ll$Xsplit <- framify.X(ll$Xsplit, Xnames, ll$d) ll$nsplit <- NULL ## deal with Z, and names of Z if(is.null(response)) ll$response <- "z" else ll$response <- response ## remove from the list if not requested if(Ds2x == FALSE) { ll$Ds2x <- NULL; } if(improv == FALSE || is.null(improv)) { ll$improv <- NULL; } ## deal with predictive data locations (ZZ) if(ll$nn == 0 || (ll$BTE[2]-ll$BTE[1])==0 || !is.null(sens.p)) { ll$XX <- ll$ZZ.mean <- ll$ZZ.s2 <- ll$ZZ.q <- ll$ZZ.km <- ll$ZZ.ks2 <- ll$ZZ.vark <- NULL ll$ZZ.q1 <- ll$ZZ.med <- ll$ZZ.q2 <- ll$ZpZZ.s2 <- ll$Ds2x <- ll$improv <- NULL } else { ## do predictive input/output processing ## replace NaN's in improv with zeros ## shouldn't happen because check have been moved to C code if((!is.null(ll$improv)) && sum(is.nan(ll$improv) > 0)) { warning(paste("encountered", sum(is.nan(ll$improv)), "NaN in Improv, replaced with zeros"), call.=FALSE) ll$improv[is.nan(ll$improv)] <- 0 } ## make sure XX has the correct output format ll$XX <- framify.X(ll$XX, Xnames, ll$d) } ## turn improv into a data.frame where the second column is the rankings if(!is.null(improv)){ ll$irank[ll$irank == 0] <- ll$nn ll$improv <- data.frame(improv=ll$improv, rank=ll$irank) } ll$irank <- NULL ## NULL-out data-predictive output if unused if(pred.n == FALSE || ll$BTE[2]-ll$BTE[1] == 0) { ll$Zp.mean <- ll$Zp.q <- ll$Zp.q1 <- ll$Zp.q2 <- NULL; ll$Zp.s2 <- ll$ZpZZ.s2 <- ll$Zp.km <- ll$Zp.vark <- ll$Zp.ks2 <- ll$Zp.med <- NULL } ## gather information about partitions if(file.exists(paste("./", "best_parts_1.out", sep=""))) { ll$parts <- as.matrix(read.table("best_parts_1.out")) if(rmfiles) unlink("best_parts_1.out") } else { ll$parts <- NULL } ## gather information about MAP trees as a function of height ll$trees <- tgp.get.trees(ll$Xsplit, rmfiles) ll$posts <- read.table("tree_m0_posts.out", header=TRUE) if(ll$BTE[2] - ll$BTE[1] == 0) ll$posts <- NULL if(rmfiles) unlink("tree_m0_posts.out") ## read the trace in the output files, and then delete them if(ll$trace) ll$trace <- tgp.read.traces(ll$n, ll$nn, ll$d, params$corr, ll$verb, rmfiles) else ll$trace <- NULL ## store params ll$params <- params ## clear the verb, state, tree and MAP fields for output ll$verb <- NULL; ll$state <- NULL; ll$tree <- NULL; ll$MAP <- NULL; ll$nt <- NULL ll$ncol <- NULL; ll$hier <- NULL; ## clear output dimensions ll$pred.n <- ll$nnprime <- ll$krige <- ll$bDs2x <- NULL ## consolidate itemps nt <- as.integer(ll$itemps[1]) lambda <- ll$itemps[length(ll$itemps)] if(lambda == 1) lambda <- "opt" else if(lambda == 2) lambda <- "naive" else if(lambda == 3) lambda <- "st" else stop(paste("bad lambda = ", lambda, sep="")) ll$itemps <- list(c0n0=as.integer(ll$itemps[2:3]), k=ll$itemps[4:(nt+3)], pk=ll$itemps[(nt+4):(2*nt+3)], counts=as.integer(ll$itemps[(2*nt+4):(3*nt+3)]), lambda=lambda) ## consolidate ess if(nt == 1) ll$ess <- ll$ess[1] else { ll$ess=list(combined=ll$ess[1], each=data.frame(k=ll$itemps$k, count=ll$ess[2:(nt+1)], ess=ll$ess[(nt+2):(2*nt+1)])) } ## change {0,1} to {TRUE,FALSE} if(ll$linburn) ll$linburn <- TRUE else ll$linburn <- FALSE ## pretty-up the grow, prune, change and swap stats ll$gpcs[is.nan(ll$gpcs)] <- NA ll$gpcs <- data.frame(t(ll$gpcs)) names(ll$gpcs) <- c("grow", "prune", "change", "swap") ## deal with sensitivity analysis outputs if(!is.null(sens.p)){ names(sens.p) <- NULL sens.par <- list(nn.lhs=sens.p[1], rect=matrix(sens.p[2:(ll$d*2+1)], nrow=2), shape=sens.p[(ll$d*2+2):(ll$d*3+1)], mode=sens.p[(ll$d*3+2):(ll$d*4+1)], ngrid=ll$sens.ngrid, span=ll$sens.span) sens <- list() sens$par <- sens.par sens$ngrid <- NULL sens$span <- NULL sens$Xgrid <- matrix(ll$sens.Xgrid, ncol=ll$d) sens$ZZ.mean <- matrix(ll$sens.ZZ.mean, ncol=ll$d) sens$ZZ.q1 <- matrix(ll$sens.ZZ.q1, ncol=ll$d) sens$ZZ.q2 <- matrix(ll$sens.ZZ.q2, ncol=ll$d) sens$S <- matrix(ll$sens.S, ncol=ll$d, byrow=TRUE) sens$T <- matrix(ll$sens.T, ncol=ll$d, byrow=TRUE) } else{ sens <- NULL } ## clear ll$sens.* and replace with single list ll$sens.Xgrid <- ll$sens.ZZ.mean <- ll$sens.ZZ.q1 <- ll$sens.ZZ.q2 <- NULL ll$sens.ngrid <- ll$sens.span <- ll$sens.S <- ll$sens.T <- NULL ll$sens <- sens ## undo mean0.range1 if(!is.null(Zm0r1)) { ll$Z <- undo.mean0.range1(ll$Z,Zm0r1$undo) ll$Zp.mean <- undo.mean0.range1(ll$Zp.mean,Zm0r1$undo) ll$ZZ.mean <- undo.mean0.range1(ll$ZZ.mean,Zm0r1$undo) ll$Zp.km <- undo.mean0.range1(ll$Zp.km,Zm0r1$undo) ll$ZZ.km <- undo.mean0.range1(ll$ZZ.km,Zm0r1$undo) ll$Zp.vark <- undo.mean0.range1(ll$Zp.vark,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$ZZ.vark <- undo.mean0.range1(ll$ZZ.vark,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$Zp.ks2 <- undo.mean0.range1(ll$Zp.ks2,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$ZZ.ks2 <- undo.mean0.range1(ll$ZZ.ks2,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$ZpZZ.ks2 <- undo.mean0.range1(ll$ZpZZ.ks2,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$Zp.q <- undo.mean0.range1(ll$Zp.q,Zm0r1$undo, nomean=TRUE) ll$ZZ.q <- undo.mean0.range1(ll$ZZ.q,Zm0r1$undo, nomean=TRUE) ll$Zp.s2 <- undo.mean0.range1(ll$Zp.s2,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$ZZ.s2 <- undo.mean0.range1(ll$ZZ.s2,Zm0r1$undo, nomean=TRUE, s2=TRUE) ll$Zp.q1 <- undo.mean0.range1(ll$Zp.q1,Zm0r1$undo) ll$Zp.med <- undo.mean0.range1(ll$Zp.med,Zm0r1$undo) ll$Zp.q2 <- undo.mean0.range1(ll$Zp.q2,Zm0r1$undo) ll$ZZ.q1 <- undo.mean0.range1(ll$ZZ.q1,Zm0r1$undo) ll$ZZ.med <- undo.mean0.range1(ll$ZZ.med,Zm0r1$undo) ll$ZZ.q2 <- undo.mean0.range1(ll$ZZ.q2,Zm0r1$undo) for(j in 1:ll$d){ ll$sens.ZZ.mean[,j] <- undo.mean0.range1(ll$sens.ZZ.mean[,j],Zm0r1$undo) ll$sens.ZZ.q1[,j] <- undo.mean0.range1(ll$sens.ZZ.q1[,j],Zm0r1$undo) ll$sens.ZZ.q2[,j] <- undo.mean0.range1(ll$sens.ZZ.q2[,j],Zm0r1$undo) } ll$m0r1 <- TRUE } else { ll$m0r1 <- FALSE } ## turn Z*.s2 into a matrix (covariance matrix) if(!is.null(ll$Zp.s2) && ll$zcov) ll$Zp.s2 <- matrix(ll$Zp.s2, ncol=ll$n) if(!is.null(ll$ZZ.s2) && ll$zcov) ll$ZZ.s2 <- matrix(ll$ZZ.s2, ncol=ll$nn) if(!is.null(ll$ZpZZ.s2) && ll$zcov) ll$ZpZZ.s2 <- t(matrix(ll$ZpZZ.s2, ncol=ll$n)) else ll$ZpZZ.s2 <- NULL ll$zcov <- NULL ## set class information and return class(ll) <- "tgp" return(ll) } "tgp.get.trees" <- function(X, rmfiles=TRUE) { trees <- list() ## get all of the names of the tree files tree.files <- list.files(pattern="tree_m0_[0-9]+.out") ## return no trees if the run was only burn-in if(length(tree.files) == 0) return(NULL) ## for each tree file for(i in 1:length(tree.files)) { ## grab the height from the filename h <- as.numeric(strsplit(tree.files[i], "[_.]")[[1]][3]) ## read it in, then remove it trees[[h]] <- read.table(tree.files[i], header=TRUE) if(rmfiles) unlink(tree.files[i]) ## correct the precision of the val (split) locations ## by replacing them with the closest X[,var] location if(nrow(trees[[h]]) == 1) next; nodes <- (1:length(trees[[h]]$var))[trees[[h]]$var != ""] for(j in 1:length(nodes)) { col <- as.numeric(as.character(trees[[h]]$var[nodes[j]])) + 1 m <- which.min(abs(X[,col] - trees[[h]]$val[nodes[j]])) trees[[h]]$val[nodes[j]] <- X[m,col] } } return(trees) } tgp/R/tgp.plot.proj.R0000644000175100001440000001237212506600653014136 0ustar hornikusers#******************************************************************************* # # Bayesian Regression and Adaptive Sampling with Gaussian Process Trees # Copyright (C) 2005, University of California # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Questions? Contact Robert B. Gramacy (rbgramacy@ams.ucsc.edu) # #******************************************************************************* "tgp.plot.proj" <- function(out, pparts=TRUE, proj=NULL, map=NULL, as=as, center="mean", layout=layout, main=NULL, xlab=NULL, ylab=NULL, zlab=NULL, pc="pc", gridlen=40, span=0.1, rankmax=20,...) { ## will call stop() if something is wrong with the proj proj <- check.proj(proj) ## deal with axis labels if(is.null(xlab)) xlab <- names(out$X)[proj[1]] if(is.null(ylab)) ylab <- names(out$X)[proj[2]] if(is.null(zlab)) zlab <- out$response ## choose center as median or mean (i.e., X & Z data) center <- tgp.choose.center(out, center); Z.mean <- center$Z smain <- paste(main, zlab, center$name); X <- center$X[,proj] if(is.null(dim(X))) { nX <- length(X); dX <- 1 } else { nX <- dim(X)[1]; dX <- dim(X)[2] } p <- seq(1,nX) ## for ALC and EGO plotting as <- tgp.choose.as(out, as); XX <- as$X[,proj] ZZ.q <- as$criteria emain <- paste(main, zlab, as$name) if(is.null(dim(XX))) { nXX <- length(XX); dXX <- 1 } else { nXX <- dim(XX)[1]; dXX <- dim(XX)[2] } pp <- seq(1,nXX); # if no data then do nothing if(length(Z.mean) == 0) { cat("NOTICE: no predictive data; nothing to plot\n") return() } # prepare for plotting if(layout == "both") par(mfrow=c(1,2), bty="n") # else par(mfrow=c(1,1), bty="n") if(dX == 1) { # 1-d projections if(layout == "both" || layout == "surf") { plot(out$X[,proj], out$Z, xlab=xlab, ylab=zlab, main=smain, ...) points(out$XX[,proj], out$ZZ.mean, pch=20, cex=0.5, ...) Zb.q1 <- c(out$Zp.q1, out$ZZ.q1) Zb.q2 <- c(out$Zp.q2, out$ZZ.q2) r <- range(X) segments(x0=X, y0=Zb.q1, x1=X, y1=Zb.q2, col=2) # plot partitions if(pparts & !is.null(out$parts) ) { tgp.plot.parts.1d(out$parts[,proj]) } } if(layout == "both" || layout == "as") { # error/as plot plot(XX, ZZ.q, ylab=as$name, xlab=xlab, main=emain, ...) if(pparts & !is.null(out$parts) ) { tgp.plot.parts.1d(out$parts[,proj]) } } } else if(pc == "pc") { # perspective and image plots if(layout == "both" || layout == "surf") slice.persp(X[,1],X[,2],p,Z.mean,xlab=xlab,ylab=ylab,zlab=zlab,main=smain, gridlen=gridlen,span=span,...) if(layout == "both" || layout == "as") { # error/as plot slice.image(XX[,1],XX[,2],pp,ZZ.q,xlab=xlab,ylab=ylab,main=emain, gridlen=gridlen,span=span,...) if(!is.null(out$XX)) points(out$XX[,proj], pch=21, ...) if(!is.null(map)) { lines(map, col="black", ...) } points(out$X[,proj],pch=20, ...) if(pparts & !is.null(out$parts)) { tgp.plot.parts.2d(out$parts, dx=proj) } if(substr(as$name,1,1) == "I"){ ranks <- out$improv[,2] <= rankmax text(out$XX[ranks,proj[1]], out$XX[ranks,proj[2]], labels=out$improv[ranks,2], pos=3, font=2,...) } } } else if(pc == "c") { # double-image plot if(layout == "both" || layout == "surf") { slice.image(X[,1],X[,2],p,Z.mean,xlab=xlab,ylab=ylab,main=smain, gridlen=gridlen,span=span,...) if(!is.null(map)) { lines(map, col="black", ...) } points(out$X[,proj],pch=20, ...) if(!is.null(out$XX)) points(out$XX[,proj], pch=21, ...) if(pparts & !is.null(out$parts)) { tgp.plot.parts.2d(out$parts, dx=proj) } } if(layout == "both" || layout == "as") { slice.image(XX[,1],XX[,2],pp,ZZ.q,xlab=xlab,ylab=ylab,main=emain, gridlen=gridlen,span=span,...) if(!is.null(map)) { lines(map, col="black", ...) } points(out$X[,proj],pch=20, ...) if(!is.null(out$XX)) points(out$XX[,proj], pch=21, ...) if(pparts & !is.null(out$parts)) { tgp.plot.parts.2d(out$parts, dx=proj) } if(substr(as$name,1,1) == "I"){ ranks <- out$improv[,2] <= rankmax text(out$XX[ranks,proj[1]], out$XX[ranks,proj[2]], labels=out$improv[ranks,2], pos=3, font=2,...) } } } else { stop(paste(pc, "not a valid plot option\n")) } } "check.proj" <- function(proj) { if(is.null(proj)) proj <- c(1,2) if(length(proj) > 2) { stop(paste("length(proj) = ", length(proj), "should be <= 2\n")) } ## will stop if the proj is not ok, ## otherwise returns the (possibly modified) proj return(proj) } tgp/vignettes/0000755000175100001440000000000012655414745013107 5ustar hornikuserstgp/vignettes/linear.iRnw0000644000175100001440000001055112506600653015212 0ustar hornikusers<>= library(tgp) ##options(width=65) seed <- 0; set.seed(seed) @ \subsection{1-d Linear data} \label{sec:ex:1dlinear} Consider data sampled from a linear model. \begin{equation} z_i = 1 + 2x_i + \epsilon_, \;\;\;\;\; \mbox{where} \;\;\; \epsilon_i \stackrel{\mbox{\tiny iid}}{\sim} N(0,0.25^2) \label{eq:linear:sim} \end{equation} The following {\sf R} code takes a sample $\{\mb{X}, \mb{Z}\}$ of size $N=50$ from (\ref{eq:linear:sim}). It also chooses $N'=99$ evenly spaced predictive locations $\tilde{\mb{X}} = \mbox{\tt XX}$. <<>>= # 1-d linear data input and predictive data X <- seq(0,1,length=50) # inputs XX <- seq(0,1,length=99) # predictive locations Z <- 1 + 2*X + rnorm(length(X),sd=0.25) # responses @ Using {\tt tgp} on this data with a Bayesian hierarchical linear model goes as follows: <<>>= lin.blm <- blm(X=X, XX=XX, Z=Z) @ \begin{figure}[ht!] \centering <>= plot(lin.blm, main='Linear Model,', layout='surf') abline(1,2,lty=3,col='blue') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-linear-blm} %\vspace{-0.5cm} \caption{Posterior predictive distribution using {\tt blm} on synthetic linear data: mean and 90\% credible interval. The actual generating lines are shown as blue-dotted.} \label{f:lin:blm} \end{figure} MCMC progress indicators are echoed every 1,000 rounds. The linear model is indicated by {\tt d=[0]}. For {\tt btlm} the MCMC progress indicators are boring, but we will see more interesting ones later. In terminal versions, e.g. {\tt Unix}, the progress indicators can give a sense of when the code will finish. GUI versions of {\tt R}---{\tt Windows} or {\tt MacOS X}---can buffer {\tt stdout}, rendering this feature essentially useless as a real--time indicator of progress. Progress indicators can be turned off by providing the argument {\tt verb=0}. Further explanation on the verbosity of screen output and interpretations is provided in Appendix \ref{sec:progress}. The generic {\tt plot} method can be used to visualize the fitted posterior predictive surface (with option {\tt layout = 'surf'}) in terms of means and credible intervals. Figure \ref{f:lin:blm} shows how to do it, and what you get. The default option {\tt layout = 'both'} shows both a predictive surface and error (or uncertainty) plot, side by side. The error plot can be obtained alone via {\tt layout = 'as'}. Examples of these layouts appear later. If, say, you were unsure about the dubious ``linearness'' of this data, you might try a GP LLM (using {\tt bgpllm}) and let a more flexible model speak as to the linearity of the process. <<>>= lin.gpllm <- bgpllm(X=X, XX=XX, Z=Z) @ \begin{figure}[ht!] \centering <>= plot(lin.gpllm, main='GP LLM,', layout='surf') abline(1,2,lty=4,col='blue') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-linear-gplm} %\vspace{-0.5cm} \caption{Posterior predictive distribution using {\tt bgpllm} on synthetic linear data: mean and 90\% credible interval. The actual generating lines are shown as blue-dotted.} \label{f:lin:gpllm} \end{figure} Whenever the progress indicators show {\tt d=[0]} the process is under the LLM in that round, and the GP otherwise. A plot of the resulting surface is shown in Figure \ref{f:lin:gpllm} for comparison. Since the data is linear, the resulting predictive surfaces should look strikingly similar to one another. On occasion, the GP LLM may find some ``bendyness'' in the surface. This happens rarely with samples as large as $N=50$, but is quite a bit more common for $N<20$. To see the proportion of time the Markov chain spent in the LLM requires the gathering of traces (Appendix \ref{sec:traces}). For example <<>>= lin.gpllm.tr <- bgpllm(X=X, XX=0.5, Z=Z, pred.n=FALSE, trace=TRUE, verb=0) mla <- mean(lin.gpllm.tr$trace$linarea$la) mla @ shows that the average area under the LLM is \Sexpr{signif(mla,3)}. Progress indicators are suppressed with \verb!verb=0!. Alternatively, the probability that input location {\tt xx} = \Sexpr{lin.gpllm.tr$XX[1,]} is under the LLM is given by <<>>= 1-mean(lin.gpllm.tr$trace$XX[[1]]$b1) @ This is the same value as the area under the LLM since the process is stationary (i.e., there is no treed partitioning). tgp/vignettes/tgp.bib0000644000175100001440000004754112525122342014353 0ustar hornikusers@unpublished{GinsLe-RCarr2009, Author = {{G}insbourger, David and {L}e Riche, Rodolphe and Carraro, Laurent}, Note = {HAL: hal-00260579}, Title = {A Multi-points Criterion for Deterministic Parallel Global Optimization based on {G}aussian Processes}, Year = {2009}} @article{VeigWahlGamb2009, Author = {S. {D}a Veiga and F. Wahl and F. Gamboa}, Journal = {Technometrics}, Pages = {452--463}, Title = {Local Polynomial Estimation for Sensitivity Analysis on Models With Correlated Inputs}, Volume = {51}, Year = {2009}} @article{MarrIoosLaurRous2009, Author = {A. Marrel and B. Iooss and B. Laurent and O. Roustant}, Journal = {Reliability Engineering \& System Safety}, Pages = {742--751}, Title = {Calculations of Sobol Indices for the Gaussian Process Metamodel}, Volume = {94}, Year = {2009}} @article{StorSwilHeltSall2009, Author = {Curtis B. Storlie and Laura P. Swiler and Jon C. Helton and Cedric J. Sallaberry}, Journal = {Reliability Engineering \& System Safety}, Pages = {1735--1763}, Title = {Implementation and Evaluation of Nonparametric Regression Procedures for Sensitivity Analysis of Computationally Demanding Models}, Volume = {94}, Year = {2009}} @article{StorHelt2008, Author = {Curtis B. Storlie and Jon C. Helton}, Journal = {Reliability Engineering \& System Safety}, Pages = {28--54}, Title = {Multiple Predictor Smoothing Methods for Sensitivity Analysis: Description of Techniques}, Volume = {93}, Year = {2008}} @incollection{SchoWelcJone1998, author={M. Schonlau and Jones, D.R. and Welch, W.J.}, title = {Global versus local search in constrained optimization of computer models}, year={1998}, booktitle={New Developments and applications in experimental design}, pages={11--25}, series={IMS Lecture Notes - Monograph Series}, number={34}, publisher={IMS} } @article{RommShoe2007, author = {Rommel G. Regis and Christine A. Shoemaker}, title = {Improved Strategies for Radial basis Function Methods for Global Optimization}, journal = {J. of Global Optimization}, volume = {37}, number = {1}, year = {2007}, issn = {0925-5001}, pages = {113--135}, doi = {http://dx.doi.org/10.1007/s10898-006-9040-1}, publisher = {Kluwer Academic Publishers}, address = {Hingham, MA, USA}, } @article{JoneSchoWelc1998, author={Jones, D.R. and Schonlau, M. and Welch, W.J}, title={Efficient Global Optimization of Expensive Black-Box Functions}, journal={Journal of Global Optimization}, volume={13}, year={1998}, pages={455--492} } @article{SaltTara2002, author={A. Saltelli and S. Tarantola}, title={On the relative importance of input factors in mathematical models: safety assessment for nuclear waste disposal}, year={2002}, journal={Journal of the American Statistical Association}, volume={97}, pages={702--709} } @article{WelcBuckSackWynnMitcMorr1992, Author = {W. J. Welch and R. J. Buck and J. Sacks and H. P. Wynn and T.J Mitchell and M. D. Morris}, Journal = {Technometrics}, Pages = {15--25}, Title = {Screening, predicting, and computer experiment}, Volume = {34}, Year= {1992} } @article{OaklOhag2004, author = {Oakley, J.E. and O'Hagan, A.}, title = {Probabilistic sensitivity analysis of complex models: a {B}ayesian approach}, journal = {Journal of the Royal Statistical Society Series B}, year = {2004}, volume = {66}, pages = {751--769} } @article{Sobo1993, author={I. M. Sobol'}, year={1993}, title={ Sensitivity Analysis for nonlinear mathematical models}, journal={Mathematical Modeling and Computational Experiment}, volume={1}, pages={407--414} } @article{HommSalt1996, author={T. Homma and A. Saltelli}, title={Importance measures in global sensitivity analysis of nonlinear models}, journal={Reliability engineering and system safety}, year={1996}, volume={52}, pages={1--17} } @book{SaltChanScot2000, editor={Saltelli, A. and Chan, K. and Scott, E.M.}, title={Sensitivity {A}nalysis}, year={2000}, publisher={John Wiley and Sons} } @article{MorrKottTaddFurfGana2008, author={R. D. Morris and A. Kottas and M. Taddy and R. Furfaro and B. Ganapol}, title={A statistical framework for the sensitivity analysis of radiative transfer models}, year={To appear}, journal={IEEE Transactions on Geoscience and Remote Sensing} } @article{TaddLeeGrayGrif2009, Author = {Matthew A. Taddy and Herbert K. H. Lee and Genetha A. Gray and Joshua D. Griffin}, Journal = {Technometrics}, Pages = {389--401}, Title = {Bayesian Guided Pattern Search for Robust Local Optimization}, Volume = 51, Year = 2009} @Book{SaltEtAl2008, author = {A. Saltelli and M. Ratto and T. Andres and F. Campolongo and J. Cariboni and D. Gatelli and M. Saisana and S. Tarantola}, title = {Global Sensitivity Analysis: The Primer}, publisher = {John Wiley \& Sons}, year = 2008} @article{Salt2002, author={Andrea Saltelli}, title={Making best use of model evaluations to compute sensitivity indices}, journal={Computer Physics Communications}, year={2002}, volume={145}, pages={280--297} } @INPROCEEDINGS{cohn:1996, Author = {D. A. Cohn}, Booktitle = {Advances in Neural Information Processing Systems}, Editor = {Jack D. Cowan and Gerald Tesauro and Joshua Alspector}, Journal = {Neural Network}, Pages = {679--686}, Publisher = {Morgan Kaufmann Publishers}, Title = {Neural Network Exploration Using Optimal Experimental Design}, Volume = {6(9)}, Year = {1996} } @ARTICLE{math:1963, Author = {G. Matheron}, Journal = {Economic Geology}, Pages = {1246-1266}, Title = {Principles of geostatistics}, Volume = {58}, Year = {1963} } @ARTICLE{chip:geor:mccu:1998, Author = {Chipman, H. A. and George, E. I. and McCulloch, R. E.}, Journal = {Journal of the American Statistical Association}, Pages = {935--960}, Title = {{B}ayesian {CART} Model Search (with discussion)}, Volume = {93}, Year = {1998} } @BOOK{cressie:1991, Author = {N.A. Cressie}, Publisher = {John Wiley and Sons, Inc.}, Title = {Statistics for Spatial Data}, Year = {1991} } @TECHREPORT{neal:1997, author = {R. Neal}, title = {Monte Carlo implementation of {G}aussian process models for {B}ayesian regression and classification"}, Institution = {Dept. of Computer Science, University of Toronto.}, year = "1997", number = "CRG--TR--97--2" } @BOOK{brei:1984, Address = {Belmont, CA}, Author = {Breiman, L. and Friedman, J. H. and Olshen, R. and Stone, C.}, Publisher = {Wadsworth}, Title = {Classification and Regression Trees}, Year = {1984} } @BOOK{sant:will:notz:2003, Address = {New York, NY}, Author = {Santner, T. J. and Williams, B. J. and Notz, William I.}, Publisher = {Springer-Verlag}, Title = {The Design and Analysis of Computer Experiments}, Year = {2003} } @ARTICLE{chaloner:1995, Author = {K. Chaloner and I. Verdinelli}, Journal = {Statistical Science}, Pages = {273-1304}, Title = {Bayesian Experimental Design, A Review}, Volume = {10 No. 3}, Year = {1995} } @Misc{fields:2004, author = {{Fields Development Team}}, title = {fields: {T}ools for Spatial Data}, howpublished = {National {C}enter for {A}tmospheric {R}esearch, {B}oulder CO}, year = 2004, note = {URL: http://www.cgd.ucar.edu/Software/Fields} } @ARTICLE{mackay:1992, Author = {D. J. C. MacKay}, Journal = {Neural Computation}, Number = {4}, Pages = {589--603}, Title = {Information--based Objective Functions for Active Data Selection}, Volume = {4}, Year = {1992} } @INPROCEEDINGS{seo00, Author = {S. Seo and M. Wallat and T. Graepel and K. Obermayer}, Booktitle = {Proceedings of the International Joint Conference on Neural Networks}, Month = {July}, Pages = {241--246}, Publisher = {IEEE}, Title = {Gaussian Process Regression: Active Data Selection and Test Point Rejection}, Volume = {III}, Year = {2000} } @ARTICLE{chip:geor:mccu:2002, Author = {Chipman, H. A. and George, E. I. and McCulloch, R. E.}, Journal = {Machine Learning}, Pages = {303--324}, Title = {Bayesian Treed Models}, Volume = {48}, Year = {2002} } @Manual{cran:R, title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = 2004, note = {ISBN 3-900051-00-3}, url = {http://www.R-project.org} } @book{dey:1998, author = {Dipak Dey and Peter M\"{u}eller and Debajyoti Sinha}, title = {Practical Nonparametric and Semiparametric {B}ayesian Statistics}, year = {1998}, isbn = {0387985174}, publisher = {Springer-Verlag New York, Inc.}, address = {New York, NY, USA}, } @INPROCEEDINGS{rasm:ghah:nips:2002, Author = {Rasmussen, C.E. and Ghahramani, Z.}, Booktitle = {Advances in Neural Information Processing Systems}, Publisher = {MIT Press}, Title = {Infinite Mixtures of {G}aussian Process Experts}, Volume = {14}, Pages = {881--888}, Year = {2002} } @ARTICLE{silv:1985, Author = {Silverman, B. W.}, Journal = {Journal of the Royal Statistical Society Series B}, Pages = {1--52}, Title = {Some Aspects of the Spline Smoothing Approach to Non-Parametric Curve Fitting}, Volume = {47}, Year = {1985} } @ARTICLE{freid:1991, Author = {J. H. Friedman}, Journal = {Annals of Statistics}, Pages = {1--67}, Title = {Multivariate Adaptive Regression Splines}, Volume = {19, No. 1}, Month = {March}, Year = {1991} } @INPROCEEDINGS{glm:04, author = {R. B. Gramacy and Herbert K. H. Lee and William Macready}, title = {Parameter Space Exploration With {G}aussian Process Trees}, booktitle = {ICML}, pages = {353-360}, year = {2004}, publisher = {Omnipress \& ACM Digital Library}, url = {http://whisper.cse.ucsc.edu/~rbgramacy/papers/gra2004-02.pdf} } @article{harrison:78, author = {Harrison, D. and Rubinfeld, D. L.}, title = {{Hedonic Housing Prices and the Demand for Clean Air}}, journal = {Journal of Environmental Economics and Management}, year = {1978}, volume = {5}, pages = {81-102} } @UNPUBLISHED{atlas-hp, TITLE = "{\tt ATLAS} ({A}utomatically {T}uned {L}inear {A}lgebra {S}oftware)", AUTHOR = "R. Clint Whaley and Antoine Petitet", PUBLISHER = "{See homepage for details}", NOTE = "http://math-atlas.sourceforge.net/", YEAR = 2004 } @ARTICLE{jones:schonlau:welch:1998, Author = {Jones, D.R. and M. Schonlau and W. J. Welch}, Journal = {Journal of Global Optimization}, Pages = {455--492}, Title = {Efficient Global Optimization of Expensive Black Box Functions}, Volume = {13}, Year = {1998} } @Article{gra:lee:2008, Author = {Robert B. Gramacy and Herbert K. H. Lee}, Title = {Bayesian treed {G}aussian process models with an application to computer modeling}, Year = 2008, journal = {Journal of the American Statistical Association}, volume = 103, Pages = {1119--1130}, url={http://arxiv.org/abs/0710.4536} } @TECHREPORT{gra:lee:2009, Author = {Robert B. Gramacy and Herbert K H. Lee}, Institution = {ArXiV}, Title = {Adaptive Design and Analysis of Supercomputer Experiments}, Year = 2009, number = {0805.4359}, url = {http://arxiv.org/abs/0805.4359}, note = {to appear in Technometrics} } @PhDThesis{Paci:2003, Author={Paciorek, C.J.}, Title={Nonstationary {G}aussian Processes for Regression and Spatial Modelling}, Year=2003, Department={Department of Statistics}, School={Carnegie Mellon University}, Address={Pittsburgh, Pennsylvania} } @BOOK{stein:1999, Address = {New York, NY}, Author = {Michail L. Stein}, Publisher = {Springer}, Title = {Interpolation of Spatial Data}, Year = {1999} } @BOOK{abramowitz:stegun:1964, author = "Milton Abramowitz and Irene A. Stegun", title = "Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables", publisher = "Dover", year = 1964, address = "New York", edition = "9th Dover printing, 10th GPO printing--", isbn = "0-486-61272-4" } @ARTICLE{dam:samp:gutt:2001, Author = {Doris Damian and Paul D. Sampson and Peter Guttorp}, Journal = {Environmetrics}, Pages = {161-178}, Title = {Bayesian Estimation of Semiparametric Nonstationary Spatial Covariance Structure}, Volume = {12}, Year = {2001} } @ARTICLE{schmidt:2003, Author = {Alexandra Mello Schmidt and Anthony O'Hagan}, Journal = {Journal of the Royal Statistical Society, Series B}, Title = {Bayesian Inference for Nonstationary Spatial Covariance Structure via Spatial Deformations}, Volume = {65}, Pages = {745--758}, Year = {2003} } @INCOLLECTION{higd:swal:kern:1999, Author = {Higdon, Dave and Swall, Jenise and Kern, John}, Booktitle = {Bayesian Statistics 6}, Editor = {Bernardo, J. M and Berger, J. O. and Dawid, A. P. and Smith, A. F. M.}, Pages = {761--768}, Publisher = {Oxford University Press}, Title = {Non-Stationary Spatial Modeling}, Year = {1999} } @TechReport{fuentes:smith:2001, author = {Montserrat Fuentes and Richard L. Smith}, title = {A New Class of Nonstationary Spatial Models}, institution = {North Carolina State University, Raleigh, NC}, year = 2001 } @article{Gramacy:2007, author = "Robert B. Gramacy", title = "{\tt tgp}: An {{\sf R}} Package for {B}ayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models", journal = "Journal of Statistical Software", volume = "19", number = "9", day = "13", month = "6", year = "2007", CODEN = "JSSOBK", ISSN = "1548-7660", bibdate = "2007-06-13", URL = "http://www.jstatsoft.org/v19/i09", accepted = "2007-06-13", submitted = "2006-07-12", } @Article{gra:lee:2008b, author = {Robert B. Gramacy and Herbert K. H. Lee}, title = {Gaussian Processes and Limiting Linear Models}, journal = {Computational Statistics and Data Analysis}, volume = 53, pages = {123--136}, year = 2008 } @Book{liu:2001, author = {Liu, J. S.}, title = {Monte {C}arlo Strategies in Scientific Computing}, publisher = {Springer}, year = 2001, address = {New York} } @Article{geyer:1995, author = {Geyer, C.J. and Thompson, E.A.}, title = {Annealing {M}arkov chain {M}onte {C}arlo with applications to ancenstral inference}, journal = {Journal of the American Statistical Association}, year = 1995, volume = 90, pages = {909--920} } @InProceedings{geyer:1991, author = {Geyer, C.J.}, title = {Markov chain {M}onte {C}arlo Maximum Likelihood}, booktitle = {Computing Science and Statistics: Proceedings of the 23rd Symposium on the Interface}, pages = {156--163}, year = 1991 } @ARTICLE{hast:1970, Author = {Hastings, W.K.}, Journal = {Biometrika}, Pages = {97--109}, Title = {Monte {C}arlo Sampling Methods using {M}arkov Chains and their Applications}, Volume = {57}, Year = {1970} } @ARTICLE{met:1953, Author = {Metropolis, N. and Rosenbluth, A.W. and Rosenbluth, M.N. and Teller, A.H. and Teller, R.}, Journal = {Journal of Chemical Physics}, Pages = {1087--1091}, Title = {Equations of State Calculations by Fast Computing Machine}, Volume = {21}, Year = {1953} } @ARTICLE{geman:1984, Author = {Geman, S. and Geman, D.}, Journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence}, Pages = {721--741}, Title = {Stochastic Relaxation, {G}ibbs Distributions and the {B}ayesian Restoration of Images}, Volume = {6}, Year = {1984} } @Article{neal:2001, author = {Radford M. Neal}, title = {Annealed Importance Sampling}, journal = {Statistics and Computing}, year = 2001, volume = 11, pages = {125--129} } @Article{neal:1996, author = {Radford M. Neal}, title = {Sampling from multimodal distributions using tempered transition}, journal = {Statistics and Computing}, year = 1996, volume = 6, pages = {353--366} } @InProceedings{veach:1995, author = {Veach, Eric and Guibas, Leonidas J.}, title = {Optimally combining sampling techniques for Monte Carlo rendering}, booktitle = {SIGGRAPH '95 Conference Proceedings}, pages = {419--428}, year = 1995, address = {Reading, MA}, publisher = {Addison--Wesley} } @TechReport{douc:etal:2007, author = {R. Douc and A. Guillin and J.-M. Marin and C.P. Robert}, title = {Minimum Variance Importance Sampling via Population Monte Carlo}, institution = {CEREMADE, Universit\'{e} Paris Dauphine, and CREST, INSEE, Paris}, year = 2007, url = {http://www.ceremade.dauphine.fr/~xian/dgmr05.pdf} } @Article{owen:2000, author = {Owen, Art and Zhou, Yi}, title = {Safe and Effective Importance Sampling}, journal = {Journal of the American Statstical Association}, year = 2000, volume = 95, number = 449, pages = {135--143}, month = {March}} @Article{kass:1998, author = {Robert E. Kass and Bradley P. Carlin and Andrew Gelman and Radford M. Neal}, title = {Markov Chain Monte Carlo in Practice: A Roundtable Discussion}, journal = {The American Statistician}, year = 1998, volume = 52, number = 2, pages = {93--100}, month = {May} } @Article{jennison:1993, author = {Jennison, C.}, title = {Discussion on the meeting on the Gibbs sampler and other {M}arkov chain {M}onte {C}arlo methods}, journal = {Journal of the Royal Statistical Society, Series B}, year = 1993, volume = 55, pages = {54--56} } @TechReport{gra:samw:king:2009, author = {Robert B. Gramacy and Richard J. Samworth and Ruth King}, title = {Importance tempering}, institution = {ArXiv}, year = 2009, number = {0707.4242}, url = {http://arxiv.org/abs/0707.4242}, note = {to appear in Statistics and Computing} } @Manual{coda:R, title = {coda: Output analysis and diagnostics for MCMC}, author = {Martyn Plummer and Nicky Best and Kate Cowles and Karen Vines}, year = {2008}, note = {R package version 0.13-3}, } @Article{qian:wu:wu:2009, author = {Z.G. Qian and H. Wu and C.F.J. Wu}, title = {Gaussian process models for computer experiments with qualitative and quantitative factors}, journal = {Technometrics}, year = 2009, volume = 50, pages = {383--396}} @Article{gra:taddy:2010, title = {Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with {\tt tgp} Version 2, an {\sf R} Package for Treed {G}aussian Process Models}, author = {Robert B. Gramacy and Matthew Taddy}, journal = {Journal of Statistical Software}, year = {2010}, volume = {33}, number = {6}, pages = {1--48}, url = {http://www.jstatsoft.org/v33/i06/} } tgp/vignettes/motivate.tex0000644000175100001440000000454712506600653015461 0ustar hornikusers\subsection*{Motivation} Consider as motivation the Motorcycle Accident Dataset \cite{silv:1985}. It is a classic data set used in recent literature \cite{rasm:ghah:nips:2002} to demonstrate the success of nonstationary regression models. The data consists of measurements of the acceleration of the head of a motorcycle rider as a function of time in the first moments after an impact. Many authors have commented on the existence of two---perhaps three---regimes in the data over time where the characteristics of the mean process and noise level change (i.e., a nonstationarity and heteroskedasticity, respectively). It can be interesting to see how various candidate models handle this nuance. \begin{figure}[ht!] \centering \includegraphics[trim=0 25 0 0]{motovate_bgp} \includegraphics[trim=0 25 0 0]{motovate_btgp} \caption{Fit of the Motorcycle Accident Dataset using a GP ({\em top}) and treed GP model ({\em bottom}). The $x$-axis is time in milliseconds after an impact; the $y$--axis is acceleration of the helmet of a motorcycle rider measured in ``$g$'s'' in a simulated impact.} \label{f:motivate} \end{figure} Figure \ref{f:motivate} shows a fit of this data using a standard (stationary) Gaussian process (GP; {\em left}), and the treed GP model ({\em right}).\footnote{Note that these plots are {\em static}, i.e., they were not generated in--line with {\tt R} code. See Section \ref{sec:moto} for {\em dynamic} versions.} Notice how stationary GP model is unable to capture the smoothness in the linear section(s), nor the decreased noise level. We say that the standard GP model is stationary because it has a single fixed parameterization throughout the input space. An additive model would be inappropriate for similar reasons. In contrast, the treed GP model is able to model the first linear part, the noisy ``whiplash'' middle section, and the smooth (possibly linear) final part with higher noise level, thus exhibiting nonstationary modeling behavior and demonstrating an ability to cope with heteroskedasticity. The remainder of this paper describes the treed GP model in detail, and provides illustrations though example. There are many special cases of the treed GP model, e.g., the linear model (LM), treed LM, stationary GP, etc.. These are outlined and demonstrated as well. %%% Local Variables: %%% mode: latex %%% TeX-master: "tgp" %%% End: tgp/vignettes/traces.iRnw0000644000175100001440000001573012506600653015225 0ustar hornikusers\subsection{Parameter traces} \label{sec:traces} <>= library(tgp) ##options(width=65) seed <- 0; set.seed(seed) @ Traces of (almost) all parameters to the {\tt tgp} model can be collected by supplying {\tt trace=TRUE} to the {\tt b*} functions. In the current version, traces for the linear prior correlation matrix ($\mb{W}$) are not provided. I shall illustrate the gathering and analyzing of traces through example. But first, a few notes and cautions. Models which involve treed partitioning may have more than one base model (GP or LM). The process governing a particular input $\mb{x}$ depends on the coordinates of $\mb{x}$. As such, {\tt tgp} records region--specific traces of parameters to GP (and linear) models at the locations enumerated in the {\tt XX} argument. Even traces of single--parameter Markov chains can require hefty amounts of storage, so recording traces at each of the {\tt XX} locations can be an enormous memory hog. A related warning will be given if the product of $|${\tt XX}$|$, \verb!(BTE[2]-BTE[1])/BTE[3]! and {\sf R} is beyond a threshold. The easiest way to keep the storage requirements for traces down is to control the size of {\tt XX} and the thinning level {\tt BTE[3]}. Finally, traces for most of the parameters are stored in output files. The contents of the trace files are read into {\sf R} and stored as {\tt data.frame} objects, and the files are removed. The existence of partially written trace files in the current working directory (CWD)---while the {\tt C} code is executing---means that not more than one {\tt tgp} run (with \verb!trace = TRUE!) should be active in the CWD at one time. Consider again the exponential data. For illustrative purposes I chose {\tt XX} locations (where traces are gathered) to be (1) in the interior of the interesting region, (2) on/near the plausible intersection of partition boundaries, and (3) in the interior of the flat region. The hierarchical prior \verb!bprior = "b0"! is used to leverage a (prior) belief the most of the input domain is uninteresting. <<>>= exp2d.data <- exp2d.rand(n2=150, lh=0, dopt=10) X <- exp2d.data$X Z <- exp2d.data$Z XX <- rbind(c(0,0),c(2,2),c(4,4)) @ We now fit a treed GP LLM and gather traces, and also gather EI and ALC statistics for the purposes of illustration. Prediction at the input locations {\tt X} is turned off to be thrifty. <<>>= out <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", bprior="b0", pred.n=FALSE, Ds2x=TRUE, R=10, trace=TRUE, verb=0) @ \begin{figure}[hp] \centering <<>>= out$trace @ \caption{Listing the contents of {\tt "tgptraces"}--class objects.} \label{f:tgptraces} \end{figure} Figure \ref{f:tgptraces} shows a dump of \verb!out$trace! which is a \verb!"tgptraces"!--class object. It depicts the full set of parameter traces broken down into the elements of a \verb!list!: \verb!$XX! with GP/LLM parameter traces for each {\tt XX} location (the parameters are listed); \verb!$hier! with traces for (non--input--dependent) hierarchical parameters (listed); \verb!$linarea! recording proportions of the input space under the LLM; \verb!$parts! with the boundaries of all partitions visited; \verb!$post! containing (log) posterior probabilities; \verb!preds! containing traces of samples from the posterior predictive distribution and adaptive sampling statistics. \begin{figure}[ht!] \centering <>= trXX <- out$trace$XX; ltrXX <- length(trXX) y <- trXX[[1]]$d for(i in 2:ltrXX) y <- c(y, trXX[[i]]$d) plot(log(trXX[[1]]$d), type="l", ylim=range(log(y)), ylab="log(d)", main="range (d) parameter traces") names <- "XX[1,]" for(i in 2:ltrXX) { lines(log(trXX[[i]]$d), col=i, lty=i) names <- c(names, paste("XX[", i, ",]", sep="")) } legend("bottomleft", names, col=1:ltrXX, lty=1:ltrXX) @ <>= graphics.off() @ \includegraphics[trim=55 25 65 20]{tgp-traces-XXd} \caption{Traces of the (log of the) first range parameter for each of the three {\tt XX} locations} \label{f:XXd} \end{figure} Plots of traces are useful for assessing the mixing of the Markov chain. For example, Figure \ref{f:XXd} plots traces of the range parameter ($d$) %in the first input dimension ($d_1$) for each of the \Sexpr{length(out$trace$XX)} predictive locations {\tt XX}. It is easy to see which of the locations is in the same partition with others, and which have smaller range parameters than others. The mean area under the LLM can be calculated as <<>>= linarea <- mean(out$trace$linarea$la) linarea @ \begin{figure}[ht!] \centering <>= hist(out$trace$linarea$la) @ <>= graphics.off() @ \includegraphics[trim=0 0 0 20]{tgp-traces-la} \vspace{-0.5cm} \caption{Histogram of proportions of the area of the input domain under the LLM} \label{f:la} \end{figure} This means that the expected proportion of the input domain under the full LLM is \Sexpr{signif(linarea[1], 3)}. Figure \ref{f:la} shows a histogram of areas under the LLM. The clumps near 0, 0.25, 0.5, and 0.75 can be thought of as representing quadrants (none, one, two, and tree) under the LLM. Similarly, we can calculate the probability that each of the {\tt XX} locations is governed by the LLM. % (in total, and by dimension) <<>>= m <- matrix(0, nrow=length(trXX), ncol=3)#ncol=5) for(i in 1:length(trXX)) m[i,] <- as.double(c(out$XX[i,], mean(trXX[[i]]$b))) m <- data.frame(cbind(m, 1-m[,3])) names(m)=c("XX1","XX2","b","pllm") m @ The final column above represents the probability that the corresponding {\tt XX} location is under the LLM (which is equal to {\tt 1-b}). \begin{figure}[ht!] \centering <>= trALC <- out$trace$preds$Ds2x y <- trALC[,1] for(i in 2:ncol(trALC)) y <- c(y, trALC[,i]) plot(log(trALC[,1]), type="l", ylim=range(log(y)), ylab="Ds2x", main="ALC: samples from Ds2x") names <- "XX[1,]" for(i in 2:ncol(trALC)) { lines(log(trALC[,i]), col=i, lty=i) names <- c(names, paste("XX[", i, ",]", sep="")) } legend("bottomright", names, col=1:ltrXX, lty=1:ltrXX) @ <>= graphics.off() @ \includegraphics[trim=55 25 65 20]{tgp-traces-alc} \caption{Traces of the (log of the) samples for the ALC statistic $\Delta \sigma^2(\tilde{\mb{x}})$ at for each of the three {\tt XX} locations} \label{f:preds} \end{figure} Traces of posterior predictive and adaptive sampling statistics are contained in the \verb!$preds! field. For example, Figure \ref{f:preds} shows samples of the ALC statistic $\Delta \sigma^2(\tilde{\mb{x}})$. We can see from the trace that statistic is generally lowest for {\tt XX[3,]} which is in the uninteresting region, and that there is some competition between {\tt XX[2,]} which lies on the boundary between the regions, and {\tt XX[1,]} which is in the interior of the interesting region. Similar plots can be made for the other adaptive sampling statistics (i.e., ALM \& EI). tgp/vignettes/tgp2.Rnw0000644000175100001440000001563012506600653014446 0ustar hornikusers\documentclass[12pt]{article} \usepackage{Sweave} %\SweaveOpts{eps=TRUE} %\usepackage[footnotesize]{caption} \usepackage{caption} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amscd} \usepackage{epsfig} \usepackage{fullpage} %\renewcommand{\baselinestretch}{1.5} \newcommand{\bm}[1]{\mbox{\boldmath $#1$}} \newcommand{\mb}[1]{\mathbf{#1}} \newcommand{\mc}[1]{\mathcal{#1}} \newcommand{\mr}[1]{\mathrm{#1}} \newcommand{\mbb}[1]{\mathbb{#1}} %\VignetteIndexEntry{new features in tgp version 2.x} %\VignetteKeywords{tgp} %\VignetteDepends{tgp,maptree} %\VignettePackage{tgp} \begin{document} \setkeys{Gin}{width=0.85\textwidth} <>= library(tgp) options(width=65) @ \title{Categorical inputs, sensitivity analysis,\\ optimization and importance tempering\\ with {\tt tgp} version 2, an {\sf R} package for\\ treed Gaussian process models} \author{ Robert B. Gramacy\\ Booth School of Business\\ The University of Chicago\\ rbgramacy@chicagobooth.edu \and Matthew Taddy\\ Booth School of Business\\ The University of Chicago\\ taddy@chicagobooth.edu } \maketitle \begin{abstract} This document describes the new features in version 2.x of the {\tt tgp} package for {\sf R}, implementing treed Gaussian process (GP) models. The topics covered include methods for dealing with categorical inputs and excluding inputs from the tree or GP part of the model; fully Bayesian sensitivity analysis for inputs/covariates; %multiresolution (treed) Gaussian process modeling; sequential optimization of black-box functions; and a new Monte Carlo method for inference in multi-modal posterior distributions that combines simulated tempering and importance sampling. These additions extend the functionality of {\tt tgp} across all models in the hierarchy: from Bayesian linear models, to CART, to treed Gaussian processes with jumps to the limiting linear model. %, except in the case of multiresolution models which apply only %to the (treed) GP. It is assumed that the reader is familiar with the baseline functionality of the package, outlined in the first vignette \cite{gramacy:2007}. \end{abstract} \subsection*{Intended audience} \label{sec:discaimer} The {\tt tgp} package contains implementations of seven related Bayesian regression frameworks which combine treed partition models, linear models (LM), and stationary Gaussian process (GP) models. GPs are flexible (phenomenological) priors over functions which, when used for regression, are usually relegated to smaller applications for reasons of computational expense. Trees, by contrast, are a crude but efficient divide-and-conquer approach to non-stationary regression. When combined they are quite powerful, and provide a highly flexible nonparametric and non-stationary family of regression tools. These treed GP models have been successfully used in a variety of contexts, in particular in the sequential design and analysis of computer experiments. The models, and the (base) features of the package, are described the vignette for version 1.x of the package \cite{gramacy:2007}. This document is intended as a follow-on, describing four new features that have been added to the package in version 2.x. As such, it is divided into four essentially disjoint sections: on categorical inputs (Section \ref{sec:cat}), sensitivity analysis (Section \ref{sec:sens}), statistical optimization (Section \ref{sec:optim}), and importance tempering (Section \ref{sec:it}). The ability to deal with categorical inputs greatly expands the sorts of regression problems which {\tt tgp} can handle. It also enables the partition component of the model to more parsimoniously describe relationships that were previously left to the GP part of the model, at a great computational expense and interpretational disadvantage. The analysis of sensitivity to inputs via the predictive variance enables the user to inspect, and understand, the first-order and total effects of each of the inputs on the response. The section on statistical optimization expands the sequential design feature set described in the first vignette. We now provide a skeleton which automates the optimization of black-box functions by expected improvement, along with tools and suggestions for assessing convergence. Finally, the addition of tempering-based MCMC methods leads to more reliable inference via a more thorough exploration of the highly multi-modal posterior distributions that typically result from tree based models, which previously could only be addressed by random restarts. Taken all together, these four features have greatly expanded the capabilities of the package, and thus the variety of statistical problems which can be addressed with the {\tt tgp} family of methods. Each of the four sections to follow will begin with a short mathematical introduction to the new feature or methodology and commence with extensive examples in {\sf R} on synthetic and real data. This document has been authored in {\tt Sweave} (try {\tt help(Sweave)}). This means that the code quoted throughout is certified by {\sf R}, and the {\tt Stangle} command can be used to extract it. As with the first vignette, the {\sf R} code in each of the sections to follow is also available as a demo in the package. Note that this tutorial was not meant to serve as an instruction manual. For more detailed documentation of the functions contained in the package, see the package help--manuals. At an {\sf R} prompt, type {\tt help(package=tgp)}. PDF documentation is also available on the world-wide-web. \begin{center} \tt http://www.cran.r-project.org/doc/packages/tgp.pdf \end{center} Each section starts by seeding the random number generator with \verb!set.seed(0)!. This is done to make the results and analyses reproducible within this document (assuming identical architecture [64-bit Linux] and version of {\sf R} [2.10.1]), and in demo form. We recommend you try these examples with different seeds and see what happens. Usually the results will be similar, but sometimes (especially when the data ({\tt X},{\tt Z}) is generated randomly) they may be quite different. \SweaveInput{cat.iRnw} \SweaveInput{sens.iRnw} \SweaveInput{optim.iRnw} \SweaveInput{it.iRnw} %\iffalse \subsection*{Acknowledgments} This work was partially supported by research subaward 08008-002-011-000 from the Universities Space Research Association and NASA, NASA/University Affiliated Research Center grant SC 2003028 NAS2-03144, Sandia National Laboratories grant 496420, National Science Foundation grants DMS 0233710 and 0504851, and Engineering and Physical Sciences Research Council Grant EP/D065704/1. The authors would like to thank their Ph.D.~advisor, Herbie Lee, whose contributions and guidance in this project have been invaluable throughout. Finally, we would like to thank two anonymous referees whose many helpful comments improved the paper. %\fi \bibliography{tgp} \bibliographystyle{plain} \end{document} tgp/vignettes/motovate_btgp.pdf0000644000175100001440000013470312506600653016452 0ustar hornikusers%PDF-1.4 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 3 0 obj << /Type /Page /Parent 2 0 R /Resources << /XObject << /Im0 8 0 R >> /ProcSet 6 0 R >> /MediaBox [0 0 504 360] /CropBox [0 0 504 360] /Contents 4 0 R /Thumb 11 0 R >> endobj 4 0 obj << /Length 5 0 R >> stream q 504 0 0 360 0 0 cm /Im0 Do Q endstream endobj 5 0 obj 31 endobj 6 0 obj [ /PDF /Text /ImageC ] endobj 7 0 obj << >> endobj 8 0 obj << /Type /XObject /Subtype /Image /Name /Im0 /Filter [ /RunLengthDecode ] /Width 504 /Height 360 /ColorSpace 10 0 R /BitsPerComponent 8 /SMask 15 0 R /Length 9 0 R >> stream            & ZC )ւ , b  9t  + (+(+}Yd}:d}0~k~*IIFIdIOW[OeIxxLHSS`OxIqGERhzET\[tdETE1Y~kN4cE]K`KKKLG&&t"&m !  Qwm9I6+;t%Q( ^       Q t   )%CQR  Z|m66q$$ endstream endobj 9 0 obj 24004 endobj 10 0 obj /DeviceRGB endobj 11 0 obj << /Filter [ /RunLengthDecode ] /Width 106 /Height 76 /ColorSpace 10 0 R /BitsPerComponent 8 /Length 12 0 R >> stream  <_T0D`ق < A    G#fXS ~ 4N gk/ ! #\8   {L 4d6( fp iF@ϊ+&&3+$G|Vj)0P 4 %%90u56ia"6o &&47flW^gYYafuq*, S7_ZQb`3V=59,1Fs9H~?GM c  r (h Qt FNXy) Th A>m ?ng zI3; ̓L"  g5O =  Qm? g e 4+;!S R" W0]k I $.u1 6 f  e   =Y l L  v > 0    }  'Lz ^r   `} A݂|y? 2  endstream endobj 12 0 obj 3380 endobj 13 0 obj endobj 14 0 obj 3380 endobj 15 0 obj << /Type /XObject /Subtype /Image /Name /Ma0 /Filter [ /RunLengthDecode ] /Width 504 /Height 360 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 16 0 R >> stream fݙDUD33݈Uf3ff" ݻ3DUUf"U3Uf333w333DD33݈UwwUDDÜ"UU f"UDU"ݻDUUD̈"UUUDff  w33w Uwwf3UD""3UDD"fD"wwwffwUDD3DDw 3ww3fD" 3DUDDUDDfU  3DDwDUU  ݈ ݈ ݻ DDDD3ff f3" ݪ "U3Dww"DDDD" 3 ww D3 ff3Üwf ̻fw fDUÜÜݻD w UU f݈f fD3D ffUU"f݈f݈ff 3݈ UfwfD3D"3"DDDDUUۈωDDDDUDD wUDDwUD"U3DDwfwf3DD"D"DfDDDDwUwU3DDDf3D3̙DDD"wU33DDD f"U UUf3DDUf 3̈UN̻"DD3ffDD"DD"DDfDDUDD3DDDD"D"DDf3DD3fDDf3DDDUUDDD3wDDUDw3UDD3̻݈U̪DDf3UDݙD""w3̪D""DwUUUDDDUw3̪D""DfDwUDݙD33"w"DfĂDD 3݈DDDuDuǂ̻fݙ"3@DuǤ[" 3f"f"߉DuǂϷDwfĭw"DD""uǂU"݈UD"fDffD"݈uǂUwDD f"D"ݪD"UffD3"fuǤf"U ̈3݈DD3wf"DDuǂD̻f̈D݊DuǂUD"3Duǂf3DuǤUUDuǂUUDDwDuǂfDDw3"ff3DDuǂf3f3DẅݙDU"DuǤ U"DݻDf݈f3"Duǂf̻f3D"UDDw3w"DuǂDf"DUٙ3̈ٻwDDuǂUww33N3DuǤf3fU fw߈kDuǂ3"UfֈDwDuǂUf33Uwѻf"Duǂf3f3Df3fDuǤU33 iwDuǟ"fw3f "ڈ Duǟf"33fw3Duǟ3D3"UUUDuǤUwDf33"Df3DuǠU"̭UDfwff3Duǡ"fffUf3Duǡww"3 DUf3DuǤ33̯3U w3w݈f3DuǢ33wD""f3Df3DuǢww"D3fUf"D̈DuǢ"ݱ"fwfݻw"̪D3w̻UDD3DuǤU3w""f3wwݻfDDU"DuǣUw3"f"fD3" DfݻU3DU̻UDDuǤ"3ݪ"f"D Dw̻DD"DD̻UDDuǤwUfUwww"wU DfݗUDDD"DuǤ3f UUD3"D3"f݈"̈"UU"3w3D3fwDU3UwDuǤ3 UfU3D"D݈"fDDD"fUUfwDuǤff3f"Uݻ̪U3fDDf"wDDuǤUUD3Ư"33D3"w"Uwf3wDDuǥD3UU"wUfUf݈f݈3ݙ̻݈ݙDuǥDw DffU"D"z"̙"wU"fUDw3Dw3Dw3Duǥwfݸw UwfwffwUDuǥ33 Dw33"DwDDDuǥwf33UU"ljf UwݻfֻDuǥDDf3w33i Dw"UDݙuwU33U"3DD"￈www3UUf3D""uU"w\DUffUw""UU""wĴuw3D̵f3"wi"DDwD"DUD`N3#"DDiD̈DD0DDuw3D3DD"3D3 3D3"DDwf3fDUUU"D3UUf3DD0DDD""Di̻$ߏf3w݈̻f""3DU3Ǫ컧UDf3"Df̻Dݙuf͏3fȾuڬu*~쑑uеڑ왇uDDḭu~ʧ߈@ݻ3fÜDUDDP\P͂wfDwLjǻD֖i[Du׿&߈߻ѻػֻ֣DUf"f"ff"f݈3DD "wDDu(ѿڻ߻ǿU[UDUw3ȧݴ̈3D̈i3 UU"Du3wDD3' \Ȉ"ÏDU\\DiD\uw wD3"Df3f3w3wU3 Du ݈3DÙ̈D\3D3w"DȈpDU"wU݈DuUwU3 3ⵈw[3Dw 3"D̈"Duǿ DNwU ̕ݫwwDDfU݈ݪw"wݻfDD"D"DuǾw"f Df֣Dֈ3߀D3D""̪3ݻ݈Duǥfw3"̙ݪ3w3fDDuǥ ݯw3DwfUfUff"DDw3fDuǥ Uw3U33f Df3"U"DDfUD"Duǥ D뗈fDD"f3UD3D"̻UD3U̻Duǥ "ffDf3DfUD3"D3DuǤ w@DD"DDwwD"f"U333fDD"DDuǤ ߂Uw3̗33Uf3"DDwf̈D"DfDuǤ ?ff"fUf33wDf""UDD wf"Uf3DUwDD"DuǤ D "fUUf"P D3DfUUD"\fD"D3uǤUf DDDw3Df "UUݙ Df"DD33ݙݙ"UUff 3DfD3DwDDU3uǤLjDi݈3Dݙ33i ̻fDUu33"D3Dݙ3wU 3Df"Dww3DUDuǤDN3wDf 3Dw "3333D̈3wfDD3DuǤDwꏏߧu"U3ݦDfDfD3""fD"D"uǣ33ѻւw3" UfUDDDfwD"uǤ"U@www"""UDD3D""Duǣ3DU""33̈D3Uݙf3݈̈3Df3uǣDݻwݻ3f3D3DfD"uǣ f3"3fUD"ffwUf33w"DDuǤwfDUD3Df3"DDuǣD 3ffU3ff3"3DuǣD굙i3f DD̪DDfݙ"fݻDDuǢכUU"3w3"wf݈U"3Df3uǤ333U""3fD"uǢ"DUf3"f3DDDuǢD"wDwwwUݙ"wDuǢfẁ3"3w"D"݈w"DuǤwDND33ݻ݈3Uݙ"DuǢDww33wf3UfU"DDDwuǢ3D"DDwfU3w3 "DwfDwuǡ3݈3U""wfDf"DD""fDD3wuǤff33UwD"D33 U݈"DDDuǡ3"w"UfDUD3w3ݙuǡDD["Dw3"D""uǡwDUU"ݙ"fD"uǤf3"U"wDw "UD""uǡD3"3"wDDf"ݞDݙuǡ"DǿUwDfw"DuǠ""""3Uw`3"DuǤDD"ffD̂DuǠ3"֪"fȻ""3ݻfDuǠD w@w@"f3"Dfՠ zfUww"D"wfD""uǤf 3謹DDf3D"3ݪ3UD"݈uǠD ݤ괿DU33wU"D3"fuǠ"DD3UDUU݈Dw"DfuǟifDDwfk"fDffwwDuǤ DUUf3 U3fwDDuǟ D"Ư"UDD 3"w3fwDuǟDw̏3Dי̈UfUwwDuǟDw"Df"D"D3"ffDuǤUD0DD3"ݙDfuǟD 3UU3DUfݻwDuǞDfDD3i"f3DuǞfD3fwUDuǤwD3Dw""`fU3UDuǝf݈ff"""D3UfDuǝUDw3fwPUf"DuǜU3"3UUD̗DuǤffU3UwݒDuǜUUpU̪w3DuǛ`3U"D3D"݂DuǛUffݻ݈3"DwݻffDuǤUwD""ffD̄""UDuǚwwfwDf"ݪDDuǚU݈DwkfDDÜ3"wfUUDuǚf""Df3w݈"3U"3"fDuǤ"wD"wUDuǙw݈Dw"3f3̂DuǙfww"UwDuǘ "Dw3DuǤfffwD3"݂DuǘDUwffDuǘ33D`fU""ݒDuǗw3ffDfDuǤ3D̻U"3"`DDuǖ3D"fU3̈Df3ff̈UDuǖw"""UfDU3DuǖDu33"̂DuǤU3"wDݙuǕD D3p̈w"D""uǕfw݈fw"f3f3"̂DuǕ "3Df33fD""uǤUwD3fUDݙuǓUw"3DuǓ0D"Dw̻33̏DuǓfDUfwUwDݙuǤDUD"DD""uǒ"D"f"DuǒDfݻ"3D""uǒf DUDDݙuǤD D"Uf3D3"3DDґ3"љff3݈̪f3̂D"D~f"3DfDw3wDDk"fDfDD U w""ff3DDD fߗ""fD3UDf3DݙD3DD fݻDDfw"33 wDfDff 3U3UDDU3DDffDU"݂DD"DDDfDDwDUw3w"f3ݻDD"UfU"D̪̙DD"DDD3333U3DUf݂DfDwDD3D3̂DD3fDUwwDDUUwfwfu3D U""DDf3DfDff3̈DD "P"3DwDDfDĈf"DD3wU""̂DD""D"UwDD w"ww"w3DDPw w"fwwfw"݂DD333U"DD3"wDDD"fDU33DDw ψ3""3w3DDP "̻ffݻ̻"fDD3Pw3 @DD3UDDU3wwDDD"D3DDDD3U"DD"Uf"wD"̂DD3"wDDwwUDDDDDUDDDf3"DD̻DfDDf3DDDDUD̂DDfDD""DDDUݿ3DDDDDDDDDDDDDD f3 333" D wU3DD"""f33DD333"" D33̂w3U"3w"""fD33f"33""33݂  D 3 UU3D"U 3  D݂ "3 endstream endobj 16 0 obj 18421 endobj 17 0 obj << /Title (motovate_btgp.pdf) /CreationDate (D:20110401184121) /ModDate (D:20110401184121) /Producer (ImageMagick 6.5.8-4 2009-12-15 Q16 http://www.imagemagick.org) >> endobj xref 0 18 0000000000 65535 f 0000000010 00000 n 0000000059 00000 n 0000000118 00000 n 0000000300 00000 n 0000000383 00000 n 0000000401 00000 n 0000000439 00000 n 0000000460 00000 n 0000024664 00000 n 0000024685 00000 n 0000024712 00000 n 0000028237 00000 n 0000028258 00000 n 0000028274 00000 n 0000028295 00000 n 0000046909 00000 n 0000046931 00000 n trailer << /Size 18 /Info 17 0 R /Root 1 0 R >> startxref 47115 %%EOF tgp/vignettes/sin.iRnw0000644000175100001440000001167212506600653014536 0ustar hornikusers\subsection{1-d Synthetic Sine Data} \label{sec:sin} <>= library(tgp) ##options(width=65) seed <- 0; set.seed(seed) @ Consider 1-dimensional simulated data which is partly a mixture of sines and cosines, and partly linear. \begin{equation} z(x) = \left\{ \begin{array}{cl} \sin\left(\frac{\pi x}{5}\right) + \frac{1}{5}\cos\left(\frac{4\pi x}{5}\right) & x < 9.6 \\ x/10-1 & \mbox{otherwise} \end{array} \right. \label{e:sindata} \end{equation} The {\sf R} code below obtains $N=100$ evenly spaced samples from this data in the domain $[0,20]$, with noise added to keep things interesting. Some evenly spaced predictive locations {\tt XX} are also created. <<>>= X <- seq(0,20,length=100) XX <- seq(0,20,length=99) Ztrue <- (sin(pi*X/5) + 0.2*cos(4*pi*X/5)) * (X <= 9.6) lin <- X>9.6; Ztrue[lin] <- -1 + X[lin]/10 Z <- Ztrue + rnorm(length(Ztrue), sd=0.1) @ By design, the data is clearly nonstationary in its mean. Perhaps not knowing this, a good first model choice for this data might be a GP. <<>>= sin.bgp <- bgp(X=X, Z=Z, XX=XX, verb=0) @ \begin{figure}[ht!] \centering <>= plot(sin.bgp, main='GP,', layout='surf') lines(X, Ztrue, col=4, lty=2, lwd=2) @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-sin-bgp} %\vspace{-0.25cm} \caption{Posterior predictive distribution using {\tt bgp} on synthetic sinusoidal data: mean and 90\% pointwise credible interval. The true mean is overlayed with a dashed line.} \label{f:sin:bgp} \end{figure} Figure \ref{f:sin:bgp} shows the resulting posterior predictive surface under the GP. Notice how the (stationary) GP gets the wiggliness of the sinusoidal region, but fails to capture the smoothness of the linear region. The true mean (\ref{e:sindata}) is overlayed with a dashed line. So one might consider a Bayesian treed linear model (LM) instead. <<>>= sin.btlm <- btlm(X=X, Z=Z, XX=XX) @ MCMC progress indicators show successful {\em grow} and {\em prune} operations as they happen, and region sizes $n$ every 1,000 rounds. Specifying {\tt verb=3}, or higher will show echo more successful tree operations, i.e., {\em change}, {\em swap}, and {\em rotate}. \begin{figure}[ht!] \centering <>= plot(sin.btlm, main='treed LM,', layout='surf') lines(X, Ztrue, col=4, lty=2, lwd=2) @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-sin-btlm} %\vspace{-0.25cm} <>= tgp.trees(sin.btlm) @ <>= graphics.off() @ \vspace{-1cm} \caption{{\em Top:} Posterior predictive distribution using {\tt btlm} on synthetic sinusoidal data: mean and 90\% pointwise credible interval, and MAP partition ($\hat{\mathcal{T}}$). The true mean is overlayed with a dashed line. {\em Bottom:} MAP trees for each height encountered in the Markov chain showing $\hat{\sigma}^2$ and the number of observation $n$, at each leaf.} \label{f:sin:btlm} \end{figure} Figure \ref{f:sin:btlm} shows the resulting posterior predictive surface ({\em top}) and trees ({\em bottom}). The MAP partition ($\hat{\mathcal{T}}$) is also drawn onto the surface plot ({\em top}) in the form of vertical lines. The treed LM captures the smoothness of the linear region just fine, but comes up short in the sinusoidal region---doing the best it can with piecewise linear models. The ideal model for this data is the Bayesian treed GP because it can be both smooth and wiggly. <<>>= sin.btgp <- btgp(X=X, Z=Z, XX=XX, verb=0) @ \begin{figure}[ht!] \centering <>= plot(sin.btgp, main='treed GP,', layout='surf') lines(X, Ztrue, col=4, lty=2, lwd=2) @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-sin-btgp} %\vspace{-1cm} \caption{Posterior predictive distribution using {\tt btgp} on synthetic sinusoidal data: mean and 90\% pointwise credible interval, and MAP partition ($\hat{\mathcal{T}}$) \label{f:sin:btgp}. The true mean is overlayed with a dashed line.} \end{figure} Figure \ref{f:sin:btgp} shows the resulting posterior predictive surface ({\em top}) and MAP $\hat{\mathcal{T}}$ with height=2. Finally, speedups can be obtained if the GP is allowed to jump to the LLM \cite{gra:lee:2008}, since half of the response surface is {\em very} smooth, or linear. This is not shown here since the results are very similar to those above, replacing {\tt btgp} with {\tt btgpllm}. Each of the models fit in this section is a special case of the treed GP LLM, so a model comparison is facilitated by fitting this more general model. The example in the next subsection offers such a comparison for 2-d data. A followup in Appendix \ref{sec:traces} shows how to use parameter traces to extract the posterior probability of linearity in regions of the input space. tgp/vignettes/motovate_bgp.pdf0000644000175100001440000013156312506600653016267 0ustar hornikusers%PDF-1.4 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 3 0 obj << /Type /Page /Parent 2 0 R /Resources << /XObject << /Im0 8 0 R >> /ProcSet 6 0 R >> /MediaBox [0 0 504 360] /CropBox [0 0 504 360] /Contents 4 0 R /Thumb 11 0 R >> endobj 4 0 obj << /Length 5 0 R >> stream q 504 0 0 360 0 0 cm /Im0 Do Q endstream endobj 5 0 obj 31 endobj 6 0 obj [ /PDF /Text /ImageC ] endobj 7 0 obj << >> endobj 8 0 obj << /Type /XObject /Subtype /Image /Name /Im0 /Filter [ /RunLengthDecode ] /Width 504 /Height 360 /ColorSpace 10 0 R /BitsPerComponent 8 /SMask 15 0 R /Length 9 0 R >> stream "6h9 ` 6     ZKP  "  "   )     4   %  4 %6"6o  Q 9)? mCKCh?9 m   o    ?       %" % (    L4,&Go6   t !oh|Yo$6Ђ endstream endobj 9 0 obj 23310 endobj 10 0 obj /DeviceRGB endobj 11 0 obj << /Filter [ /RunLengthDecode ] /Width 106 /Height 76 /ColorSpace 10 0 R /BitsPerComponent 8 /Length 12 0 R >> stream A΂k & :m W v   ** 39K2pyv  c  y  %%m4\ d}^P /  R\{ ! \'F cM  &% ۂK;]:\  endstream endobj 12 0 obj 2782 endobj 13 0 obj endobj 14 0 obj 2782 endobj 15 0 obj << /Type /XObject /Subtype /Image /Name /Ma0 /Filter [ /RunLengthDecode ] /Width 504 /Height 360 /ColorSpace /DeviceGray /BitsPerComponent 8 /Length 16 0 R >> stream D U wU" U3Uwf"U333333333f3D3݈UU3݈D"!"UUU"ݻUDUU!ff"UU3U""33U3D"3D"ff 3UwwwUDD D3wDDwDDff wDD U ݻ ݈ ݈  w"w!3wf"fD"D"D"D"" " ff D"D" ww DݻUf33 f 3 UU UD!3݈"fw݈DDfU fU D UDDŵDDDDDUUDDDDDDDDDD"wf3DD "݈D3UwDfDDDwDfݙ"3DDDPwݻ3DDDwUU݈3DDDUDf3DD"̙fDfUN̻"DDfDffDDD"݂DD"DDẅDDDDDD3DDwU3DD"D݂DDfDDD"݂DDfff3DDD"fwDDDwU3݂DDDDw3UDDD̻݈fDDf3DݙDD"wwD""DfUU̙DDDDUwUD""DfDfDݙD""ẅDfĂ0D 3݈DDD̙DDDuǂw̻fݙ"3ݪ3Duǂ3ݏw" 3f" f3݂DuǂDDwff33D""uǂfU"݈UDf3"3D"݈uǂDD f"D3ݷ@"3wwD3"fuǂ"U ̈33ݷ߈DDDDuǵDDwD̻ ̈""݈UfUDDuǽ "fUfݻ̪"D""݈DD"DݻDwDݪw3DuǾ "݈fDw3w݈DwwݙUDf"ݙU3f3DuǾUDffDU"3f3Du3̈D̪"DDwDf"wDuUw݈3DDw3D"3 3ݻwDD "ww"3DuUDf3fwݪwD3U 3Dw"f݈33Du3"DDݻfD̻"ݦ"D3̈D"fݻDf3"fݪDf3DuUDDD""wf3̻f3DfUDDw3wfݻDfUDu3ݻU3̙UD3݈3f݈3fwDf"DU3wUٻwfݻDfUDuDDfwf3f3w3̈3N3UwfUDuDf3"3 fw"Dݻ̙wD"wUDuǥwwUDUfֈDw3"U̙wD"w݈DDuǥ"ݢ333Uwѻf "Ü̪3DuǤfwDDf3"D"DuǤDUD3݈iwDuǣ3fD "wDuǣf"fwDuǢ"3fUUDuǢwUU33"DDuǢ"Uf33wfDuǡfD33fUDuǡD̩f UDUDuǠUwD ݈w݈DuǠf3f"""DDuǟ3fD3wDuǟwffwfwݻwDuǟݪ"D"̙3wDuǝ"D""3"ݐDuǝDf3ݪDf3DDuǝf3UDww"wUw3"DD"DuǜD"UD3D3"f݈"̈"UU"3w3fwDU3UwDuǜfwUfU3D"D"fDDD"fUUfwDuǛD 3fUݻ̪3݈3fDDf"wDDuǛD"ٻ3݀"3 "D3"w"Uwf3wDDuǚDw3f3U"wU3UfUf݈f݈3ݙ̻݈ݙDuǚD"ffUD"3̈Uf"̙"wU"fUDw3Dw3\3DuǙ33UffwUw3wUUwDuǙDwDwf3U݈UDw"3f"DuǶ3f3Df33UU ""ff"f "Dwݻ̻f3D"fw3Duǻ D݈f3f333"wDDDDf ̻UDDÜUDݙuwU3 3wD"U3Uw"3DD"fU3Dz3̪f"D""uU"w\DUffUfȻ"DwD3UDw""wDD"3"wiz"Dwf̙D"DUD`N3#"DDiD̈DD0DDuw3P"3D3w݈ 3DD"3"DDݹ3"DUUUwUUݪff3 fDDD""Di3ݙ$fݙ̻3ᙪ݈ݏ3ݟf3w݈̻wfff wDw݈w3""3DUw3wDDUff3 UU̙DDݙuf͏""iݻf*33w3D"PDf"f"ffUݯݻ3UUf"DfD̈DUDDD"UUf"3UUp33DuU&DD""D[uU"Up"3U"֣Df"w 3"3f"ff"f݈UfU݈Dwf "wDDu޿iψfD3(3w`׿wDׯNǯ"`f3U[UfUw3̙Pf33̈̈3D̈iUf3 DݪD UU"Du?3wDDi߯[D"Ȉ"ÏDU"ݙ"3"D3wwDDfUUf"3w3wUf"wݪDU3 Du ݈3D "DUÙ̈D\3D3""ufwDwfUUD3̈3U݈DuUwU3fⵈw[iDw3f3̻ݙUwUDUݻw"Duǿ DNwU f{ݫfϻUwD̟UD"f݈DD"D""wݪfDuǾw"f D֣D3f3ֈD""̪3ݻ݈DuǤDw3Uww3fDDuǤ Dzw33f""f"DDw3fDuǣUNUw"f Df3"U"DDfUD"DuǣDݪpfD33D33UD3D"̻UD3U̻DuǢwffUDDfDfUD3"D3DuǢ3"w@fU"DD[w"k333fDD"DDuǡUU"333҈LjUf3"DDwf̈D"Duǡ刈ff3ffw3Df" wf"UfDuǡψ"DwUfUDD̟fff""D3uǡf DDDw@ D"UUݻ Df"3D"UUDU3uǟ"݈D Dݙ33 ̻fUD"3Dݙ3DUDuǠ33w̧ D3D" N@w3D݂Duǡwwꏏߧuw3"ݙDUwU3̂D"uǡ3ѻւD UfUD3̈D"uǡ"fU@w""`"UD"""Duǡ3DU"D 3Ȼ̈DUրẅ3Df3uǠݻݻffD3fD"uǟ3D3"fwU"wU"DDuǛ"f"D3"3̈DDuǛ wff3"3"ww33DuǛ3ઙi33fD̪fDUwݻDDuǛiUU"3wU3"U""3Df3uǜ3w3"wUUf3U̙D"uǜD"DfUDfD3̪DDD 3UD"Duǜ"DDUfwf̙f"3ݪfDf̙3 wDDuǸD3w̶3ND"3"D""f3Dw"3f"̙3ffDDuǿ33UDD0Dfݻ݈DDw݈Df3ݙ3Dww3UDuD݈ݪ"3ffUUf"wf fUf3f3Dwuw333fwDDDfUfUUfUDwufݪ"3وf3wwf" ffD3wu"wDUff3Pw"f3"D33"""wݙUDDDuwDU"DU"3̈wff"DUwݪD"̈3D3w3ݙu "wDẅfD 3ff3D["UDw3"wf̻fD݈"D""u 3wݻwD3D3ffDD݈DUU ݙ""DwfݻfD"u 3Dw333"wfwDf"P"""3D""u"DU3Uf3D3DDDfffݙDUwDݙuǦ"DݷU3fw""f̈3Df"Duǥ""D3Uw@3U̙Dww3Duǥ33D"wf"DDDuǤ"""w""3 DuǤ3 w@w3"wU""`DfգU zfU"w" "3"wwfD""uǢ 3謹DDwD"3ݪ"D"݈uǢ" ݤ괿D3U"U"D3"fuǡw DD3ψU"Dwf݈Dw"DfuǠfifDDw0p"DD3DwwDuǠ "DUDw fU3f3wDDuǟ "Ư"UD3"̂"fwDuǞw̏3Dݏ̈DfUwwDuǞwDw"D`""3D3"ffDuǞ"D"fD"3"̂Dfuǝw 3U 3"wfȈwDuǝ3fDf"i"DDDuǜ"D3UDfUDuǜwwDfDD""@fUiDuǜ3݈fDwD3UDuǛ"Dw3f"DwUzDuǛwUU"3UD"DuǛ3"UDUwp3Duǚ"UfwD̪Duǚ""UD3DDuǚ"Df"fDfݻf3DuǙDwDڈ""UfD""wDuǙDwwwPD3DuǙw݈Dw"DfDDUDuǙ""f"D D wU"3"UDuǘ"Df"wUfDuǗ ݈Dw"ffD""DuǗwwU3wDDf3̂Duǖ ""DD3"UDuǖwffwDUw3PDuǖ"U3Uwf"݂DuǕ`fUw"fDuǕ`33D"ݻDfDuǕU̻U3"w"DuǕUD"fU3̈Df3ffֈ"݂Duǔ"zUfDUfDuǔU3fUDuǔUUD3Dݙuǔ"D3ff̈33D""uǓ݈fw""3fwwDuǓ3f"3D""uǒD"D݂DݙuǒUUf"3fDuǒ"i"DU"̻3UDuǑU"wUDݙuǑDw"̂D""uǐDDU"DDuǐffݻ"UwDD""uǐf DUf"Dݙuǐ "UD"U"3D33DDҏ "љfff݈̪"D"D~ "3D"DwU3DD3kfDfUDD f w"""fwDDD ݈ߗ"fD3wDDf3D3ݙD3D""ݻDDffwf3wwDfDU3U3wDDD33DDff"""݂DDfDDUUfDD"DUD3ww"U"3ݻDD3UfUD ̪̙" D"wDDw3U3UUf"DfD"DD"̂DDf3D3UwwDDwUwfw3DUU"UDDD3DfDDD""zfݙDDDwww3wDDwUD3DD "D"UwwUDDπ w"ww"wDD w"fwwfw3DDN3U"DD3"UDDߛ"fDU3fDDw3 ψ3""3w3"DD̪D3 "̻ffݻ̻""݂DD3Dw3 @DD3fDD"3wwUDDDD3DDDDf3UDDUf"wDDDDU"@݂DDUwwDDDDDfDfDDU3DDDw̻D3݂DD33DwDDUDDUDD3fDDDDUݿ3DDDDDDDDDDDDDD f3 333" D wU3DD"""f33DD333"" D33̂w3U"3w"""fD33f"33""33݂  D 3 UU3D"U 3  D݂ "3 endstream endobj 16 0 obj 18098 endobj 17 0 obj << /Title (motovate_bgp.pdf) /CreationDate (D:20110401184102) /ModDate (D:20110401184102) /Producer (ImageMagick 6.5.8-4 2009-12-15 Q16 http://www.imagemagick.org) >> endobj xref 0 18 0000000000 65535 f 0000000010 00000 n 0000000059 00000 n 0000000118 00000 n 0000000300 00000 n 0000000383 00000 n 0000000401 00000 n 0000000439 00000 n 0000000460 00000 n 0000023970 00000 n 0000023991 00000 n 0000024018 00000 n 0000026945 00000 n 0000026966 00000 n 0000026982 00000 n 0000027003 00000 n 0000045294 00000 n 0000045316 00000 n trailer << /Size 18 /Info 17 0 R /Root 1 0 R >> startxref 45499 %%EOF tgp/vignettes/as.iRnw0000644000175100001440000001167412506600653014352 0ustar hornikusers\subsection{Adaptive Sampling} \label{sec:as} <>= library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) @ In this section, sequential design of experiments, a.k.a.~{\em adaptive sampling}, is demonstrated on the exponential data of Section \ref{sec:exp}. Gathering, again, the data: <<>>= exp2d.data <- exp2d.rand(lh=0, dopt=10) X <- exp2d.data$X Z <- exp2d.data$Z Xcand <- lhs(1000, rbind(c(-2,6),c(-2,6))) @ In contrast with the data from Section \ref{sec:exp}, which was based on a grid, the above code generates a randomly subsampled $D$--optimal design $\mb{X}$ from LH candidates, and random responses $\mb{Z}$. As before, design configurations are more densely packed in the interesting region. Candidates $\tilde{\mb{X}}$ are from a large LH--sample. Given some data $\{\mb{X},\mb{Z}\}$, the first step in sequential design using {\tt tgp} is to fit a treed GP LLM model to the data, without prediction, in order to infer the MAP tree $\hat{\mathcal{T}}$. <>= exp1 <- btgpllm(X=X, Z=Z, pred.n=FALSE, corr="exp", R=5, verb=0) @ \begin{figure}[ht!] \centering <>= tgp.trees(exp1) @ <>= graphics.off() @ \includegraphics[trim=50 50 50 20]{tgp-as-mapt} \vspace{-1cm} \caption{MAP trees of each height encountered in the Markov chain for the exponential data, showing $\hat{\sigma}^2$ and the number of observations $n$ at the leaves. $\hat{\mathcal{T}}$ is the one with the maximum $\log(p)$ above.} \label{f:mapt} \end{figure} The trees are shown in Figure \ref{f:mapt}. Then, use the {\tt tgp.design} function to create $D$--optimal candidate designs in each region of $\hat{\mathcal{T}}$. For the purposes of illustrating the {\tt improv} statistic, I have manually added the known (from calculus) global minimum to {\tt XX}. <<>>= XX <- tgp.design(200, Xcand, exp1) XX <- rbind(XX, c(-sqrt(1/2),0)) @ Figure \ref{f:cands} shows the sampled {\tt XX} locations (circles) amongst the input locations {\tt X} (dots) and MAP partition $(\hat{\mathcal{T}})$. Notice how the candidates {\tt XX} are spaced out relative to themselves, and relative to the inputs {\tt X}, unless they are near partition boundaries. The placing of configurations near region boundaries is a symptom particular to $D$--optimal designs. This is desirable for experiments with {\tt tgp} models, as model uncertainty is usually high there \cite{chaloner:1995}. \begin{figure}[ht!] \centering <>= plot(exp1$X, pch=19, cex=0.5) points(XX) mapT(exp1, add=TRUE) @ <>= graphics.off() @ \includegraphics[trim=0 0 0 45]{tgp-as-cands} \vspace{-0.5cm} \caption{Treed $D$--optimal candidate locations {\tt XX} (circles), input locations {\tt X} (dots), and MAP tree $\hat{\mathcal{T}}$} \label{f:cands} \end{figure} Now, the idea is to fit the treed GP LLM model, again, in order to assess uncertainty in the predictive surface at those new candidate design points. The following code gathers all three adaptive sampling statistics: ALM, ALC, \& EI. <>= exp.as <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", improv=TRUE, Ds2x=TRUE, R=5, verb=0) @ Figure \ref{f:as} shows the posterior predictive estimates of the adaptive sampling statistics. The error surface, on the {\em left}, summarizes posterior predictive uncertainty by a norm of quantiles. %%Since the combined data and predictive locations are not densely %%packed in the input space, the {\tt loess} smoother may have trouble %%with the interpolation. One option is increase the {\tt tgp}-default %%kernel span supplied to {\tt loess}, e.g., {\tt span = 0.5}. \begin{figure}[ht!] \centering <>= par(mfrow=c(1,3), bty="n") plot(exp.as, main="tgpllm,", layout="as", as="alm") plot(exp.as, main="tgpllm,", layout='as', as='alc') plot(exp.as, main="tgpllm,", layout='as', as='improv') @ <>= graphics.off() @ % do the including over here instead \includegraphics[trim=75 0 75 20]{tgp-as-expas} \vspace{-0.5cm} \caption{{\em Left}: Image plots of adaptive sampling statistics and MAP trees $\hat{\mathcal{T}}$; {\em Left}; ALM adaptive sampling image for (only) candidate locations {\tt XX} (circles); {\em center}: ALC; and {\em right:} EI.} \label{f:as} \end{figure} In accordance with the ALM algorithm, candidate locations {\tt XX} with largest predictive error would be sampled (added into the design) next. These are most likely to be in the interesting region, i.e., the first quadrant. However, these results depend heavily on the clumping of the original design in the un-interesting areas, and on the estimate of $\hat{\mathcal{T}}$. Adaptive sampling via the ALC, or EI (or both) algorithms proceeds similarly, following the surfaces shown in {\em center} and {\em right} panels of Figure \ref{f:as}. tgp/vignettes/moto.iRnw0000644000175100001440000001401712506600653014717 0ustar hornikusers\subsection{Motorcycle Accident Data} \label{sec:moto} <>= library(tgp) ##options(width=65) seed <- 0; set.seed(seed) @ %\iffalse The Motorcycle Accident Dataset \cite{silv:1985} is a classic nonstationary data set used in recent literature \cite{rasm:ghah:nips:2002} to demonstrate the success of nonstationary models. The data consists of measurements of the acceleration of the head of a motorcycle rider as a function of time in the first moments after an impact. In addition to being nonstationary, the data has input--dependent noise (heteroskedasticity) which makes it useful for illustrating how the treed GP model handles this nuance. There are at least two---perhaps three---three regions where the response exhibits different behavior both in terms of the correlation structure and noise level. The data is %\else %In this section we return to the motivating Motorcycle Accident %Dataset~\cite{silv:1985}, which is %\fi included as part of the {\tt MASS} library in {\sf R}. <<>>= library(MASS) X <- data.frame(times=mcycle[,1]) Z <- data.frame(accel=mcycle[,2]) @ Figure \ref{f:moto:bgp} shows how a stationary GP is able to capture the nonlinearity in the response but fails to capture the input dependent noise and increased smoothness (perhaps linearity) in parts of the input space. <>= moto.bgp <- bgp(X=X, Z=Z, verb=0) @ Progress indicators are suppressed. \begin{figure}[ht!] \centering <>= plot(moto.bgp, main='GP,', layout='surf') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-moto-bgp} %\vspace{-0.5cm} \caption{Posterior predictive distribution using {\tt bgp} on the motorcycle accident data: mean and 90\% credible interval} \label{f:moto:bgp} \end{figure} A Bayesian Linear CART model is able to capture the input dependent noise but fails to capture the waviness of the ``whiplash''---center--- segment of the response. <>= moto.btlm <- btlm(X=X, Z=Z, verb=0) @ Figure \ref{f:moto:btlm} shows the resulting piecewise linear predictive surface and MAP partition ($\hat{\mathcal{T}}$). \begin{figure}[ht!] \centering <>= plot(moto.btlm, main='Bayesian CART,', layout='surf') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-moto-btlm} %\vspace{-0.5cm} \caption{Posterior predictive distribution using {\tt btlm} on the motorcycle accident data: mean and 90\% credible interval} \label{f:moto:btlm} \end{figure} A treed GP model seems appropriate because it can model input dependent smoothness {\em and} noise. A treed GP LLM is probably most appropriate since the left-hand part of the input space is likely linear. One might further hypothesize that the right--hand region is also linear, perhaps with the same mean as the left--hand region, only with higher noise. The {\tt b*} functions can force an i.i.d.~hierarchical linear model by setting \verb!bprior="b0"!. <>= moto.btgpllm <- btgpllm(X=X, Z=Z, bprior="b0", verb=0) moto.btgpllm.p <- predict(moto.btgpllm) ## using MAP @ The {\tt predict.tgp} function obtains posterior predictive estimates from the MAP parameterization (a.k.a., {\em kriging}). \begin{figure}[ht!] \centering <>= par(mfrow=c(1,2)) plot(moto.btgpllm, main='treed GP LLM,', layout='surf') plot(moto.btgpllm.p, center='km', layout='surf') @ <>= graphics.off() @ \includegraphics[trim=50 25 50 20]{tgp-moto-btgp} <>= par(mfrow=c(1,2)) plot(moto.btgpllm, main='treed GP LLM,', layout='as') plot(moto.btgpllm.p, as='ks2', layout='as') @ <>= graphics.off() @ \includegraphics[trim=50 25 50 20]{tgp-moto-btgpq} %\vspace{-0.5cm} \caption{{\em Top}: Posterior predictive distribution using treed GP LLM on the motorcycle accident data. The {\em left}--hand panes how mean and 90\% credible interval; {\em bottom}: Quantile-norm (90\%-5\%) showing input-dependent noise. The {\em right}--hand panes show similar {\em kriging} surfaces for the MAP parameterization.} \label{f:moto:tgp} \end{figure} The resulting posterior predictive surface is shown in the {\em top--left} of Figure \ref{f:moto:tgp}. The {\em bottom--left} of the figure shows the norm (difference) in predictive quantiles, clearly illustrating the treed GP's ability to capture input-specific noise in the posterior predictive distribution. The {\em right}--hand side of the figure shows the MAP surfaces obtained from the output of the {\tt predict.tgp} function. The {\tt tgp}--default \verb!bprior="bflat"! implies an improper prior on the regression coefficients $\bm{\beta}$. It essentially forces $\mb{W}=\mb{\infty}$, thus eliminating the need to specify priors on $\bm{\beta}_0$ and $\mb{W}^{-1}$ in (\ref{eq:model}). This was chosen as the default because it works well in many examples, and leads to a simpler overall model and a faster implementation. However, the Motorcycle data is an exception. Moreover, when the response data is very noisy (i.e., low signal--to--noise ratio), {\tt tgp} can be expected to partition heavily under the \verb!bprior="bflat"! prior. In such cases, one of the other proper priors like the full hierarchical \verb!bprior="b0"! or \verb!bprior="bmzt"! might be preferred. An anonymous reviewer pointed out a shortcoming of the treed GP model on this data. The sharp spike in predictive variance near the first regime shift suggests that the symmetric Gaussian noise model may be inappropriate. A log Gaussian process might offer an improvement, at least locally. Running the treed GP MCMC for longer will eventually result in the finding of a partition near time=17, just after the first regime change. The variance is still poorly modeled in this region. Since it is isolated by the tree it could potentially be fit with a different noise model. tgp/vignettes/tree.pdf0000644000175100001440000026704212506600653014542 0ustar hornikusers%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xɒ$qd=&tr$%j!f bAb Lg}GGdUdNgv6.1%3=5<~ۮ|kNGM{؝}}vӮݟmMqnێ}헟اzw4w{n#>ߵKwߵ}tǟorf3uv{qMOjgn:/̳slݹ{qٓ #NB38s7C>~a{]N؝^7yoqoçۻ_>f?X77TH]^7~w tRk"X@i7nq}f=".Hn8-P]sc;$fn{'̙c$88d.HdTD%nNj:.f}Ӯ?;ň32|ޝ@0/AR Y$ Xx. e=\.)}RC[B v2VG@=GZV~ў0> X!*CJY sy9O"o5pڊ2ֲ`o!#o5 ]̻pcŕ  |?M˿\|c }p FR0JEZv9=$q,#O%ӲqYVɾpV}`Ҟ.fc:bEǎD#cE~Ģ%b3+~_F:l*]B eujgg#Y5)bԉ`T\jo4;)[Y/BŴnu^q{q)h#AЃ:wk~Yg'-ʗf. WYeaiٸjnbd##lv~۝^Qr:ǁgt̅ 0DsˠCu)  C;Ly?:aP~6# RΊ -,E؟Rg6Y;aC H}Nܒ8: wYw+ܢ-`Q=Z=)N&*$t{͓(D@]"$rJ#D ۸͔f-iL0'a)24z(,M" a0{7ZKN 'j*dKSZKN{lQi>M1x }bɸ.YH[ fswm֚NsbՐ夿fci>d]C-r^92nmJ랱~Ÿ{bOC盻|ug|wh|3)=̋^maPq99Zڎʔ lm -Kafag6pv񶃣_gB{8'0q\;%f1_"|wO5Q DX<<@ d6H4.͵ʯ`p0<F:$X[ɲ&#3ƌ5RN*ߧmOmR)lt `g]u48hr^&(AO>)Sj]Qљ^}jCR$]{qeÁڷ m4]'_+v/h0£ocnx) q p7J d$z<*p%5S8vxB0 K}`f(Z%nx?G:ˑZ֞3A8P5` .DQw M !ӘV43Ѥ6h@eQ`' tF׵1eeȰce10Esś&1E۰eކ^ EHidO ,㩨q)wfF -5Rb9O.j<|#:FP*cRg[SAK$4FDOeĎ=j5aO\qSӆpsW~6V̌;s 3ab(eV92q.FǔyfPV:A.g9[e=b~ (Z EHrvhlž* h_t"a=͉i zƂ#Ԕ^ e5*  %b o0 54ToVW?z2d"gQ&b,Ld*2D-·%ekImˡ4%2h9qHP̭e(Y7j@a$) juz@. {k~eR{/Z2yj]&(|*f󛒃 h]>y-n ` HPX%}Y;z8bdτe-\(bIvɖ8XJ<'_ާA$}pVɄȥ9mA5p@22RUĉh'j:8id9p2hP4 i6}VW``O =5Anb׵.eFD29 Y+i\)kqz7\+ck8RjD[.S(` ,%9xb m1#|)ѐ, & ,S߉o|FVOg$Zv֫ 4rsG  ֲ)t3)y,Z`]OGZ6FFW->%2RDja).jZoi&ڛ?c_/`jPZ(-;kSfj-8 Dr>;и8{]uȫgwnFJ r`)y+l#sIG"zuܑR&s|*KMvly1wfe%}gt;_/+Ñؓ o* O 9~ɑ>ۻ3_>xg0;H_we̷R^tD\q>Ǖܵmi&B^dLL괈>9/UXE*Uv "2 }jbqvo_m )5J\D٪`O7t>l,&f2{6R@Ϙߒ2[8 ae& I} !B-pM>(uPSHͶ jɉUe9f|ND_Ula"?**^bq@^2^[ Q&}zQJ+BGۆtGr_MCmcWwǓІjsu*+p/懣5C=&%+&)z-JhEID -J|]/33O"HuMr"IR5MXe',5nfO|::@?^lZz A9)l7z PK[ڧm4-mMŶ"r](;J-fkvGg;Y;dVma|7zFR sy˫lr{6 sC,&Hؼ+Sg`Y"9kTHp$Q$[~*eœti2#D64"{'1Rr8.m/$ߖ$*淥qxE>2yʖsTu_ȩ""f2d͔o?" X_b>r`b~rP{*LCyj'5.)(ҧ6鰹4Y^K+fѾIyG+6Fu$.8T=x1T-TI]%̸&6L0ws 90Ț>+aɴ n9]|`21R\B;/ 6_ {NofƶJq7/)\tp{Oc4j)jO_-?f)?d:YÜӹP[N>k۸T&U% H)U)TGҕ8z*m` IA4*]JĀ6)wc("5 2-ԣ8]4"Beջ)wh?B =@@RuTs:U*mkj=y#)L_'hY@9p@acyI[bS:k?굸knMc|]tWUJK;@\s&g0Rb38B!gF⣉$~p۲5F۴Ó" eTH=1ЭaTlK,kpA [3Z׊guX.Pw!7k)Cyms˷+oFW Һxrbk>`|>Tp:zLv'0]~?54K3EYm6y2o( K3c ȀRhYN%l2vOIHnI R IqTA.6An ubзr1ƽ /s1]!zw ]eUZ{_^Y+ζб'߹{Emjk{h9J0$MHf)HFzH/f;BT'`Fҗ TAD0,R=j3/m,#P_)u2g)kBO+iĘjw jV=oݶbXh:`L0 bIqa?.Co;~j+({qJJbA@ů(vLBk<4Qے$QBy 8t&;Ury/fTN*-SpdNHG†.R2[ou?+bbIihJp"!`pyJd6IF~eH^j:0 Ud4SKZPK#øF2Det#a5-ϱB;.8_,;4 j/Nd»T.\>#^#i3C%۬`W #l|Fnuu' X2񮜛$dPXgQPa !)?Τe=W; _1 ۫r-fo;eGDf4*|Iˌ~>a!G-|%N=p&!6ڇ >͝ g~ƃlmeyj\?D5xۭ>d n ̄wWɆ]K$wSsr 4%;wjE/=kQ&4/Ct7gO A +ʞmQ[xj ܇h;/$lJs|v̒ˡ`-3H|Be8L ܯX3;_ n |٦D< қa]hOۈ#`NcEȞUM9YF4x[ Dw8) z<@6j7I|M)<OUȩYFfd> frOu35"R$ ) iH;)C3*' sDE/1xRre{,4zvl݌޵X/z~ > )<] )ttS&ojW95DIM59K>r0s $}lnwM??d7D endstream endobj 5 0 obj 9464 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 841.89 595.29] /CropBox [24.44898 120.2857 780.0816 475.551] /BleedBox [0 0 841.89 595.29] /TrimBox [0 0 841.89 595.29] /ArtBox [0 0 841.89 595.29] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /ExtGState << /Gs1 34 0 R >> /Font << /Tc12.0 21 0 R /Tc8.0 17 0 R /Tc3.0 11 0 R /Tc6.0 14 0 R /Tc14.1 24 0 R /Tc9.0 18 0 R /Tc11.0 20 0 R /Tc1.0 8 0 R /Tc7.1 16 0 R /Tc13.0 22 0 R /Tc17.0 27 0 R /Tc21.1 33 0 R /Tc15.0 25 0 R /Tc16.0 26 0 R /Tc4.0 12 0 R /Tc18.1 29 0 R /Tc19.0 30 0 R /Tc10.0 19 0 R /Tc2.1 10 0 R /Tc20.0 31 0 R /Tc5.0 13 0 R >> >> endobj 34 0 obj << /Type /ExtGState /OPM 1 >> endobj 35 0 obj << /Length 36 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 36 0 obj 2612 endobj 7 0 obj [ /ICCBased 35 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 37 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VQFJAY+CMTI8 /FontDescriptor 38 0 R /Encoding /MacRomanEncoding /FirstChar 101 /LastChar 116 /Widths [ 493 329 493 548 329 0 0 274 0 0 0 0 0 452 0 356 ] >> endobj 38 0 obj << /Type /FontDescriptor /FontName /VQFJAY+CMTI8 /Flags 32 /FontBBox [-57 -236 936 736] /ItalicAngle 0 /Ascent 704 /Descent -204 /CapHeight 625 /StemV 73 /XHeight 469 /StemH 33 /MaxWidth 991 /FontFile3 39 0 R >> endobj 39 0 obj << /Length 40 0 R /Subtype /Type1C /Filter /FlateDecode >> stream x tSU_ OqP":8 ({ަMB&iI|ٚ6m&MҖڔPjARE :u}1mʸ9'{;ɽ~'r]G03'0wsl3G ̼}Tr*mBp9nP)̒ ,{ ,]|8;=@.U%OyMlT)DTZؒ%r|qjdHy4KQ(e=U >5_(,nqy(pT( -X!*KԴ{Yىy-"l"@l"6bXD !UjYb xxXG3b:.18 MHp{qbc¨CxNZ= 2-'(ZnscaԆ:auF;چS'nHeytR%+⧇׀Ae,6Pr0}Mԇ8EL|8iTA2:v@6H,ez=Ȓzjؚ(ϐx!iLJ =bҙ`U՗z۫k(gwZ{5@0g4C.Z_ :h<4ݎx_A_+ 64r5j=zX#42tBĢl &uR 6[}C\%؉t sdheeP sX>;e'\NbBRuIz$I &\̸\i;Ŀn m~/@Ҫkakcѳnht@Hn@w9Aao+ ݁h"_3]TD3o9jS@oZn>_m[ T:wMRVk8mVŁ+M`Zw. V#Q[j*rR7Nސ!t9m;obAN0kcWЂK}!z`=e0Y:tzpb(u#;#jEb*5 +_*md~SYm@FnP,Ot"MA_JvBj9N{GY^)aASd53u1:ѽvX$wru&j$jO9&zxql =hcs~s uT%*yN<Hqe0uCG.3=ͯ,1j5JL dZf[g䉴P4VPrc,}v7>^tR:̀~::M6 ~ eLK-EgE˜"(=ysnM3zC;j}Ty?Sfn[Zp %uŚ:,Nfoc米塣zOU1zJ,H׍Wm!~y֚LR~4ecm}XK5Q16RY$6%}u B&kx̝x-Io'W!]nRt'E+ \zKln/'Ck&TU}WO  ډ!\>OAIUmqK>ﱤ8.Lh9 {3wuI}lk'%Maq \w@64ƴz&uU+8+ jߴQF-åM"/R{z@S%wf v"6nyXpyyhaLaE|v1d1*CFJ}#~{Ӏ~yX}5S+AB4jw7%a +(ˉ1"f]I[>V/Uo~ /q|ӇF$ 11&b@E[1LH {YsOo wӲezIAnljr2(A5WXTk{bYsatős uk8IQ68@yK+&wu8a\\iXKhԺ#X]8~}\lbon냛NNK]WqЌ]gQ.E*[(Ie`?DmgW?ws7ܤBQEDZ %(c#SH6g+f{$RVyaoÌ0_ۜVimF ?1Ԛ+:|ma-FY/!j~WƳJÀ { ֚ѽtC xLf +ieK,X4^#^8d9콄W *KEbι6F8_ E~0v_Cm:v.*!!gJ#gR(#7u᫣NAUT&l't5U8]\ռ=N9f/x hnqZ9(Y/١4[MpSUUH_K`F:^EB](^czy"a~P~p8;/c?u9&.vYǂS`5&^djxYYBR7cS\“Gn&O\%䈎&˛F endstream endobj 40 0 obj 2979 endobj 25 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VOFAGL+CMR10 /FontDescriptor 41 0 R /Encoding /MacRomanEncoding /FirstChar 40 /LastChar 246 /Widths [ 388 388 0 777 277 333 277 0 500 500 500 500 0 0 0 0 500 0 0 277 0 777 0 0 0 750 708 722 0 680 652 784 0 361 0 0 625 916 750 777 680 0 736 555 722 0 0 0 0 0 0 277 0 277 0 0 0 500 555 444 555 444 305 500 555 277 0 527 277 833 555 500 555 527 391 394 388 555 527 722 527 527 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 277 0 0 0 0 0 0 0 0 555 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ] >> endobj 41 0 obj << /Type /FontDescriptor /FontName /VOFAGL+CMR10 /Flags 32 /FontBBox [-72 -282 1041 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 69 /XHeight 500 /StemH 31 /MaxWidth 1111 /FontFile3 42 0 R >> endobj 42 0 obj << /Length 43 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xz XHfB+TP;}ߵZ+(!,$O} q ZOպ/XUOkkkk=szu2$g~^ջ%DVo:Q`? k_;,;d9zyEUꢀ]^ޡcN=n)Sf.o%%pa;fwhhɓ&L `۰]޶CP}-)jM Qsz}j$ESʁKmQj!5J-&Rۨ$j;5ZBMRSerj:AfRՔECQ)kʆD P"*X*EARDʏOSPT&5zb*Ԃ># 2՛R  pF]OY e"7~b_e1,Z&io5@3Zi,v3l;{۬sm޴9(grݵ>q_۹N 1uͰa~tDe#6⛑#bF;*cњD<6w\6H#j Ulr2# @!OnXGlqvP1tЦU7Ho 6Thjh@tOThbg/ݠ Q5+MDk!&CV`=" |KE|yf <. F3N2XF~^ݪ r]^&ʩ s6p8~w3A4<oCLnzX;V3?x—MbJ(( G]C_HMKLTz)BR$"<AM΄TT3F[<V=5JPTVa5cv2u$4(^ޡbҦfaMÉm (l NzU׎7Þ=FƲc E=oBvt< {HEi2Z8Y{VnBYɥ py8~[.yI:i^J\/?Dl~cad5"GeFUu͓-<{ĒW մ yEo~O!1#KOÉCGZJV +A,ur FǦ/}񓳩@tS:P&Ǧ%x6.I٠4RCaH{@ PUL 䉿ƛnE +Õ0(Km)5vL4ZzB߰ 5;$AL6d@pXe/j@mhO.k&, _-,pQ$n3Bҡo}ڇi)1B*13l~x6 1$A}5E,JOD4$6'k!~NM'%U|Έ АGh7h B4c5Q3!. ƓBl R5,=f|qSQY 1Ԣ\O[{ˋ/ D/YԋSMzESMMֵ^iI<S (rkk}wr kYNRȶ#:eFNRv\Hcu.z-Rqw'@^fl{<7wOƁs`KJ Cŏ;SE"f<;_s'[O@\`=Wt!6p r> bM4Aj7Lmo2}+ު'UB7TJ`J?ɿ+9lOvN#M(~F[ 3{r?]dEU"7nZRY4𠣧ݧI_Ucjbi.$gs&4?.w83v>5juf~e #>Zм6{,"yt dE4:pp=*\u^UϹ*~UUj><`2[gcHEAA:\OZ 4 )|5lB$&<5QЁ8<%ca#R7i$WZlWf UGkuQ5j?7*?_Sx(@:Y[/h6OI#٬Sc!W cI{%!=" %$dpvB6q 1i7#9yt4Iv9FGؗoY`ac1ߍA̾jTJYv'NSW :8Ma\R㾺Q4Gr"sFajRϮilBJNnotUBp/"QD%Ur~B38*|(GJhyA2[Mv6wWR@I|+JB.Fe7E6. {XT+k{g# ɹA?#a$,N$'(J{TV1\buîB@SE;x2KD<Z7 OAK 4MGNŎǃB(!gbd%:cnhL-CH*R"b! - .Е7zmMC9LoQlDF2ZƠ}p{Hb#v7#76g'1߈,QZoǴn6U5_$O#2/?VrV5$t)pBO{絑 z:I|QH,b E/YKCԴٚj5ꝂG. HDzo}o>Iwզ#ZHT}^D/Z+`nݫJ"$$$ [cޱnc a5iiuG>װD?˒o`}OתOhI;3'O* . ꃌUZHmDPReu"&␫GޚoW36O|r dz9d4hyLR8 ~ծMh7} oJrRZ.G2⧕I5IUA٤C1.vt₪A@?;U1߈)qZdAup؄g^] 5^3s!tHxQ>XvɎ]t50BёLҎvlv{l~ce&'\e-嶩J]JTȕrs55|R56է`zB2(o=OzWi<(MZZ>k}0o!on!7]]3ۋGrX*Dj(q`MO"c-&\H8cUt2 ל zv4B#k,\g20?uHMDm|d|5әGG!BCh`ձQ#cj(o/mu$2ܢ7/?KW%H%l [FZ%zL<$FIQ:34T.]hÎ̈BO;leįH& q q AܻxY-1tҺ"CyyawwҎ!"EbI%{PЗVuT2P?`υTؠN'YV@LOҢU%qq LRZJZN ԇCO.3{V`5rNd4JGo57wh7p-d?,6LHuD )~wrxڷXȉ;疰d V j#W [ n^~kwFnd)M)7O| 2& NaKP楔0ؕ ¬y鷈P 7,j.HwOŃwc $t:rgs4Ԟh\dL;=e"4N͎\N\c3 㲟74{4sQ+.,zs^UxY3}~—-I6<_Ə0N /DWX߱>A7;Y]d )F%/;%٪XC|mN;9WPzs_>eglp h)mվxC]O㦌s63˳KkF}Lt]I>*k^7]=GaO5ꋧNYc}FX<C #ˆHs-}- E\eTqRKL^Emd HVR =[Y/s*JF _Tkj}Z_Y6k>`}qe'5 ֖ ?#DqK8&@V>h=Z-DoyN.u+ '9j3Hp{~EnFZnPb-zsgd&OI+@Y!ni<x1~ [v<5%=ϑ,׊z"!7MHXjBiLeƽ [4gMN[4 (ҤutgGע:Q>Ax pݝGDމb \|se^|.xs!r- JҪ]E9ީ‚BBtA5Uz}i2Q@AD?j[V=1+P;_ɈuM_y!HUd-߮R*!f0,D?h!>Tǹ*쮈-)++9y$w pXRȟ3dt69L:J7L|GjB[Mvj*fegG\N*L5roFkQNf׋Xkd)h/n ȉ|WҧaX`?\Z,M\ƑkYP%DCDdF.}ILH`n~0 +D3T,Dh-{': !2Y}g-%ݕt(WJ#И(&%>^09 IrS$;(lىp'.t0uϒy>|:sFoj/݂ WYwXgVvY3O׳ DQ2&*\*[=a\Tm4 P5!jx-M(zt KOU0d6j vo}詊FCG]*J*ߢxD?q)ɾ| xnDS`Kl`4c-=PQᝨ+D`3s7x̤؈iQZHd$d"sW(C}~(O(:~fULvo毝[^m髏9B4g~#Gn V^jz@N 2.-7lviMcڈ~ ǻuGI@ңc;\.| I)7\^NұGȯX&)"IsTLb:r+D鐩MrO,w6Zt6#1D](8hGs h0&.~1˜öf2ָ¤Cu7='FN10 ьI4%ǟi<Ǔ1a%?§ЖMq:]".j2IѶxIx'%#Bt\;. uxYcn(MOTyC!2DIfD>n9Rt^u)ɜ}Z 00Sn##'J&EK ٽώVSё0#WW&y'ȿ&(h! )wPRa{> n\h ow79fZ?>9sW&@HsK_Ts"K\m>_K~)ՊH endstream endobj 43 0 obj 8897 endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QUCZTJ+CMR8 /FontDescriptor 44 0 R /Encoding /MacRomanEncoding /FirstChar 38 /LastChar 121 /Widths [ 826 0 413 413 0 0 295 0 295 0 0 0 0 531 0 0 0 0 0 0 295 0 0 826 0 0 0 795 0 0 0 0 693 0 0 0 0 0 0 0 0 0 0 0 0 0 767 0 0 1091 0 0 0 295 0 295 0 0 0 531 590 472 590 472 324 531 590 295 0 0 295 885 590 531 590 0 414 419 413 590 560 767 560 560 ] >> endobj 44 0 obj << /Type /FontDescriptor /FontName /QUCZTJ+CMR8 /Flags 32 /FontBBox [-68 -282 1102 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 76 /XHeight 500 /StemH 33 /MaxWidth 1168 /FontFile3 45 0 R >> endobj 45 0 obj << /Length 46 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xyXTGXP= ƜAc=XػFEA"Ha{ Q$1ceɽߞA|s%[W $=ײ+΀-F ?ٛ>rG{XQRsp72T lKv^r٣Cs.}g.ɉ]Uy-rDwٷf/[A =1i?H;8p78,=g%z~cpp` ΰ ƭkɹ>9gش[Ok02>z.Y'9҇7X({31h0e=h!PN95˂1Ƣ}%"Ө]Ak(n]<|Ԍ̷Y)i&VV6W;;D '22Og4B'dEsİ T]˩Mx&f.;ߒٗ0\CgU_N1v"`0 k#÷bUBJ1c$0EqJHHTT%A9 nԟ[6k}A5YSo&R+uO& YEjJ?\@6Rr5rA+(yV՛wߏ_%}iYRonVHISWjFuh#&E96ߗvmBg~_`d7)C`=l॥~UWCniYvW{{콀̪kR4/"Csk44]܂3LEM>yyH>pPPB#n*%FY)^7pX׈#xg$pUL=s$%gK_u\G™@eEГ:LB:5Pm7jlRСf #'1~P3bރ(UɱPYZ(ZP+._dtUg8&g,` PNBo>^'hfp\]wTOXKqsu_)=[BQ6ڼ1\Ҧx2N}BllMkClJ8(O3-EmyB*@ylJJ|&}6r!ۦn7QdmU@,DYst%~8<ۑKYv MDή);iz?}V hjW(3THH,-7z)!N^1;q2X*s@ywntwq{JXЦB芞bSҢKI.R)Lπ |嚙xn±)3,7TT6( muΜ%d))?]vhjA]};9zH8?~V6'#?zJ%0764L~~sLX*T9 HL"q|k xzN[RgZMf_yCҌ{hCR8I͊Zc*o:i"O$Rҗx,ا0 b7ӎXy5Ik[Ʒ'oK1k,VֆfkMc`hpiC='Yv4VA]7ɥAU 6E+.Fm}W.E9p+`m,T8}kj:4Uph鳳a'W|-S9Ͳխ؛QRAM|%-|,+ǍźԪ*ui5)6r~;ǥ҉N"':ZU,NYK<1!\#\FO7G׮|'~WDXuT̄.(&Ĥ-YBxW pc,yۥ޷*FYXŸ[˄0g$MW_R)/165>($ =d߀C`ƹcw*M%J3ZDJ,?,^A*oŁ.ЕA#LYTd:j雅Q3q=tV07E{){fڣ fP{;OwZ]q|XiW5]}{H& N>\_ƃ뒤PɺułMc'oZ|#K0J~vo uz!@汱'j UfIxZ.d֦4Ҝg* 77e9$ IkiJ5׽ȚL0̶i>i^9+ߥ)FgֺZ<C>;qQw^Nr\>uŦ!#\b@NaU;})xeIA6jTWF*K St*;. 䤃PNmNPXګlpǖmv/Qo q +`ȋZu.-(&. eԏPzDoDlvI6%001h#>avWwR;OgQ𠠪}AnSm W/9sHQy,sMǎ@QߡuSeA2T_[X=SJkHjqвGN8$w92>.) O>m!2~XSoPC%&:c[lpZ)/ةH,5N9j ~K ,}DC_H"AM P8>G/5,{LwLc1SO_0ѧȯ.X(Q"7.B*G=מP&ė5Oqd>,Z W}׹9 W9*-.K.M=psgo5t^E  懷iӓ꾕OXmh5EE'{/=y_8 7F>'!8->8px@.]!*-]ްn.˵UΚ!:a`b1)Tb_%:/*4Ĕ0ZM Z]Hp4bqx7gԐioO1 Qa&juyE~ $ѩ>]]9\Q չJɔHf.ŕFUx7{ ‘7f޺W(=ܖV)q ilںDZ\f$ss v |"=YW'N-9|Mr)]}w,W?[A5[QlD=mQ{7FiWU]\6=~cUph TӖ$š=Z/\aG 26ܑ/[oxA2ᵑ>CBa/W?}yokP{u ̾ub;~z'mYxMÉy!Nޞ f .oj67+#Ƃ2y^Fs)fDcDrIܔFh-VXPtv9IB jj"`d;" 2J]/_RK1}c%CPH6fHIp=6x>=ig%#Bc7 JMjH*OPYul j]/:mxesvZ꺦z 3c}\wT}%ڪ*%?]D,&HN^EN܏}E 8]V^JMi4Ɖm* D> pt/J>|JKcWl 9]B&G[6&%MM/=v\ShkeLRh;~)v2;Lj-Ҧ! %|5٣75 *4πNGf#M_PRzk8mSxIŻIo%J߈JPTSC̲_TR1CG}Nǜ򂎪 Z9]<?mG%>Õ%*øHZWPgPg PBL[$`O;E)N>]y]!P.!K̞+RgڑhCWd=ׁ!ϒ/ @Đ Tc kG1zI(9C=ȑHr%O*ՂU?~_-p%rJKp$џ^dz컌i(nIRߠ҄ #&.~au>J__.7 p_v$y6~;F/-i7?ya17iݔi{ӋK ڥ>bk I_Nd6\ֈKi[IYf Khk^z{~z^rGM\:nZa^I_ȚАm~\Mƨj-CedlgKonl (ojˁ6rqGb<(0R&+VD=yCIEvFHLLȇ,u&J77CYzA"ٹJzSpvhw[> endobj 47 0 obj << /Type /FontDescriptor /FontName /DYMHCT+CMSY8 /Flags 32 /FontBBox [-32 -282 915 803] /ItalicAngle 0 /Ascent 771 /Descent -250 /CapHeight 685 /StemV 46 /XHeight 514 /StemH 46 /MaxWidth 945 /FontFile3 48 0 R >> endobj 48 0 obj << /Length 49 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xEmL[e塞N`/yfjXl.AcF0%/1 -^ i/-Rvt@y] jTP3,KWbbcȓ<''9988./.9) Sd zI -urQAC;)p\guCLIiQTVIl-4tTUZ+=ک*QC&*@Ͳ:ٙr}KlSêJ@oM4ǗmT9Du5hVj0:N :E2etvAasWŰ\]8n|# ` ?/TerYÆFpFUȑ͐ljt8VPH=i~9718:{n{D·w5ʻ8tԝْ֋}=0.> 8D=QnFhѧ[2L S0N>YIJk\S |Rs5s,`/BpO3!6( lB"8@/ܙ9#+y B@ _D"zxL@B]0 UKz ,=`޳5ZfB ꪮ\r;!*z[5FWgq%lž~Mk l'J_=bQ߇]p,,'/]iT?Rrc=~|nOȾa~W-=<- Pۏƿa-]N &'}#NhKlXy"Ԭ:OʯGZ1{JX'-(s\+Pbj50VVZBp$da% ė J1+dD; ~[Y_~禇2 qgoW6!|=/ $˂T^i`pqRa6` +Kf$riiMǰ4U endstream endobj 49 0 obj 1054 endobj 19 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LJTSIL+CMMI5 /FontDescriptor 50 0 R /Encoding /MacRomanEncoding /FirstChar 68 /LastChar 117 /Widths [ 1109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 670 0 846 ] >> endobj 50 0 obj << /Type /FontDescriptor /FontName /LJTSIL+CMMI5 /Flags 32 /FontBBox [-32 -43 1121 715] /ItalicAngle 0 /Ascent 683 /Descent -11 /CapHeight 607 /StemV 90 /XHeight 455 /StemH 36 /MaxWidth 1151 /FontFile3 51 0 R >> endobj 51 0 obj << /Length 52 0 R /Subtype /Type1C /Filter /FlateDecode >> stream x]klSeO1TVֈ=' ! !CD L@RF:NiO/k=i׮=da0D@a~Ĩg/o7o2dem]֋/ĵ%+rp~{ˡtlQ{:,j~d&w=e`6ز|v[eZr^kԵh:F ݦk yjiiܸ kjVkFo;7UVF6iMZE{|}\z鬧35)ð{L}: cl/V*!-]|#1(PuRwLUaY#qWgypPzg'Ni qCFԄVG#ˬOLO GPUіp%]$ &酺mu$yepBOC(ԏ+淸&'F2tKd-DW=Qp3{;:Z[KƩg_wauR1j4cfChc?WI~hlQ+&5-\g W@sVS1طDb$:<~WH/i\\Dwgg. %Ksktz{3pFKSw gX_gڶlp;?!LiTCDxA3OVCC ']eha<.% lu),af" .g;xOvWJ@a8| iBkpk*O2waYrYA-6ɀ>#h(*D=Yx`(*\$" q|}Kv4@.a&{j7Sy096>@+~Om?x7"XbH/>kj*[ + (ݍk..2H];~f;j9/'ID$MjϨW/_5+/ǰt endstream endobj 52 0 obj 1276 endobj 24 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VCZUZX+CMSY8 /FontDescriptor 53 0 R /Encoding << /Type /Encoding /Differences [ 33 /union /intersection /emptyset /negationslash ] >> /ToUnicode 54 0 R /FirstChar 33 /LastChar 36 /Widths [ 708 708 531 0 ] >> endobj 54 0 obj << /Length 55 0 R /Filter /FlateDecode >> stream x]j0D= gc():EAk࿯zAz3gHJ` X gux%mU&*a[@mWF$\h '} kwD:rċAO>S/[F8<*Dc!'it4&U$j~O=?c endstream endobj 55 0 obj 207 endobj 53 0 obj << /Type /FontDescriptor /FontName /VCZUZX+CMSY8 /Flags 4 /FontBBox [-32 -282 915 803] /ItalicAngle 0 /Ascent 771 /Descent -250 /CapHeight 685 /StemV 46 /XHeight 514 /StemH 46 /MaxWidth 945 /FontFile3 56 0 R >> endobj 56 0 obj << /Length 57 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xEmL[e塞N`/yfjXl.AcF0%/1 -^ i/-Rvt@y] jTP3,KWbbcȓ<''9988./.9) Sd zI -urQAC;)p\guCLIiQTVIl-4tTUZ+=ک*QC&*@Ͳ:ٙr}KlSêJ@oM4ǗmT9Du5hVj0:N :E2etvAasWŰ\]8n|# ` ?/TerYÆFpFUȑ͐ljt8VPH=i~9718:{n{D·w5ʻ8tԝْ֋}=0.> 8D=QnFhѧ[2L S0N>YIJk\S |Rs5s,`/BpO3!6( lB"8@/ܙ9#+y B@ _D"zxL@B]0 UKz ,=`޳5ZfB ꪮ\r;!*z[5FWgq%lž~Mk l'J_=bQ߇]p,,'/]iT?Rrc=~|nOȾa~W-=<- Pۏƿa-]N &'}#NhKlXy"Ԭ:OʯGZ1{JX'-(s\+Pbj50VVZBp$da% ė J1+dD; ~[Y_~禇2 qgoW6!|=/ $˂T^i`pqRa6` +Kf$riiMǰ4U endstream endobj 57 0 obj 1054 endobj 21 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TJKKWN+CMBX8 /FontDescriptor 58 0 R /Encoding /MacRomanEncoding /FirstChar 88 /LastChar 90 /Widths [ 922 0 748 ] >> endobj 58 0 obj << /Type /FontDescriptor /FontName /TJKKWN+CMBX8 /Flags 32 /FontBBox [-32 -32 914 718] /ItalicAngle 0 /Ascent 686 /Descent 0 /CapHeight 609 /StemV 122 /XHeight 457 /StemH 52 /MaxWidth 944 /FontFile3 59 0 R >> endobj 59 0 obj << /Length 60 0 R /Subtype /Type1C /Filter /FlateDecode >> stream x=KSaq;9 ɕ-'ԤlYAf0fml$G14B((HEu7E]Ezњ/KS idW5h='C?l@*xƥ$ͻ=~t*ˬ֊bXiU<'KN-N%u\}.tnE*) BgŐGq)5>"^tʒ~͒6쿡Hk^ M-]e* e^=†4F =' ȳqt[P: 6B-E|;04 TR@jI!giz@&Y&Qn$ҩ(k0 j*Tc1.m7`5MY!uN%30 nEdqElͯ^wr4F&8RATV~|> endobj 61 0 obj << /Type /FontDescriptor /FontName /TNMOXN+CMMI8 /Flags 32 /FontBBox [-56 -236 878 726] /ItalicAngle 0 /Ascent 694 /Descent -204 /CapHeight 616 /StemV 78 /XHeight 462 /StemH 32 /MaxWidth 932 /FontFile3 62 0 R >> endobj 62 0 obj << /Length 63 0 R /Subtype /Type1C /Filter /FlateDecode >> stream x PSw_ '"nMXۮt]{lYZ]zJBIA~$!9$!# "Z=U{=:=;ݶ;쳳Ny3o18Xrrs_|}z~)dvBHBZJT(ta 9hmΑjUJJaHdCs gΰ -drzEGbB.$u:|tG 79z`#k"Lx&ãG"8W0P$!̧JwT~Eaq zK+]1t!҂>Or?ZL񫀣e_6>FB.o÷z=v{z33GP Ua7WGF'#٫l!e;Jhkq $oYu.Z!(WAh'-hR_eUi@k@ąMݹOwqMa| SWK{ \3}C~ цCh^Qi+da"fCW[9/8;|4v *߽Yw=M(H*I c)wegߛ<"OhF` =᎑kV^oȚ.2)c4rw9W wo` xw[UfVf| kox-!xC a:C+.vQl3dC-.c tIDB#KTM'hpB4$Qp3M.mWK+0(;;bQuE(ODٍ1<.ր_=wD:n>,Q>aQkw{ 2P&` Z&PӲFI +]ɺ[wxs&=FC''z eΕ&8o#5.ͮ8AWV޺fmV LmǠd(o'LUGs[X$BSbqj;py޾8ᡱWN4qd[\"yK|Wj(sFt݆y(_,a6wT(,[Q砜Ż6C\A?rMui*ee}axѢ?,y߹7~K֙-uD!S`lA& C2V^S32LB|d4ɛvuA|26gͽ/P|75vbGɾcݠʳdR]\'8ﳊB>kwR{uFpx>^&y.xwHw_T>~@hTTg "EǠ} ׬?&do*TjYTR_.IFrT0#FҦ];\43l8H$xO_W?<|FpT|,z}ko' ޶ށ?dVᝏ?*qs"54k 5d:D@ƛb㬞hcTQ#auWO`DߘW)eoz7gV^-:$?s-EiuOgp橒W^Zv҄=Dj=sqs}R:}nA_gYGֳQ]&|M&}4; xn=ǘc(q9(?Ea>ln͵lM&OOo(TIkQ顮p`E%C} *cC7C};h*9;6ZC=45L*4͟h)zU=x J2̗]%ɫ,E[z9&Ie OC[t];v^7rfr~S<H,3;m^uWByO1fJWL*f rD*FPmǔ ^[B<ݑ8JKð?h.D endstream endobj 63 0 obj 2418 endobj 13 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CLRLCH+CMR5 /FontDescriptor 64 0 R /Encoding /MacRomanEncoding /FirstChar 49 /LastChar 116 /Widths [ 680 680 680 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 750 0 0 0 0 0 0 0 0 0 0 0 541 ] >> endobj 64 0 obj << /Type /FontDescriptor /FontName /CLRLCH+CMR5 /Flags 32 /FontBBox [-32 -54 1063 726] /ItalicAngle 0 /Ascent 694 /Descent -22 /CapHeight 616 /StemV 89 /XHeight 462 /StemH 44 /MaxWidth 1093 /FontFile3 65 0 R >> endobj 65 0 obj << /Length 66 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xLuǟ5G9E9~Ha "CE'88$D}MS$'`i+jեn+h0+LPj0Po0z>"T/k"MU|]Pj m"S Hb2V 3i*2+)JˌQ1PTKR/R:j.B=AͣQT#u^IgV0_}ߒӍ Jx0ti';߰H$΢(`'ޤ%V@c:W_l70h~t8У,*~lgp@ҋJcI5*T\Wږ­԰͹ylRAe*;8NwW댔0aylq"KHbBP:HoG6$BdJ7٘YfsrE~@Wϝ:zNTy?9 fI_f> c[ "viL`4qVuUkK=:I 2w__?h;~]pV3loC=h03kZ֒T`̷ӐU0s#[AL#=p:9㤿S.NhvqLY l1M1ľgOmIk_ Ckc#zH%+ AV>QcEٱo1Rt :Pm/hQMUVYs".@zkw^E`z_7JovH70WWZ_ۙ]{bAFßa(> endobj 67 0 obj << /Type /FontDescriptor /FontName /FBHFUC+CMBX10 /Flags 32 /FontBBox [-32 -233 1196 736] /ItalicAngle 0 /Ascent 704 /Descent -201 /CapHeight 625 /StemV 114 /XHeight 469 /StemH 47 /MaxWidth 1226 /FontFile3 68 0 R >> endobj 68 0 obj << /Length 69 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xXy\WR}_hLTYJwDhAOw#"(AhIt}K⒙̈́qtN۾ {_Kݺ|sd]?F&q+<{͚i};A!F^ig٢{9۝C4w a2YD܁IѻCb]'Lr5gΜ,,(zw__lHP_,]b\'. \0cFBBt'MuM)(&(:>(=" 02V lMzy8L.p&g#.dȃ &.ߍU$6Vmж"|7l Q^%C#=q?|0K/>i3ӛJl g )&b-~N"Sz`}vx Ͷ&И~D &=y=cPP[GW 1id#~H_фQ+;`LNMdN`qϏ4>oT9ѨhPt$D$.8>?Ü_b$nj߼8QniZ{p_drf+8oߢ]f>"cn{7)V|7+)o &x_F}!Jg@P!w_xM|tҝ^c-c-_g.QPNG= }āO\Yi醴$96Si! t)a{]pī]]]ҵzzcg5=]-jN"=ɦ%(b2Z"q.=Q06"fzǩx}\L-b];Y q*szy ċ컘x!W<=0aևq̖4Ost.V@G9PmcFcF_'U`H }Bmm}y[k=U7w TXw"NܳPPR3(3`A+zGHz(i{f4ޱSL(=(Dwp-UcV9` ZzH TE >LPYn iμW>l,u3 nT4UVq>2cD%B<)WzʀCNwkCs͙-OɞҪ ʟR&5O?|[Ƌ[nTj5aŽu|0cfST\~!-["r"qN5?'p37kź *|oq_UL[y>[ ZĊ59(Yihxk YCjV@Z{rD˥!Zz_.%{!8'"7DC469V0j3Qb2Fmnpb(0R(4ST}ڻKUOc텃sXwՇb 4] Z.ӠS&SK"jԇV]ʷ m]lqEօz? L4ˀUR9ysrWH^l qIXPc%xi],[vWBzP?ICkN&LCDS+u$/>$}RbkEܔ^g*\~W)I/Tm4Tt `Kop"*$;X3FF(|5 z@תE 1WO9%)#B[hs@VBCRSQV!]_ `|pqnW"r!zOCvSDobЁlzyӜ'!h(Z}(R-Ùd-q"a'hFyAe6 %%51/_e؏԰ƏL:lV_Xznrfi?kSD.)]][IOmZ6V,1 |.(`Wx"U! 4%*P 7W)y: =&+="KGdv_'GZD$}Hc\oY{2̯ip@˲ߔz˨؝q;CW}7f r*?s|wDxb·.POU3P9Z)B^} ٘d 7(hCA¡"p)#9X/g l;hף>a$ M#(.·Ɏ:Mi\J_d2A_T95#+}ZoXRoaҵ]14:D]Gkm1"m8|BRߵ ;8\J g$]{AƏ~")?xnG\jA էյmba\ЊpzT֞9{OsE!e~NNӶs%C'\h"d%fwn ]MW2SvƶS--j8Cx0IFy_ ,|FkiJ"'AAR6&V/om X40~DAz ~+v4yHҍΓEw7@mk4(Qw(2paɊLQx7ǟ6alc#7J{Nh17 o͎o&ΘU^}*D}Tdg!.M.=v2;E ٥J:WsEne+0!{CJΎTxX{]\t{哓jPm>@,xxQ9Su0 ߾ ;K}.Zo]dsGU{n-6Oɯ+=4&S TmR!Uai>KDyܩ>UPU|Gh.HYO֣ng.ߣ4kE&(߶ڵ8Sx"N5CJBDF-Ɵi> endobj 70 0 obj << /Type /FontDescriptor /FontName /MPDPFJ+CMMI10 /Flags 32 /FontBBox [-64 -282 1080 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 72 /XHeight 500 /StemH 31 /MaxWidth 1142 /FontFile3 71 0 R >> endobj 71 0 obj << /Length 72 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xYy|Tex -Lߋ ؈ZD" E![e$UTe}j߲V*{*!EȢNc.=|/~ng왞~%=sƏI6_(v.7=,`nttw/)[l.5|JPY%%Kx% hUiReT]!S&[. =Tii|BIq֊ KemҌbyFz⋒YıhI27I3 RS3d%SX""M-gdS3dm|o;N{^A~5o1)oZ&֥W0Zep=tD =.83Ǯ 46=#ch~=BV^ge.@:,*Je3yx%2H(ޠbdAw qa0}}"sAFJY {BnNZ¿w]agasD~[92ZUjjG\O f +tڜ{*Z0p!ꭃ}In")t<2Lf SQBY]s 8.ۢ?J aڠc4ǒ &r~ ů(4E=s͹h-`U2dfkz":9x2^/'Uw\,7sDÏl .kRzdP VAzPVҽh5D8r?'T inl6W Tosࠜ&Vk5<{_^^)~"|ri-2$g*/40#!J'B3h<~c?Vk̠lVQ=P!Ý8~o)3xS|%F:AX 046 <`YOqZn7$r]zuZZA]r.6;O7:v9e<ˬItV(tACR#v.`m1T3ۃf2aMLd@ I^ݨR:I>Y>b0X x^:D7mW /փJϐB zcw8!T5etTfZR){ 'csu,TȀHzTChŐ0 Kc@v& i+jwEjMZ]Ft i}:َzOw;6Gdsh=PAD ET_Aܽ^ duZ/ ,V~:IBIB,nHb--[78J9s+: fP ;"/):=TU ^&bfrbm*PrM;8a^u$8|IElX}'vZMiϮjfZ3Ng54PG,scD:_[k͕ L<&K-^|Zt \G8@d"of40\ڞKj m0Ţe𬑨6ӬY 2ٙeNm Di&zX7^W}C_81G*E%UN_M7 J݌xnY[;~2{7ǚ:AnPd`*Rq |}4He1ʼnG ^!$2 ߏs|}3OjOΩW C@[Ca?Y7Sʤ%%fBTQ ;KS3]hZ &rqH_J3XD~s..nj7ŘV_$4+Gvgzav(6K! Y";n+9e`n{$x!ձFIf  {u 9r8oE*vhg!l%/[rǴ] L Ի]a{ S=<D(4(!UV↥Gp1*j2lUފ'(5Ɩ>_E֦'4CcXZ Q6 w &Wgok/ 6,*zYWZУݚW.'2ĩ2[FBem%ܔ3ǯEq@f4PBX'k-&I\+%^u28n(Pf?%)@"\U:KHkNz^mK=r',86=Ϧ*˧KW\a`oԴmxKJ*;v4^!dQ yѹ -8)Or٢5RNTrN4`@#4t}~@Y$)/_N ò~MӶIC~yir͌lFE%wg+rrКI[;V@k)#I3껤-X3ּ |6nGӠY73WN9X}s  1PfKՌǏlE\jq),q(+^Ӥ.3'V>X65Յ!nG\K#wevp.cFo^:9'aN~8R\scHuU#/\? oIx<<ٷyi׸Jn+9ԇg?Co&co1?6"+miSI# JVjhHi:r^>m5R_osM|l.H0?aFjRE%zzJj N!.a0MM\GEV--Hďͻ|ɓ~c:6{#BUn(,U:R;4jh%2ɊKreϞ>x'ƴ>ԵeF#a|?4pdx(TY++,,*TT57u6u+Gdk}Ix-rܤatE`*Sd"D|)g{21}ώz.`tT Ƅqtyd"Ϣ)1vֶT,,h&?4V}a~$ ci?L447:a1X&3v,JѱFqBI#>w_箊Z7G860\Lz;^oWBfkx%QM#޲%64.v(/  qM-'ݢQ@ YQFrE"glZ Ҧ.o :ɹ㏌5 !.K>;`x g\n')֫6[@_EIFP%c9E|PA^_T0MoC q:9r[ ZUkj=Åm*Fh^΂;HǡNr#z+>Z6ѵ9ŒPQw h;kـ٬[rrb)ŠNbgwgEYAppm4z`DrkhpAE5Sd]TMl$9JfUc#I/TUuz pxhaW)сv+G$' uY`5[\N$6ro7-W[tMD|l*~I7L|LQ{pn7䈰A6v}ycAfzׂZ#/vE‘y/ȥ$S )rۃ6ڟwKuƭ|l5?b]n?4GKԤ1X8ro qwa'|۞4肭L5(]ܪܗ6Z8D.|oS(A:Sh&nvogښNhIPFJE-^Sk=[Y*?pYj e%qk fTқTD}V]-|'G;Nf*/0[d>sDh0uPlP܄7κ)$pY ,, 8_^Bn ڀux\_\ ^/㩩tPꂝ#3$lR[]V &qf5%b`/=Xd|A P~XTw5aߍGuڵq^nt?)pA2ʏE}n G:U

a*uzyvyIz벶2 8{=@…-䞒U]7TǭOR?t-Fig謁w85t**TE6\n0d⣞:LDԒ2$Q3 wfE e@[cٜ}" W* ?:D Re Dv.!(Hh V61oʃbI)Ԇ_׸jh6-tL^d&Oq]z EPW2?#l Ւ/ȗb!g>]՛oVBV6Z&4> /ToUnicode 74 0 R /FirstChar 33 /LastChar 33 /Widths [ 571 ] >> endobj 74 0 obj << /Length 75 0 R /Filter /FlateDecode >> stream x]j0D= gc():EAk࿯zAz3gHJ` X gux%mU&*a[@mWF$\h '} kwD:rċAO>S/[F8<*Dc!'it4&U$j~O=?c endstream endobj 75 0 obj 207 endobj 73 0 obj << /Type /FontDescriptor /FontName /AMMHAX+CMMI10 /Flags 4 /FontBBox [-64 -282 1080 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 72 /XHeight 500 /StemH 31 /MaxWidth 1142 /FontFile3 76 0 R >> endobj 76 0 obj << /Length 77 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xYy|Tex -Lߋ ؈ZD" E![e$UTe}j߲V*{*!EȢNc.=|/~ng왞~%=sƏI6_(v.7=,`nttw/)[l.5|JPY%%Kx% hUiReT]!S&[. =Tii|BIq֊ KemҌbyFz⋒YıhI27I3 RS3d%SX""M-gdS3dm|o;N{^A~5o1)oZ&֥W0Zep=tD =.83Ǯ 46=#ch~=BV^ge.@:,*Je3yx%2H(ޠbdAw qa0}}"sAFJY {BnNZ¿w]agasD~[92ZUjjG\O f +tڜ{*Z0p!ꭃ}In")t<2Lf SQBY]s 8.ۢ?J aڠc4ǒ &r~ ů(4E=s͹h-`U2dfkz":9x2^/'Uw\,7sDÏl .kRzdP VAzPVҽh5D8r?'T inl6W Tosࠜ&Vk5<{_^^)~"|ri-2$g*/40#!J'B3h<~c?Vk̠lVQ=P!Ý8~o)3xS|%F:AX 046 <`YOqZn7$r]zuZZA]r.6;O7:v9e<ˬItV(tACR#v.`m1T3ۃf2aMLd@ I^ݨR:I>Y>b0X x^:D7mW /փJϐB zcw8!T5etTfZR){ 'csu,TȀHzTChŐ0 Kc@v& i+jwEjMZ]Ft i}:َzOw;6Gdsh=PAD ET_Aܽ^ duZ/ ,V~:IBIB,nHb--[78J9s+: fP ;"/):=TU ^&bfrbm*PrM;8a^u$8|IElX}'vZMiϮjfZ3Ng54PG,scD:_[k͕ L<&K-^|Zt \G8@d"of40\ڞKj m0Ţe𬑨6ӬY 2ٙeNm Di&zX7^W}C_81G*E%UN_M7 J݌xnY[;~2{7ǚ:AnPd`*Rq |}4He1ʼnG ^!$2 ߏs|}3OjOΩW C@[Ca?Y7Sʤ%%fBTQ ;KS3]hZ &rqH_J3XD~s..nj7ŘV_$4+Gvgzav(6K! Y";n+9e`n{$x!ձFIf  {u 9r8oE*vhg!l%/[rǴ] L Ի]a{ S=<D(4(!UV↥Gp1*j2lUފ'(5Ɩ>_E֦'4CcXZ Q6 w &Wgok/ 6,*zYWZУݚW.'2ĩ2[FBem%ܔ3ǯEq@f4PBX'k-&I\+%^u28n(Pf?%)@"\U:KHkNz^mK=r',86=Ϧ*˧KW\a`oԴmxKJ*;v4^!dQ yѹ -8)Or٢5RNTrN4`@#4t}~@Y$)/_N ò~MӶIC~yir͌lFE%wg+rrКI[;V@k)#I3껤-X3ּ |6nGӠY73WN9X}s  1PfKՌǏlE\jq),q(+^Ӥ.3'V>X65Յ!nG\K#wevp.cFo^:9'aN~8R\scHuU#/\? oIx<<ٷyi׸Jn+9ԇg?Co&co1?6"+miSI# JVjhHi:r^>m5R_osM|l.H0?aFjRE%zzJj N!.a0MM\GEV--Hďͻ|ɓ~c:6{#BUn(,U:R;4jh%2ɊKreϞ>x'ƴ>ԵeF#a|?4pdx(TY++,,*TT57u6u+Gdk}Ix-rܤatE`*Sd"D|)g{21}ώz.`tT Ƅqtyd"Ϣ)1vֶT,,h&?4V}a~$ ci?L447:a1X&3v,JѱFqBI#>w_箊Z7G860\Lz;^oWBfkx%QM#޲%64.v(/  qM-'ݢQ@ YQFrE"glZ Ҧ.o :ɹ㏌5 !.K>;`x g\n')֫6[@_EIFP%c9E|PA^_T0MoC q:9r[ ZUkj=Åm*Fh^΂;HǡNr#z+>Z6ѵ9ŒPQw h;kـ٬[rrb)ŠNbgwgEYAppm4z`DrkhpAE5Sd]TMl$9JfUc#I/TUuz pxhaW)сv+G$' uY`5[\N$6ro7-W[tMD|l*~I7L|LQ{pn7䈰A6v}ycAfzׂZ#/vE‘y/ȥ$S )rۃ6ڟwKuƭ|l5?b]n?4GKԤ1X8ro qwa'|۞4肭L5(]ܪܗ6Z8D.|oS(A:Sh&nvogښNhIPFJE-^Sk=[Y*?pYj e%qk fTқTD}V]-|'G;Nf*/0[d>sDh0uPlP܄7κ)$pY ,, 8_^Bn ڀux\_\ ^/㩩tPꂝ#3$lR[]V &qf5%b`/=Xd|A P~XTw5aߍGuڵq^nt?)pA2ʏE}n G:U

a*uzyvyIz벶2 8{=@…-䞒U]7TǭOR?t-Fig謁w85t**TE6\n0d⣞:LDԒ2$Q3 wfE e@[cٜ}" W* ?:D Re Dv.!(Hh V61oʃbI)Ԇ_׸jh6-tL^d&Oq]z EPW2?#l Ւ/ȗb!g>]՛oVBV6Z&4> endobj 78 0 obj << /Type /FontDescriptor /FontName /QABTAG+CMR7 /Flags 32 /FontBBox [-32 -52 838 706] /ItalicAngle 0 /Ascent 674 /Descent -20 /CapHeight 599 /StemV 79 /XHeight 449 /StemH 36 /MaxWidth 868 /FontFile3 79 0 R >> endobj 79 0 obj << /Length 80 0 R /Subtype /Type1C /Filter /FlateDecode >> stream x}LwzОZ..3[&EA "l&!X,e-՛XʛbC MR`-E9 n% d2Ȉm02_z' x&=+>% K7>`  Q.8n,0%Mz]!KEDR1 CjulMm1e i: GLf/RlIbt4qQZ91G8=[Heft>G`Y*Ck@0 Ktm*0KcŰW0%V°=X8maaAX/[I!qT6^gG;xԴNhaJmځD{r^Vp\}KN9SzP */oeeP\ޢ4w? 2'y&YHyܘ^'79(0T ;]I)wywpuCol63MR#E[`UZY0{ME(oB!|S UӠl|^JKus{\^AkS-_[j%~ҋOUBhC$y7_RاрFVd~"2iX~sMyf={,lϮ@,$C-S`)@B/ۍ ?Tgi| u)/(+~%v֣]FaPnB&OCۍ;6ږi?uܘLJM?N%^̫Zp4<ϋdOGO/ЊblJ ՜,8:U7C S Tm,.n峱_ 8}L;y N@~=cՖTE4n:Q,oy gT-B:EBȒyRqʫͳ:K"QYN8g<¬cPY"K7U˲$mŦD܂ƅ[RQ*/Pnw˷yvy endstream endobj 80 0 obj 1073 endobj 31 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HDZZKV+CMBX12 /FontDescriptor 81 0 R /Encoding /MacRomanEncoding /FirstChar 46 /LastChar 116 /Widths [ 312 0 0 0 562 562 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 782 0 0 0 0 0 0 0 0 0 0 0 0 546 0 0 625 513 0 562 0 312 0 0 0 0 625 562 625 0 459 0 437 ] >> endobj 81 0 obj << /Type /FontDescriptor /FontName /HDZZKV+CMBX12 /Flags 32 /FontBBox [-32 -283 1171 782] /ItalicAngle 0 /Ascent 750 /Descent -251 /CapHeight 666 /StemV 109 /XHeight 500 /StemH 43 /MaxWidth 1201 /FontFile3 82 0 R >> endobj 82 0 obj << /Length 83 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xX\TW"֧]D%EbbHޤe0"EHEFE &j$QkYw#DWd߷;a{?Wc$ kkdYw%~{R #L fFFZ,]1c nH%`Ow .f̛j5j[^ o6x[M\3BCC|4iUgz@7W+;? *7Ma78--a9}],.pyPʐPUpW=7lq|E̦M9k|Œa:fl`&0&f33qd0K-3,e3N2ƎYdV0+*f>g2ƄbLƜ a2yƘ1bbu~S{)u6sUOd e1?I+212Ybrt'nfoV=gm(/<5h ੃;C[Y +0*)}`@kT"4$u8I~m_J@J2]Pl 7K.[`"6:g1ʒB$i6&Q2.c0z JQ;Q"aicOc%e*vJB-;d~hY"9w&yW=z0Hp?H鱮%Uw(E;0ՇB+dm2GN6x싲[DStbѤ0;x~@XБ ԡ棙TF?ߝ$!Ɉ'p&{ ȉp@iI| {J@8ͻc X G -Ү9|?pjEb$ d:GvgD&Es4-NLZE=:8l1cNJ=33zFLꊅnmWǼOF1Ec[3 _nc`Z՟t8N|n>[N@͢,Lڽ,XcKi"E ֪dǩe8 ϵ|1θoLRv̅]= > g<*Vᜳ>J_xi*vTF.I{@eOkΡ-H\C_}[Mlڵ~]VCvx{Xb9i%'Xk|#Ά%d=I^4^ȫRa/}'ONU't·L2|4 KRT'ӡ))TGeMQgy)#(Ci<5:[,2HPhs9!5 -hka XVGNƱ~.q*X 쯻 ^}?ww^Yq4!BJ )J~}7E8Xܠi':MCQwq yʑ] \aLϵ JX˿-좝k~\uNOYbkıw d8ګB0bͅ}9 u sL]7^FݝH6C ]ϡt'Xui i6eYgA,4˩8O=N.'TB pWl.,Ef"RkBtRnP$oeCyYoX&)MR烥A8ԓv6,$#+R]cRVB"K2 Fb;Mm/1Od׮Uom&J?W(71ya{"É?ŕ CWN`9>UNKd/,Ch]$ (Xd4`3"ߞh&e\Z0,HϾ$V&8SR)bgaX+q -?h:Ģ}(ߤː^v b 6SZ>;0sqՅgo/YLAyYh*<ЄϏH6&IۻbQSOtաIj"%%zpUe[6s[FEKF0':oiBRtRCy" IY ZpM6 BwG}קX|ӵP RY~W Ő],RE]&ֽt%t2O6!>N 4la2:J LN!%2(?RH]7Kw ́R_VیUQEUKU\}"t'\ƎFtĊy6-ϵ)Y$H[)ACBQQw#x~=DnbnzcLUѪPlؿN sǑ!5N)'^HmJt'j1NWS5)7k!f[9s|HG|Df _^~Ui5}q¹ԇ,o(<޲ԚH'XyB*r Wa+R)9ÿF=WsS9z 5e`|%#3DT>t8z>,2Jq8OB6߆\EMQez.%+\HA%e*sHxܹ5g |G˼s[<a "`=pyp]M@ܩr5̦#.HJUf4RN-aL~\;y=xv;vy_:cճ/]BQA7ͼ3~RQ(-}d7܎ч CD8j}A HY{^mKB^$ooG١ ck=.63w8!-:L*zjP_Ix ݗخA=R`}KqبC>TeZ/BO8VF)vI=uޞnnuur=>j/L"6I|K1KXO,O 6}GgdD<-6{:Uhme[M6fL"YѰ JqPˠ5~S, F'ȵ - uU9򼼜UU-ND_zWDRE 3%KW:k},QAI} ܝdRv[ݫo {^ף{D~}8ܼk"}kB)_ʔdJdo,(i231p(p@-(jjP+JWԴ #!bSҒb ( {}웷X7 {9vQK]3h^ Wpqɝ3/bC?&H#m|YWM?|]=R C҂&9^At'o 2/tzK ̈́!u3Ď L(S!9X;&G2p@nUfd_K #=GGL78BR 2'OӅ"pB5EJzp *3 ?F8mu)b .BAӂ-եf  L[` ck >To*o'|a=/xӄDM5HZGw*%Hc)6T%G^ν:/FdBRH!ơŏ & CW\9J~5MΎmp`gᄉ*V7ŀPF5% <.1B#%.4E#THc )^!r2*Fh A.pOwp2<&BT-QV`9?tDpd)W8׆W-VU棟(5eƘ08/V"Te)"ɫťޫg}";r29r 1ɠ) W12M\bDcbZHb!#Ge#ثpĔ͙hV+F>}Rn۔r@vWhS]>c/R iBbط=\Y}+hQI3Bc)>b x&R2LY";MrP-A+]`G]w%l3HΣ%:0C/zuv^!k P6xʡ7'ٰdwwd{z.lTO42B/i:rrki~h/ʧGjF&dea'!jfgjM???Q-Xŗw"Q#> /ToUnicode 85 0 R /FirstChar 33 /LastChar 33 /Widths [ 583 ] >> endobj 85 0 obj << /Length 86 0 R /Filter /FlateDecode >> stream x]j0D= gc():EAk࿯zAz3gHJ` X gux%mU&*a[@mWF$\h '} kwD:rċAO>S/[F8<*Dc!'it4&U$j~O=?c endstream endobj 86 0 obj 207 endobj 84 0 obj << /Type /FontDescriptor /FontName /BJRKNI+CMR10 /Flags 4 /FontBBox [-72 -282 1041 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 69 /XHeight 500 /StemH 31 /MaxWidth 1111 /FontFile3 87 0 R >> endobj 87 0 obj << /Length 88 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xz XHfB+TP;}ߵZ+(!,$O} q ZOպ/XUOkkkk=szu2$g~^ջ%DVo:Q`? k_;,;d9zyEUꢀ]^ޡcN=n)Sf.o%%pa;fwhhɓ&L `۰]޶CP}-)jM Qsz}j$ESʁKmQj!5J-&Rۨ$j;5ZBMRSerj:AfRՔECQ)kʆD P"*X*EARDʏOSPT&5zb*Ԃ># 2՛R  pF]OY e"7~b_e1,Z&io5@3Zi,v3l;{۬sm޴9(grݵ>q_۹N 1uͰa~tDe#6⛑#bF;*cњD<6w\6H#j Ulr2# @!OnXGlqvP1tЦU7Ho 6Thjh@tOThbg/ݠ Q5+MDk!&CV`=" |KE|yf <. F3N2XF~^ݪ r]^&ʩ s6p8~w3A4<oCLnzX;V3?x—MbJ(( G]C_HMKLTz)BR$"<AM΄TT3F[<V=5JPTVa5cv2u$4(^ޡbҦfaMÉm (l NzU׎7Þ=FƲc E=oBvt< {HEi2Z8Y{VnBYɥ py8~[.yI:i^J\/?Dl~cad5"GeFUu͓-<{ĒW մ yEo~O!1#KOÉCGZJV +A,ur FǦ/}񓳩@tS:P&Ǧ%x6.I٠4RCaH{@ PUL 䉿ƛnE +Õ0(Km)5vL4ZzB߰ 5;$AL6d@pXe/j@mhO.k&, _-,pQ$n3Bҡo}ڇi)1B*13l~x6 1$A}5E,JOD4$6'k!~NM'%U|Έ АGh7h B4c5Q3!. ƓBl R5,=f|qSQY 1Ԣ\O[{ˋ/ D/YԋSMzESMMֵ^iI<S (rkk}wr kYNRȶ#:eFNRv\Hcu.z-Rqw'@^fl{<7wOƁs`KJ Cŏ;SE"f<;_s'[O@\`=Wt!6p r> bM4Aj7Lmo2}+ު'UB7TJ`J?ɿ+9lOvN#M(~F[ 3{r?]dEU"7nZRY4𠣧ݧI_Ucjbi.$gs&4?.w83v>5juf~e #>Zм6{,"yt dE4:pp=*\u^UϹ*~UUj><`2[gcHEAA:\OZ 4 )|5lB$&<5QЁ8<%ca#R7i$WZlWf UGkuQ5j?7*?_Sx(@:Y[/h6OI#٬Sc!W cI{%!=" %$dpvB6q 1i7#9yt4Iv9FGؗoY`ac1ߍA̾jTJYv'NSW :8Ma\R㾺Q4Gr"sFajRϮilBJNnotUBp/"QD%Ur~B38*|(GJhyA2[Mv6wWR@I|+JB.Fe7E6. {XT+k{g# ɹA?#a$,N$'(J{TV1\buîB@SE;x2KD<Z7 OAK 4MGNŎǃB(!gbd%:cnhL-CH*R"b! - .Е7zmMC9LoQlDF2ZƠ}p{Hb#v7#76g'1߈,QZoǴn6U5_$O#2/?VrV5$t)pBO{絑 z:I|QH,b E/YKCԴٚj5ꝂG. HDzo}o>Iwզ#ZHT}^D/Z+`nݫJ"$$$ [cޱnc a5iiuG>װD?˒o`}OתOhI;3'O* . ꃌUZHmDPReu"&␫GޚoW36O|r dz9d4hyLR8 ~ծMh7} oJrRZ.G2⧕I5IUA٤C1.vt₪A@?;U1߈)qZdAup؄g^] 5^3s!tHxQ>XvɎ]t50BёLҎvlv{l~ce&'\e-嶩J]JTȕrs55|R56է`zB2(o=OzWi<(MZZ>k}0o!on!7]]3ۋGrX*Dj(q`MO"c-&\H8cUt2 ל zv4B#k,\g20?uHMDm|d|5әGG!BCh`ձQ#cj(o/mu$2ܢ7/?KW%H%l [FZ%zL<$FIQ:34T.]hÎ̈BO;leįH& q q AܻxY-1tҺ"CyyawwҎ!"EbI%{PЗVuT2P?`υTؠN'YV@LOҢU%qq LRZJZN ԇCO.3{V`5rNd4JGo57wh7p-d?,6LHuD )~wrxڷXȉ;疰d V j#W [ n^~kwFnd)M)7O| 2& NaKP楔0ؕ ¬y鷈P 7,j.HwOŃwc $t:rgs4Ԟh\dL;=e"4N͎\N\c3 㲟74{4sQ+.,zs^UxY3}~—-I6<_Ə0N /DWX߱>A7;Y]d )F%/;%٪XC|mN;9WPzs_>eglp h)mվxC]O㦌s63˳KkF}Lt]I>*k^7]=GaO5ꋧNYc}FX<C #ˆHs-}- E\eTqRKL^Emd HVR =[Y/s*JF _Tkj}Z_Y6k>`}qe'5 ֖ ?#DqK8&@V>h=Z-DoyN.u+ '9j3Hp{~EnFZnPb-zsgd&OI+@Y!ni<x1~ [v<5%=ϑ,׊z"!7MHXjBiLeƽ [4gMN[4 (ҤutgGע:Q>Ax pݝGDމb \|se^|.xs!r- JҪ]E9ީ‚BBtA5Uz}i2Q@AD?j[V=1+P;_ɈuM_y!HUd-߮R*!f0,D?h!>Tǹ*쮈-)++9y$w pXRȟ3dt69L:J7L|GjB[Mvj*fegG\N*L5roFkQNf׋Xkd)h/n ȉ|WҧaX`?\Z,M\ƑkYP%DCDdF.}ILH`n~0 +D3T,Dh-{': !2Y}g-%ݕt(WJ#И(&%>^09 IrS$;(lىp'.t0uϒy>|:sFoj/݂ WYwXgVvY3O׳ DQ2&*\*[=a\Tm4 P5!jx-M(zt KOU0d6j vo}詊FCG]*J*ߢxD?q)ɾ| xnDS`Kl`4c-=PQᝨ+D`3s7x̤؈iQZHd$d"sW(C}~(O(:~fULvo毝[^m髏9B4g~#Gn V^jz@N 2.-7lviMcڈ~ ǻuGI@ңc;\.| I)7\^NұGȯX&)"IsTLb:r+D鐩MrO,w6Zt6#1D](8hGs h0&.~1˜öf2ָ¤Cu7='FN10 ьI4%ǟi<Ǔ1a%?§ЖMq:]".j2IѶxIx'%#Bt\;. uxYcn(MOTyC!2DIfD>n9Rt^u)ɜ}Z 00Sn##'J&EK ٽώVSё0#WW&y'ȿ&(h! )wPRa{> n\h ow79fZ?>9sW&@HsK_Ts"K\m>_K~)ՊH endstream endobj 88 0 obj 8897 endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ILDUPH+CMR6 /FontDescriptor 89 0 R /Encoding /MacRomanEncoding /FirstChar 49 /LastChar 93 /Widths [ 611 611 0 0 0 0 0 0 0 351 0 0 935 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 351 0 351 ] >> endobj 89 0 obj << /Type /FontDescriptor /FontName /ILDUPH+CMR6 /Flags 32 /FontBBox [-32 -282 887 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 83 /XHeight 500 /StemH 39 /MaxWidth 917 /FontFile3 90 0 R >> endobj 90 0 obj << /Length 91 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xeleu;]⦛`mHd.d#45뱭ٵ2vqa[D6enla1.!q%B&FC .d n/W21OyOE*>G49,5r8b?XUf!mC;j D,@QH1A3p5P@@U]5 ]7soV,R׭in'8RqD|+⮮$>)Z(?D#_D6.Tdij8,6?d ijnB1_i *>} +B2܆Y?˧؇2C &&FGr?~zߕxgil㥑D˓)g֬.d2+NO+> endobj 92 0 obj << /Type /FontDescriptor /FontName /KUCCWS+CMBX6 /Flags 32 /FontBBox [-32 -32 1003 718] /ItalicAngle 0 /Ascent 686 /Descent 0 /CapHeight 609 /StemV 130 /XHeight 457 /StemH 60 /MaxWidth 1033 /FontFile3 93 0 R >> endobj 93 0 obj << /Length 94 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xcd`ab`dddsu0T~H3a!+k7s7˦BcG``fd+nr/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsSN%E )Ey LQ @00adkF3CD{)S{J=cq.nþҞ<;tLmIw7ֳۭCûjwE]]ŝu]ulz>cAиqe}M=þJ|]vz@5+j~>qƟ?YDLG嬗ئn߽1۟?;%w-¶\Vjy9~;0{̙3~Mf?][|>)<<10' endstream endobj 94 0 obj 512 endobj 16 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EQDKJN+CMSY6 /FontDescriptor 95 0 R /Encoding << /Type /Encoding /Differences [ 33 /greaterequal /equivalence ] >> /ToUnicode 96 0 R /FirstChar 33 /LastChar 34 /Widths [ 962 962 ] >> endobj 96 0 obj << /Length 97 0 R /Filter /FlateDecode >> stream x]j0D= gc():EAk࿯zAz3gHJ` X gux%mU&*a[@mWF$\h '} kwD:rċAO>S/[F8<*Dc!'it4&U$j~O=?c endstream endobj 97 0 obj 207 endobj 95 0 obj << /Type /FontDescriptor /FontName /EQDKJN+CMSY6 /Flags 4 /FontBBox [-32 -282 901 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 52 /XHeight 500 /StemH 52 /MaxWidth 931 /FontFile3 98 0 R >> endobj 98 0 obj << /Length 99 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xeO_Hss;lJ#C]Q 顰(leR!zsrvn쟛[i7t3;J˨fRPz-vBC|}(CPU54V2ehhQΉW,pK{0l`.d9PIן"k2hLrrK2Ź34YO8jlfX*ihS& G\#SW Q,tSRQ>W&, AeQ[ HAɗDH=_3 )6մ O)'-Wͭ.'St<ґ#:p}+ؐ?LD&32<!Ǥ:z 0~c/KGG> MjxkzJ#[,o]ٕ"*/ui0wbDJ`Ų2pIPӒ+ЎI=jpmd:F[fʿo|R a~)Iɾc| ]nZoa &­RWZ8+͠Sˏ={lg7:a|~/0ҋ_KW(4?HB'$_T^|@嵁Ͷ<. ,YCL-<^aL~$L}A<'F#^L endstream endobj 99 0 obj 684 endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QTDCDD+CMSY6 /FontDescriptor 100 0 R /Encoding /MacRomanEncoding /FirstChar 123 /LastChar 125 /Widths [ 638 0 638 ] >> endobj 100 0 obj << /Type /FontDescriptor /FontName /QTDCDD+CMSY6 /Flags 32 /FontBBox [-32 -282 901 782] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 666 /StemV 52 /XHeight 500 /StemH 52 /MaxWidth 931 /FontFile3 101 0 R >> endobj 101 0 obj << /Length 102 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xeO_Hss;lJ#C]Q 顰(leR!zsrvn쟛[i7t3;J˨fRPz-vBC|}(CPU54V2ehhQΉW,pK{0l`.d9PIן"k2hLrrK2Ź34YO8jlfX*ihS& G\#SW Q,tSRQ>W&, AeQ[ HAɗDH=_3 )6մ O)'-Wͭ.'St<ґ#:p}+ؐ?LD&32<!Ǥ:z 0~c/KGG> MjxkzJ#[,o]ٕ"*/ui0wbDJ`Ų2pIPӒ+ЎI=jpmd:F[fʿo|R a~)Iɾc| ]nZoa &­RWZ8+͠Sˏ={lg7:a|~/0ҋ_KW(4?HB'$_T^|@嵁Ͷ<. ,YCL-<^aL~$L}A<'F#^L endstream endobj 102 0 obj 684 endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XMJSUQ+CMSY5 /FontDescriptor 103 0 R /Encoding << /Type /Encoding /Differences [ 33 /prime ] >> /ToUnicode 104 0 R /FirstChar 33 /LastChar 33 /Widths [ 440 ] >> endobj 104 0 obj << /Length 105 0 R /Filter /FlateDecode >> stream x]j0D= gc():EAk࿯zAz3gHJ` X gux%mU&*a[@mWF$\h '} kwD:rċAO>S/[F8<*Dc!'it4&U$j~O=?c endstream endobj 105 0 obj 207 endobj 103 0 obj << /Type /FontDescriptor /FontName /XMJSUQ+CMSY5 /Flags 4 /FontBBox [-23 -32 393 591] /ItalicAngle 0 /Ascent 559 /Descent 0 /CapHeight 496 /StemV 56 /XHeight 372 /StemH 56 /MaxWidth 414 /FontFile3 106 0 R >> endobj 106 0 obj << /Length 107 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xcd`ab`ddds 4T~H3a!ann }O=J19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUML:)槤e200000v1012q/dGhOϔyݳ8g/MjȩiǵKzkcϔ '/it\/b^ʽh endstream endobj 107 0 obj 295 endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LKMCOT+CMMI6 /FontDescriptor 108 0 R /Encoding /MacRomanEncoding /FirstChar 44 /LastChar 117 /Widths [ 379 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 962 0 0 0 0 0 0 0 998 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 445 511 0 0 0 0 0 0 0 0 584 0 737 ] >> endobj 108 0 obj << /Type /FontDescriptor /FontName /LKMCOT+CMMI6 /Flags 32 /FontBBox [-32 -236 976 715] /ItalicAngle 0 /Ascent 683 /Descent -204 /CapHeight 607 /StemV 85 /XHeight 455 /StemH 35 /MaxWidth 1006 /FontFile3 109 0 R >> endobj 109 0 obj << /Length 110 0 R /Subtype /Type1C /Filter /FlateDecode >> stream xMklSu{m|88G&y'ͭecw֮ZڵccA1Jq d(!A%,F?,FBv |99sH"7 I2wf%z- qefOE M,kgӗIj:Z]R(YzSfz{EŎRm*}j9jnUMRnbE}T۬]]Jܺh45;ʴbRڨby1[I-ʞJZg ]m3 VЫNz JcD5q8Hl ^$P."pb%"`_!3=aR zv[D cfqr++{6h{FGL. `@ oQVsx[PHؔߙ]a hO7.$>?g3sI|q 7u`R(-FP\9(aѵل Y^qu@C>E6yͭ$=Ϳ%T]MXԺ{k{#}p{J+8G6(P_R/z D!+kzt2e(P/ʻ?MLP#u7L` &ΜIM|-@?źN2do| )N?rio) ޘ#3z,NtvfxK|'q~G\x0Ӵkd*Ihd< DQAu"nM>]YFXgӀת*{`BW7]Eg-}.\Z@]x|` 2 sTv-YT#jne: ÝɉT2E 'ۥ{?= ȣ}?dC0 t{ȢSOV߲i,NQKx D+=(/tOs/ȅ 1k$+La3k2E|Z:0l1 .ais1NH8g|XtELax:O IlNBi1Fo{B#-Åڿmh1iԉ!.$_ĺD]5չ;₩XL\ endstream endobj 110 0 obj 1115 endobj 111 0 obj (tgp) endobj 112 0 obj (Mac OS X 10.7.2 Quartz PDFContext) endobj 113 0 obj (Robert B. Gramacy) endobj 114 0 obj (Preview) endobj 115 0 obj (D:20120127173531Z00'00') endobj 1 0 obj << /Title 111 0 R /Author 113 0 R /Producer 112 0 R /Creator 114 0 R /CreationDate 115 0 R /ModDate 115 0 R >> endobj xref 0 116 0000000000 65535 f 0000091124 00000 n 0000009580 00000 n 0000013061 00000 n 0000000022 00000 n 0000009560 00000 n 0000009823 00000 n 0000013025 00000 n 0000084188 00000 n 0000000000 00000 n 0000087989 00000 n 0000082720 00000 n 0000089150 00000 n 0000044266 00000 n 0000086782 00000 n 0000000000 00000 n 0000085214 00000 n 0000034516 00000 n 0000026665 00000 n 0000036167 00000 n 0000013194 00000 n 0000040021 00000 n 0000041169 00000 n 0000000000 00000 n 0000038057 00000 n 0000016729 00000 n 0000046069 00000 n 0000051636 00000 n 0000000000 00000 n 0000058505 00000 n 0000065608 00000 n 0000067195 00000 n 0000000000 00000 n 0000072963 00000 n 0000010243 00000 n 0000010289 00000 n 0000013004 00000 n 0000013144 00000 n 0000013408 00000 n 0000013636 00000 n 0000016708 00000 n 0000017424 00000 n 0000017654 00000 n 0000026644 00000 n 0000027070 00000 n 0000027299 00000 n 0000034495 00000 n 0000034771 00000 n 0000034999 00000 n 0000036146 00000 n 0000036439 00000 n 0000036667 00000 n 0000038036 00000 n 0000038626 00000 n 0000038323 00000 n 0000038606 00000 n 0000038853 00000 n 0000040000 00000 n 0000040195 00000 n 0000040420 00000 n 0000041149 00000 n 0000041506 00000 n 0000041734 00000 n 0000044245 00000 n 0000044576 00000 n 0000044803 00000 n 0000046048 00000 n 0000046337 00000 n 0000046569 00000 n 0000051615 00000 n 0000051922 00000 n 0000052153 00000 n 0000058484 00000 n 0000059026 00000 n 0000058723 00000 n 0000059006 00000 n 0000059256 00000 n 0000065587 00000 n 0000065783 00000 n 0000066008 00000 n 0000067174 00000 n 0000067531 00000 n 0000067763 00000 n 0000072942 00000 n 0000073480 00000 n 0000073177 00000 n 0000073460 00000 n 0000073709 00000 n 0000082699 00000 n 0000082985 00000 n 0000083212 00000 n 0000084168 00000 n 0000084362 00000 n 0000084589 00000 n 0000085194 00000 n 0000085758 00000 n 0000085455 00000 n 0000085738 00000 n 0000085985 00000 n 0000086762 00000 n 0000086959 00000 n 0000087189 00000 n 0000087968 00000 n 0000088514 00000 n 0000088208 00000 n 0000088493 00000 n 0000088739 00000 n 0000089129 00000 n 0000089478 00000 n 0000089709 00000 n 0000090919 00000 n 0000090941 00000 n 0000090964 00000 n 0000091017 00000 n 0000091054 00000 n 0000091081 00000 n trailer << /Size 116 /Root 37 0 R /Info 1 0 R /ID [ <57a2f7b827228b14bcb7e8a21cb2c914> <57a2f7b827228b14bcb7e8a21cb2c914> ] >> startxref 91250 %%EOF tgp/vignettes/cat.iRnw0000644000175100001440000003305512506600653014513 0ustar hornikusers\section{Non--real--valued, categorical and other inputs} \label{sec:cat} <>= library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) @ Early versions of {\tt tgp} worked best with real--valued inputs $\mb{X}$. While it was possible to specify ordinal, integer--valued, or even binary inputs, {\tt tgp} would treat them the same as any other real--valued input. Two new arguments to {\tt tgp.default.params}, and thus the ellipses ({\tt ...}) argument to the {\tt b*} functions, provide a more natural way to model with non--real valued inputs. In this section we shall introduce these extensions, and thereby illustrate how the current version of the package can more gracefully handle categorical inputs. We argue that the careful application of this new feature can lead to reductions in computational demands, improved exploration of the posterior, increased predictive accuracy, and more transparent interpretation of the effects of categorical inputs. Classical treed methods, such as CART \cite{brei:1984}, can cope quite naturally with categorical, binary, and ordinal, inputs. Categorical inputs can be encoded in binary, and splits can be proposed with rules such as $x_i < 1$. Once a split is made on a binary input, no further process is needed, marginally, in that dimension. Ordinal inputs can also be coded in binary, and thus treated as categorical, or treated as real--valued and handled in a default way. GP regression, however, handles such non--real--valued inputs less naturally, unless (perhaps) a custom and non--standard form of the covariance function is used \cite{qian:wu:wu:2009}. When inputs are scaled to lie in $[0,1]$, binary--valued inputs $x_i$ are always a constant distance apart---at the largest possible distance in the range. A separable correlation function width parameter $d_i$ will tend to infinity (in the posterior) if the output does not vary with $x_i$, and will tend to zero if it does. Clearly, this functionality is more parsimoniously achieved by partitioning, e.g., using a tree. However, trees with fancy regression models at the leaves pose other problems, as discussed below. Consider as motivation, the following modification of the Friedman data \cite{freid:1991} (see also Section 3.5 of \cite{gramacy:2007}). Augment 10 real--valued covariates in the data ($\mb{x} = \{x_1,x_2,\dots,x_{10}\}$) with one categorical indicator $I\in\{1,2,3,4\}$ that can be encoded in binary as \begin{align*} 1& \equiv (0,0,0) & 2 &\equiv (0,0,1) & 3 &\equiv (0,1,0) & 4 &\equiv (1,0,0). \end{align*} Now let the function that describes the responses ($Z$), observed with standard Normal noise, have a mean \begin{equation} E(Z|\mb{x}, I) = \left\{ \begin{array}{cl} 10 \sin(\pi x_1 x_2) & \mbox{if } I = 1 \\ 20(x_3 - 0.5)^2 &\mbox{if } I = 2 \\ 10x_4 + 5 x_5 &\mbox{if } I = 3 \\ 5 x_1 + 10 x_2 + 20(x_3 - 0.5)^2 + 10 \sin(\pi x_4 x_5) &\mbox{if } I = 4 \label{eq:f1b} \end{array} \right. \end{equation} that depends on the indicator $I$. Notice that when $I=4$ the original Friedman data is recovered, but with the first five inputs in reverse order. Irrespective of $I$, the response depends only on $\{x_1,\dots,x_5\}$, thus combining nonlinear, linear, and irrelevant effects. When $I=3$ the response is linear $\mb{x}$. A new function has been included in the {\tt tgp} package which facilitates generating random realizations from (\ref{eq:f1b}). Below we obtain 500 such random realizations for training purposes, and a further 1000 for testing. <<>>= fb.train <- fried.bool(500) X <- fb.train[,1:13]; Z <- fb.train$Y fb.test <- fried.bool(1000) XX <- fb.test[,1:13]; ZZ <- fb.test$Ytrue @ A separation into training and testing sets will be useful for later comparisons by RMSE. The names of the data frame show that the first ten columns encode $\mb{x}$ and columns 11--13 encode the boolean representation of $I$. <<>>= names(X) @ One, na\"ive approach to fitting this data would be to fit a treed GP LLM model ignoring the categorical inputs. But this model can only account for the noise, giving high RMSE, and so is not illustrated here. Clearly, the indicators must be included. One simple way to do so would be to posit a Bayesian CART model. <<>>= fit1 <- bcart(X=X, Z=Z, XX=XX, verb=0) rmse1 <- sqrt(mean((fit1$ZZ.mean - ZZ)^2)) rmse1 @ In this case the indicators are treated appropriately (as indicators), but in some sense so are the real--valued inputs as only constant models are fit at the leaves of the tree. \begin{figure}[ht!] <>= tgp.trees(fit1, "map") @ <>= graphics.off() @ \centering \includegraphics[trim=0 100 0 25]{tgp2-cat-fbcart-mapt} \caption{Diagrammatic depiction of the maximum {\em a' posteriori} (MAP) tree for the boolean indicator version of the Friedman data in Eq.~(\ref{eq:f1b}) using Bayesian CART.} \label{f:fb:cart} \end{figure} Figure \ref{f:fb:cart} shows that the tree does indeed partition on the indicators, and the other inputs, as expected. One might expect a much better fit from a treed linear model to this data, since the response is linear in some of its inputs. <<>>= fit2 <- btlm(X=X, Z=Z, XX=XX, verb=0) rmse2 <- sqrt(mean((fit2$ZZ.mean - ZZ)^2)) rmse2 @ Unfortunately, this is not the case---the RMSE obtained is similar to the one for the CART model. \begin{figure}[ht!] <>= tgp.trees(fit2, "map") @ <>= graphics.off() @ \centering \includegraphics[trim=0 100 0 25]{tgp2-cat-fbtlm-trees} \caption{Diagrammatic depiction of the maximum {\em a' posteriori} (MAP) tree for the boolean indicator version of the Friedman data in Eq.~(\ref{eq:f1b}) using a Bayesian treed linear model.} \label{f:fb:btlm:trees} \end{figure} Figure \ref{f:fb:btlm:trees} shows that the tree does indeed partition, but not on the indicator variables. When a linear model is used at the leaves of the tree the boolean indicators cannot be partitioned upon because doing so would cause the design matrix to become rank--deficient at the leaves of the tree (there would be a column of all zeros or all ones). A treed GP would have the same problem. A new feature in {\tt tgp} makes dealing with indicators such as these more natural, by including them as candidates for treed partitioning, but ignoring them when it comes to fitting the models at the leaves of the tree. The argument {\tt basemax} to {\tt tgp.default.params}, and thus the ellipses ({\tt ...}) argument to the {\tt b*} functions, allows for the specification of the last columns of {\tt X} to be considered under the base (LM or GP) model. In the context of our example, specifying {\tt basemax = 10} ensures that only the first 10 inputs, i.e., $\mb{X}$ only (excluding $I$), are used to predict the response under the GPs at the leaves. Both the columns of $\mb{X}$ and the columns of the boolean representation of the (categorical) indicators $I$ are (still) candidates for partitioning. This way, whenever the boolean indicators are partitioned upon, the design matrix (for the GP or LM) will not contain the corresponding column of zeros or ones, and therefore will be of full rank. Let us revisit the treed LM model with {\tt basemax = 10}. <<>>= fit3 <- btlm(X=X, Z=Z, XX=XX, basemax=10, verb=0) rmse3 <- sqrt(mean((fit3$ZZ.mean - ZZ)^2)) rmse3 @ \begin{figure}[ht!] <>= tgp.trees(fit3, "map") @ <>= graphics.off() @ \centering \includegraphics[trim=0 90 0 25,scale=0.75]{tgp2-cat-fbtlm-mapt} \caption{Diagrammatic depiction of the maximum {\em a' posteriori} (MAP) tree for the boolean indicator version of the Friedman data in Eq.~(\ref{eq:f1b}) using a Bayesian treed linear model with the setting {\tt basemax = 10}.} \label{f:fb:btlm:mapt} \end{figure} Figure \ref{f:fb:btlm:mapt} shows that the MAP tree does indeed partition on the indicators in an appropriate way---as well as on some other real--valued inputs---and the result is the lower RMSE we would expect. A more high--powered approach would clearly be to treat all inputs as real--valued by fitting a GP at the leaves of the tree. Binary partitions are allowed on all inputs, $\mb{X}$ and $I$, but treating the boolean indicators as real--valued in the GP is clearly inappropriate since it is known that the process does not vary smoothly over the $0$ and $1$ settings of the three boolean indicators representing the categorical input $I$. <<>>= fit4 <- btgpllm(X=X, Z=Z, XX=XX, verb=0) rmse4 <- sqrt(mean((fit4$ZZ.mean - ZZ)^2)) rmse4 @ Since the design matrices would become rank--deficient if the boolean indicators are partitioned upon, there was no partitioning in this example. <<>>= fit4$gpcs @ Since there are large covariance matrices to invert, the MCMC inference is {\em very} slow. Still, the resulting fit (obtained with much patience) is better that the Bayesian CART and treed LM (with {\tt basemax = 10}) ones, as indicated by the RMSE. We would expect to get the best of both worlds if the setting {\tt basemax = 10} were used when fitting the treed GP model, thus allowing partitioning on the indicators by guarding against rank deficient design matrices. <<>>= fit5 <- btgpllm(X=X, Z=Z, XX=XX, basemax=10, verb=0) rmse5 <- sqrt(mean((fit5$ZZ.mean - ZZ)^2)) rmse5 @ And indeed this is the case. The benefits go beyond producing full rank design matrices at the leaves of the tree. Loosely speaking, removing the boolean indicators from the GP part of the treed GP gives a more parsimonious model, without sacrificing any flexibility. The tree is able to capture all of the dependence in the response as a function of the indicator input, and the GP is the appropriate non--linear model for accounting for the remaining relationship between the real--valued inputs and outputs. \begin{figure}[ht!] <>= h <- fit1$post$height[which.max(fit1$posts$lpost)] tgp.trees(fit5, "map") @ <>= graphics.off() @ \centering \includegraphics[trim=0 100 0 25]{tgp2-cat-fb-mapt} \caption{Diagrammatic depiction of the maximum {\em a' posteriori} (MAP) tree for the boolean indicator version of the Friedman data in Eq.~(\ref{eq:f1b}) using {\tt basemax=10}.} \label{f:fb:mapt} \end{figure} We can look at the maximum {\em a' posteriori} (MAP) tree, to see that only (and all of) the indicators were partitioned upon in Figure \ref{f:fb:mapt}. Further advantages to this approach include speed (a partitioned model gives smaller covariance matrices to invert) and improved mixing in the Markov chain when a separable covariance function is used. Note that using a non--separable covariance function in the presence of indicators would result in a poor fit. Good range ($d$) settings for the indicators would not necessarily coincide with good range settings for the real--valued inputs. A complimentary setting, {\tt splitmin}, allows the user to specify the first column of the inputs {\tt X} upon which treed partitioning is allowed. From Section 3.5 of the first {\tt tgp} vignette \cite{gramacy:2007}, it was concluded that the original formulation of Friedman data was stationary, and thus treed partitioning is not required to obtain a good fit. The same would be true of the response in (\ref{eq:f1b}) after conditioning on the indicators. Therefore, the most parsimonious model would use {\tt splitmin = 11}, in addition to {\tt basemax = 10}, so that only $\mb{X}$ are under the GP, and only $I$ under the tree. Fewer viable candidate inputs for treed partitioning should yield improved mixing in the Markov chain, and thus lower RMSE. <<>>= fit6 <- btgpllm(X=X, Z=Z, XX=XX, basemax=10, splitmin=11, verb=0) rmse6 <- sqrt(mean((fit6$ZZ.mean - ZZ)^2)) rmse6 @ Needless to say, it is important that the input {\tt X} have columns which are ordered appropriately before the {\tt basemax} and {\tt splitmin} arguments can be properly applied. Future versions of {\tt tgp} will have a formula--based interface to handle categorical ({\tt factors}) and other inputs more like other {\sf R} regression routines, e.g., {\tt lm} and {\tt glm}. The tree and binary encodings represent a particularly thrifty way to handle categorical inputs in a GP regression framework, however it is by no means the only or best approach to doing so. A disadvantage to the binary coding is that it causes the introduction of several new variables for each categorical input. Although they only enter the tree part of the model, and not the GP (where the introduction of many new variables could cause serious problems), this may still be prohibitive if the number of categories is large. Another approach that may be worth considering in this case involves designing a GP correlation function which can explicitly handle a mixture of qualitative (categorical) and quantitative (real-valued) factors \cite{qian:wu:wu:2009}. An advantage of our treed approach is that it is straightforward to inspect the effect of the categorical inputs by, e.g., counting the number of trees (in the posterior) which contain a particular binary encoding. It is also easy to see how the categorical inputs interact with the real-valued ones by inspecting the (posterior) parameterizations of the correlation parameters in each partition on a binary encoding. Both of these are naturally facilitated by gathering traces ({\tt trace = TRUE}), as described in the 1.x vignette \cite{gramacy:2007}. In Section \ref{sec:sens} we discuss a third way of determining the sensitivity of the response to categorical and other inputs. tgp/vignettes/pred.iRnw0000644000175100001440000001061212506600653014670 0ustar hornikusers\subsection{Collaboration with {\tt predict.tgp}} \label{sec:apred} <>= library(tgp) library(maptree) ##options(width=65) seed <- 0; set.seed(seed) @ In this section I revisit the motorcycle accident data in order to demonstrate how the {\tt predict.tgp} function can be helpful in collaborative uses of {\tt tgp}. Consider a fit of the motorcycle data, and suppose that infer the model parameters only (obtaining no samples from the posterior predictive distribution). The \verb!"tgp"!-class output object can be saved to a file using the {\tt R}--internal {\tt save} function. <<>>= library(MASS) out <- btgpllm(X=mcycle[,1], Z=mcycle[,2], bprior="b0", pred.n=FALSE, verb=0) save(out, file="out.Rsave") out <- NULL @ Note that there is nothing to plot here because there is no predictive data. (\verb!out <- NULL! is set for illustrative purposes.) Now imagine e--mailing the ``out.Rsave'' file to a collaborator who wishes to use your fitted {\tt tgp} model. S/he could first load in the \verb!"tgp"!--class object we just saved, design a new set of predictive locations {\tt XX} and obtain kriging estimates from the MAP model. <<>>= load("out.Rsave") XX <- seq(2.4, 56.7, length=200) out.kp <- predict(out, XX=XX, pred.n=FALSE) @ Another option would be to sample from the posterior predictive distribution of the MAP model. <<>>= out.p <- predict(out, XX=XX, pred.n=FALSE, BTE=c(0,1000,1)) @ This holds the parameterization of the {\tt tgp} model {\em fixed} at the MAP, and samples from the GP or LM posterior predictive distributions at the leaves of the tree. Finally, the MAP parameterization can be used as a jumping-off point for more sampling from the joint posterior and posterior predictive distribution. <<>>= out2 <- predict(out, XX, pred.n=FALSE, BTE=c(0,2000,2), MAP=FALSE) @ Since the return--value of a {\tt predict.tgp} call is also a \verb!"tgp"!--class object the process can be applied iteratively. That is, {\tt out2} can also be passed to {\tt predict.tgp}. \begin{figure}[hp] \centering <>= plot(out.kp, center="km", as="ks2") @ <>= graphics.off() @ \vspace{-0.1cm} \includegraphics[trim=50 30 50 25]{tgp-pred-kp} <>= plot(out.p) @ <>= graphics.off() @ \vspace{-0.1cm} \includegraphics[trim=50 30 50 25]{tgp-pred-p} <>= plot(out2) @ <>= graphics.off() @ \includegraphics[trim=50 30 50 25]{tgp-pred-2} \caption{Predictive surfaces ({\em left}) and error/variance plots ({\em right}) resulting from three different uses of the {\tt predict.tgp} function: MAP kriging ({\em top}), sampling from the MAP ({\em middle}), sampling from the joint posterior and posterior predictive starting from the MAP ({\em bottom}).} \label{f:pred} \end{figure} Figure \ref{f:pred} plots the posterior predictive surfaces for each of the three calls to {\tt predict.tgp} above. The kriging surfaces are smooth within regions of the partition, but the process is discontinuous across partition boundaries. The middle surface is simply a Monte Carlo--sample summarization of the kriging one above it. The final surface summarizes samples from the posterior predictive distribution when obtained jointly with samples from $\mathcal{T}|\bm{\theta}$ and $\bm{\theta}|\mathcal{T}$. Though these summaries are still ``noisy'' they depict a process with smoother transitions across partition boundaries than ones conditioned only on the MAP parameterization. <>= unlink("out.Rsave") @ Finally, the {\tt predict.tgp} function can also sample from the ALC statistic and calculate expected improvements (EI) at the {\tt XX} locations. While the function was designed with prediction in mind, it is actually far more general. It allows a continuation of MCMC sampling where the {\tt b*} function left off (when {\tt MAP=FALSE}) with a possibly new set of predictive locations {\tt XX}. The intended use of this function is to obtain quick kriging--style predictions for a previously-fit MAP estimate (contained in a \verb!"tgp"!-class object) on a new set of predictive locations {\tt XX}. However, it can also be used simply to extend the search for an MAP model when {\tt MAP=FALSE}, {\tt pred.n=FALSE}, and {\tt XX=NULL}. tgp/vignettes/sens.iRnw0000644000175100001440000007301612506600653014715 0ustar hornikusers\section{Analysis of sensitivity to inputs} \label{sec:sens} <>= library(tgp) seed <- 0; set.seed(seed) @ %% Bobby says to Taddy: Need to check that LHS stuff does the right %% thing for the inputs that are being treated as categorical. Not %% sure what this means because exactly since "treating as categorical" %% is means "no-GP" or "tree-only" on those inputs. One way might be %% to allow a scale=0 argument at which point the resulting LHS samples %% snap to {0,1} The mode argument could determine the p parameter %% in the Bernoulli(p) distribution that would result. %% Taddy replies: done and done! At least, the following seems fine. %% re-fit the ozone data with temperature as a threshold effect: %% library(tgp) %% X <- airquality[,2:4] %% X$Temp[X$Temp >74] <- 1 %% X$Temp[X$Temp >1] <- 0 %% Z <- airquality$Ozone %% rect <- t(apply(X, 2, range, na.rm=TRUE)) %% mode <- apply(X , 2, mean, na.rm=TRUE) %% shape <- rep(2,3) %% mode[3] <- .5 %% shape[3] <- 0 %% s.air <- sens(X=X, Z=Z, nn.lhs=300, rect=rect, %% shape=shape, mode=mode, basemax=2) %% plot(s.air, layout="sens") %% plot(s.air, layout="sens", maineff=c(1,2,3)) %% %% This example has been added to the vignette. %% This won't work for your 'binary' representation of %% categorical variables with more than two levels, however. %% It will provide an answer, but perhaps not what you'd want %% since it will look at the sensitivity to each binary element, %% rather than at sensitivity to the unique sequences. %% This is fixable, but it would take some real effort and time (I'll make %% sure to get it done for a future iteration). %% The code for plotting is a bit messy, but it should be robust enough. %% I've added a note in the description of 'shape' in sens.Rd outlining %% these changes. %% Changes in the c-code only occur in tgp.cc, where the %% main effects calculation now takes basemax into consideration. Methods for understanding how inputs, or explanatory variables, contribute to the outputs, or response, of simple statistical models are by now classic in the literature and frequently used in practical application. For example, in linear regression one can perform $F$--tests to ascertain the relevance of a predictor, or inspect the leverage of a particular input setting, or use Cooks' distance, to name a few. Unfortunately, such convenient statistics/methods are not available for more complicated models, such as those in the {\tt tgp} family of nonparametric models. A more advanced tool is needed. Sensitivity Analysis (SA) is a resolving of the sources of output variability by apportioning elements of this variation to different sets of input variables. It is applicable in wide generality. The edited volume by Saltelli et al.~\cite{SaltChanScot2000} provides an overview of the field. Valuable recent work on smoothing methods is found in \cite{StorHelt2008,VeigWahlGamb2009}, and Storlie, et al.~\cite{StorSwilHeltSall2009}, provide a nice overview of nonparametric regression methods for inference about sensitivity. The analysis of response variability is useful in a variety of different settings. For example, when there is a large number of input variables over which an objective function is to be optimized, typically only a small subset will be influential within the confines of their uncertainty distribution. SA can be used to reduce the input space of such optimizations \cite{TaddLeeGrayGrif2009}. Other authors have used SA to assess the risk associated with dynamic factors affecting the storage of nuclear waste \cite{HommSalt1996}, and to investigate the uncertainty characteristics of a remote sensing model for the reflection of light by surface vegetation \cite{MorrKottTaddFurfGana2008}. The {\tt sens} function adds to {\tt tgp} a suite of tools for global sensitivity analysis, and enables ``out-of-the-box'' estimation of valuable sensitivity indices for any regression relationship that may be modeled by a member of the {\tt tgp} family. The type of sensitivity analysis provided by {\tt tgp} falls within the paradigm of global sensitivity analysis, wherein the variability of the response is investigated with respect to a probability distribution over the entire input space. The recent book by Saltelli et al. \cite{SaltEtAl2008} serves as a primer on this field. Global SA is inherently a problem of statistical inference, as evidenced by the interpolation and estimation required in a study of the full range of inputs. This is in contrast with the analytical nature of local SA, which involves derivative--based investigation of the stability of the response over a small region of inputs. We will ignore local SA for the remainder of this document. The sensitivity of a response $z$ to a changing input $\mb{x}$ is always considered in relation to a specified {\it uncertainty distribution}, defined by the density $u(\mb{x})$, and the appropriate marginal densities $u_i(x_i)$. What is represented by the uncertainty distribution changes depending upon the context. The canonical setup has that $z$ is the response from a complicated physics or engineering simulation model, with tuning parameters $\mb{x}$, that is used to predict physical phenomena. In this situation, $u(\mb{x})$ represents the experimentalist's uncertainty about real--world values of $\mb{x}$. In optimization problems, the uncertainty distribution can be used to express prior information from experimentalists or modelers on where to look for solutions. Finally, in the case of observational systems (such as air-quality or smog levels), $u(\mb{x})$ may be an estimate of the density governing the natural occurrence of the $\mb{x}$ factors (e.g., air-pressure, temperature, wind, and cloud cover). In this setup, SA attempts to resolve the natural variability of $z$. The most common notion of sensitivity is tied to the relationship between conditional and marginal variance for $z$. Specifically, variance--based methods decompose the variance of the objective function, with respect to the uncertainty distribution on the inputs, into variances of conditional expectations. These are a natural measure of the output association with specific sets of variables and provide a basis upon which the importance of individual inputs may be judged. The other common component of global SA is an accounting of the main effects for each input variable, $\mathbb{E}_{u_j}[z|x_j]$, which can be obtained as a by-product of the variance analysis. Our variance--based approach to SA is a version of the method of Sobol', wherein a deterministic objective function is decomposed into summands of functions on lower dimensional subsets of the input space. Consider the function decomposition $ f(x_1, \ldots ,x_d) = f_0 + \sum_{j=1}^df_j(x_j) +\sum_{1 \leq i < j \leq d} f_{ij}(x_j,x_i) + \ldots + f_{1,\ldots,d}(x_1, \ldots ,x_d). $ When the response $f$ is modeled as a stochastic process $z$ conditional on inputs $\mb{x}$, we can develop a similar decomposition into the response distributions which arise when $z$ has been marginalized over one subset of covariates and the complement of this subset is allowed to vary according to a marginalized uncertainty distribution. In particular, we can obtain the marginal conditional expectation $\mbb{E}[z|\mb{x}_J=\{x_j:j\in J\}]$ $=$ $\int_{\mathbb{R}^{d-d_J}} \mbb{E}[z|\mb{x}]u(\mb{x}) d\mb{x}_{-J}$, where $J=\{j_1, \ldots, j_{d_J}\}$ indicates a subset of input variables, $\mb{x}_{-j} =\{x_j:j\notin J\}$, and the marginal uncertainty density is given by $u_J(\mb{x}_J) = \int_{\mathbb{R}^{d-d_J}} u(\mb{x}) d\{x_i:i \notin J \}$. SA concerns the variability of $\mbb{E}[z|\mb{x}_J]$ with respect to changes in $\mb{x}_J$ according to $u_J(\mb{x}_J)$ and, if $u$ is such that the inputs are uncorrelated, the variance decomposition is available as \begin{equation} \label{eqn:var_decomp} \mr{var}(\mbb{E}[z|\mb{x}]) = \sum_{j=1}^dV_j + \sum_{1 \leq i < j \leq d} V_{ij} + \ldots + V_{1,\ldots,d}, \end{equation} where $V_j = \mr{var}(\mbb{E}[z|x_j])$, $V_{ij}=\mr{var}(\mbb{E}[z|x_i, x_j]) - V_i - V_j$, and so on. Clearly, when the inputs are correlated this identity no longer holds (although a ``less-than-or-equal-to'' inequality is always true). But it is useful to retain an intuitive interpretation of the $V_J$'s as a portion of the overall marginal variance. Our global SA will focus on the related sensitivity indices $S_J = V_J/\mr{var}(z)$ which, as can be seen in the above equation, will sum to one over all possible $J$ and are bounded to $[0,1]$. These $S_J$'s provide a natural measure of the {\it importance} of a set $J$ of inputs and serve as the basis for an elegant analysis of sensitivity. The {\tt sens} function allows for easy calculation of two very important sensitivity indices associated with each input: the 1$^{\rm st}$ order for the $j$th input variable, \begin{equation} S_j = \frac{\mr{var}\left(\mbb{E}\left[z|x_j\right]\right)}{\mr{var}(z)}, \label{eq:S} \end{equation} and the total sensitivity for input $j$, \begin{equation} T_j = \label{eq:T} \frac{\mbb{E}\left[\mr{var}\left(z|\mb{x}_{-j}\right)\right]}{\mr{var}(z)}. \end{equation} The 1$^{\rm st}$ order indices measure the portion of variability that is due to variation in the main effects for each input variable, while the total effect indices measure the portion of variability that is due to total variation in each input. From the identity $\mbb{E}\left[\mr{var}\left(z|\mb{x}_{-j}\right)\right] = \mr{var}(z) - \mr{var}\left(\mbb{E}\left[z|\mb{x}_{-j}\right]\right)$, it can be seen that $T_j$ measures the {\it residual} variability remaining after variability in all other inputs has been apportioned and that, for a deterministic response and uncorrelated input variables, $T_j = \sum_{J:j \in J} S_J$. This implies that the difference between $T_j$ and $S_j$ provides a measure of the variability in $z$ due to interaction between input $j$ and the other input variables. A large difference may lead the investigator to consider other sensitivity indices to determine where this interaction is most influential, and this is often a key aspect of the dimension--reduction that SA provides for optimization problems. \subsection{Monte Carlo integration for sensitivity indices} Due to the many integrals involved, estimation of the sensitivity indices is not straightforward. The influential paper by Oakley \& O'Hagan \cite{OaklOhag2004} describes an empirical Bayes estimation procedure for the sensitivity indices, however some variability in the indices is lost due to plug-in estimation of GP model parameters and, more worryingly, the variance ratios are only possible in the form of a ratio of expected values. Marrel, et al.~\cite{MarrIoosLaurRous2009}, provide a more complete analysis of the GP approach to this problem, but their methods remain restricted to estimation of the first order Sobol indices. Likelihood based approaches have also been proposed \cite{WelcBuckSackWynnMitcMorr1992,MorrKottTaddFurfGana2008}. The technique implemented in {\tt tgp} is, in contrast, fully Bayesian and provides a complete accounting of the uncertainty involved. Briefly, at each iteration of an MCMC chain sampling from the treed GP posterior, output is predicted over a large (carefully chosen) set of input locations. Conditional on this predicted output, the sensitivity indices can be calculated via Monte Carlo integration. By conditioning on the predicted response (and working as though it were the observed response), we obtain a posterior sample of the indices, incorporating variability from both the integral estimation and uncertainty about the function output. In particular, the {\tt sens} function includes a {\tt model} argument which allows for SA based on any of the prediction models (the {\tt b*} functions) in {\tt tgp}. Our Monte Carlo integration is based upon Saltelli's \cite{Salt2002} efficient Latin hypercube sampling (LHS) scheme for estimation of both 1$^{\rm st}$ order and total effect indices. We note that the estimation is only valid for uncorrelated inputs, such that $u(\mb{x}) = \prod_{j=1}^d u_j(x_j)$. The {\tt sens} function only allows for uncertainty distributions of this type (in fact, the marginal distributions also need to be bounded), but this is a feature of nearly every ``out-of-the-box'' approach to SA. Studies which concern correlated inputs will inevitably require modeling for this correlation, whereas most regression models (including those in {\tt tgp}) condition on the inputs and ignore the joint density for $\mb{x}$. Refer to the work of Saltelli \& Tarantola \cite{SaltTara2002} for an example of SA with correlated inputs. We now briefly describe the integration scheme. The 2nd moment is a useful intermediate quantity in variance estimation, and we define \[ D_J = \mbb{E}\left[\mbb{E}^2\left[z|\mb{x}_{J}\right]\right] = \int_{\mbb{R}^{d_J}} \mbb{E}^2\left[z| {\mb{x}_J}\right]u_J(\mb{x}_J)d(\mb{x}_J). \] Making use of an auxiliary variable, \begin{eqnarray*} D_J &=& \int_{\mbb{R}^{d_J}} \left[\int_{\mbb{R}^{d_{-J}}} \!\!\!\mbb{E}\left[ z | \mb{x}_J, \mb{x}_{-J} \right]u_{-J}(\mb{x}_{-J})d\mb{x}_{-J} \int_{\mbb{R}^{d_{-J}}} \!\!\!\mbb{E}\left[ z | \mb{x}_J, \mb{x}'_{-J} \right] u_{-J}(\mb{x}'_{-J})d\mb{x}'_{-J}\right]u_J(\mb{x}_J)\mb{x}_{J}\\ &=& \int_{\mbb{R}^{d + d_{-J}}} \!\!\mbb{E}\left[ z | \mb{x}_J, \mb{x}_{-J} \right]\mbb{E}\left[ z | \mb{x}_J, \mb{x}'_{-J} \right] u_{-J}(\mb{x}_{-J})u_{-J}(\mb{x}'_{-J})u_{J}(\mb{x}_{J})d\mb{x}d\mb{x}'_{J}. \end{eqnarray*} Thus, in the case of independent inputs, \[ D_J = \int_{\mbb{R}^{d+d_{-J}}} \mbb{E}\left[ z |\mb{x} \right]\mbb{E}\left[ z | \mb{x}_J, \mb{x}'_{-J} \right] u_{-J}(\mb{x}'_{-J})u({\bf x})d\mb{x}'_{-J}d\mb{x}. \] Note that at this point, if the inputs had been correlated, the integral would have been instead with respect to the joint density $u(\mb{x})u(\mb{x}_{-J}' | \mb{x}_J)$, leading to a more difficult integral estimation problem. Recognizing that $S_j = (D_j-\mbb{E}^2[z])/\mr{var}(z)$ and $T_j = 1- \left( \left(D_{-j} - \mbb{E}^2[z]\right)\right)/\mr{var}(z)$, we need estimates of $\mr{var}(z)$, $\mbb{E}^2[z]$, and $\{ (D_j, D_{-j}) : j=1,\ldots,d \}$ to calculate the sensitivity indices. Given a LHS $M$ proportional to $u(\mb{x})$, \begin{equation*} M = \left[ \begin{array}{c} s_{1_1} ~ \cdots ~ s_{1_d}\\ \vdots \\ s_{m_1} ~ \cdots ~ s_{m_d}\\ \end{array} \right], \end{equation*} it is possible to estimate $\widehat{\mbb{E}[z]} = \frac{1}{m} \sum_{k=1}^m\mbb{E}[z|{\bf s}_k]$ and $\widehat{\mr{var}[z]} = \frac{1}{m} \mbb{E}^T[z|M]\mbb{E}[z|M] - \widehat{\mbb{E}[z]}\widehat{\mbb{E}[z]}$, where the convenient notation $\mbb{E}[z|M]$ is taken to mean $\left[\mbb{E}[z|\mb{s}_1] \cdots \mbb{E}[z|\mb{s}_m]\right]^T$. All that remains is to estimate the $D$'s. Define a second LHS $M'$ proportional to $u$ of the same size as $M$ and say that $N_J$ is $M'$ with the $J$ columns replaced by the corresponding columns of $M$. Hence, \begin{equation*} N_j = \left[ \begin{array}{c} s'_{1_1} \cdots s_{1_j} \cdots s'_{1_d}\\ \vdots \\ s'_{m_1} \cdots s_{m_j} \cdots s'_{m_d} \end{array}\right]~~~\mr{and}~~~ N_{-j} = \left[ \begin{array}{c} s_{1_1} \cdots s'_{1_j} \cdots s_{1_d}\\ \vdots \\ s_{m_1} \cdots s'_{m_j} \cdots s_{m_d} \end{array}\right]. \end{equation*} The estimates are then $\hat D_j = \mbb{E}^T[z|M]\mbb{E}[z|N_{j}]/(m-1)$ and $\hat D_{-j}$ $=$ $\mbb{E}^T[z|M']\mbb{E}[z|N_{j}]/(m-1)$ $\approx$ $ \mbb{E}^T[z|M]\mbb{E}[z|N_{-j}]/(m-1)$. Along with the variance and expectation estimates, these can be plugged into equations for $S_j$ and $T_j$ in (\ref{eq:S}--\ref{eq:T}) to obtain $\hat S_j$ and $\hat T_j$. Note that Saltelli recommends the use of the alternative estimate $\widehat{\mbb{E}^2[z]} = \frac{1}{n-1}\mbb{E}^T[z|M]\mbb{E}[z|M']$ in calculating 1$^{\rm st}$ order indices, as this brings the index closer to zero for non-influential variables. However, it has been our experience that these biased estimates can be unstable, and so {\tt tgp} uses the standard $\widehat{\mbb{E}^2[z]} = \widehat{\mbb{E}[z]}\widehat{\mbb{E}[z]}$ throughout. As a final point, we note that identical MCMC sampling-based integration schemes can be used to estimate other Sobol indices (e.g., second order, etc) for particular combinations of inputs, but that this would require customization of the {\tt tgp} software. The set of input locations which need to be evaluated for each calculation of the indices is $\{ M, M', N_1,\ldots,N_d \}$, and if $m$ is the sample size for the Monte Carlo estimate this scheme requires $m(d+2)$ function evaluations. Hence, at each MCMC iteration of the model fitting, the $m(d+2)$ locations are drawn randomly according the LHS scheme, creating a random prediction matrix, {\tt XX}. By allowing random draws of the input locations, the Monte Carlo error of the integral estimates will be included in the posterior variability of the indices and the posterior moments will not be dependent upon any single estimation input set. Using predicted output over this input set, a single realization of the sensitivity indices is calculated through Saltelli's scheme. At the conclusion of the MCMC, we have a representative sample from the posterior for ${\bf S}$ and ${\bf T}$. The averages for these samples are unbiased estimates of the posterior mean, and the variability of the sample is representative of the complete uncertainty about model sensitivity. Since a subset of the predictive locations ($M$ and $M'$) are actually a LHS proportional to the uncertainty distribution, we can also estimate the main effects at little extra computational cost. At each MCMC iteration, a one--dimensional nonparametric regression is fit through the scatterplot of $[s_{1_j}, \ldots, s_{m_j},s'_{1_j}, \ldots, s'_{m_j}]$ vs. $[\mbb{E}[z|M],\mbb{E}[z|M']]$ for each of the $j=1,\ldots,d$ input variables. The resultant regression estimate provides a realization of $\mbb{E}[z|x_j]$ over a grid of $x_j$ values, and therefore a posterior draw of the main effect curve. Thus, at the end of the MCMC, we have not only unbiased estimates of the main effects through posterior expectation, but also a full accounting of our uncertainty about the main effect curve. This technique is not very sensitive to the method of non-parametric regression, since $2m$ will typically represent a very large sample in one--dimension. The estimation in {\tt tgp} uses a moving average with squared distance weights and a window containing the {\tt span}$*2m$ nearest points (the {\tt span} argument defaults to 0.3). \subsection{Examples} We illustrate the capabilities of the {\tt sens} function by looking at the Friedman function considered earlier in this vignette. The function that describes the responses ($Z$), observed with standard Normal noise, has mean \begin{equation} E(Z|\mb{x}) = 10 \sin(\pi x_1 x_2) + 20(x_3 - 0.5)^2 + 10x_4 + 5 x_5. \label{eq:f1} \end{equation} A sensitivity analysis can be based upon any of the available regression models (e.g., {\tt btlm}, {\tt bgp}, or {\tt btgp}); we choose to specify {\tt model=btgpllm} for this example. The size of each LHS used in the integration scheme is specified through {\tt nn.lhs}, such that this is equivalent to $m$ in the above algorithm description. Thus the number of locations used for prediction---the size of the random {\tt XX} prediction matrix---is {\tt nn.lhs*(ncol(X)+2)}. In addition, the window for moving average estimation of the main effects is {\tt span*2*nn.lhs} (independent of this, an {\tt ngrid} argument with a default setting of {\tt ngrid=100} dictates the number of grid points in each input dimension upon which main effects will be estimated). <<>>= f <- friedman.1.data(250) @ This function actually generates 10 covariates, the last five of which are completely un-influential. We'll include one of these ($x_6$) to show what the sensitivity analysis looks like for unrelated variables. <<>>= Xf <- f[, 1:6] Zf <- f$Y sf <- sens(X=Xf, Z=Zf, nn.lhs=600, model=bgpllm, verb=0) @ The progress indicators printed to the screen (for {\tt verb > 0}) are the same as would be obtained under the specified regression {\tt model}---{\tt bgpllm} in this case---so we suppress them here. All of the same options (e.g., {\tt BTE}, {\tt R}, etc.) apply, although if using the {\tt trace} capabilities one should be aware that the {\tt XX} matrix is changing throughout the MCMC. The {\tt sens} function returns a \verb!"tgp"!-class object, and all of the SA related material is included in the {\tt sens} list within this object. <<>>= names(sf$sens) @ The object provides the SA parameters ({\tt par}), the grid of locations for main effect prediction ({\tt Xgrid}), the mean and interval estimates for these main effects ({\tt ZZ.mean}, {\tt ZZ.q1}, and {\tt ZZ.q2}), and full posterior via samples of the sensitivity indices ({\tt S} and {\tt T}). The plot function for \verb!"tgp"!-class objects now provides a variety of ways to visualize the results of a sensitivity analysis. This capability is accessed by specifying {\tt layout="sens"} in the standard {\tt plot} command. By default, the mean posterior main effects are plotted next to boxplot summaries of the posterior sample for each $S_j$ and $T_j$ index, as in Figure \ref{full}. \begin{figure}[ht!] <>= plot(sf, layout="sens", legendloc="topleft") @ <>= graphics.off() @ \includegraphics[width=6.5in,trim=0 10 0 10]{tgp2-sens-full} \caption{Full sensitivity analysis results for the Friedman function.} \label{full} \end{figure} A further note on the role played by {\tt nn.lhs}: As always, the quality of the regression model estimate depends on the length of the MCMC. But now, the quality of sensitivity analysis is directly influenced by the size of the LHS used for integral approximation; as with any Monte Carlo integration scheme, the sample size (i.e., {\tt nn.lhs}) must increase with the dimensionality of the problem. In particular, it can be seen in the estimation procedure described above that the total sensitivity indices (the $T_j$'s) are not forced to be non-negative. If negative values occur it is necessary to increase {\tt nn.lhs}. In any case, the {\tt plot.tgp} function changes any of the negative values to zero for purposes of illustration. The {\tt maineff} argument can be used to plot either selected main effects (Figure \ref{mains}), \begin{figure}[ht!] <>= par(mar=c(4,2,4,2), mfrow=c(2,3)) plot(sf, layout="sens", maineff=t(1:6)) @ <>= graphics.off() @ \centering \includegraphics[width=6.6in]{tgp2-sens-mains} \caption{Friedman function main effects, with posterior 90\% intervals.} \label{mains} \end{figure} or just the sensitivity indices (Figure \ref{indices}). \begin{figure}[ht!] <>= plot(sf, layout="sens", maineff=FALSE) @ <>= graphics.off() @ \centering \includegraphics[width=6.5in,trim=0 15 0 15]{tgp2-sens-indices} \caption{Sensitivity indices for the Friedman function.} \label{indices} \end{figure} Note that the posterior intervals shown in these plots represent uncertainty about both the function response and the integration estimates; this full quantification of uncertainty is not presently available in any alternative SA procedures. These plots may be compared to what we know about the Friedman function (refer to Eq.~(\ref{eq:f1})) to evaluate the analysis. The main effects correspond to what we would expect: sine waves for $x_1$ and $x_2$, a parabola for $x_3$, and linear effects for $x_4$ and $x_5$. The sensitivity indices show $x_1$ and $x_2$ contributing roughly equivalent amounts of variation, while $x_4$ is relatively more influential than $x_5$. Full effect sensitivity indices for $x_3$, $x_4$, and $x_5$ are roughly the same as the first order indices, but (due to the interaction in the Friedman function) the sensitivity indices for the total effect of $x_1$ and $x_2$ are significantly larger than the corresponding first order indices. Finally, our SA is able to determine that $x_6$ is unrelated to the response. This analysis assumes the default uncertainty distribution, which is uniform over the range of input data. In other scenarios, it is useful to specify an informative $u(\mb{x})$. In the {\tt sens} function, properties of $u$ are defined through the {\tt rect}, {\tt shape}, and {\tt mode} arguments. To guarantee integrability of our indices, we have restricted ourselves to bounded uncertainty distributions. Hence, {\tt rect} defines these bounds. In particular, this defines the domain from which the LHSs are to be taken. We then use independent scaled beta distributions, parameterized by the {\tt shape} parameter and distribution {\tt mode}, to define an informative uncertainty distribution over this domain. As an example of sensitivity analysis under an informative uncertainty distribution, consider the {\tt airquality} data available with the base distribution of {\sf R}. This data set contains daily readings of mean ozone in parts per billion ({\it Ozone}), solar radiation ({\it Solar.R}), wind speed ({\it Wind}), and maximum temperature ({\it Temp}) for New York City, between May 1 and September 30, 1973. Suppose that we are interested in the sensitivity of air quality to natural changes in {\it Solar.R},{\it Wind}, and {\it Temp}. For convenience, we will build our uncertainty distribution while assuming independence between these inputs. Hence, for each variable, the input uncertainty distribution will be a scaled beta with {\tt shape=2}, and {\tt mode} equal to the data mean. <<>>= X <- airquality[,2:4] Z <- airquality$Ozone rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- rep(2,3) @ LHS samples from the uncertainty distribution are shown in Figure (\ref{udraw}) \begin{figure}[ht!] <>= Udraw <- lhs(300, rect=rect, mode=mode, shape=shape) par(mfrow=c(1,3), mar=c(4,2,4,2)) for(i in 1:3){ hist(Udraw[,i], breaks=10,xlab=names(X)[i], main="",ylab="", border=grey(.9), col=8) } @ <>= graphics.off() @ \centering \includegraphics[width=6in,trim=0 0 0 30]{tgp2-sens-udraw} \caption{A sample from the marginal uncertainty distribution for the airquality data.} \label{udraw} \end{figure} Due to missing data (discarded in the current version of {\tt tgp}), we suppress warnings for the sensitivity analysis. We shall use the default {\tt model=btgp}. <<>>= s.air <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, rect=rect, shape=shape, mode=mode, verb=0)) @ Figure (\ref{air1}) shows the results from this analysis. \begin{figure}[ht!] <>= plot(s.air, layout="sens") @ <>= graphics.off() @ \centering \includegraphics[width=6.5in,trim=0 15 0 15]{tgp2-sens-air1} \caption{Sensitivity of NYC airquality to natural variation in wind, sun, and temperature.} \label{air1} \end{figure} Through use of {\tt predict.tgp}, it is possible to quickly re-analyze with respect to a new uncertainty distribution without running new MCMC. We can, for example, look at sensitivity for air quality on only low--wind days. We thus alter the uncertainty distribution (assuming that things remain the same for the other variables) <<>>= rect[2,] <- c(0,5) mode[2] <- 2 shape[2] <- 2 @ and build a set of parameters {\tt sens.p} with the {\tt sens} function by setting {\tt model=NULL}. <<>>= sens.p <- suppressWarnings(sens(X=X,Z=Z,nn.lhs=300, model=NULL, rect=rect, shape=shape, mode=mode)) @ \begin{figure}[ht!] <>= s.air2 <- predict(s.air, BTE=c(1,1000,1), sens.p=sens.p, verb=0) plot(s.air2, layout="sens") @ <>= graphics.off() @ \includegraphics[width=6.5in,trim=0 15 0 15]{tgp2-sens-air2} \caption{Air quality sensitivity on low-wind days.} \label{air2} \end{figure} Figures (\ref{air1}) and (\ref{air2}) both show total effect indices which are much larger than the respective first order sensitivities. As one would expect, the effect on airquality is manifest largely through an interaction between variables. Finally, it is also possible to perform SA with binary covariates, included in the regression model as described in Section 1. In this case, the uncertainty distribution is naturally characterized by a Bernoulli density. Setting {\tt shape[i]=0} informs {\tt sens} that the relevant variable is binary (perhaps encoding a categorical input as in Section \ref{sec:cat}), and that the Bernoulli uncertainty distribution should be used. In this case, the {\tt mode[i]} parameter dictates the probability parameter for the Bernoulli, and we must have {\tt rect[i,] = c(0,1)}. As an example, we re-analyze the original air quality data with temperature included as an indicator variable (set to one if temperature > 79, the median, and zero otherwise). <<>>= X$Temp[X$Temp >70] <- 1 X$Temp[X$Temp >1] <- 0 rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- c(2,2,0) s.air <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, rect=rect, shape=shape, mode=mode, verb=0, basemax=2)) @ \begin{figure}[ht!] <>= plot(s.air, layout="sens") @ <>= graphics.off() @ \centering \includegraphics[width=6.5in,trim=0 15 0 15]{tgp2-sens-air3} \caption{Sensitivity of NYC airquality to natural variation in wind, sun, and a binary temperature variable (for a threshold of 79 degrees).} \label{air3} \end{figure} Figure (\ref{air3}) shows the results from this analysis. tgp/vignettes/tgp.Rnw0000644000175100001440000015630212654547265014403 0ustar hornikusers\documentclass{article} \usepackage{Sweave} %\SweaveOpts{eps=TRUE} %\documentclass[12pt]{article} %\usepackage{fullpage} %\usepackage{setspace} \usepackage[footnotesize]{caption} \usepackage{amsmath} \usepackage{amscd} \usepackage{epsfig} \newcommand{\bm}[1]{\mbox{\boldmath $#1$}} \newcommand{\mb}[1]{\mathbf{#1}} %\VignetteIndexEntry{a guide to the tgp package} %\VignetteKeywords{tgp} %\VignetteDepends{tgp,maptree} %\VignettePackage{tgp} \begin{document} %\doublespacing \setkeys{Gin}{width=0.85\textwidth} <>= library(tgp) options(width=65) @ \title{{\tt tgp}: an {\sf R} package for Bayesian nonstationary,\\ semiparametric nonlinear regression and design by treed Gaussian process models} \author{Robert B. Gramacy\\ Booth School of Business\\ The University of Chicago\\ rbgramacy@chicagobooth.edu} \maketitle \begin{abstract} The {\tt tgp} package for {\sf R} \cite{cran:R} is a tool for fully Bayesian nonstationary, semiparametric nonlinear regression and design by treed Gaussian processes with jumps to the limiting linear model. Special cases also implemented include Bayesian linear models, linear CART, stationary separable and isotropic Gaussian processes. In addition to inference and posterior prediction, the package supports the (sequential) design of experiments under these models paired with several objective criteria. 1-d and 2-d plotting, with higher dimension projection and slice capabilities, and tree drawing functions (requiring {\tt maptree} and {\tt combinat} libraries), are also provided for visualization of {\tt tgp}-class output. \end{abstract} \subsection*{Intended audience} \label{sec:discaimer} This document is intended to familiarize a (potential) user of {\tt tgp} with the models and analyses available in the package. After a brief overview, the bulk of this document consists of examples on mainly synthetic and randomly generated data which illustrate the various functions and methodologies implemented by the package. This document has been authored in {\tt Sweave} (try {\tt help(Sweave)}). This means that the code quoted throughout is certified by {\tt R}, and the {\tt Stangle} command can be used to extract it. Note that this tutorial was not meant to serve as an instruction manual. For more detailed documentation of the functions contained in the package, see the package help-manuals. At an {\sf R} prompt, type {\tt help(package=tgp)}. PDF documentation is also available on the world-wide-web. \begin{center} \tt http://www.cran.r-project.org/doc/packages/tgp.pdf \end{center} The outline is as follows. Section \ref{sec:implement} introduces the functions and associated regression models implemented by the {\tt tgp} package, including plotting and visualization methods. The Bayesian mathematical specification of these models is contained in Section \ref{sec:model}. In Section \ref{sec:examples} the functions and methods implemented in the package are illustrated by example. The appendix covers miscellaneous topics such as how to link with the {\tt ATLAS} libraries for fast linear algebra routines, compile--time support for {\tt Pthreads} parallelization, the gathering of parameter traces, the verbosity of screen output, and some miscellaneous details of implementation. \input{motivate} \section{What is implemented?} \label{sec:implement} The {\tt tgp} package contains implementations of seven Bayesian multivariate regression models and functions for visualizing posterior predictive surfaces. These models, and the functions which implement them, are outlined in Section \ref{sec:breg}. Also implemented in the package are functions which aid in the sequential design of experiments for {\tt tgp}-class models, which is what I call {\em adaptive sampling}. These functions are introduced at the end of Section \ref{sec:model} and a demonstration is given in Section \ref{sec:as}. \subsection{Bayesian regression models} \label{sec:breg} The seven regression models implemented in the package are summarized in Table \ref{t:reg}. They include combinations of treed partition models, (limiting) linear models, and Gaussian process models as indicated by T, LM/LLM, \& GP in the center column of the table. The details of model specification and inference are contained in Section \ref{sec:model}. Each is a fully Bayesian regression model, and in the table they are ordered by some notion of ``flexibility''. These {\tt b*} functions, as I call them, are wrappers around the master {\tt tgp} function which is an interface to the core {\tt C} code. \begin{table} \centering \begin{tabular}{l|l|l} {\sf R} function & Ingredients & Description \\ \hline blm & LM & Linear Model \\ btlm & T, LM & Treed Linear Model \\ bcart & T & Treed Constant Model \\ bgp & GP & GP Regression \\ bgpllm & GP, LLM & GP with jumps to the LLM \\ btgp & T, GP & treed GP Regression \\ btgpllm & T, GP, LLM & treed GP with jumps to the LLM \\ \hline tgp & & Master interface for the above methods \end{tabular} \caption{Bayesian regression models implemented by the {\tt tgp} package} \label{t:reg} \end{table} The {\tt b*} functions are intended as the main interface, so little further attention to the {\tt tgp} master function will be included here. The easiest way to see how the master {\tt tgp} function implements one of the {\tt b*} methods is to simply type the name of the function of interest into {\sf R}. For example, to see the implementation of {\tt bgp}, type: <>= bgp @ The output (return-value) of {\tt tgp} and the {\tt b*} functions is a {\tt list} object of class ``{\tt tgp}''. This is what is meant by a ``{\tt tgp}-class'' object. This object retains all of the relevant information necessary to summarize posterior predictive inference, maximum {\em a' posteriori} (MAP) trees, and statistics for adaptive sampling. Information about its actual contents is contained in the help files for the {\tt b*} functions. Generic {\tt print}, {\tt plot}, and {\tt predict} methods are defined for {\tt tgp}-class objects. The {\tt plot} and {\tt predict} functions are discussed below. The {\tt print} function simply provides a list of the names of the fields comprising a {\tt tgp}-class object. \subsubsection{Plotting and visualization} \label{sec:plot} The two main functions provided by the {\tt tgp} package for visualization are {\tt plot.tgp}, inheriting from the generic {\tt plot} method, and a function called {\tt tgp.trees} for graphical visualization of MAP trees. The {\tt plot.tgp} function can make plots in 1-d or 2-d. Of course, if the data are 1-d, the plot is in 1-d. If the data are 2-d, or higher, they are 2-d image or perspective plots unless a 1-d projection argument is supplied. Data which are 3-d, or higher, require projection down to 2-d or 1-d, or specification of a 2-d slice. The {\tt plot.tgp} default is to make a projection onto the first two input variables. Alternate projections are specified as an argument ({\tt proj}) to the function. Likewise, there is also an argument ({\tt slice}) which allows one to specify which slice of the posterior predictive data is desired. For models that use treed partitioning (those with a T in the center column of Table \ref{t:reg}), the {\tt plot.tgp} function will overlay the region boundaries of the MAP tree ($\hat{\mathcal{T}}$) found during MCMC. A few notes on 2-d plotting of {\tt tgp}-class objects: \begin{itemize} \item 2-d plotting requires interpolation of the data onto a uniform grid. This is supported by the {\tt tgp} package in two ways: (1) {\tt loess} smoothing, and (2) the {\tt akima} package, available from CRAN. The default is {\tt loess} because it is more stable and does not require installing any further packages. When {\tt akima} works it makes (in my opinion) smarter interpolations. However there are two bugs in the {\tt akima} package, one malign and the other benign, which preclude it from the default position in {\tt tgp}. The malign bug can cause a segmentation fault, and bring down the entire R session. The benign bug produces {\tt NA}'s when plotting data from a grid. For beautiful 2-d plots of gridded data I suggest exporting the {\tt tgp} predictive output to a text file and using {\tt gnuplot}'s 2-d plotting features. \item The current version of this package contains no examples---nor does this document---which demonstrate plotting of data with dimension larger than two. The example provided in Section \ref{sec:fried} uses 10-d data, however no plotting is required. {\tt tgp} methods have been used on data with input dimension as large as 15 \cite{gra:lee:2008}, and were used in a sequential design and detailed analysis of some proprietary 3-d input and 6-d output data sampled using a NASA supercomputer \cite{gra:lee:2009}. \item The {\tt plot.tgp} function has many more options than are illustrated in [Section \ref{sec:examples} of] this document. Please refer to the help files for more details. \end{itemize} The {\tt tgp.trees} function provides a diagrammatic representation of the MAP trees of each height encountered by the Markov chain during sampling. The function will not plot trees of height one, i.e., trees with no branching or partitioning. Plotting of trees requires the {\tt maptree} package, which in turn requires the {\tt combinat} package, both available from CRAN. \subsubsection{Prediction} \label{sec:predintro} Prediction, naturally, depends on fitted model parameters $\hat{\bm{\theta}}|\mbox{data}$, or Monte Carlo samples from the posterior distribution of $\bm{\theta}$ in a Bayesian analysis. Rather than saving samples from $\pi(\bm{\theta}|\mbox{data})$ for later prediction, usually requiring enormous amounts of storage, {\tt tgp} samples the posterior predictive distribution in-line, as samples of $\bm{\theta}$ become available. [Section \ref{sec:pred} and \ref{sec:llmpred} outlines the prediction equations.] A {\tt predict.tgp} function is provided should it be necessary to obtain predictions {\em after} the MCMC has finished. The {\tt b*} functions save the MAP parameterization $\hat{\bm{\theta}}$ maximizing $\pi(\bm{\theta}|\mbox{data})$. More specifically, the ``{\tt tgp}''--class object stores the MAP tree $\hat{{\mathcal T}}$ and corresponding GP (or LLM) parameters $\hat{\bm{\theta}}|\hat{\mathcal{T}}$ found while sampling from the joint posterior $\pi(\bm{\theta},\mathcal{T}|\mbox{data})$. These may be accessed and used, via {\tt predict.tgp}, to obtain posterior--predictive inference through the MAP parameterization. In this way {\tt predict.tgp} is similar to {\tt predict.lm}, for example. Samples can also be obtained from the MAP--parameterized predictive distributions via {\tt predict.tgp}, or a re--initialization of the joint sampling of the posterior and posterior predictive distribution can commence starting from the $(\hat{\bm{\theta}},\hat{\mathcal{T}})$. The output of {\tt predict.tgp} is also a {\tt tgp} class object. Appendix \ref{sec:apred} illustrates how this feature can be useful in the context of passing {\tt tgp} model fits between collaborators. There are other miscellaneous demonstrations in Section~\ref{sec:examples}. \subsubsection{Speed} \label{sec:speed} Fully Bayesian analyses with MCMC are not the super-speediest of all statistical models. Nor is inference for GP models, classical or Bayesian. When the underlying relationship between inputs and responses is non-linear, GPs represent a state of the art phenomenological model with high predictive power. The addition of axis--aligned treed partitioning provides a divide--and--conquer mechanism that can not only reduce the computational burden relative to the base GP model, but can also facilitate the efficient modeling of nonstationarity and heteroskedasticity in the data. This is in stark contrast to other recent approaches to nonstationary spatial models (e.g., via deformations \cite{dam:samp:gutt:2001,schmidt:2003}, or process convolutions \cite{higd:swal:kern:1999,fuentes:smith:2001,Paci:2003}) which can require orders of magnitude more effort relative to stationary GPs. Great care has been taken to make the implementation of Bayesian inference for GP models as efficient as possible [see Appendix \ref{sec:howimplement}]. However, inference for non-treed GPs can be computationally intense. Several features are implemented by the package which can help speed things up a bit. Direct support for {\tt ATLAS} \cite{atlas-hp} is provided for fast linear algebra. Details on linking this package with {\tt ATLAS} is contained in Appendix \ref{sec:atlas}. Parallelization of prediction and inference is supported by a producer/consumer model implemented with {\tt Pthreads}. Appendix \ref{sec:pthreads} shows how to activate this feature, as it is not turned on by default. An argument called {\tt linburn} is made available in tree class (T) {\tt b*} functions in Table \ref{t:reg}. When {\tt linburn = TRUE}, the Markov chain is initialized with a run of the Bayesian treed linear model \cite{chip:geor:mccu:2002} before burn-in in order to pre-partition the input space using linear models. Finally, thinning of the posterior predictive samples obtained by the Markov chain can also help speed things up. This is facilitated by the {\tt E}-part of the {\tt BTE} argument to {\tt b*} functions. \subsection{Sequential design of experiments} \label{sec:design} Sequential design of experiments, a.k.a. {\em adaptive sampling}, is not implemented by any {\em single} function in the {\tt tgp} package. Nevertheless, options and functions are provided in order to facilitate the automation of adaptive sampling with {\tt tgp}-class models. A detailed example is included in Section \ref{sec:as}. Arguments to {\tt b*} functions, and {\tt tgp}, which aid in adaptive sampling include {\tt Ds2x} and {\tt improv}. Both are booleans, i.e., should be set to {\tt TRUE} or {\tt FALSE} (the default for both is {\tt FALSE}). {\tt TRUE} booleans cause the {\tt tgp}-class output list to contain vectors of similar names with statistics that can be used toward adaptive sampling. When {\tt Ds2x = TRUE} then $\Delta \sigma^2(\mb{\tilde{x}})$ statistic is computed at each $\tilde{\mb{x}} \in \mbox{\tt XX}$, in accordance with the ALC (Active Learning--Cohn) algorithm \cite{cohn:1996}. Likewise, when {\tt improv = TRUE}, statistics are computed in order to asses the expected improvement (EI) for each $\tilde{\mb{x}} \in \mbox{\tt XX}$ about the global minimum \cite{jones:schonlau:welch:1998}. The ALM (Active Learning--Mackay) algorithm \cite{mackay:1992} is implemented by default in terms of difference in predictive quantiles for the inputs {\tt XX}, which can be accessed via the {\tt ZZ.q} output field. Details on the ALM, ALC, and EI algorithms are provided in Section \ref{sec:model}. Calculation of EI statistics was considered ``beta'' functionality while this document was being prepared. At that time it had not been adequately tested, and its implementation changed substantially in future versions of the package. For updates see the follow-on vignette \cite{gra:taddy:2010}, or \verb!vignette("tgp2")!. That document also discusses sensitivity analysis, handling of categorical inputs, and importance tempring. The functions included in the package which explicitly aid in the sequential design of experiments are {\tt tgp.design} and {\tt dopt.gp}. They are both intended to produce sequential $D$--optimal candidate designs {\tt XX} at which one or more of the adaptive sampling methods (ALM, ALC, EI) can gather statistics. The {\tt dopt.gp} function generates $D$--optimal candidates for a stationary GP. The {\tt tgp.design} function extracts the MAP tree from a {\tt tgp}-class object and uses {\tt dopt.gp} on each region of the MAP partition in order to get treed sequential $D$--optimal candidates. \section{Methods and Models} \label{sec:model} This section provides a quick overview of the statistical models and methods implemented by the {\tt tgp} package. Stationary Gaussian processes (GPs), GPs with jumps to the limiting linear model (LLM; a.k.a.~GP LLM), treed partitioning for nonstationary models, and sequential design of experiments (a.k.a.~{\em adaptive sampling}) concepts for these models are all briefly discussed. Appropriate references are provided for the details, including the original paper on Bayesian treed Gaussian process models \cite{gra:lee:2008}, and an application paper on adaptively designing supercomputer experiments \cite{gra:lee:2009}. As a first pass on this document, it might make sense to skip this section and go straight on to the examples in Section \ref{sec:examples}. \subsection{Stationary Gaussian processes} \label{sec:gp} Below is a hierarchical generative model for a stationary GP with linear tend for data $D=\{\mb{X}, \mb{Z}\}$ consisting of $n$ pairs of $m_X$ covariates and a single response variable $\{(x_{i1},\dots, x_{im_X}), z_i\}_{i=1}^n$. \begin{align} \mb{Z} | \bm{\beta}, \sigma^2, \mb{K} &\sim N_{n}(\mb{\mb{F}} \bm{\beta}, \sigma^2 \mb{K}) & \sigma^2 &\sim IG(\alpha_\sigma/2, q_\sigma/2) \nonumber \\ \bm{\beta} | \sigma^2, \tau^2, \mb{W}, \bm{\beta}_0 &\sim N_{m}(\bm{\beta}_0, \sigma^2 \tau^2 \mb{W}) & \tau^2 &\sim IG(\alpha_\tau/2, q_\tau/2) \label{eq:model} \\ \bm{\beta}_0 &\sim N_{m}(\bm{\mu}, \mb{B}) & \mb{W}^{-1} &\sim W((\rho \mb{V})^{-1}, \rho), \nonumber \end{align} $\mb{X}$ is a design matrix with $m_X$ columns. An intercept term is added with $\mb{F} = (\mb{1}, \mb{X})$ which has $m\equiv m_X+1$ columns, and $\mb{W}$ is a $m \times m$ matrix. $N$, $IG$, and $W$ are the (Multivariate) Normal, Inverse-Gamma, and Wishart distributions, respectively. Constants $\bm{\mu}, \mb{B},\mb{V},\rho, \alpha_\sigma, q_\sigma, \alpha_\tau, q_\tau.$ are treated as known. The GP correlation structure $\mb{K}$ is chosen either from the isotropic power family, or separable power family, with a fixed power $p_0$ (see below), but unknown (random) range and nugget parameters. Correlation functions used in the {\tt tgp} package take the form $K(\mb{x}_j, \mb{x}_k) = K^*(\mb{x}_j, \mb{x}_k) + {g} \delta_{j,k}$, where $\delta_{\cdot,\cdot}$ is the Kronecker delta function, $g$ is the {\em nugget}, and $K^*$ is a {\em true} correlation representative from a parametric family. The isotropic Mat\'{e}rn family is also implemented in the current version as ``beta'' functionality. All parameters in (\ref{eq:model}) can be sampled using Gibbs steps, except for the covariance structure and nugget parameters, and their hyperparameters, which can be sampled via Metropolis-Hastings \cite{gra:lee:2008}. \subsubsection{The nugget} \label{sec:intro:nug} The $g$ term in the correlation function $K(\cdot,\cdot)$ is referred to as the {\em nugget} in the geostatistics literature \cite{math:1963,cressie:1991} and sometimes as {\em jitter} in the Machine Learning literature \cite{neal:1997}. It must always be positive $(g>0)$, and serves two purposes. Primarily, it provides a mechanism for introducing measurement error into the stochastic process. It arises when considering a model of the form: \begin{equation} Z(\mb{X}) = m(\mb{X}, \bm{\beta}) + \varepsilon(\mb{X}) + \eta(\mb{X}), \label{eq:noisemodel} \end{equation} where $m(\cdot,\cdot)$ is underlying (usually linear) mean process, $\varepsilon(\cdot)$ is a process covariance whose underlying correlation is governed by $K^*$, and $\eta(\cdot)$ represents i.i.d.~Gaussian noise. Secondarily, though perhaps of equal practical importance, the nugget (or jitter) prevents $\mb{K}$ from becoming numerically singular. Notational convenience and conceptual congruence motivates referral to $\mb{K}$ as a correlation matrix, even though the nugget term ($g$) forces $K(\mb{x}_i,\mb{x}_i)>1$. \subsubsection{Exponential Power family} \label{sec:pow} Correlation functions in the {\em isotropic power} family are {\em stationary} which means that correlations are measured identically throughout the input domain, and {\em isotropic} in that correlations $K^*(\mb{x}_j, \mb{x}_k)$ depend only on a function of the Euclidean distance between $\mb{x}_j$ and $\mb{x}_k$: $||\mb{x}_j - \mb{x}_k||$. \begin{equation} K^*(\mb{x}_j, \mb{x}_k|d) = \exp\left\{-\frac{||\mb{x}_j - \mb{x}_k||^{p_0}}{d} \right\}, \label{eq:pow} \end{equation} where $d>0$ is referred to as the {\em width} or {\em range} parameter. The power $0>= hist(c(rgamma(100000,1,20), rgamma(100000,10,10)), breaks=50, xlim=c(0,2), freq=FALSE, ylim=c(0,3), main = "p(d) = G(1,20) + G(10,10)", xlab="d") d <- seq(0,2,length=1000) lines(d,0.2+0.7/(1+exp(-10*(d-0.5)))) abline(h=1, lty=2) legend(x=1.25, y=2.5, c("p(b) = 1", "p(b|d)"), lty=c(1,2)) @ <>= graphics.off() @ \includegraphics[trim=0 25 0 10]{tgp-gpllm} %\vspace{-0.5cm} \caption{\footnotesize Prior distribution for the boolean ($b$) superimposed on $p(d)$. There is truncation in the left--most bin, which rises to about 6.3. } \label{f:boolprior} \end{center} \end{figure} Probability mass functions which increase as a function of $d_i$, e.g., \begin{equation} p_{\gamma, \theta_1, \theta_2}(b_i=0|d_i) = \theta_1 + (\theta_2-\theta_1)/(1 + \exp\{-\gamma(d_i-0.5)\}) \label{eq:boolp} \end{equation} with $0<\gamma$ and $0\leq \theta_1 \leq \theta_2 < 1$, can encode such a preference by calling for the exclusion of dimensions $i$ with large $d_i$ when constructing $\mb{K}^*$. Thus $b_i$ determines whether the GP or the LLM is in charge of the marginal process in the $i^{\mbox{\tiny th}}$ dimension. Accordingly, $\theta_1$ and $\theta_2$ represent minimum and maximum probabilities of jumping to the LLM, while $\gamma$ governs the rate at which $p(b_i=0|d_i)$ grows to $\theta_2$ as $d_i$ increases. Figure \ref{f:boolprior} plots $p(b_i=0|d_i)$ %as in (\ref{eq:boolp}) for $(\gamma,\theta_1,\theta_2) =(10, 0.2, 0.95)$ superimposed on a convenient $p(d_i)$ which is taken to be a mixture of Gamma distributions, \begin{equation} p(d) = [G(d|\alpha=1,\beta=20) + G(d|\alpha=10,\beta=10)]/2, \label{eq:dprior} \end{equation} representing a population of GP parameterizations for wavy surfaces (small $d$) and a separate population of those which are quite smooth or approximately linear. The $\theta_2$ parameter is taken to be strictly less than one so as not to preclude a GP which models a genuinely nonlinear surface using an uncommonly large range setting. The implied prior probability of the full $m_X$-dimensional LLM is \begin{equation} p(\mbox{linear model}) = \prod_{i=1}^{m_X} p(b_i=0|d_i) = \prod_{i=1}^{m_X} \left[ \theta_1 + \frac{\theta_2-\theta_1} {1 + \exp\{-\gamma (d_i-0.5)\}}\right]. \label{e:linp} \end{equation} Notice that the resulting process is still a GP if any of the booleans $b_i$ are one. The primary computational advantage associated with the LLM is foregone unless all of the $b_i$'s are zero. However, the intermediate result offers increased numerical stability and represents a unique transitionary model lying somewhere between the GP and the LLM. It allows for the implementation of a semiparametric stochastic processes like $Z(\mb{x}) = \bm{\beta} f(\mb{x}) + \varepsilon(\tilde{\mb{x}})$ representing a piecemeal spatial extension of a simple linear model. The first part ($\bm{\beta}f(\mb{x})$) of the process is linear in some known function of the full set of covariates $\mb{x} = \{x_i\}_{i=1}^{m_X}$, and $\varepsilon(\cdot)$ is a spatial random process (e.g. a GP) which acts on a subset of the covariates $\mb{x}'$. Such models are commonplace in the statistics community~\cite{dey:1998}. Traditionally, $\mb{x}'$ is determined and fixed {\em a' priori}. The separable boolean prior (\ref{eq:boolp}) implements an adaptively semiparametric process where the subset $\mb{x}' = \{ x_i : b_i = 1, i=1,\dots,m_X \}$ is given a prior distribution, instead of being fixed. \subsubsection{Prediction and Adaptive Sampling under LLM} \label{sec:llmpred} Prediction under the limiting GP model is a simplification of (\ref{eq:pred}) when it is known that $\mb{K} = (1+g)\mb{I}$. It can be shown \cite{gra:lee:2008b} that the predicted value of $z$ at $\mb{x}$ is normally distributed with mean $\hat{z}(\mb{x}) = \mb{f}^\top(\mb{x}) \tilde{\bm{\beta}}$ and variance $\hat{\sigma}(\mb{x})^2 = \sigma^2 [1 + \mb{f}^\top(\mb{x})\mb{V}_{\tilde{\beta}} \mb{f}(\mb{x})]$, where $ \mb{V}_{\tilde{\beta}} = (\tau^{-2} + \mb{F}^\top \mb{F}(1+g))^{-1}$. This is preferred over (\ref{eq:pred}) with $\mb{K}=\mb{I}(1+g)$ because an $m \times m$ inversion is faster than an $n\times n$ one. Applying the ALC algorithm under the LLM also offers computational savings. Starting with the predictive variance given in (\ref{eq:pred}), the expected reduction in variance under the LM is \cite{gra:lee:2009} \begin{equation} \Delta \hat{\sigma}^2_\mb{y} (\mb{x}) = \frac{ \sigma^2 [\mb{f}^\top(\mb{y}) \mb{V}_{\tilde{\beta}_N} \mb{f}(\mb{x})]^2} {1+g + \mb{f}^\top(\mb{x}) \mb{V}_{\tilde{\beta}_N} \mb{f}(\mb{x})} \label{e:llmalc} \end{equation} which is similarly preferred over (\ref{e:gpalc}) with $\mb{K} = \mb{I}(1+g)$. The statistic for expected improvement (EI; about the minimum) is the same under the LLM as (\ref{eq:ego}) for the GP. Of course, it helps to use the linear predictive equations instead of the kriging ones for $\hat{z}(\mb{x})$ and $\hat{\sigma}^2(\mb{x})$. \subsection{Treed partitioning} \label{sec:treed} Nonstationary models are obtained by treed partitioning and inferring a separate model within each region of the partition. Treed partitioning is accomplished by making (recursive) binary splits on the value of a single variable so that region boundaries are parallel to coordinate axes. Partitioning is recursive, so each new partition is a sub-partition of a previous one. Since variables may be revisited, there is no loss of generality by using binary splits as multiple splits on the same variable are equivalent to a non-binary split. \begin{figure}%[ht!] \centering \includegraphics{tree} \caption{\footnotesize An example tree $\mathcal{T}$ with two splits, resulting in three regions, shown in a diagram ({\em left}) and pictorially ({\em right}). The notation $\mb{X}[:,u] < s$ represents a subsetting of the design matrix $\mb{X}$ by selecting the rows which have $u^{\mbox{\tiny th}}$ column less than $s$, i.e. columns $\{i: x_{iu} < s\}$, so that $\mb{X}_1$ has the rows $I_1$ of $\mb{X}$ where $I_1 = \{x_{iu_1} < s_1 \;\&\; x_{iu_2} < s_2\}$, etc. The responses are subsetted similarly so that $\mb{Z}_1$ contains the $I_1$ elements of $\mb{Z}$. We have that $\cup_j D_i = \{\mb{X},\mb{Z}\}$ and $D_i \cap D_j = \emptyset$ for $i\ne j$. } \label{f:tree} \end{figure} Figure \ref{f:tree} shows an example tree. In this example, region $D_1$ contains $\mb{x}$'s whose $u_1$ coordinate is less than $s_1$ and whose $u_2$ coordinate is less than $s_2$. Like $D_1$, $D_2$ has $\mb{x}$'s whose coordinate $u_1$ is less than $s_1$, but differs from $D_1$ in that the $u_2$ coordinate must be bigger than or equal to $s_2$. Finally, $D_3$ contains the rest of the $\mb{x}$'s differing from those in $D_1$ and $D_2$ because the $u_1$ coordinate of its $\mb{x}$'s is greater than or equal to $s_1$. The corresponding response values ($z$) accompany the $\mb{x}$'s of each region. These sorts of models are often referred to as Classification and Regression Trees (CART) \cite{brei:1984}. CART has become popular because of its ease of use, clear interpretation, and ability to provide a good fit in many cases. The Bayesian approach is straightforward to apply to tree models, provided that one can specify a meaningful prior for the size of the tree. The trees implemented in the {\tt tgp} package follow Chipman et al.~\cite{chip:geor:mccu:1998} who specify the prior through a tree-generating process. Starting with a null tree (all data in a single partition), the tree, ${\mathcal T}$, is probabilistically split recursively with each partition, $\eta$, being split with probability $p_{\mbox{\sc split}}(\eta, {\mathcal T}) = a (1 + q_\eta)^{-b}$ where $q_\eta$ is the depth of $\eta$ in $\mathcal{T}$ and $a$ and $b$ are parameters chosen to give an appropriate size and spread to the distribution of trees. Extending the work of Chipman et al.~\cite{chip:geor:mccu:2002}, the {\tt tgp} package implements a stationary GP with linear trend, or GP LLM, independently within each of the regions depicted by a tree $\mathcal{T}$ \cite{gra:lee:2008}. Integrating out dependence on $\mathcal{T}$ is accomplished by reversible-jump MCMC (RJ-MCMC) via tree operations {\em grow, prune, change}, and {\em swap}~\cite{chip:geor:mccu:1998}. %(2002)\nocite{chip:geor:mccu:2002}. %, however %Tree proposals can change the size of the parameter space ($\bm{\theta}$). To keep things simple, proposals for new parameters---via an increase in the number of partitions (through a {\em grow})---are drawn from their priors\footnote{Proposed {\em grows} are the {\em only} place where the priors (for $d$, $g$ and $\tau^2$ parameters; the others can be integrated out) are used for MH--style proposals. All other MH proposals are ``random--walk'' as described in Appendix \ref{sec:howimplement}.}, thus eliminating the Jacobian term usually present in RJ-MCMC. New splits are chosen uniformly from the set of marginalized input locations $\mb{X}$. The {\em swap} operation is augmented with a {\em rotate} option to improve mixing of the Markov chain \cite{gra:lee:2008}. There are many advantages to partitioning the input space into regions, and fitting separate GPs (or GP LLMs) within \index{each}each region. Partitioning allows for the modeling of non-stationary behavior, and can ameliorate some of the computational demands by fitting models to less data. Finally, fully Bayesian model averaging yields a uniquely efficient nonstationary, nonparametric, or semiparametric (in the case of the GP LLM) regression tool. The most general Bayesian treed GP LLM model can facilitate a model comparison between its special cases (LM, CART, treed LM, GP, treed GP, treed GP LLM) through the samples obtained from the posterior distribution. \subsection{(Treed) sequential D-optimal design} \label{sec:treedopt} In the statistics community, sequential data solicitation goes under the general heading of {\em design of experiments}. Depending on a choice of utility, different algorithms for obtaining optimal designs can be derived. Choose the Kullback-Leibler distance between the posterior and prior distributions as a utility leads to what are called $D$--optimal designs. For GPs with correlation matrix $\mb{K}$, this is equivalent to maximizing det$(\mb{K})$. Choosing quadratic loss leads to what are called $A-$optimal designs. An excellent review of Bayesian approaches to the design of experiments is provided by Chaloner \& Verdinelli~\cite{chaloner:1995}. Other approaches used by the statistics community include space-filling designs: e.g. max-min distance and Latin Hypercube (LH) designs \cite{sant:will:notz:2003}. The {\tt FIELDS} package \cite{fields:2004} implements space-filling designs along side kriging and thin plate spline models. A hybrid approach to designing experiments employs active learning techniques. The idea is to choose a set of candidate input configurations $\tilde{\mb{X}}$ (say, a $D-$optimal or LH design) and a rule for determining which $\tilde{\mb{x}}\in \tilde{\mb{X}}$ to add into the design next. The ALM algorithm has been shown to approximate maximum expected information designs by choosing $\tilde{\mathbf{x}}$ with the the largest predictive variance \cite{mackay:1992}. The ALC algorithm selects $\tilde{\mathbf{x}}$ minimizing the reduction in squared error averaged over the input space \cite{cohn:1996}. Seo et al.~\cite{seo00} provide a comparison between ALC and ALM using standard GPs. The EI \cite{jones:schonlau:welch:1998} algorithm can be used to find global minima. Choosing candidate configurations $\tilde{\mb{X}}$ ({\tt XX} in the {\tt tgp} package), at which to gather ALM, ALC, or EI statistics, is a significant component in the hybrid approach to experimental design. Candidates which are are well-spaced relative to themselves, and relative to already sampled configurations, are clearly preferred. Towards this end, a sequential $D$--optimal design is a good first choice, but has a number of drawbacks. $D$--optimal designs are based require a {\em known} parameterization, and are thus not well-suited to MCMC inference. They may not choose candidates in the ``interesting'' part of the input space, because sampling is high there already. They are ill-suited partition models wherein ``closeness'' may not measured homogeneously across the input space. Finally, they are computationally costly, requiring many repeated determinant calculations for (possibly) large covariance matrices. One possible solution to both computational and nonstationary modeling issues is to use treed sequential $D$--optimal design \cite{gra:lee:2009}, where separate sequential $D$--optimal designs are computed in each of the partitions depicted by the maximum {\em a posteriori} (MAP) tree $\hat{\mathcal{T}}$. The number of candidates selected from each region can be proportional to the volume of---or to the number of grid locations in---the region. MAP parameters $\hat{\bm{\theta}}_\nu|\hat{\mathcal{T}}$, or ``neutral'' or ``exploration encouraging'' ones, can be used to create the candidate design---a common practice \cite{sant:will:notz:2003}. Small range parameters, for learning about the wiggliness of the response, and a modest nugget parameter, for numerical stability, tend to work well together. Finding a local maxima is generally sufficient to get well-spaced candidates. The {\tt dopt.gp} function uses a stochastic ascent algorithm to find local maxima without calculating too many determinants. This works work well with ALM and ALC. However, it is less than ideal for EI as will be illustrated in Section \ref{sec:as}. Adaptive sampling from EI (with {\tt tgp}) is still an open area of research. \section{Examples using {\tt tgp}} \label{sec:examples} The following subsections take the reader through a series of examples based, mostly, on synthetic data. At least two different {\tt b*} models are fit for each set of data, offering comparisons and contrasts. Duplicating these examples in your own {\sf R} session is highly recommended. The {\tt Stangle} function can help extract executable {\sf R} code from this document. For example, the code for the exponential data of Section \ref{sec:exp} can be extracted with one command. \begin{verbatim} > Stangle(vignette("exp", package="tgp")$file) \end{verbatim} \noindent This will write a file called ``exp.R''. Additionally, each of the subsections that follow is available as an {\sf R} demo. Try {\tt demo(package="tgp")} for a listing of available demos. To invoke the demo for the exponential data of Section \ref{sec:exp} try {\tt demo(exp, package="tgp")}. This is equivalent to {\tt source("exp.R")} because the demos were created using {\tt Stangle} on the source files of this document. \footnote{Note that this vignette functionality is only supported in {\tt tgp} version $<2.x$. In 2.x and later the vignettes were coalesced in order to reduce clutter. The demos in 2.x, however, still correspond to their respective sections.} Each subsection (or subsection of the appendix) starts by seeding the random number generator with \verb!set.seed(0)!. This is done to make the results and analyses reproducible within this document, and in demo form. I recommend you try these examples with different seeds and see what happens. Usually the results will be similar, but sometimes (especially when the data ({\tt X, Z}) is generated randomly) they may be quite different. Other successful uses of the methods in this package include applications to the Boston housing data \cite{harrison:78, gra:lee:2008}, and designing an experiment for a reusable NASA launch vehicle \cite{glm:04,gra:lee:2009} called the Langely glide-back booster (LGBB). \SweaveInput{linear.iRnw} \SweaveInput{sin.iRnw} \SweaveInput{exp.iRnw} \SweaveInput{moto.iRnw} \SweaveInput{fried.iRnw} \SweaveInput{as.iRnw} \subsection*{Acknowledgments} This work was partially supported by research subaward 08008-002-011-000 from the Universities Space Research Association and NASA, NASA/University Affiliated Research Center grant SC 2003028 NAS2-03144, Sandia National Laboratories grant 496420, and National Science Foundation grants DMS 0233710 and 0504851. I would like to thank Matt Taddy for his contributions to recent releases of the package. I am especially grateful to my thesis advisor, Herbie Lee, whose contributions and guidance in this project have been invaluable throughout. Finally, I would like to thank an anonymous referee whose many helpful comments improved the paper. \appendix \section{Implementation notes} \label{sec:howimplement} The treed GP model is coded in a mixture of {\tt C} and {\tt C++}: {\tt C++} for the tree data structure ($\mathcal{T}$) and {\tt C} for the GP at each leaf of $\mathcal{T}$. The code has been tested on Unix ({\tt Solaris, Linux, FreeBSD, OSX}) and Windows (2000, XP) platforms. It is useful to first translate and re-scale the input data ($\mb{X}$) so that it lies in an $\Re^{m_X}$ dimensional unit cube. This makes it easier to construct prior distributions for the width parameters to the correlation function $K(\cdot,\cdot)$. Proposals for all parameters which require MH sampling are taken from a uniform ``sliding window'' centered around the location of the last accepted setting. For example, a proposed a new nugget parameter $g_\nu$ to the correlation function $K(\cdot, \cdot)$ in region $r_\nu$ would go as \[ g_\nu^* \sim \mbox{Unif}\left(\frac{3}{4}g_\nu, \frac{4}{3}g_\nu \right). \] Calculating the corresponding forward and backwards proposal probabilities for the MH acceptance ratio is straightforward. For more details about the MCMC algorithm and proposals, etc., please see the original technical report on {\em Bayesian treed Gaussian process models} \cite{gra:lee:2008}. \section{Interfaces and features} The following subsections describe some of the ancillary features of the {\tt tgp} package such as the gathering and summarizing of MCMC parameter traces, the progress meter, and an example of how to use the {\tt predict.tgp} function in a collaborative setting. \SweaveInput{traces.iRnw} \subsection{Explaining the progress meter} \label{sec:progress} The progress meter shows the state of the MCMC as it iterates through the desired number of rounds of burn--in ({\tt BTE[1]}), and sampling ({\tt BTE[2]-BTE[1]}), for the requested number of repeats ({\sf R-1}). The verbosity of progress meter print statements is controlled by the {\tt verb} arguments to the {\tt b*} functions. Providing {\tt verb=0} silences all non--warning (or error) statements. To suppress warnings, try enclosing commands within {\tt suppressWarnings(...)}, or globally set {\tt options(warn=0)}. See the help file ({\tt ?options}) for more global warning settings. The default verbosity setting ({\tt verb=1}) shows all {\em grows} and {\em prunes}, and a summary of $d$--(range) parameters for each partition every 1000 rounds. Higher verbosity arguments will show more tree operations, e.g., {\em change} and {\em swap}, etc. Setting {\tt verb=2} will cause an echo of the {\tt tgp} model parameters and their starting values; but is otherwise the same as {\tt verb=1}. The max is {\tt verb=4} shows all successful tree operations. Here is an example {\em grow} statement. \begin{verbatim} **GROW** @depth 2: [0,0.05], n=(10,29) \end{verbatim} The {\tt *GROW*} statements indicate the depth of the split leaf node; the splitting dimension $u$ and location $v$ is shown between square brackets {\tt [u,v]}, followed by the size of the two new children {\tt n=(n1,n2)}. {\tt *PRUNE*} is about the same, without printing {\tt n=(n1,n2)}. Every 1000 rounds a progress indicator is printed. Its format depends on a number of things: (1) whether parallelization is turned on or not, (2) the correlation model [isotropic or separable], (3) whether jumps to the LLM are allowed. Here is an example with the 2-d exp data with parallel prediction under the separable correlation function: \begin{verbatim} (r,l)=(5000,104) d=[0.0144 0.0236] [1.047 0/0.626]; mh=2 n=(59,21) \end{verbatim} The first part {\tt (r,l)=(5000,104)} is indicating the MCMC round number r=5000 and the number of leaves waiting to be "consumed" for prediction by the parallel prediction thread. When parallelization is turned off (default), the print will simply be {\tt "r=5000"}. The second part is a printing of the $d$--(range) parameter to a separable correlation function. For 2 partitions there are two sets of square brackets. Inside the square brackets is the $m_X$ (2 in this case) range parameters for the separable correlation function. Whenever the LLM governs one of the input dimensions a zero will appear. I.e., the placement of {\tt 0/0.626} indicates the LLM is active in the 2nd dimension of the 2nd partition. 0.626 is the $d$--(range) parameter that would have been used if the LLM were inactive. Whenever all dimensions are under the LLM, the d-parameter print is simply {\tt [0]}. This also happens when forcing the LLM (i.e., for {\tt blm} and {\tt btlm}), where {\tt [0]} appears for each partition. These prints will look slightly different if the isotropic instead of separable correlation is used, since there are not as many range parameters. \SweaveInput{pred.iRnw} \section{Configuration and performance optimization} In what follows I describe customizations and enhancements that can be made to {\tt tgp} at compile time in order to take advantage of custom computing architectures. The compilation of {\tt tgp} with a linear algebra library different from the one used to compile {\sf R} (e.g., ATLAS), and the configuration and compilation of {\tt tgp} with parallelization is described in detail. \subsection{Linking to ATLAS} \label{sec:atlas} {\tt ATLAS} \cite{atlas-hp} is supported as an alternative to standard {\tt BLAS} and {\tt LAPACK} for fast, automatically tuned, linear algebra routines. %Compared to standard {\tt BLAS} and {\tt Lapack}, %those automatically tuned by {\tt ATLAS} are significantly faster. If you know that {\sf R} has already been linked to tuned linear algebra libraries (e.g., on {\tt OSX}), then compiling with {\tt ATLAS} as described below, is unnecessary---just install {\tt tgp} as usual. As an alternative to linking {\tt tgp} to {\tt ATLAS} directly, one could re-compile all of {\sf R} linking it to {\tt ATLAS}, or some other platform--specific {\tt BLAS}/{\tt Lapack}, i.e., {\tt Intel}'s Math Kernel Library, or {\tt AMD}'s Core Math Library, as described in: \begin{center} \verb!http://cran.r-project.org/doc/manuals/R-admin.html! \end{center} Look for the section titled ``Linear Algebra''. While this is arguably best solution since all of {\sf R} benefits, the task can prove challenging to accomplish and may require administrator (root) privileges. Linking {\tt tgp} with {\tt ATLAS} directly is described here. GP models implemented in {\tt tgp} can get a huge benefit from tuned linear algebra libraries, since the MCMC requires many large matrix multiplications and inversions (particularly of $\mb{K}$). In some cases the improvement can be as large as tenfold with {\tt ATLAS} as compared to the default {\sf R} linear algebra routines. Comparisons between {\tt ATLAS} and architecture specific libraries like {\tt MKL} for {\tt Intel} or {\tt veclib} for {\tt OSX} usually show the latter favorably, though the difference is less impressive. For example, see \begin{center} \verb!http://www.intel.com/cd/software/products/asmo-na/eng/266858.htm! \end{center} for a comparison to {\tt MKL} on several typical benchmarks. Three easy steps (assuming, of course, you have already compiled and installed {\tt ATLAS} -- {\tt http://math-atlas.sourceforge.net}) need to be performed before you install the {\tt tgp} package from source. \begin{enumerate} \item Edit src/Makevars. Comment out the existing \verb!PKG_LIBS! line, and replace it with: \begin{verbatim} PKG_LIBS = -L/path/to/ATLAS/lib -llapack -lcblas -latlas \end{verbatim} You may need replace \verb!-llapack -lcblas -latlas! with whatever {\tt ATLAS} recommends for your OS. (See {\tt ATLAS} README.) For example, if your {\tt ATLAS} compilation included {\tt F77} support, you may need to add \verb!"-lF77blas"!, if you compiled with {\tt Pthreads}, you would might use \begin{verbatim} -llapack -lptcblas -lptf77blas -latlas \end{verbatim} \item Continue editing src/Makevars. Add: \begin{verbatim} PKG_CFLAGS = -I/path/to/ATLAS/include \end{verbatim} \item Edit src/linalg.h and comment out lines 40 \& 41: \begin{verbatim} /*#define FORTPACK #define FORTBLAS*/ \end{verbatim} \end{enumerate} Now simply install the {\tt tgp} package as usual. Reverse the above instructions to disable {\tt ATLAS}. Don't forget to re-install the package when you're done. Similar steps can be taken for platform specific libraries like {\tt MKL}, leaving off step 3. \subsection{Parallelization with {\tt Pthreads}} \label{sec:pthreads} After conditioning on the tree and parameters ($\{\mathcal{T}, \bm{\theta}\}$), prediction can be parallelized by using a producer/consumer model. This allows the use of {\tt PThreads} in order to take advantage of multiple processors, and get speed-ups of at least a factor of two. This is particularly relevant since dual processor workstations and multi-processor servers are becoming commonplace in modern research labs. However, multi--processors are not yet ubiquitous, so parallel--{\tt tgp} is not yet the default. Using the parallel version will be slower than the non--parallel (serial) version on a single processor machine. Enabling parallelization requires two simple steps, and then a re--install. \begin{enumerate} \item Add \verb!-DPARALLEL! to \verb!PKG_CXXFLAGS! of src/Makevars \item You may need to add \verb!-pthread! to \verb!PKG_LIBS! of src/Makevars, or whatever is needed by your compiler in order to correctly link code with {\tt PThreads}. \end{enumerate} The biggest improvement in the parallel version, over the serial, is observed when calculating ALC statistics, which require $O(n_2^2)$ time for $n_2$ predictive locations, or when calculating ALM (default) or EI statistics on predictive locations whose number ($n_2$) is at least an order of magnitude larger ($n_2\gg n_1)$ than the number of input locations ($n_1$). Parallel sampling of the posterior of $\bm{\theta}|\mathcal{T}$ for each of the $\{\theta_\nu\}_{\nu=1}^R$ is also possible. However, the speed-up in this second case is less impressive, and so is not supported by the current version of the {\tt tgp} package. \bibliography{tgp} \bibliographystyle{plain} \end{document} tgp/vignettes/exp.iRnw0000644000175100001440000001515212506600653014536 0ustar hornikusers\subsection{Synthetic 2-d Exponential Data} \label{sec:exp} <>= library(tgp) library(maptree) ##options(width=65) seed <- 0; set.seed(seed) @ The next example involves a two-dimensional input space in $[-2,6] \times [-2,6]$. The true response is given by \begin{equation} z(\mb{x}) = x_1 \exp(-x_1^2 - x_2^2). \label{e:2dtoy} \end{equation} A small amount of Gaussian noise (with sd $=0.001$) is added. Besides its dimensionality, a key difference between this data set and the last one is that it is not defined using step functions; this smooth function does not have any artificial breaks between regions. The {\tt tgp} package provides a function for data subsampled from a grid of inputs and outputs described by (\ref{e:2dtoy}) which concentrates inputs ({\tt X}) more heavily in the first quadrant where the response is more interesting. Predictive locations ({\tt XX}) are the remaining grid locations. <<>>= exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z XX <- exp2d.data$XX @ The treed LM is clearly just as inappropriate for this data as it was for the sinusoidal data in the previous section. However, a stationary GP fits this data just fine. After all, the process is quite well behaved. In two dimensions one has a choice between the isotropic and separable correlation functions. Separable is the default in the {\tt tgp} package. For illustrative purposes here, I shall use the isotropic power family. <>= exp.bgp <- bgp(X=X, Z=Z, XX=XX, corr="exp", verb=0) @ \begin{figure}[ht!] \centering <>= plot(exp.bgp, main='GP,') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-exp-bgp} %\vspace{-0.5cm} \caption{{\em Left:} posterior predictive mean using {\tt bgp} on synthetic exponential data; {\em right} image plot of posterior predictive variance with data locations {\tt X} (dots) and predictive locations {\tt XX} (circles).} \label{f:exp:bgp} \end{figure} Progress indicators are suppressed. Figure \ref{f:exp:bgp} shows the resulting posterior predictive surface under the GP in terms of means ({\em left}) and variances ({\em right}) in the default layout. The sampled locations ({\tt X}) are shown as dots on the {\em right} image plot. Predictive locations ({\tt XX}) are circles. Predictive uncertainty for the stationary GP model is highest where sampling is lowest, despite that the process is very uninteresting there. A treed GP seems more appropriate for this data. It can separate out the large uninteresting part of the input space from the interesting part. The result is speedier inference and region-specific estimates of predictive uncertainty. <>= exp.btgp <- btgp(X=X, Z=Z, XX=XX, corr="exp", verb=0) @ \begin{figure}[ht!] \centering <>= plot(exp.btgp, main='treed GP,') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-exp-btgp} %\vspace{-0.25cm} <>= tgp.trees(exp.btgp) @ <>= graphics.off() @ \includegraphics[trim=50 65 50 10]{tgp-exp-btgptrees} \vspace{-0.5cm} \caption{{\em Top-Left:} posterior predictive mean using {\tt btgp} on synthetic exponential data; {\em top-right} image plot of posterior predictive variance with data locations {\tt X} (dots) and predictive locations {\tt XX} (circles). {\tt Bottom:} MAP trees of each height encountered in the Markov chain with $\hat{\sigma}^2$ and the number of observations $n$ at the leaves.} \label{f:exp:btgp} \end{figure} Figure \ref{f:exp:btgp} shows the resulting posterior predictive surface ({\em top}) and trees ({\em bottom}). Typical runs of the treed GP on this data find two, and if lucky three, partitions. As might be expected, jumping to the LLM for the uninteresting, zero-response, part of the input space can yield even further speedups \cite{gra:lee:2008}. Also, Chipman et al.~recommend restarting the Markov chain a few times in order to better explore the marginal posterior for $\mathcal{T}$ \cite{chip:geor:mccu:2002}. This can be important for higher dimensional inputs requiring deeper trees. The {\tt tgp} default is {\tt R = 1}, i.e., one chain with no restarts. Here two chains---one restart---are obtained using {\tt R = 2}. <<>>= exp.btgpllm <- btgpllm(X=X, Z=Z, XX=XX, corr="exp", R=2) @ \begin{figure}[ht!] \centering <>= plot(exp.btgpllm, main='treed GP LLM,') @ <>= graphics.off() @ \includegraphics[trim=0 25 0 25]{tgp-exp-btgpllm} %\vspace{-0.5cm} \caption{{\em Left:} posterior predictive mean using {\tt btgpllm} on synthetic exponential data; {\em right} image plot of posterior predictive variance with data locations {\tt X} (dots) and predictive locations {\tt XX} (circles).} \label{f:exp:btgpllm} \end{figure} Progress indicators show where the LLM ({\tt corr=0($d$)}) or the GP is active. Figure \ref{f:exp:btgpllm} shows how similar the resulting posterior predictive surfaces are compared to the treed GP (without LLM). Appendix \ref{sec:traces} shows how parameter traces can be used to calculate the posterior probabilities of regional and location--specific linearity in this example. \begin{figure}[ht!] \centering <>= plot(exp.btgpllm, main='treed GP LLM,', proj=c(1)) @ <>= graphics.off() @ \vspace{-0.65cm} <>= plot(exp.btgpllm, main='treed GP LLM,', proj=c(2)) @ <>= graphics.off() @ \includegraphics[trim=0 10 0 25]{tgp-exp-1dbtgpllm1} \includegraphics[trim=0 25 0 10]{tgp-exp-1dbtgpllm2} %\vspace{-0.5cm} \caption{1-d projections of the posterior predictive surface ({\em left}) and normed predictive intervals ({\em right}) of the 1-d tree GP LLM analysis of the synthetic exponential data. The {\em top} plots show projection onto the first input, and the {\em bottom} ones show the second.} \label{f:exp:1dbtgpllm} \end{figure} Finally, viewing 1-d projections of {\tt tgp}-class output is possible by supplying a scalar {\tt proj} argument to the {\tt plot.tgp}. Figure \ref{f:exp:1dbtgpllm} shows the two projections for {\tt exp.btgpllm}. In the {\em left} surface plots the open circles indicate the mean of posterior predictive distribution. Red lines show the 90\% intervals, the norm of which are shown on the {\em right}. tgp/vignettes/optim.iRnw0000644000175100001440000006350312506600653015075 0ustar hornikusers\section{Statistical search for optimization} \label{sec:optim} <>= library(tgp) seed <- 0; set.seed(seed) @ There has been considerable recent interest in the use of statistically generated search patterns (i.e., locations of relatively likely optima) for optimization. A popular approach is to estimate a statistical (surrogate) model, and use it to design a set of well-chosen candidates for further evaluation by a direct optimization routine. Such statistically designed search patterns can be used either to direct the optimization completely (e.g., \cite{JoneSchoWelc1998} or \cite{RommShoe2007}) or to work in hybrid with local pattern search optimization (as in \cite{TaddLeeGrayGrif2009}). An bonus feature of the statistical surrogate approach is that it may be used to tackle problems of optimization under uncertainty, wherein the function being optimized is observed with noise. In this case the search is for input configurations which optimize the response with high probability. Direct-search methods would not apply in this scenario without modification. However, a sensible hybrid could involve inverting the relationship between the two approaches so that direct-search is used on deterministic predictive surfaces from the statistical surrogate model. This search can be used to find promising candidates to compliment space-filling ones at which some statistical improvement criterion is evaluated. Towards situating {\tt tgp} as a promising statistical surrogate model for optimization (in both contexts) the approach developed by Taddy, et al.~\cite{TaddLeeGrayGrif2009}, has been implemented to produce a list of input locations that is ordered by a measure of the potential for new optima. The procedure uses samples from the posterior predictive distribution of treed GP regression models to estimate improvement statistics and build an ordered list of search locations which maximize expected improvement. The single location improvement is defined $I(\mb{x}) = \mathrm{max}\{f_{min}-f(\mb{x}),0\}$, where $f_{min}$ is the minimum evaluated response in the search (refer to \cite{SchoWelcJone1998} for extensive discussion on general improvement statistics and initial vignette~\cite{gramacy:2007} for details of a base implementation in {\tt tgp}). Thus, a high improvement corresponds to an input location that is expected to be much lower than the current minimum. The criterion is easily changed to a search for maximum values through negation of the response. The improvement is always non-negative, as points which do not turn out to be new minimum points still provide valuable information about the output surface. Thus, in the expectation, candidate locations will be rewarded for high response uncertainty (indicating a poorly explored region of the input space), as well as for low mean predicted response. Our {\tt tgp} generated search pattern will consist of $m$ locations that recursively maximize (over a discrete candidate set) a sequential version of the expected multi-location improvement developed by Schonlau, et al.~\cite{SchoWelcJone1998}, defined as $\mbb{E}\left[I^g(\mb{x}_1, \ldots, \mb{x}_m)\right]$ where \begin{equation} \label{eqn:imult} I^g(\mb{x}_1, \ldots, \mb{x}_m) = \left(\mathrm{max}\{(f_{min}-f(\mb{x}_1)), \ldots, (f_{min}-f(\mb{x}_m)), 0 \}\right)^g. \end{equation} Increasing $g \in \{0,1,2,3,\ldots\}$ increases the global scope of the criteria by rewarding in the expectation extra variability at $\mb{x}$. For example, $g=0$ leads to $\mbb{E}[I^0(\mb{x})] = \Pr(I(\mb{x})>0)$ (assuming the convention $0^0=0$), $g=1$ yields the standard statistic, and $g=2$ explicitly rewards the improvement variance since $\mbb{E}[I^2(\mb{x})] = \mr{var}[I(\mb{x})] + \mbb{E}[I(\mb{x})]^2$. For further discussion on the role of $g$, see \cite{SchoWelcJone1998} . Finding the maximum expectation of (\ref{eqn:imult}) is practically impossible for the full posterior distribution of $I^g(\mb{x}_1, \ldots, \mb{x}_m)$, and would require conditioning on a single fit for the model parameters (for example, static imputation of predictive GP means can be used to recursively build the improvement set \cite{GinsLe-RCarr2009}). However, {\tt tgp} just seeks to maximize over a discrete list of predictive locations. In fact, the default is to return an ordering for the entire {\tt XX} matrix, thus defining a ranking of predictive locations by order of decreasing expected improvement. There is no restriction on the form for {\tt XX}.\footnote{A full optimization routine would require that the search pattern is placed within an algorithm iterating towards convergence, as in \cite{TaddLeeGrayGrif2009}. However, we concentrate here on the statistical problem of choosing the next samples optimally. We shall touch on issues of convergence in Section \ref{sec:optimskel} where we describe a skeleton scheme for optimization extending {\sf R}'s internal {\tt optim} functionality.} The structure of this scheme will dictate the form for {\tt XX}. If it is the case that we seek simply to explore the input space and map a list of potential locations for improvement, using LHS to choose {\tt XX} will suffice. The discretization of decision space allows for a fast iterative solution to the optimization of $\mbb{E}\left[I^g(\mb{x}_1, \ldots, \mb{x}_m)\right]$. This begins with evaluation of the simple improvement $I^g(\tilde{\mb{x}}_i)$ over $\tilde{\mb{x}}_i \in {\bf \tilde X}$ at each of $T=$ {\tt BTE[2]-BTE[1]} MCMC iterations (each corresponding to a single posterior realization of {\tt tgp} parameters and predicted response after burn-in) to obtain the posterior sample \begin{equation*} \mathcal{I} = \left\{ \begin{array}{rcl} I^g( \tilde{\mb{x}}_1)_1& \ldots& I^g(\tilde{\mb{x}}_m)_1\\ &\vdots& \\ I^g( \tilde{\mb{x}}_1)_T& \ldots& I^g(\tilde{\mb{x}}_m)_T \end{array}\right\}. \end{equation*} Recall that in {\tt tgp} parlance, and as input to the {\tt b*} functions: $\tilde{\mb{X}}\equiv $ {\tt XX}. We then proceed iteratively to build an {\it ordered} collection of $m$ locations according to an iteratively refined improvement: Designate $\mb{x}_1 = \mathrm{argmax}_{\tilde{\mb{x}} \in {\bf \tilde X}} \mbb{E}\left[I^g( \tilde{\mb{x}})\right]$, and for $j=2,\ldots,m$, given that $\mb{x}_1, \ldots, \mb{x}_{j-1}$ are already included in the collection, the next member is \begin{eqnarray*} \mb{x}_j &=& \mathrm{argmax}_{\tilde{\mb{x}} \in {\bf \tilde X}} \mbb{E}\left[ \mathrm{max}\{I^g( \mb{x}_1, \ldots, \mb{x}_{j-1}), I^g(\tilde{\mb{x}}) \} \right]\\ &=& \mathrm{argmax}_{\tilde{\mb{x}} \in {\bf \tilde X}} \mbb{E}[\left(\mathrm{max}\{(f_{min}-f(\mb{x}_1)), \ldots, (f_{min}-f(\mb{x}_{j-1})), (f_{min}-f(\tilde{\mb{x}})), 0\}\right)^g ] \\ &=& \mathrm{argmax}_{\tilde{\mb{x}} \in {\bf \tilde X}} \mbb{E}\left[I^g(\mb{x}_1, \ldots, \mb{x}_{j-1},\tilde{\mb{x}})\right]. \end{eqnarray*} Thus, after each $j^{\rm th}$ additional point is added to the set, we have the maximum expected $j$--location improvement conditional on the first $j-1$ locations. This is not necessarily the unconditionally maximal expected $j$--location improvement; instead, point $\mb{x}_j$ is the location which will cause the greatest increase in expected improvement over the given $(j-1)$--location expected improvement. The posterior sample $\mathcal{I}$ acts as a discrete approximation to the true posterior distribution for improvement at locations within the candidate set {\tt XX}. Based upon this approximation, iterative selection of the point set is possible without any re-fitting of the {\tt tgp} model. Conditional on the inclusion of $\tilde{\mb{x}}_{i_1},\ldots,\tilde{\mb{x}}_{i_{l-1}}$ in the collection, a posterior sample of the $l$--location improvement statistics is calculated as \begin{equation*} \mathcal{I}_l = \left\{ \begin{array}{rcl} I^g( \tilde{\mb{x}}_{i_1},\ldots,\tilde{\mb{x}}_{i_{l-1}}, \tilde{\mb{x}}_1)_1 & \ldots& I^g( \tilde{\mb{x}}_{i_1},\ldots,\tilde{\mb{x}}_{i_{l-1}}, \tilde{\mb{x}}_m)_1\\ &\vdots& \\ I^g(\tilde{\mb{x}}_{i_1},\ldots,\tilde{\mb{x}}_{i_{l-1}}, {\tilde x}_1)_T& \ldots& I^g(\tilde{\mb{x}}_{i_1},\ldots,\tilde{\mb{x}}_{i_{l-1}},\tilde{\mb{x}}_m)_T \end{array}\right\}, \end{equation*} where the element in the $t^{\rm th}$ row and $j^{\rm th}$ column of this matrix is calculated as max$\{I^g(\tilde{\mb{x}}_{i_1}$, $\ldots,$ $\tilde{\mb{x}}_{i_{l-1}})_t$, $I^g(\tilde{\mb{x}}_j)_t\}$ and the $l^{\rm th}$ location included in the collection corresponds to the column of this matrix with maximum average. Since the multi-location improvement is always at least as high as the improvement at any subset of those locations, the same points will not be chosen twice for inclusion. In practice, very few iterations (about 10\% of the total candidate size under the default inference and regression model(s)) through this ordering process can be performed before the iteratively updated improvement statistics become essentially zero. Increasing the number of MCMC iterations ({\tt BTE[2]-BTE[1]}) can mitigate this to a large extent.\footnote{Once a zero (maximal) iterative improvement is attained the rest of the ranking is essentially arbitrary, at which point {\tt tgp} cuts off the process prematurely.} We refer the reader to \cite{TaddLeeGrayGrif2009} for further details on this approach to multi-location improvement search. \subsection{A simple example} We shall use the Rosenbrock function to illustrate the production of an ordered collection of (possible) adaptive samples to maximize the expected improvement within {\tt tgp}. Specifically, the two dimensional Rosenbrock function is defined as <<>>= rosenbrock <- function(x){ x <- matrix(x, ncol=2) 100*(x[,1]^2 - x[,2])^2 + (x[,1] - 1)^2 } @ and we shall bound the search space for adaptive samples to the rectangle: $-1\le x_i \le 5$ for $i=1,2$. The single global minimum of the Rosenbrock function is at $(1,1)$. <<>>= rosenbrock(c(1,1)) @ This function involves a long steep valley with a gradually sloping floor, and is considered to be a difficult problem for local optimization routines. We begin by drawing an LHS of 40 input locations within the bounding rectangle, and evaluating the function at these locations. <<>>= rect <- cbind(c(-1,-1),c(5,5)) X <- lhs(40, rect) Z <- rosenbrock(X) @ We will fit a {\tt bgp} model to this data to predict the Rosenbrock response at unobserved (candidate) input locations in {\tt XX}. The {\tt improv} argument may be used to obtain an ordered list of places where we should be looking for new minima. In particular, specifying {\tt improv=c(1,10)} will return the 10 locations which maximize the iterative multi-location expected improvement function, with $g=1$ (i.e., Eq.~(\ref{eqn:imult})). Note that {\tt improv=TRUE} is also possible, in which case {\tt g} defaults to one and the entire list of locations is ranked. Our candidate set is just a space filling LHS design. In other situations, it may be useful to build an informative LHS design (i.e., to specify {\tt shape} and {\tt mode} arguments for the {\tt lhs} function) to reflect what is already known about the location of optima. <<>>= XX <- lhs(200, rect) rfit <- bgp(X,Z,XX,improv=c(1,10), verb=0) @ Upon return, the \verb!"tgp"!-class object {\tt rfit} includes the matrix {\tt improv}, which is a list of the expected single location improvement for the 200 {\tt XX} locations, and the top 10 ranks. Note that the {\tt rank}s for those points which are not included in the top 10 are set to {\tt nrow(XX)=}\Sexpr{nrow(XX)}. Here are the top 10: <<>>= cbind(rfit$improv,XX)[rfit$improv$rank <= 10,] @ This iterative algorithm may produce ranks that differ significantly from a straightforward ordering of expected improvement. This leads to a list that better explores the input space, since the expected improvement is naturally balanced against a desire to search the domain. We plot the results with the usual function, by setting {\tt as="improv"}, in Figure \ref{optim-fit1}. \begin{figure}[htb!] <>= plot(rfit, as="improv") @ <>= graphics.off() @ \centering \includegraphics[width=6.5in,trim=0 25 0 25]{tgp2-optim-fit1} \caption{The {\em left} panel shows the mean predicted Rosenbrock function response, and on the {\em right} we have expected single location improvement with the top 10 points (labelled by rank) plotted on top.} \label{optim-fit1} \end{figure} The banana--shaped region of higher expected improvement corresponds to the true valley floor for the Rosenbrock function, indicating the that {\tt bgp} model is doing a good job of prediction. Also, we note that the ordered input points are well dispersed throughout the valley---a very desirable property for adaptive sampling candidates. It is straightforward, with {\tt predict.tgp}, to obtain a new ordering for the more global {\tt g=5} (or any new {\tt g}). Figure \ref{optim-fit2} shows a more diffuse expected improvement surface and a substantially different point ordering. In practice, we have found that {\tt g=2} provides a good compromise between local and global search. \begin{figure}[htb!] <>= rfit2 <- predict(rfit, XX=XX, BTE=c(1,1000,1), improv=c(5,20), verb=0) plot(rfit2, layout="as", as="improv") @ <>= graphics.off() @ \centering \includegraphics[width=3.25in,trim=0 25 0 25]{tgp2-optim-fit2} \caption{The expected improvement surface and top 20 ordered locations, for {\tt g=5}.} \label{optim-fit2} \end{figure} \subsection{A skeleton optimization scheme} \label{sec:optimskel} %% The nature of global optimization demands that a fine balance be %% struck between global and local search. Therefore, designing a %% one--size--fits--all approach would be a daunting task. For one %% thing, assessing convergence in any formal sense would be quite %% difficult, although in practice it would be straightforward to %% ``force'' convergence by (eventually) focusing the method on finding a %% local solution. In the case where the function evaluations are %% deterministic, final convergence to a the local solution is always %% possible through the use of {\tt R}'s {\tt optim} function, for %% example. A method using {\tt tgp} based on a similar, but more %% formalized approach, using a direct/pattern search (in place of {\tt %% optim}) has been recently demonstrated in the context of %% sequentially designing computer experiments to solve an optimization %% problem \cite{TaddLeeGrayGrif2009}. Generally speaking, the result is %% a sensible compromise between local and global search. When the %% function evaluations are noisy one can always create a deterministic %% approximation, i.e., via the MAP predictive distribution (i.e., a %% kriging surrogate), for use with {\tt optim} in order to obtain %% convergence to a local optima. %% %% It may be possible to base assessments of convergence on the %% improvement statistic, which would naturally tend to zero as more %% points are added into the design. But any such assessments would hinge %% upon being able to drive the (Monte Carlo) method used to infer the %% model parameters---on which the improvement statistic is based---to a %% fixed point. In the context of MCMC this is only guaranteed as the %% number of samples gathered tends to infinity. Even if obtaining %% asymptotic convergence in this way is clearly a pipe dream, the %% practical application of this idea, and those based on local %% optimization mentioned above, can still bear fruit. Insight into %% convergence in practice is still a very tangible concept. Moreover, %% for many applications the considerations of convergence may even take %% a back seat to other budgetary constraints where the efficient %% allocation of an available resource (say computer cycles) is more %% important than a bottom--line based upon convergence which may only be %% achieved at all costs in the best of scenarios. The capabilities outlined above are useful in their own right, as a search list or candidate set ranked by expected improvement gain provides concrete information about potential optima. However, a full optimization framework requires that the production of these sets of search locations are nested within an iterative search scheme. The approach taken by Taddy, et al.~\cite{TaddLeeGrayGrif2009}, achieves this by taking the {\tt tgp} generated sets of locations and using them to augment a local optimization search algorithm. In this way, the authors are able to achieve robust solutions which balance the convergence properties of the local methods with the global scope provided by {\tt tgp}. Indeed, any optimization routine capable of evaluating points provided by an outside source could benefit from a {\tt tgp} generated list of search locations. In the absence of this sort of formal hybrid search algorithm, it is still possible to devise robust optimization algorithms based around {\tt tgp}. A basic algorithm is as follows: first, use a LHS to explore the input space (see the {\tt lhs} function included in {\tt tgp}). Repeatedly fit one of the {\tt b*} models with {\tt improv!=FALSE} to the evaluated iterates to produce a search set, then evaluate the objective function over this search set, as described earlier. Then evaluate the objective function over the highest ranked locations in the search set. Continue until you are confident that the search has narrowed to a neighborhood around the true optimum (a good indicator of this is when all of the top-ranked points are in the same area). At this point, the optimization may be completed by {\tt optim}, {\sf R}'s general purpose local optimization algorithm in order to guarentee convergence. The {\tt optim} routine may be initialized to the best input location (i.e. corresponding the most optimal function evaluation) found thus far by {\tt tgp}. Note that this approach is actually an extreme version of a template proposed by Taddy, et al.~\cite{TaddLeeGrayGrif2009}, where the influence of global (i.e. {\tt tgp}) search is downweighted over time rather than cut off. In either case, a drawback to such approaches is that they do not apply when the function being optimized is deterministic. An alternative scheme is to employ both {\tt tgp} search and a local optimization at each iteration. The idea is that a mix of local and global information is provided throughout the entire optimization, but with an added twist. Rather than apply {\tt optim} on the stochastic function directly, which would not converge due to the noise, it can be applied on a deterministic (MAP) kriging surface provided by {\tt tgp}. The local optima obtained can be used to augment the candidate set of locations where the improvement statistic is gathered---which would otherwise be simple LHS. That way the search pattern produced on output is likely to have a candidate with high improvement. To fix ideas, and for the sake of demonstration, the {\tt tgp} package includes a skeleton function for performing a single iteration in the derivative--free optimization of noisy black--box functions. The function is called {\tt optim.step.tgp}, and the name is intended to emphasize that it performs a single step in an optimization by trading off local {\tt optim}--based search of {\tt tgp} predictive (kriging surrogate) surfaces, with the expected posterior improvement. In other words, it is loosely based on some the techniques alluded to above, but is designed to be augmented/adjusted as needed. Given $N$ pairs of inputs and responses $(\mb{X}, \mb{Z})$, {\tt optim.step.tgp} suggests new points at which the function being optimized should be evaluated. It also returns information that can be used to assess convergence. An outline follows. The {\tt optim.step.tgp} function begins by constructing a set of candidate locations, either as a space filling LHS over the input space (the default) or from a treed $D$--optimal design, based on a previously obtained \verb!"tgp"!-class model. {\sf R}'s {\tt optim} command is used on the MAP predictive surface contained within the object to obtain an estimate of the current best guess $\mb{x}$-location of the optimal solution. A standalone subroutine called {\tt optim.ptgpf} is provided for this specific task, to be used within {\tt optim.step.tgp} or otherwise. Within {\tt optim.step.tgp}, {\tt optim.ptgpf} is initialized with the data location currently predicted to be the best guess of the minimum. The optimal $x$-location found is then added into the set of candidates as it is likely that the expected improvement would be high there. Then, a new \verb!"tgp"!-class object is obtained by applying a {\tt b*} function to $(\mb{X}, \mb{Z})$ whilst sampling from the posterior distribution of the improvement statistic. The best one, two, or several locations with highest improvement ranks are suggested for addition into the design. The values of the maximum improvement statistic are also returned in order to track progress in future iterations. The \verb!"tgp"!-class object returned is used to construct candidates and initialize the {\tt optim.ptgpf} function in future rounds. To illustrate, consider the 2-d exponential data from the initial vignette \cite{gramacy:2007} as our noisy function $f$. <<>>= f <- function(x) { exp2d.Z(x)$Z } @ Recall that this data is characterized by a mean value of \[ f(\mb{x}) = x_1 \exp(-x_1^2 - x_2^2) \] which is observed with a small amount of Gaussian noise (with sd $=0.001$). Elementary calculus gives that the minimum of $f$ is obtained at $\mb{x} = (-\sqrt{1/2},0)$. The {\tt optim.step.tgp} function requires that the search domain be defined by a bounding rectangle, and we require an initial design to start things off. Here we shall use $[-2,6]^2$ with an LHS design therein. <<>>= rect <- rbind(c(-2,6), c(-2,6)) X <- lhs(20, rect) Z <- f(X) @ The following code proceeds with several rounds of sequential design towards finding the minimum of {\tt f}. <>= out <- progress <- NULL for(i in 1:20) { ## get recommendations for the next point to sample out <- optim.step.tgp(f, X=X, Z=Z, rect=rect, prev=out, verb=0) ## add in the inputs, and newly sampled outputs X <- rbind(X, out$X) Z <- c(Z, f(out$X)) ## keep track of progress and best optimum progress <- rbind(progress, out$progress) } @ The {\tt progress} can be tracked through the rows of a {\tt data.frame}, as constructed above, containing a listing of the input location of the current best guess of the minimum for each round, together with the value of the objective at that point, as well as the maximum of the improvement statistic. \begin{figure}[ht!] \centering <>= par(mfrow=c(1,2)) matplot(progress[,1:2], main="x progress", xlab="rounds", ylab="x[,1:2]", type="l", lwd=2) legend("topright", c("x1", "x2"), lwd=2, col=1:2, lty=1:2) plot(log(progress$improv), type="l", main="max log improv", xlab="rounds", ylab="max log(improv)") @ <>= graphics.off() @ \includegraphics[trim=40 20 0 0]{tgp2-optim-progress} %\vspace{-0.5cm} \caption{Progress in iterations of {\tt optim.step.tgp} shown by tracking the $\mb{x}$--locations of the best guess of the minimum ({\em left}) and the logarithm of the maximum of the improvement statistics at the candidate locations ({\em right})} \label{f:optim:progress} \end{figure} In addition to printing this data to the screen, plots such as the ones in Figure \ref{f:optim:progress} can be valuable for assessing convergence. As can be seen in the figure, the final iteration gives an $\mb{x}$-value that is very close to the correct result, and is (in some loose sense) close to convergence. <<>>= out$progress[1:2] @ As mentioned above, if it is known that the function evaluations are deterministic then, at any time, {\sf R}'s {\tt optim} routine can be invoked---perhaps initialized by the $\bm{x}$-location in \verb!out$progress!---and convergence to a local optimum thus guaranteed. Otherwise, the quantities in \verb!out$progress! will converge, in some sense, as long as the number of MCMC rounds used in each round, above, ($T=$ {\tt BTE[2]-BTE[1]}) tends to infinity. Such arguments to the {\tt b*} functions can be set via the ellipses ({\tt ...}) arguments to {\tt optim.step.tgp}.\footnote{This runs contrary to how the ellipses are used by {\tt optim} in order to specify static arguments to {\tt f}. If setting static arguments to {\tt f} is required within {\tt optim.step.tgp}, then they must be set in advance by adjusting the default arguments via {\tt formals}.} A heuristic stopping criterion can be based on the maximum improvement statistic obtained in each round as long as the candidate locations become dense in the region as $T\rightarrow \infty$. This can be adjusted by increasing the {\tt NN} argument to {\tt optim.step.tgp}. The internal use of {\tt optim} within {\tt optim.step.tgp} on the posterior predictive (kriging surrogate) surface via {\tt optim.ptgpf} may proceed with any of the usual method arguments. I.e., <<>>= formals(optim)$method @ however the default ordering is switched in {\tt optim.ptgpf} and includes one extra method. <<>>= formals(optim.ptgpf)$method @ Placing \verb!"L-BFGS-B"! in the default position is sensible since this method enforces a rectangle of constraints as specified by {\tt rect}. This guarentees that the additional candidate found by {\tt optim.ptfpf} will be valid. However, the other {\tt optim} methods generally work well despite that they do not enforce this constraint. The final method, \verb!"optimize"!, applies only when the inputs to {\tt f} are 1-d. In this case, the documentation for {\tt optim} suggests using the {\tt optimize} function instead. %% Bobby says to Taddy: I also have a good example using the 1-d %% sinusoidal data, which is slightly more challenging since it %% has two equivalent minima, but perhaps it is not ideal. Do you %% have any other good examples that we can test this on? Do we %% need any more? tgp/vignettes/fried.iRnw0000644000175100001440000000750012506600653015031 0ustar hornikusers\subsection{Friedman data} \label{sec:fried} <>= library(tgp) ##options(width=65) seed <- 0; set.seed(seed) @ This Friedman data set is the first one of a suite that was used to illustrate MARS (Multivariate Adaptive Regression Splines) \cite{freid:1991}. There are 10 covariates in the data ($\mb{x} = \{x_1,x_2,\dots,x_{10}\}$). The function that describes the responses ($Z$), observed with standard Normal noise, has mean \begin{equation} E(Z|\mb{x}) = \mu = 10 \sin(\pi x_1 x_2) + 20(x_3 - 0.5)^2 + 10x_4 + 5 x_5, \label{eq:f1} \end{equation} but depends only on $\{x_1,\dots,x_5\}$, thus combining nonlinear, linear, and irrelevant effects. Comparisons are made on this data to results provided for several other models in recent literature. Chipman et al.~\cite{chip:geor:mccu:2002} used this data to compare their treed LM algorithm to four other methods of varying parameterization: linear regression, greedy tree, MARS, and neural networks. The statistic they use for comparison is root mean-square error (RMSE) \begin{align*} \mbox{MSE} &= \textstyle \sum_{i=1}^n (\mu_i - \hat{z}_i)^2/n & \mbox{RMSE} &= \sqrt{\mbox{MSE}} \end{align*} where $\hat{z}_i$ is the model--predicted response for input $\mb{x}_i$. The $\mb{x}$'s are randomly distributed on the unit interval. Input data, responses, and predictive locations of size $N=200$ and $N'=1000$, respectively, can be obtained by a function included in the {\tt tgp} package. <<>>= f <- friedman.1.data(200) ff <- friedman.1.data(1000) X <- f[,1:10]; Z <- f$Y XX <- ff[,1:10] @ This example compares Bayesian treed LMs with Bayesian GP LLM (not treed), following the RMSE experiments of Chipman et al. It helps to scale the responses so that they have a mean of zero and a range of one. First, fit the Bayesian treed LM, and obtain the RMSE. <<>>= fr.btlm <- btlm(X=X, Z=Z, XX=XX, tree=c(0.95,2), pred.n=FALSE, verb=0) fr.btlm.mse <- sqrt(mean((fr.btlm$ZZ.mean - ff$Ytrue)^2)) fr.btlm.mse @ Next, fit the GP LLM, and obtain its RMSE. <<>>= fr.bgpllm <- bgpllm(X=X, Z=Z, XX=XX, pred.n=FALSE, verb=0) fr.bgpllm.mse <- sqrt(mean((fr.bgpllm$ZZ.mean - ff$Ytrue)^2)) fr.bgpllm.mse @ So, the GP LLM is \Sexpr{signif(fr.btlm.mse/fr.bgpllm.mse,4)} times better than Bayesian treed LM on this data, in terms of RMSE (in terms of MSE the GP LLM is \Sexpr{signif(sqrt(fr.btlm.mse)/sqrt(fr.bgpllm.mse),4)} times better). Parameter traces need to be gathered in order to judge the ability of the GP LLM model to identify linear and irrelevant effects. <<>>= XX1 <- matrix(rep(0,10), nrow=1) fr.bgpllm.tr <- bgpllm(X=X, Z=Z, XX=XX1, pred.n=FALSE, trace=TRUE, m0r1=FALSE, verb=0) @ Here, \verb!m0r1 = FALSE! has been specified instead so that the $\bm{\beta}$ estimates provided below will be on the original scale.\footnote{The default setting of {\tt m0r1 = TRUE} causes the {\tt Z}--values to undergo pre-processing so that they have a mean of zero and a range of one. The default prior specification has been tuned so as to work well this range.} A summary of the parameter traces show that the Markov chain had the following (average) configuration for the booleans. <<>>= trace <- fr.bgpllm.tr$trace$XX[[1]] apply(trace[,27:36], 2, mean) @ Therefore the GP LLM model correctly identified that only the first three input variables interact only linearly with the response. This agrees with dimension--wise estimate of the total area of the input domain under the LLM (out of a total of 10 input variables). <<>>= mean(fr.bgpllm.tr$trace$linarea$ba) @ A similar summary of the parameter traces for $\bm{\beta}$ shows that the GP LLM correctly identified the linear regression coefficients associated with the fourth and fifth input covariates (from (\ref{eq:f1})) <<>>= summary(trace[,9:10]) @ and that the rest are much closer to zero. <<>>= apply(trace[,11:15], 2, mean) @ tgp/vignettes/it.iRnw0000644000175100001440000010405112506600653014353 0ustar hornikusers\section{Importance tempering} \label{sec:it} <>= library(tgp) library(maptree) #options(width=65) seed <- 0; set.seed(seed) @ It is well--known that MCMC inference in Bayesian treed methods suffers from poor mixing. For example, Chipman et al.~\cite{chip:geor:mccu:1998,chip:geor:mccu:2002} recommend periodically restarting the MCMC to avoid chains becoming stuck in local modes of the posterior distribution (particularly in tree space). The treed GP models are or no exception, although it is worth remarking that using flexible GP models at the leaves of the tree typically results in shallower trees, and thus less pathalogical mixing in tree space. Version 1.x provided some crude tools to help mitigate the effects of poor mixing in tree space. For example, the {\tt R} argument to the {\tt b*} functions facilitates the restarts suggested by Chipman et al. A modern Monte Carlo technique for dealing with poor mixing in Markov chain methods is to employ {\em tempering} to flatten the peaks and raise the troughs in the posterior distribution so that movements between modes is more fluid. One such method, called {\em simulated tempering} (ST) \cite{geyer:1995}, is essentially the MCMC analogue of the popular simulated annealing algorithm for optimization. The ST algorithm helps obtain samples from a multimodal density $\pi(\theta)$ where standard methods, such as Metropolis--Hastings (MH) \cite{met:1953,hast:1970} and Gibbs Sampling (GS) \cite{geman:1984}, fail. As will be shown in our examples, ST can guard against becoming stuck in local modes of the {\tt tgp} posterior by encouraging better mixing {\em between modes} via in increase in the acceptance rate of tree modification proposals, particularly {\em prunes}. However, as we will see, ST suffers from inefficiency because it discards the lions share of the samples it collects. The discarded samples can be recycled if they are given appropriate importance sampling (IS) \cite{liu:2001} weights. These weights, if combined carefully, can be used to construct meta-estimators of expectations under the {\tt tgp} posterior that have much lower variance compared to ST alone. This combined application of ST and IT is dubbed {\em importance tempering} \cite{gra:samw:king:2009}. \subsection{Simulated Tempering and related methods} \label{sec:st} ST is an application of the MH algorithm on the product space of parameters and inverse temperatures $k\in [0,1]$. That is, ST uses MH to sample from the joint chain $\pi(\theta,k) \propto \pi(\theta)^k p(k)$. The inverse temperature is allowed to take on a discrete set of values $k \in \{k_1,\dots,k_m: k_1 = 1, \; k_i > k_{i+1} \geq 0\}$, called the {\em temperature ladder}. Typically, ST calls for sampling $(\theta,k)^{(t+1)}$ by first updating $\theta^{(t+1)}$ conditional on $k^{(t)}$ and (possibly) on $\theta^{(t)}$, using MH or GS. Then, for a proposed $k' \sim q(k^{(t)} \rightarrow k')$, usually giving equal probability to the nearest inverse temperatures greater and less than $k^{(t)}$, an acceptance ratio is calculated: \[ A^{(t+1)} = \frac{\pi(\theta^{(t+1)})^{k'} p(k') q(k' \rightarrow k^{(t)})}{\pi(\theta^{(t+1)})^{k^{(t)}} p(k^{(t)}) q(k^{(t)}\rightarrow k')}. \] Finally, $k^{(t+1)}$ is determined according to the MH accept/reject rule: set $k^{(t+1)} = k'$ with probability $\alpha^{(t+1)} = \min\{1,A^{(t+1)}\}$, or $k^{(t+1)} = k^{(t)}$ otherwise. Standard theory for MH and GS gives that samples from the marginals $\pi_{k_i}$ can be obtained by collecting samples $\theta^{(t)}$ where $k^{(t)} = k_i$. Samples from $\pi(\theta)$ are obtained when $k^{(t)} = 1$. The success of ST depends crucially on the ability of the Markov chain frequently to: (a) visit high temperatures (low $k$) where the probability of escaping local modes is increased; (b) visit $k=1$ to obtain samples from $\pi$. The algorithm can be tuned by: (i.)~adjusting the number and location of the rungs of the temperature ladder; or (ii.)~setting the pseudo-prior $p(k)$ for the inverse temperature. Geyer \& Thompson \cite{geyer:1995} give ways of adjusting the spacing of the rungs of the ladder so that the ST algorithm achieves between--temperature acceptance rates of 20--40\%. More recently, authors have preferred to rely on defaults, e.g., \begin{equation} \;\;\;\;\; k_i = \left\{ \begin{array}{cl} (1+\Delta_k)^{1-i} & \mbox{geometric spacing}\\ \{1+\Delta_k (i-1)\}^{-1} & \mbox{harmonic spacing} \end{array} \right. \;\;\;\;\ i=1,\dots,m. \label{eq:ladder} \end{equation} Motivation for such default spacings is outlined by Liu \cite{liu:2001}. Geometric spacing, or uniform spacing of $\log(k_i)$, is also advocated by Neal \cite{neal:1996,neal:2001} to encourage the Markov chain to rapidly traverse the breadth of the temperature ladder. Harmonic spacing is more often used by a related method called Metropolis coupled Markov chain Monte Carlo (MC$^3$) \cite{geyer:1991}. Both defaults are implemented in the {\tt tgp} package, through the provided {\tt default.itemps} function. A new ``sigmoidal'' option is also implemented, as discussed below. The rate parameter $\Delta_k>0$ can be problem specific. Rather than work with $\Delta_k$ the {\tt default.itemps} function allows the ladder to be specified via $m$ and the hottest temperature $k_m$, thus fixing $\Delta_k$ implicitly. I.e., for the geometric ladder $\Delta_k = (k_m)^{1/(1-m)}-1$, and for the harmonic ladder $\Delta_k = \frac{(k_m)^{-1}-1}{m-1}$. A sigmoidal ladder can provide a higher concentration of temperatures near $k=1$ without sacrificing the other nice properties of the geometric and harmonic ladders. It is specified by first situating $m$ indices $j_i\in \mathbb{R}$ so that $k_1 = k(j_1) = 1$ and $k_m = k(j_m) = k_{\mbox{\tiny m}}$ under \[ k(j_i) = 1.01 - \frac{1}{1+e^{j_i}}. \] The remaining $j_i, i=2,\dots,(m-1)$ are spaced evenly between $j_1$ and $j_m$ to fill out the ladder $k_i = k(j_i), i=1,\dots,(m-1)$. By way of comparison, consider generating the three different types of ladder with identical minimum inverse temperature $k_{\mbox{\tiny m}} = 0.1$, the default setting in {\tt tgp}. <<>>= geo <- default.itemps(type="geometric") har <- default.itemps(type="harmonic") sig <- default.itemps(type="sigmoidal") @ The plots in Figure \ref{f:itemps} show the resulting inverse temperature ladders, and their logarithms. \begin{figure}[ht!] <>= par(mfrow=c(2,1)) all <- cbind(geo$k, har$k, sig$k) matplot(all, pch=21:23, main="inv-temp ladders", xlab="indx", ylab="itemp") legend("topright", pch=21:23, c("geometric","harmonic","sigmoidal"), col=1:3) matplot(log(all), pch=21:23, main="log(inv-temp) ladders", xlab="indx", ylab="itemp") @ <>= graphics.off() @ \centering \includegraphics[height=5.9in,width=4.5in,trim=0 20 0 20]{tgp2-it-itemps} \caption{Three different inverse temperature ladders, each with $m=40$ temperatures starting at $k_1=1$ and ending at $k_m=0.1$} \label{f:itemps} \end{figure} Observe how, relative to the geometric ladder, the harmonic ladder has a higher concentration of inverse temperatures near zero, whereas the sigmoidal ladder has a higher concentration near one. Once a suitable ladder has been chosen, the {\tt tgp} package implementation of ST follows the suggestions of Geyer \& Thompson \cite{geyer:1995} in setting the pseudo--prior, starting from a uniform $p_0$. First, $p_0$ is adjusted by {\em stochastic approximation}: add $c_0/[m(t+n_0)]$ to $\log p_0(k)$ for each $k_i \ne k^{(t)}$ and subtract $c_0/(t+n_0)$ from $\log p_0(k^{(t)})$ over $t=1,\dots,B$ {\em burn--in} MCMC rounds sampling from the joint posterior of $(\theta, k)$. Then, $p_0$ is normalized to obtain $p_1$. Before subsequent runs, specified via an {\tt R >= 2} argument, {\em occupation numbers} $o(k_i) = \sum_{t=1}^B 1_{\{k^{(t)} = k_i\}}$, are used update $p(k_i) \propto p_1(k_i)/o(k_i)$. Note that, in this setting, the {\tt R} argument is used to update the pseudo--prior only, not to restart the Markov chain. \subsection{Importance sampling from tempered distributions} \label{sec:temp} ST provides us with $\{(\theta^{(t)},k^{(t)}): t = 1,\ldots,T\}$, where $\theta^{(t)}$ is an observation from $\pi_{k^{(t)}}$. It is convenient to write $\mathcal{T}_i = \{t: k^{(t)} = k_i\}$ for the index set of observations at the $i^{\mbox{\tiny th}}$ temperature, and let $T_i = |\mathcal{T}_i|$. Let the vector of observations at the $i^{\mbox{\tiny th}}$ temperature collect in $\bm{\theta}_i = (\theta_{i1},\dots,\theta_{iT_i})$, so that $\{\theta_{ij}\}_{j=1}^{T_i}\sim \pi_{k_i}$. Each vector $\bm{\theta}_i$ can be used to construct an IS estimator of $E_{\pi}\{h(\theta)\}$ by setting \[ \hat{h}_i = \frac{\sum_{j=1}^{T_i} w_i(\theta_{ij}) h(\theta_{ij})} {\sum_{j=1}^{T_i} w_i(\theta_{ij})} \equiv \frac{\sum_{j=1}^{T_i} w_{ij}h(\theta_{ij})}{W_i}, \] say. That is, rather than obtain one estimator from ST (at the cold temperature), we can obtain $m$ estimators (one at each temperature) via IS. The efficiency of each estimator, $i=1,\dots,m$ can be measured through its variance, but unfortunately this can be difficult to calculate in general. As a result, the notion of {\em effective sample size} \cite{liu:2001} (ESS) plays an important role in the study of IS estimators. Denote the vector of IS weights at the $i^{\mbox{\tiny th}}$ temperature as $\mathbf{w}_i = \mathbf{w}_i(\bm{\theta}_i) = (w_i(\theta_{i1}),\ldots,w_i(\theta_{iT_i}))$, where $w_i(\theta) = \pi(\theta)/\pi_{k_i}(\theta)$. The ESS of $\hat{h}_i$ is defined by \begin{equation} \mathrm{ESS}(\mb{w}_i) = \frac{T}{1 + \mathrm{cv^2}(\mathbf{w}_i)}, \label{eq:essw} \end{equation} where $\mathrm{cv}(\mathbf{w}_i)$ is the \emph{coefficient of variation} of the weights (in the $i^{\mbox{\tiny th}}$ temperature), given by \begin{align*} \mathrm{cv^2}(\mathbf{w}_i) &= \frac{\sum_{t=1}^T(w(\theta^{(t)}) - \bar{w})^2}{(T-1) \bar{w}^2}, &\mbox{where} && \bar{w} &= T^{-1} \sum_{t=1}^T w(\theta^{(t)}). \end{align*} In {\sf R}: <<>>= ESS <- function(w) { mw <- mean(w) cv2 <- sum((w-mw)^2)/((length(w)-1)*mw^2) ess <- length(w)/(1+cv2) return(ess) } @ This should not be confused with the concept of \emph{effective sample size due to autocorrelation} \cite{kass:1998} (due to serially correlated samples coming from a Markov chain as in MCMC) as implemented by the {\tt effectiveSize} function in the {\tt coda} package \cite{coda:R} for {\sf R}. Before attempting to combine $m$ IS estimators it is fruitful backtrack briefly to obtain some perspective on the topic of applying IS with a {\em single} tempered proposal distribution. Jennison \cite{jennison:1993} put this idea forward more than a decade ago, although the question of how to choose the best temperature was neither posed or resolved. It is clear that larger $k$ leads to lower variance estimators (and larger ESS), but at the expense of poorer mixing in the Markov chain. It can be shown that the optimal inverse temperature $k^*$ for IS, in the sense of constructing a minimum variance estimator, may be significantly lower than one \cite{gra:samw:king:2009}. However, the variance of such an estimator will indeed become unbounded as $k\rightarrow 0$, just as ESS~$\rightarrow 0$. Needless to say, the choice of how to best pick the best temperatures (for ST or IS) is still an open problem. But in the context of the family of tempered distributions used by ST for mixing considerations, this means that the discarded samples obtained when $k^{(t)} < 1$ may actually lead to more efficient estimators than the ones saved from the cold distribution. So ST is wastefull indeed. However, when combining IS estimators from the multiple temperatures used in ST, the deleterious effect of the high variance ones obtained at high temperature must be mitigated. The possible strategies involved in developing such a meta-estimator comprise the {\em importance tempering} (IT) family of methods. The idea is that small ESS will indicate high variance IS estimators which should be relegated to having only a small influence on the overall estimator. \subsection{An optimal way to combine IS estimators} \label{sec:lambdas} It is natural to consider an overall meta-estimator of $E_{\pi}\{h(\theta)\}$ defined by a convex combination: \begin{align} \label{eq:hhatlambda} \hat{h}_{\lambda} &= \sum_{i=1}^m \lambda_i \hat{h}_i,& \mbox{where} && 0 \leq \lambda_i \leq \sum_{i=1}^m \lambda_i = 1. \end{align} Unfortunately, if $\lambda_1,\dots,\lambda_m$ are not chosen carefully, $\mbox{Var}(\hat{h}_\lambda)$, can be nearly as large as the largest $\mbox{Var}(\hat{h}_i)$ \cite{owen:2000}, due to the considerations alluded to in Section \ref{sec:temp}. Notice that ST is recovered as a special case when $\lambda_1=1$ and $\lambda_2,\dots,\lambda_m = 0$. It may be tempting to choose $\lambda_i = W_i/W$, where $W = \sum_{i=1}^m W_i$. The resulting estimator is equivalent to \begin{align} \label{Eq:hath} \hat{h} &= W^{-1} \sum_{t=1}^T w(\theta^{(t)},k^{(t)})h(\theta^{(t)}), & \mbox{where} && W = \sum_{t=1}^T w(\theta^{(t)},k^{(t)}), \end{align} and $w(\theta,k) = \pi(\theta)/\pi(\theta)^k = \pi(\theta)^{1-k}$. It can lead to a very poor estimator, even compared to ST, as will be demonstrated empirically in the examples to follow shortly. Observe that we can equivalently write \begin{align} \hat{h}_{\lambda} &= \sum_{i=1}^m \sum_{j=1}^{T_i} w_{ij}^{\lambda}h(\theta_{ij}), && \mbox{where} & w_{ij}^{\lambda} &= \lambda_iw_{ij}/W_i. \label{eq:wlambda} \end{align} Let $\mathbf{w}^{\lambda} = (w_{11}^\lambda,\ldots,w_{1T_1}^\lambda,w_{21}^\lambda,\ldots,w_{2T_2}^\lambda, \ldots,w_{m1}^\lambda,\ldots,w_{mT_m}^\lambda)$. Attempting to choose $\lambda_1,\dots,\lambda_m$ to minimize $\mbox{Var}(\hat{h}_\lambda)$ directly can be difficult. Moreover, for the applications that we have in mind, it is important that our estimator can be constructed without knowledge of the normalizing constants of $\pi_{k_1},\ldots,\pi_{k_m}$, and without evaluating the MH transition kernels $\mathcal{K}_{\pi_{k_i}}(\cdot,\cdot)$. It is for this reason that methods like the \emph{balance heuristic} \cite{veach:1995}, MCV \cite{owen:2000}, or population Monte Carlo (PMC) \cite{douc:etal:2007} cannot be applied. Instead, we seek maximize the effective sample size of $\hat{h}_\lambda$ in (\ref{eq:hhatlambda}), and look for an $O(T)$ operation to determine the optimal $\lambda^*$. %\begin{thm} %\label{thm:lambdastar} Among estimators of the form~(\ref{eq:hhatlambda}), it can be shown \cite{gra:samw:king:2009} that $\mathrm{ESS}(\mathbf{w}^{\lambda})$ is maximized by $\lambda = \lambda^*$, where, for $i=1,\ldots,m$, \begin{align*} \lambda_i^* &= \frac{\ell_i}{\sum_{i=1}^m \ell_i}, & \mbox{and} && \ell_i &= \frac{W_i^2}{\sum_{j=1}^{T_i} w_{ij}^2}. \end{align*} The efficiency of each IS estimator $\hat{h}_i$ can be measured through $\mathrm{ESS}(\mathbf{w}_i)$. Intuitively, we hope that with a good choice of $\lambda$, the ESS (\ref{eq:essw}) of $\hat{h}_{\lambda}$, would be close to the sum over $i$ of the effective sample sizes each of $\hat{h}_i$. This is indeed the case for $\hat{h}_{\lambda^*}$, because it can be shown \cite{gra:samw:king:2009} that \[ \mathrm{ESS}(\mathbf{w}^{\lambda^*}) \geq \sum_{i=1}^m \mathrm{ESS}(\mathbf{w}_i) - \frac{1}{4} - \frac{1}{T}. \] In practice we have found that this bound is conservative and that in fact $\mathrm{ESS}(\mathbf{w}^{\lambda^*}) \geq \sum_{i=1}^m \mathrm{ESS}(\mathbf{w}_i)$, as will be shown empirically in the examples that follow. Thus our optimally--combined IS estimator has a highly desirable and intuitive property in terms of its effective sample size: that the whole is greater than the sum of its parts. $\mathrm{ESS}(\mathbf{w}^{\lambda^*})$ depends on $\mathrm{ESS}(\mathbf{w}_i)$ which in turn depend on the $k_i$. Smaller $k_i$ will lead to better mixing in the Markov chain, but lower $\mathrm{ESS}(\mathbf{w}_i)$. Therefore, we can expect that the geometric and sigmoidal ladders will fare better than the harmonic ones, so long as the desired improvements in mixing are achieved. In the examples to follow, we shall see that the sigmoidal ladder does indeed leader to higher $\mathrm{ESS}(\mathbf{w}^{\lambda^*})$. \subsection{Examples} \label{sec:examples} Here the IT method is shown in action for {\tt tgp} models. IT is controlled in {\tt b*} functions via the {\tt itemps} argument: a {\tt data.frame} coinciding with the output of the {\tt default.itemps} function. The {\tt lambda} argument to {\tt default.itemps} can be used to base posterior predictive inference the other IT heuristics: ST and the na\"ive approach (\ref{Eq:hath}). Whenever the argument {\tt m = 1} is used with {\tt k.min != 1} the resulting estimator is constructed via tempered importance sampling at the single inverse temperature {\tt k.min}, in the style of Jennison~\cite{jennison:1993} as outlined in Section \ref{sec:temp}. The parameters $c_0$ and $n_0$ for stochastic approximation of the pseudo--prior can be specified as a 2--vector {\tt c0n0} argument to {\tt default.itemps}. In the examples which follow we simply use the default configuration of the IT method, adjusting only the minimum inverse temperature via the {\tt k.min} argument. Before delving into more involved examples, we illustrate the stages involved in a small run of importance tempering (IT) on the exponential data from Section 3.3 of \cite{gramacy:2007}. The data can be obtained as: <<>>= exp2d.data<-exp2d.rand() X<-exp2d.data$X Z<-exp2d.data$Z @ Now, consider applying IT to the Bayesian treed LM with a small geometric ladder. A warning will be given if the default setting of \verb!bprior="bflat"! is used, as this (numerically) improper prior can lead to improper posterior inference at high temperatures. <<>>= its <- default.itemps(m=10) exp.btlm <- btlm(X=X,Z=Z, bprior="b0", R=2, itemps=its, pred.n=FALSE, BTE=c(1000,3000,2)) @ Notice how the MCMC inference procedure starts with $B+T=\Sexpr{exp.btlm$BTE[1] + exp.btlm$BTE[2]}$ rounds of stochastic approximation (initial adjustment of the pseudo--prior) in place of typical (default) the $B=\Sexpr{exp.btlm$BTE[1]}$ burn--in rounds. Then, the first round of sampling from the posterior commences, over $T=\Sexpr{exp.btlm$BTE[2]-exp.btlm$BTE[1]}$ rounds, during which the observation counts in each temperature are tallied. The progress meter shows the current temperature the chain is in, say {\tt k=0.629961}, after each of 1000 sampling rounds. The first repeat starts with a pseudo--prior that has been adjusted by the observation counts, which continue to be accumulated throughout the entire procedure (i.e., they are never reset). Any subsequent repeats begin after a similar (re-)adjustment. Before finishing, the routine summarizes the sample size and effective sample sizes in each rung of the temperature ladder. The number of samples is given by {\tt len}, and the ESS by {\tt ess}. These quantities can also be recovered via {\tt traces}, as shown later. The ESS of the optimal combined IT sample is the last quantity printed. This, along with the ESS and total numbers of samples in each temperature, can also be obtained via the {\tt tgp}-class output object. <<>>= exp.btlm$ess @ \subsubsection{Motorcycle accident data} \label{sec:moto} Recall the motorcycle accident data of Section 3.4 of the first {\tt tgp} vignette \cite{gramacy:2007}. Consider using IT to sample from the posterior distribution of the treed GP LLM model using the geometric temperature ladder. <<>>= library(MASS) moto.it <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), bprior="b0", R=3, itemps=geo, trace=TRUE, pred.n=FALSE, verb=0) @ Out of a total of $\Sexpr{moto.it$R*moto.it$BTE[2]/moto.it$BTE[3]}$ samples from the joint chain, the resulting (optimally combined) ESS was: <<>>= moto.it$ess$combined @ Alternatively, $\mb{w}^{\lambda^*}$ can be extracted from the traces, and used to make the ESS calculation directly. <<>>= p <- moto.it$trace$post ESS(p$wlambda) @ The unadjusted weights $\mb{w}$ are also available from {\tt trace}. We can see that the na\"{i}ve choice of $\lambda_i = W_i/W$, leading to the estimator in (\ref{Eq:hath}), has a clearly inferior effective sample size. <<>>= ESS(p$w) @ To see the benefit of IT over ST we can simply count the number of samples obtained when $k^{(t)} = 1$. This can be accomplished in several ways: either via the traces or through the output object. <<>>= as.numeric(c(sum(p$itemp == 1), moto.it$ess$each[1,2:3])) @ That is, (optimal) IT gives effectively $\Sexpr{signif(moto.it$ess$combined/sum(p$itemp==1), 3)}$ times more samples. The na\"{i}ve combination, leading to the estimator in (\ref{Eq:hath}), yields an estimator with an effective sample size that is $\Sexpr{round(100*ESS(p$w)/sum(p$itemp==1))}$\% of the number of samples obtained under ST. Now, we should like to compare to the MCMC samples obtained under the same model, without IT. <<>>= moto.reg <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), R=3, bprior="b0", trace=TRUE, pred.n=FALSE, verb=0) @ The easiest comparison to make is to look at the heights explored under the three chains: the regular one, the chain of heights visited at all temperatures (combined), and those obtained after applying IT via re-weighting under the optimal combination $\lambda^*$. <<>>= L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(moto.reg$trace$post$height, p$height, hw)) @ \begin{figure}[ht!] <>= barplot(b, beside=TRUE, col=1:3, xlab="tree height", ylab="counts", main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-moto-height} \caption{Barplots indicating the counts of the number of times the Markov chains (for regular MCMC, combining all temperatures in the inverse temperature ladder, and those re-weighted via IT) were in trees of various heights for the motorcycle data.} \label{f:moto:it:heights} \end{figure} Figure \ref{f:moto:it:heights} shows barplots indicating the count of the number of times the Markov chains were in trees of various heights after burn--in. Notice how the tempered chain (denoted ``All Temps'' in the figure) frequently visits trees of height one, whereas the non--tempered chain (denoted ``reg MCMC'') never does. The result is that the non--tempered chain underestimates the probability of height two trees and produces a corresponding overestimate of height four trees---which are clearly not supported by the data---even visiting trees of height five. The IT estimator appropriately down--weights height one trees and provides correspondingly more realistic estimates of the probability of height two and four trees. Whenever introducing another parameter into the model, like the inverse temperature $k$, it is important to check that the marginal posterior chain for that parameter is mixing well. For ST it is crucial that the chain makes rapid excursions between the cold temperature, the hottest temperatures, and visits each temperature roughly the same number of times. \begin{figure}[ht!] <>= plot(log(moto.it$trace$post$itemp), type="l", ylab="log(k)", xlab="samples", main="trace of log(k)") @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-moto-ktrace} \caption{A trace of the MCMC samples from the marginal posterior distribution of the inverse temperature parameter, $k$, in the motorcycle experiment} \label{f:ktrace} \end{figure} Figure \ref{f:ktrace} shows a trace of the posterior samples for $k$ in the motorcycle experiment. Arguably, the mixing in $k$--space leaves something to be desired. Since it can be very difficult to tune the pseudo--prior and MH proposal mechanism to get good mixing in $k$--space, it is fortunate that the IT methodology does not rely on the same mixing properties as ST does. Since samples can be obtained from the posterior distribution of the parameters of interest by re-weighting samples obtained when $k < 1$ it is only important that the chain frequently visit low temperatures to obtain good sampling, and high temperatures to obtain good mixing. The actual time spent in specific temperatures, i.e., $k=1$ is less important. %%ylim <- c(0, 1.25*max(c(b[,1], moto.it$itemps$counts))) %, ylim=ylim) \begin{figure}[ht!] <>= b <- itemps.barplot(moto.it, plot.it=FALSE) barplot(t(cbind(moto.it$itemps$counts, b)), col=1:2, beside=TRUE, ylab="counts", xlab="itemps", main="inv-temp observation counts") legend("topleft", c("observation counts", "posterior samples"), fill=1:2) @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-moto-khist} \caption{Comparing (thinned) samples from the posterior distribution for the inverse temperature parameter, $k$, (posterior samples), to the observation counts used to update the pseudo--prior, in the motorcycle experiment} \label{f:khist} \end{figure} Figure \ref{f:khist} shows the histogram of the inverse temperatures visited in the Markov chain for the motorcycle experiment. Also plotted is a histogram of the {\em observation counts} in each temperature. The two histograms should have similar shape but different totals. Observation counts are tallied during every MCMC sample after burn--in, whereas the posterior samples of $k$ are thinned (at a rate specified in {\tt BTE[3]}). When the default {\tt trace=FALSE} argument is used only the observation counts will be available in the {\tt tgp}--class object, and these can be used as a surrogate for a trace of $k$. The compromise IT approach obtained using the sigmoidal ladder can yield an increase in ESS. <<>>= moto.it.sig <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,52000,10), R=3, bprior="b0", krige=FALSE, itemps=sig, verb=0) @ Compare the resulting ESS to the one given for the geometric ladder above. <<>>= moto.it.sig$ess$combined @ \begin{figure}[ht!] <>= plot(moto.it.sig) @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-moto-pred} \caption{Posterior predictive surface for the motorcycle data, with 90\% quantile errorbars, obtained under IT with the sigmoidal ladder.} \label{f:moto:pred} \end{figure} Plots of the resulting predictive surface is shown in Figure \ref{f:moto:pred} for comparison with those in Section 1.1 of the first {\tt tgp} vignette \cite{gramacy:2007}. In particular, observe that the transition from the middle region to the right one is much less stark in this tempered version than than in the original---which very likely spent a disproportionate amount of time stuck in a posterior mode with trees of depth three or greater. \subsubsection{Synthetic 2--d Exponential Data} \label{sec:exp} Recall the synthetic 2--d exponential data of Section 3.4 of the tgp vignette \cite{gramacy:2007}, where the true response is given by \[ z(\mb{x}) = x_1 \exp(-x_1^2 - x_2^2). \] Here, we will take $\mb{x} \in [-6,6]\times [-6,6]$ with a $D$--optimal design <<>>= Xcand <- lhs(10000, rbind(c(-6,6),c(-6,6))) X <- dopt.gp(400, X=NULL, Xcand)$XX Z <- exp2d.Z(X)$Z @ Consider a treed GP LLM model fit to this data using the standard MCMC. <<>>= exp.reg <- btgpllm(X=X, Z=Z, BTE=c(2000,52000,10), bprior="b0", trace=TRUE, krige=FALSE, R=10, verb=0) @ \begin{figure}[ht!] <>= plot(exp.reg) @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-exp-pred} \caption{Posterior predictive surface for the 2--d exponential data: mean surface {\em (left)} and 90\% quantile difference {\em (right)}} \label{f:exp:pred} \end{figure} Figure \ref{f:exp:pred} shows the resulting posterior predictive surface. The maximum {\em a' posteriori} (MAP) tree is drawn over the error surface in the {\em right--hand} plot. The height of this tree can be obtained from the {\tt tgp}-class object. <<>>= h <- exp.reg$post$height[which.max(exp.reg$posts$lpost)] h @ It is easy to see that many fewer partitions are actually necessary to separate the interesting, central, region from the surrounding flat region. \begin{figure}[ht!] <>= tgp.trees(exp.reg, "map") @ <>= graphics.off() @ \centering \includegraphics[trim=0 100 0 25]{tgp2-it-exp-mapt} \caption{Diagrammatic depiction of the maximum {\em a' posteriori} (MAP) tree for the 2--d exponential data under standard MCMC sampling } \label{f:exp:mapt} \end{figure} Figure \ref{f:exp:mapt} shows a diagrammatic representation of the MAP tree. Given the apparent over--partitioning in this height \Sexpr{h} tree it would be surprising to find much posterior support for trees of greater height. One might indeed suspect that there are trees with fewer partitions which would have higher posterior probability, and thus guess that the Markov chain for the trees plotted in these figures possibly became stuck in a local mode of tree space while on an excursion into deeper trees. Now consider using IT. It will be important in this case to have a $k_{\mbox{\tiny m}}$ small enough to ensure that the tree occasionally prunes back to the root. We shall therefore use a smaller $k_{\mbox{\tiny m}}$. % with an extra 10 rungs. Generally speaking, some pilot tuning may be necessary to choose an appropriate $k_{\mbox{\tiny m}}$ and number of rungs $m$, although the defaults should give adequate performance in most cases. <<>>= its <- default.itemps(k.min=0.02) exp.it <- btgpllm(X=X, Z=Z, BTE=c(2000,52000,10), bprior="b0", trace=TRUE, krige=FALSE, itemps=its, R=10, verb=0) @ As expected, the tempered chain moves more rapidly throughout tree space by accepting more tree proposals. The acceptance rates of tree operations can be accessed from the {\tt tgp}--class object. <<>>= exp.it$gpcs exp.reg$gpcs @ The increased rate of {\em prune} operations explains how the tempered distributions helped the chain escape the local modes of deep trees. We can quickly compare the effective sample sizes of the three possible estimators: ST, na\"{i}ve IT, and optimal IT. <<>>= p <- exp.it$trace$post data.frame(ST=sum(p$itemp == 1), nIT=ESS(p$w), oIT=exp.it$ess$combined) @ Due to the thinning in the Markov chain ({\tt BTE[3] = 10}) and the traversal between $m=10$ temperatures in the ladder, we can be reasonably certain that the \Sexpr{round(exp.it$ess$combined)} samples obtained via IT from the total of \Sexpr{round(exp.it$R*(exp.it$BTE[2]-exp.it$BTE[1])/exp.it$BTE[3])} samples obtained from the posterior are far less correlated than the ones obtained via standard MCMC. As with the motorcycle data, we can compare the tree heights visited by the two chains. <<>>= L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(exp.reg$trace$post$height, p$height, hw)) @ \begin{figure}[ht!] <>= barplot(b, beside=TRUE, col=1:3, xlab="tree height", ylab="counts", main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-exp-height} \caption{Barplots indicating the counts of the number of times the Markov chains (for regular MCMC, combining all temperatures in the inverse temperature ladder, and those re-weighted via IT) were in trees of various heights for the 2--d exponential data.} \label{f:exp:it:heights} \end{figure} Figure \ref{f:exp:it:heights} shows a barplot of {\tt b}, which illustrates that the tempered chain frequently visited shallow trees. IT with the optimal weights shows that the standard MCMC chain missed many trees of height three and four with considerable posterior support. \begin{figure}[ht!] <>= ylim <- range(p$height, exp.reg$trace$post$height) plot(p$height, type="l", main="trace of tree heights", xlab="t", ylab="height", ylim=ylim) lines(exp.reg$trace$post$height, col=2) legend("topright", c("tempered", "reg MCMC"), lty=c(1,1), col=1:2) @ <>= graphics.off() @ \centering \includegraphics[trim=0 25 0 25]{tgp2-it-exp-trace-height} \caption{Traces of the tree heights obtained under the two Markov chains (for regular MCMC, combining all temperatures in the inverse temperature ladder) on the 2--d exponential data.} \label{f:exp:trace:height} \end{figure} To more directly compare the mixing in tree space between the ST and tempered chains, consider the trace plots of the heights of the trees explored by the chains shown in Figure \ref{f:exp:trace:height}. Despite being restarted \Sexpr{exp.reg$R} times, the regular MCMC chain (almost) never visits trees of height less than five after burn--in and instead makes rather lengthy excursions into deeper trees, exploring a local mode in the posterior. In contrast, the tempered chain frequently prunes back to the tree root, and consequently discovers posterior modes in tree heights three and four. \begin{figure}[ht!] <>= plot(exp.it) @ \vspace{-0.7cm} <>= tgp.trees(exp.it, "map") @ <>= graphics.off() @ \centering \includegraphics[trim=0 15 0 0]{tgp2-it-expit-pred} \includegraphics[trim=0 100 0 0]{tgp2-it-expit-trees} \caption{2--d exponential data fit with IT. {\em Top:} Posterior predictive mean surface for the 2d--exponential, with the MAP tree overlayed. {\em Bottom:} diagrammatic representation of the MAP tree. } \label{f:exp-it:pred} \end{figure} To conclude, a plot of the posterior predictive surface is given in Figure \ref{f:exp-it:pred}, where the MAP tree is shown both graphically and diagrammatically. tgp/MD50000644000175100001440000001611612655611525011407 0ustar hornikusers42820f078edc8d274c37293b19329f8a *ChangeLog c84e3c5e80a5e75e0b16e59e6e9ecfae *DESCRIPTION b84738697ab332f3042e16de92e9420e *INDEX cbc0f15c9caed6bf5b0a4b51e4d17205 *NAMESPACE 2b25f8615fc58fa288ef0d0b3d7ef3e0 *R/btgp.R d62cc5b2b7203f4b94647830d1c8cd73 *R/check.matrix.R 3baf3bbc79b7a061fae989fc329d1f47 *R/default.itemps.R 4a035497f663b856b9450bfc7fd9b278 *R/exp2d.R 951ef8c644b0a22d6722564190efd66f *R/friedman.1.data.R 9a3c7f4f872fc8ec3fdff0c10d83bba9 *R/lhs.R cf6f6d40875b697a94b2fb4fd812cd15 *R/mapT.R 41b3d32269dfc34702dbee96fda2795a *R/mean0.range1.R 3e7a3f52c48eb4918fbf96b2a3d38515 *R/mrtgp.R 5c009114b3d0298abb24c92a1fb7cf5b *R/optim.tgp.R db6997134ec5938ca2848d10670acebb *R/plot.tgp.R 1ca650a4e004740dd3286e14653da285 *R/predict.tgp.R aaa1cd4e51a2713a7ae4c97942001d90 *R/print.tgp.R bc0d00e4f6a16fe1b7e2385d52d2ad0b *R/sens.R 6fc8cc5b839031edb48aba5afbdab8e9 *R/tgp.R e87f123e3887aa98a07818faac2858fc *R/tgp.choose.R 4061b57137c57516dfe26198645aff16 *R/tgp.cleanup.R ccfb8b2981d7efe9b53a4d5bd4e0f2b3 *R/tgp.default.params.R 94fc550c0c1d63865ab8f7edca537759 *R/tgp.design.R caa191571a6743193ce0b0d2db86016e *R/tgp.plot.proj.R f930e79e91ae23d196bf2f3e16289d58 *R/tgp.plot.slice.R f47a264bbe0fca8f60e39d893a3f80fc *R/tgp.postprocess.R 21af361fc357c91c43074ad161273590 *R/tgp.read.traces.R 4ee41eb445b6df5730b38da29847249e *R/tgp.trees.R d77f4eb76d59d9f4c85bdee74bce7b5e *README f19695faf7e8dc11b2b581f9b1cb5335 *build/vignette.rds 7ee7a0f1186c476e2c2f55b84537c50a *data/exp2d.rda bb12c5c06151a8a7a542038b628aa1fe *demo/00Index 4f07c99ea7ca7b8153532fa7707438b1 *demo/as.R a09a287c6f46c3deb33537c0d5044adc *demo/cat.R 238011da83b0344a91696feca7529a45 *demo/exp.R f0a1a08b41eeeff848dc11f0a69d5997 *demo/fried.R 04fdf433d57f6a9d5754f475e11b192a *demo/it.R 2410171831030fd180b7fb267d548600 *demo/linear.R 7a7662bc8eddfac5d0fefe4877ed9c74 *demo/moto.R d780d05ff7012a3c105429b4894a8d98 *demo/optim.R 8f73ca69ecea2bcb03c7881e547af214 *demo/pred.R 28f468247ca35ea5e0012e911dc65728 *demo/sens.R 09ccb8e980d6b0cfc892e1e5017f83e4 *demo/sin.R 13399b4390c8ed75a7ac5d912d1bfa63 *demo/traces.R 35f4512b176dce4169fc757ec6f96f3b *inst/CITATION 91beda9427fe03a6643e734dee55b40a *inst/doc/tgp.R df6861a8ac87a1a21cf8eb75078a4a82 *inst/doc/tgp.Rnw 09426c6daae3397f2853b2a07777c4da *inst/doc/tgp.pdf 92ca3a3a5317dead5758e4ceb06427e1 *inst/doc/tgp2.R 05e3c9c0daed01e04b2fc383ccb3620c *inst/doc/tgp2.Rnw 86f8884068caf32a9f4adc450de69ebb *inst/doc/tgp2.pdf 401e368fefb3ff347de07d7e66eee4f0 *man/btgp.Rd 2b412135bdd3a1d42c78476dddaae8a6 *man/default.itemps.Rd 0850e30a4613d7317c32937affb4760d *man/dopt.gp.Rd bf10ced995b84244349f8cde603afe25 *man/exp2d.Rd 3553d1bbc5ae2bd4f76d8b41953c6440 *man/exp2d.Z.Rd 2f7ec9892489dbcee33de4b411f3e5ce *man/exp2d.rand.Rd 07b04590315d9570263ea122341f15e8 *man/friedman.1.data.Rd c9a541e9ede3580ba1ea084f0dbdc1c6 *man/interp.loess.Rd 744a5447dcf54d5e4aa52e57dc982e57 *man/itemps.Rd 8b350b62adfc38bc812caa399bf231b1 *man/lhs.Rd e5b7be1beeaf33461ea3b767239395a3 *man/mapT.Rd 0ae4cd5c9ca18f816b126f1e5ad08161 *man/optim.tgp.Rd 4a0d81f755808bec5caf5a694f160717 *man/partition.Rd 7924402e9a3219c6d3ea2a718e7974e2 *man/plot.tgp.Rd 3e47a1a8a7c7033e68f35c2b043b4962 *man/predict.tgp.Rd 0011f52aefa1c79c39e687a45468972a *man/sens.Rd 5bea9a07c53eca888cc016b7147b9ce1 *man/tgp-internal.Rd a864b58302dec64b9e7f3126cac53b54 *man/tgp-package.Rd 9380f2735768f3b4787df979aa6a53f3 *man/tgp.default.params.Rd 225f5d20fc740cad64d2371c9157aa81 *man/tgp.design.Rd 56002311d9390cbb59b283b1f782d875 *man/tgp.trees.Rd 4d0bca9f8667851c192327ed1efacd51 *src/Makevars 1d22c4d65bb5bff3e648a6b206e862b6 *src/all_draws.c b703411ef8549db3b74412ec64d02e64 *src/all_draws.h 2dbc17df3bee7497fea459cf17fff094 *src/base.cc 37573f3fa856b77a76a232572ac20dd8 *src/base.h a57fcea24be5e354702e84b33c3cdd9c *src/corr.cc 447cb1af1fc39a5bd2b5a313d5c9b7fb *src/corr.h c550b3b19f80cc675cf8033215e2f6d7 *src/dopt.c 8f92a351cacd58155c78a0232fa1575e *src/dopt.h b048e10f07dd0336c79278554bf692e9 *src/exp.cc 82365c48e6b082befafec7b72fed24ee *src/exp.h 4750ac9b52559751e2865e3d5ca1e817 *src/exp_sep.cc 7adc5af88d2fd4791967d9de7fd54bed *src/exp_sep.h 97be9a5d10fb357b2a017de0b86e8e51 *src/gen_covar.c d356cc0e8ba88a9c14aa5b5157540c24 *src/gen_covar.h 2ab2082017658ee29ac4d9539af8a6c6 *src/gp.cc 09748aa3b85a52f1ca85b60a82db86c9 *src/gp.h 09761c34492b873de30d1f4b8bc6e656 *src/lh.c 86119f93629c41d4767c8ef289d2690b *src/lh.h 20b6ea5e55ad004eb78eee56e549f02d *src/lik_post.c 71646e59fcc920a1fcf3df16960482d1 *src/lik_post.h 712ac63a3202f6c83546e3ee6bb6ea8d *src/linalg.c c651e50a7f9e4fb7a3a6cbcb0df56824 *src/linalg.h 16038b89a011a854ba554e54bb93425a *src/list.cc 52371e91736361411faf5786323b101f *src/list.h b26e5fb56dd1ab99e1d935b4f767dcb6 *src/matern.cc 6e199cf7b6afe7e73219a72418cd6b05 *src/matern.h b65eb574d37883e53e0ea0957fe62c5e *src/matrix.c 82a72086e29c44601a675e129bea5401 *src/matrix.h 234abab317956245172eca8a53d159bf *src/model.cc 17aab050a33da1ab8ec5e0ee9aa1f3b9 *src/model.h 5e2df14034465f4cc4666fda139757ec *src/mr_exp_sep.cc 86b0eeb293929f1bcd0d852111138471 *src/mr_exp_sep.h 6396247f5f7916a1a030c28f25d3d809 *src/mstructs.cc 19d2790d825bbb5726639cdb86b0400a *src/mstructs.h 78ce07bf309b28898c3007e71285abdd *src/params.cc 81ab1ee751bcd8f4e2e83c61ca4ead18 *src/params.h af6b875a438fd021d5577b5ab7f704f8 *src/predict.c 635136c61fcbb917386bf0bef2096127 *src/predict.h d5a125f626dc68aa2130fcf265e5189d *src/predict_linear.c 9f8baae92d7b46ddd89378c7f95a9144 *src/predict_linear.h aaa8f6223f12237cfb6e3ea4e25ff908 *src/rand_draws.c 1a0cfd8a66d11e536fd9fcc4c34b44e1 *src/rand_draws.h 955530132a96c962419b1123f53b034c *src/rand_pdf.c fee24fd60fe088cc52686f8760d5e2fc *src/rand_pdf.h 63f74271418b1fc76d4ffecdfb08dd5b *src/randomkit.c 59896798fb57e6b2bf4e8c8251e8d55a *src/randomkit.h 566af35ef5275604911cef5092623510 *src/rhelp.c 7133a0f471c7db934e6a9bab77270269 *src/rhelp.h e800195aa10bcb403b492c0c6d361388 *src/sim.cc 48ea8a3f5bbf17f352b3cce0873caf6c *src/sim.h 528d66b4d1efc709e05ba156457e9e8c *src/temper.cc 9cab37ec7a79da5d9f0ca1c59b133203 *src/temper.h 1b74ddc05ab3053680e693428b6fd7b7 *src/tgp.cc 119fc3370516cb64b80acda8b9d5873b *src/tgp.h 00dfcb9c22abd696babceba9b67a69f4 *src/tree.cc ada0f53f3fba837987d48f61ae6a85d0 *src/tree.h d8ddcdee5f76633a421c3278ddd87d87 *vignettes/as.iRnw e754722722b581ec9125b47b916fd84e *vignettes/cat.iRnw b6d804ee447dbda0b5de75b4687be618 *vignettes/exp.iRnw 6d49305f829be1addd3f6ca1badeeac8 *vignettes/fried.iRnw 1bf6723e6ffec244557ccea33c437363 *vignettes/it.iRnw 39f0a4e350028051ebd8783fba61dfeb *vignettes/linear.iRnw f3298fae9479c15de10a77656ef02011 *vignettes/motivate.tex 20e17228d4e19ce189f994d662604d84 *vignettes/moto.iRnw 96f319b5ffbbe69cac4bce9874609584 *vignettes/motovate_bgp.pdf 4a5a106a111ed23c4c01b7f39e16aadc *vignettes/motovate_btgp.pdf 7669272df510e734b80e092ef833f21f *vignettes/optim.iRnw eaf4bfef87af61bc1c94406238a536bd *vignettes/pred.iRnw 32e884287bbeafdbc2c56c59aae6f829 *vignettes/sens.iRnw 762e2e85981a185734cdeca222256e0d *vignettes/sin.iRnw df6861a8ac87a1a21cf8eb75078a4a82 *vignettes/tgp.Rnw c457ca0ff12c858d3a65fd4c6f2b9bd8 *vignettes/tgp.bib 05e3c9c0daed01e04b2fc383ccb3620c *vignettes/tgp2.Rnw 6e59bc9da42389fbc099ee01ecf28b03 *vignettes/traces.iRnw e6816bfd32b05acc8703a1add5a4d339 *vignettes/tree.pdf tgp/README0000644000175100001440000000414312506600653011747 0ustar hornikusersThis is the R-package: tgp. It has been tested on Linux, FreeBSD, OSX, and Windows. This README is a sub. Please see the R-package documentation or vignette for more information. It should be possible to install this source package via "R CMD INSTALL tgp", where "tgp" is this directory, from "../". Below are some comments on compiling with support for pthreads, and linking with ATLAS, or other linear algebra library (different than the one already used by R). SUPPORT FOR PTHREADS -------------------- 1.) Add "-DPARALLEL" to PKG_CXXFLAGS of src/Makevars 2.) You may need to add "-pthread" to PKG_LIBS of src/Makevars, or whatever is needed by your compiler in order to correctly link code with pthreads functions. SUPPORT FOR ATLAS ----------------- ATLAS is supported as an alternative to standard BLAS and LAPACK for fast, automatically tuned, linear algebra routines. There are three easy steps to enable ATLAS support (assuming, of course, you have already installed it -- http://math-atlas.sourceforge.net) which need to be done before you install the package from source: Note that this is not the recommended method for getting fast linear algebra routines for tgp. The best way to do this is to compile R with ATLAS (or other libraries) support. See the R installation manual: http://cran.r-project.org/doc/manuals/R-admin.html under A.2.2 -- Begin ATLAS Instructions 1.: Edit src/Makevars. Comment out the existing PKG_LIBS line, and replace it with: PKG_LIBS = -L/path/to/ATLAS/lib -llapack -lcblas -latlas you may need replace "-llapack -lcblas -latlas" with whatever ATLAS recommends for your OS. (see ATLAS README.) For example, if your ATLAS compilation included F77 support, you would might need to add "-lF77blas", of if you compiled with pthreads, you would might use "-llapack -lptcblas -lptf77blas -latlas". 2.: Continue editing src/Makevars. Add: PKG_CFLAGS = -I/path/to/ATLAS/include 3.: Edit src/linalg.h and commend out lines 40 & 41: /*#define FORTPACK #define FORTBLAS*/ --- End ATLAS Instructions -- Reverse the above instructions to disable ATLAS. Don't forget to re-install. tgp/build/0000755000175100001440000000000012655414745012176 5ustar hornikuserstgp/build/vignette.rds0000644000175100001440000000040212655414745014531 0ustar hornikusersn &RHٺ'gtYOEM0R[<΅@e ?>~cg4K %ͅlFԵzS}$W^(kV Oh1 { A++;%VnbDy5GGRi,~ ⿈qɘʳQPp@2$?)ޥu I|tUm/Oi*6{0 n8j 'u:\Htgp/DESCRIPTION0000644000175100001440000000233612655611524012603 0ustar hornikusersPackage: tgp Title: Bayesian Treed Gaussian Process Models Version: 2.4-14 Date: 2016-02-06 Author: Robert B. Gramacy and Matt A. Taddy Depends: R (>= 2.14.0) Imports: maptree Suggests: MASS Description: Bayesian nonstationary, semiparametric nonlinear regression and design by treed Gaussian processes (GPs) with jumps to the limiting linear model (LLM). Special cases also implemented include Bayesian linear models, CART, treed linear models, stationary separable and isotropic GPs, and GP single-index models. Provides 1-d and 2-d plotting functions (with projection and slice capabilities) and tree drawing, designed for visualization of tgp-class output. Sensitivity analysis and multi-resolution models are supported. Sequential experimental design and adaptive sampling functions are also provided, including ALM, ALC, and expected improvement. The latter supports derivative-free optimization of noisy black-box functions. Maintainer: Robert B. Gramacy License: LGPL URL: http://bobby.gramacy.com/r_packages/tgp NeedsCompilation: yes Packaged: 2016-02-06 16:06:06 UTC; bobby Repository: CRAN Date/Publication: 2016-02-07 10:50:12 tgp/ChangeLog0000644000175100001440000003602312655366410012650 0ustar hornikusers2.4-14 (06 Feb 2016) ------ forgot to do compact vignettes 2.4-13 (06 Feb 2016) ------ removed Rinterface.h; not sure where it came from 2.4-12 (05 Feb 2016) ------ new web page on bobby.gramacy.com, and title case moved R.h and Rmath.h outside of rhelp.h to be compatible with new C++ headers inside of newest R removed beta functionality comment from old vignette 2.4-11 (28 November 2014) ------ removed akima from package 2.4-10 (27 November 2014) ------ added mean0.range1 to NAMESPACE for use in the plgp package cleaned up some warnings in new pedantic gcc compile moved akima and maptree to Imports 2.4-9 (01 April 2013) ----- Changed printed tables to 15 digits to comply with new read.table checks removed zzz.R and moved LICENSE to License global exp2d and data call made fancy to pass checks 2.4-8 (13 Oct 2012) ----- fixed bimprov/improv bug overlooked in NULL issue updates removeed bessel_k.c and assocated functions; now using built-in bessel_k_ex function which didn't exist before 2.4-7 (18 April 2012) ----- fixed NULL issue in lh_sample 2.4-6 (14 April 2012) ----- Added check that E divides T-B Corrected bug in slice grid causing overflow Corrected NULL problems pointed out by BR 2.4-5 (30 January 2012) ----- fixes to vigneetes after NAMESPACE change, and removing direct references to stdout and stderr 2.4-4 (23 January 2012) ----- Added NAMESPACE file 2.4-3 (18 December 2011) ----- Checked for assert problems with NDEBUG and updated R version (2.14) and email addresses 2.4-2 (30 March 2011) ----- added dp.sim to tgp.default.params so that MVN proposal covariance matrix can be specified by the user in GP-SIM models 2.4-1 (23 Feb 2011) ----- Changed my_r_process_events to always ProcessEvents and check for interrupts (every second) Made new sobol_indices function to clean up tgp::Sens, and using shape to drive categorical calculations rather than bmax minor edit to tgp2 doc to correct fried.bool description, and edit to fried.bool to fix fried.bool(1) problem 2.4 (20 Sept 2010) --- added sim (single index model) rank 1 correlation structure overlooked fixing nugget in treed split proposals; now fixed 2.3-4 (19 July 2010) ----- allowed the entire $tree component from tgp.default.params to be written over by the tree argument to b* functions fixed a bug in the linear initialization of correlation functions (for non-LLM models) 2.3-3 (23 April 2010) ----- fixed another bug pointed out by Ripley 2.3-2 (21 April 2010) ----- replace isinf by R_FINITE as suggested by Brian Ripley 2.3-1 (8 Feb 2010) ----- Added reference to second JSS paper 2.3 (23 Dec 2009) --- final version of the tgp2 vignette, accepted at JSS removed mrtgp documentation 2.2-4 (20 Nov 2009) ----- added a check for a full rank design matrix in the pre-processing of inputs corrected some syntax errors in .Rd files caught by new checks on CRAN changed sens warning to check for nn > 0 instead of null XX which was causing a warning to be printed every time regardless of whether or not there was a violation 2.2-3 (22 Jul 2009) ----- added nug.p=0 option to cause the nugget to stay fixed at the params$gd[1] value. bcart, btlm, and blm now automatically use nug.p=0 since the nugget is not identified in these models 2.2-2 (27 May 2009) ----- caught a signifigant typo/bug in Xsplit pre-processing in R which was causing the bounding rectangle to be computed improperly removed combinat dependency 2.2-1 (20 Feb 2009) ----- added Tree::Clear() to rejected prunes in Tree::Prune() tgp.default.params and tgp.check.params now allow the min partition size to depend on basemax rather than d the bounding rectangle and the valid tree-split locations are now governed by an Xsplit automatically generated in the tgp R function, and gathered from the tgp object in predict.tgp 2.2 (16 Jan 2009) --- added lower bound for s2_g0, and added DEFAULT CPP macros to help prevent assertions which would have backed out of bad parameterizations anyways. This more liberal approach essentially prevents assertions in the no-noise regression case now allow basemax != d for constant mean functions added categorical LHS for sensitivity analyses finished draft of second vignette, to be submitted to JSS 2.1-6 (25 Nov 2008) ----- caught important bug in b0-prior pre-processing in R that was causing the emperical Bayes prior to be used when the b0 hierarchical one is requested 2.1-5 (24 Oct 2008) ----- added check for >= d+1 unique rows of X in Tree::Singular changed how d an nug are printed in the progress meter for mrtgp added par(mfrow=c(1,1)) to default 1-d mrtgp plots 2.1-4 (17 Oct 2008) ----- made it possible to cap the number of input locations which are ranked by the expected improvement statistic by allowing the improv argument to b* functions to take a 2-vector input. Also no longer ranks points with an improvement statistic of zero 2.1-3 (7 Oct 2008) ----- added check for >1 unique Z in Tree::Singular allow (undocumented) specification of minpart through the ellipses (...) argument to the b* functions m0r1=TRUE is now the default for all b* functions, the Rnw documentation has been updated (but the pdfs have not been regenerated in the current version) 2.1-2 (17 April 2008) ----- introduced params$Wi and made it so that params${b,Wi} set both the starting an prior values for the corresponding parameters. added bprior="bmznot" so that tau2 can be fixed at its starting value 2.1-1 (4 April 2008) ----- separaing tcounts and cum_tcounts and resetting tcounts to the average of cum_tcounts at beginning of each round fixed bug in returning of tcounts back to R by encuring that its->UpdateProbs() is always called after the last of R rounds whenever its->Numit() > 1 return ess information at each inverse temperature back to R for storage in the tgp-class object 2.1 (22 March 2008) --- moved CHANGES to ChangeLog for the new CRAN packages page cleaned up tgp vignette into one .Rnw file including several .iRnw files added linear=FALSE to akima interp commands stopped printing both separate ess and essN in IT method added new itemps.barplot function for visualizing the number of visits to each inverse temperature in the ST-MCMC chain now tcounts (observation counts) for IT are accumulated across repeats (R>=2) -- not sure if this is a good idea now recording tree acceptance rates (Grow, Prune Change and Swap accepts over total) propogated splitmin to up to the R interface, and added a basemax paramter also specifiable in the R inferface -- the parameters allow control of which X colums can be partitioned upon (by the tree) and which appear in the base (GP) model added heights="map" argument to tgp.trees for plotting only the tree corresponding to the maximum a' posteriori tree wrote two sections in the new vignette (tgp2): one on splitmin and basemax (i.e., categorical inputs) and one on importance tempering 2.0-4 (23 Jan 2008) ----- made a change suggested by Andrea Spano to make the partition function more robust when new X values (on a different range from the original data) are provided 2.0-3 (27 Dec 2007) ----- commented the moving average code (for sens) and made it more efficient 2.0-2 (12 Dec 2007) ----- allow mode in the sens function to be be within the bounds of rect -- i.e., stop checking for positive mode fixed dyslexic error in man page for sens describing total effect indices fixed missing braces in some .Rd files shortened to LGPL in DESCRIPTION 2.0-1 (1 Oct 2007) ----- Memory savings: preds->ZZ and preds->Zp only allocated when pred.n=TRUE, preds->w and preds->itemp only allocated when ST or IT or IS corrected default.itemps() example barplot and changed k.min to 0.1 to agree with IT paper fixed zcov bug in tgp.postprocess 2.0 (21 Sept 2007) --- consolidated R functions from individual files into those grouped by task made gridlen argument a 2-vector so the grid size can be specified in both x and y new economy argument to tree and Base duplicators so that the entire set of covariance matrices is not copied unless necessary Matt Taddy officially joins the list of authors, adding multi-resolution tgp and sensitivity analysis importance tempering, with importance sampling and simulated tempering support Latin hypercube sampling with respect to a Beta distribution moved most of the reading of parameters out of the Tgp constructor and into Tgp::Init so that tgp_cleanup() can safely delete the Tgp module even it it wasn't successfully initialized ordered multiple improv statistics predictive covariances now calculated instead of variances 1.2-7 (19 Aug 2007) ----- tgp.partition 1-d data handling made more robust removed assertion on w that tends to fail for unknown reasons 1.2-6 (17 June 2007) ----- added number of leaves to traces fixed CART bug in Gp::predict that was already handled in v1.3, thanks to Taddy, but was bad in the CRAN version 1.2-5 (29 May 2007) ----- allowing btgp to do a linburn $parts is a now a matrix, and $linburn now {TRUE,FALSE} $tree and $hier removed from tgp-class output, and $trace correctly removed when input trace=FALSE got rid of some hanging code fragments in documentation of btgp and dopt.gp 1.2-4 (07 May 2007) ----- fixed a leak when krige=FALSE appearing in Tree::Predict fixed sub-vignette cutting for preds and traces corrected documentation of nug.p in tgp.default.params() added verbosity and iter arguments to dopt and thus dopt.gp and tgp.design 1.2-3 (09 Apr 2007) ----- updates to the vignette for the JSS publication check.matrix modified to allow one-column matrix Z arguments which have column-name information tgp.trees calculation of rows and columns corrected for situations when there is a height 1 tree 1.2-2 (19 Dec 2006) ----- slice.interp bugs fixed (is.null(NULL) and plotting of axis labels) and tick marks added added R argument to predict.tgp and changed the krige argument to be called MAP added new krige argument to b* and predict.tgp to allow the user to control whether Z*k* kriging samples are to be obtained (possibly saving on memory) bug involving the order of trees read from files in the tgp.get.trees function is fixed; as a result the $trees output field in "tgp"-class objects is listed by height and so may contain NULL entries documented plot.tgp and predict.tgp with the method markup 1.2-1 (03 Dec 2006) ----- Added "cart-" option to bprior in order to allow a CART style mean rather than a LM mean 1.2 (21 Nov 2006) --- Now allowing BTE[2]-BTE[1] % BTE[3] != 0 Added predict.tgp and necessary functionality to save and load in MAP tgp model for later prediction Corrected par calculation in tgp.trees for non-default which argument when there is an unprinted height 1 tree Traces not recorded for linarea, parts, and ego, when they are off or fixed to unchanging settings Fixed EGO calculations; now calling them "improv", made them thread-safe, and added improv samples to traces Also now renamed ds2x to Ds2x, and made Ds2x (i.e., ALC) calculations thread-safe Ellipses to b* function allow other params arguments to be passed to replace defaults in tgp.default.params() Added traces of hierarchical parameters, and all predictive summaries (including kriging means and vars) Initial implementation of Importance Tempering idea Calculating variances of predictive distribution, and saving kriging means and variances Fixed numPrunable (P+1) calculation in grow attempts EGO calculations made thread-safe 1.1-11 (20 Sept 2006) ------ Bad compilation flags caused bad bug in log_HierPrior to go unnoticed until assertion failure on Windows 1.1-10 (19 Sept 2006) ------ Fixed big compute_ego() bug Tweaks to RNG seeds so that they give same sequence across platforms (tested on OSX/PB & Linux/Xeons) Allow X=NULL in dopt.gp() Removal of constants LOG_2_PI covered by R internal M_LOG_SQRT_2PI Added mvnpdf_log_dup and wishpdf_log functions Corrected full log-pdf function for tree prior, and added log-pdf of W and B0 1.1-9 (03 Sept 2006) ----- Many comments added in predict[_linear].c and exp_sep.cc Fixed ds2x (predict_linear) memory leak Fixed Matern bug -- now using correct pwr=1 distance computation; added comments to gen_covar.c Compilation warnings addressed in update of compat- ibility with C/C++ adaptive sampling (as) code Now getting BestPartitions from Tgp instead of at the end of Model::Rounds 1.1-8 (29 Aug 2006) ----- Added trace capability for Matern corr family Fixed bug that num_consumed is not updated on final NULL read from tlist Using new log_bessel_k() function to bypass allocs of floor(nu)+1 double each time bessel_k() was called 1.1-7 (23 Aug 2006) ----- Added the ability to get traces of all parameters, except the hierarchical ones Fixed bug to undo.m0r1 so that quantile differences don't have the mean subtracted out twice Changes to allow "..." arguments to mapT, and plotting of 2-d slices of input locations Minor fix to do params->Print() within model->Print(). Begin addition of mr_tgp, by Matt Taddy. When these changes are complete, we should be moving to version 2.0 1.1-6 (26 Jun 2006) ----- Added Latin Hypercube design function Added "mapT" function for stand-alone plotting of MAP partitions via projection and slice. Fixed bug in "tgp.plot.slice" in the process Also now calling "tgp.get.partitions" by the shorter name "partition" 1.1-5 (27 May 2006) ----- Fixed memory leak with RNG state in predict_consumer Solved -DPARALLEL adaptive sampling mystery exp2d.rand now returns more information about responses including ZZ, Ztrue, and ZZtrue 1.1-4 (22 May 2006) ----- Instructions for compiling with Pthreads. Got rid of duplicate printing of d[a,b] in tgp header. Added verb arguments to specify how verbose the R-console printing should be be. 1.1-3: (16 Apr 2006) ------ Necessary changes in order to get read_ctrlfile to work for the command-line (non-R) interface to tgp, and other minor changes. Noticed bug for bcart and b0tau options due to bad T- matrix initialization -- fixed. 1.1-2: (04 Mar 2006) ------ 1. Beta version of Matern correlation function working (abiet a bit shakily) 2. Tgp class and cleanup function now implemented in order to let tgp be interrupted, and then clean up to avoid memory leaks "on.exit()" 1.1-1: (26 Feb 2006) ------ Minor edits to documentation. 1.1: (22 Feb 2006) ---- 1. Modularization overhall of C/C++ code for passing to Matt Taddy, who will be responsible for such future additions as Matern correlation functions, and multi- resolution GP implementations. 2. Plotting enhancements, including 1-d projections and (now default) loess interpolation for 2-d surfaces and projections, plotting of ALC & EGO statistics, and ability to control plot layout to show mean surface, error surface, or both. 3. URL/Email now to UCSC/AMS address. 1.0-2: (Dec 2005) ------ 1. Wrote generic random deviate function which can use unif_rand(), randomkit, and erand48. 2. Fixed up some documentation bugs and typos. 3. system command in model.cc no longer calls "rm" which doesn't work on Windows. 1.0-1: (Dec 2005) ------ 1. No longer using erand48; using unif_rand() from R for Windows compatibility. tgp/man/0000755000175100001440000000000012654547570011654 5ustar hornikuserstgp/man/predict.tgp.Rd0000644000175100001440000002075112654547265014374 0ustar hornikusers\name{predict.tgp} \alias{predict.tgp} \title{ Predict method for Treed Gaussian process models } \description{ This generic prediction method was designed to obtain samples from the posterior predictive distribution after the \code{b*} functions have finished. Samples, or kriging mean and variance estimates, can be obtained from the MAP model encoded in the \code{"tgp"}-class object, or this parameterization can be used as a jumping-off point in obtaining further samples from the joint posterior and posterior predictive distributions } \usage{ \method{predict}{tgp}(object, XX = NULL, BTE = c(0, 1, 1), R = 1, MAP = TRUE, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, trace = FALSE, verb = 0, ...) } \arguments{ \item{object}{ \code{"tgp"}-class object that is the output of one of the \code{b*} functions: \code{\link{blm}}, \code{\link{btlm}} \code{\link{bgp}}, \code{\link{bgpllm}}, \code{\link{btgp}}, or \code{\link{btgpllm}}} \item{XX}{ Optional \code{data.frame}, \code{matrix}, or vector of predictive input locations with \code{ncol(XX) == ncol(object$X)}} \item{BTE}{ 3-vector of Monte-carlo parameters (B)urn in, (T)otal, and (E)very. Predictive samples are saved every E MCMC rounds starting at round B, stopping at T. The default \code{BTE=c(0,1,1)} is specified to give the kriging means and variances as outputs, plus one sample from the posterior predictive distribution} \item{R}{ Number of repeats or restarts of \code{BTE} MCMC rounds, default \code{R=1} is no restarts} \item{MAP}{ When \code{TRUE} (default) predictive data (i.e., kriging mean and variance estimates, and samples from the posterior predictive distribution) are obtained for the \emph{fixed} MAP model encoded in \code{object}. Otherwise, when \code{MAP=FALSE} sampling from the joint posterior of the model parameters (i.e., tree and GPs) and the posterior predictive distribution are obtained starting from the MAP model and proceeding just as the \code{b*} functions} \item{pred.n}{\code{TRUE} (default) value results in prediction at the inputs \code{X}; \code{FALSE} skips prediction at \code{X} resulting in a faster implementation} \item{krige}{\code{TRUE} (default) value results in collection of kriging means and variances at predictive (and/or data) locations; \code{FALSE} skips the gathering of kriging statistics giving a savings in storage} \item{zcov}{If \code{TRUE} then the predictive covariance matrix is calculated-- can be computationally (and memory) intensive if \code{X} or \code{XX} is large. Otherwise only the variances (diagonal of covariance matrices) are calculated (default). See outputs \code{Zp.s2}, \code{ZZ.s2}, etc., below} \item{Ds2x}{\code{TRUE} results in ALC (Active Learning--Cohn) computation of expected reduction in uncertainty calculations at the \code{X} locations, which can be used for adaptive sampling; \code{FALSE} (default) skips this computation, resulting in a faster implementation} \item{improv}{\code{TRUE} results in samples from the improvement at locations \code{XX} with respect to the observed data minimum. These samples are used to calculate the expected improvement over \code{XX}, as well as to rank all of the points in \code{XX} in the order that they should be sampled to minimize the expected multivariate improvement (refer to Schonlau et al, 1998). Alternatively, \code{improv} can be set to any positive integer 'g', in which case the ranking is performed with respect to the expectation for improvement raised to the power 'g'. Increasing 'g' leads to rankings that are more oriented towards a global optimization. The option \code{FALSE} (default) skips these computations, resulting in a faster implementation. Optionally, a two-vector can be supplied where \code{improv[2]} is interpreted as the (maximum) number of points to rank by improvement. See the note in \code{\link{btgp}} documentation. If not specified, then the larger of 10\% of \code{nn = nrow(XX)} and \code{min(10, nn)} is taken by default } \item{sens.p}{ Either \code{NULL} or a vector of parameters for sensitivity analysis, built by the function \code{\link{sens}}. Refer there for details} \item{trace}{ \code{TRUE} results in a saving of samples from the posterior distribution for most of the parameters in the model. The default is \code{FALSE} for speed/storage reasons. See note below } \item{verb}{ Level of verbosity of R-console print statements: from 0 (default: none); 1 which shows the \dQuote{progress meter}; 2 includes an echo of initialization parameters; up to 3 and 4 (max) with more info about successful tree operations} \item{...}{ Ellipses are not used in the current version of \code{predict.tgp}. They are are only included in order to maintain S3 generic/method consistency } } \details{ While this function was designed with prediction in mind, it is actually far more general. It allows a continuation of MCMC sampling where the \code{b*} function left off (when \code{MAP=FALSE}) with a possibly new set of predictive locations \code{XX}. The intended use of this function is to obtain quick kriging-style predictions for a previously-fit MAP estimate (contained in a \code{"tgp"}-class object) on a new set of predictive locations \code{XX}. However, it can also be used simply to extend the search for an MAP model when \code{MAP=FALSE}, \code{pred.n=FALSE}, and \code{XX=NULL} } \note{ It is important to note that this function is not a replacement for supplying \code{XX} to the \code{b*} functions, which is the only way to get fully Bayesian samples from the posterior prediction at new inputs. It is only intended as a post-analysis (diagnostic) tool. Inputs \code{XX} containing \code{NaN, NA}, or \code{Inf} are discarded with non-fatal warnings. Upon execution, MCMC reports are made every 1,000 rounds to indicate progress. If \code{XX}s are provided which fall outside the range of \code{X} inputs provided to the original \code{b*} function, then those will not be extrapolated properly, due to the way that bounding rectangles are defined in the original run. For a workaround, supply \code{out$Xsplit <- rbind(X, XX)} before running \code{predict} on \code{out}. See note for \code{\link{btgp}} or another \code{b*} function regarding the handling and appropriate specification of \code{traces}. The \code{"tgp"} class output produced by \code{predict.tgp} can also be used as input to \code{predict.tgp}, as well as others (e.g., \code{\link{plot.tgp}}. } \value{ The output is the same, or a subset of, the output produced by the \code{b*} functions, for example see \code{\link{btgp}} } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \seealso{ \code{\link{predict}}, \code{\link{blm}}, \code{\link{btlm}}, \code{\link{bgp}}, \code{\link{btgp}}, \code{\link{bgpllm}}, \code{\link{btgpllm}}, \code{\link{plot.tgp}} } \examples{ ## revisit the Motorcycle data require(MASS) ## fit a btgpllm without predictive sampling (for speed) out <- btgpllm(X=mcycle[,1], Z=mcycle[,2], bprior="b0", pred.n=FALSE) ## nothing to plot here because there is no predictive data ## save the "tgp" class output object for use later and save(out, file="out.Rsave") ## then remove it (for illustrative purposes) out <- NULL ## (now imagine emailing the out.Rsave file to a friend who ## then performs the following in order to use your fitted ## tgp model on his/her own predictive locations) ## load in the "tgp" class object we just saved load("out.Rsave") ## new predictive locations XX <- seq(2.4, 56.7, length=200) ## now obtain kriging estimates from the MAP model out.kp <- predict(out, XX=XX, pred.n=FALSE) plot(out.kp, center="km", as="ks2") ## actually obtain predictive samples from the MAP out.p <- predict(out, XX=XX, pred.n=FALSE, BTE=c(0,1000,1)) plot(out.p) ## use the MAP as a jumping-off point for more sampling out2 <- predict(out, XX, pred.n=FALSE, BTE=c(0,2000,2), MAP=FALSE, verb=1) plot(out2) ## (generally you would not want to remove the file) unlink("out.Rsave") } \keyword{ nonparametric } \keyword{ nonlinear } \keyword{ smooth } \keyword{ models } \keyword{ spatial } \keyword{ tree } tgp/man/default.itemps.Rd0000644000175100001440000001550612654547570015076 0ustar hornikusers\name{default.itemps} \alias{default.itemps} \title{ Default Sigmoidal, Harmonic and Geometric Temperature Ladders } \description{ Parameterized by the minimum desired \emph{inverse} temperature, this function generates a ladder of inverse temperatures \code{k[1:m]} starting at \code{k[1] = 1}, with \code{m} steps down to the final temperature \code{k[m] = k.min} progressing sigmoidally, harmonically or geometrically. The output is in a format convenient for the \code{b*} functions in the \pkg{tgp} package (e.g. \code{\link{btgp}}), including stochastic approximation parameters \eqn{c_0}{c0} and \eqn{n_0}{n0} for tuning the uniform pseudo-prior output by this function } \usage{ default.itemps(m = 40, type = c("geometric", "harmonic","sigmoidal"), k.min = 0.1, c0n0 = c(100, 1000), lambda = c("opt", "naive", "st")) } \arguments{ \item{m}{ Number of temperatures in the ladder; \code{m=1} corresponds to \emph{importance sampling} at the temperature specified by \code{k.min} (in this case all other arguments are ignored) } \item{type}{ Choose from amongst two common defaults for simulated tempering and Metropolis-coupled MCMC, i.e., geometric (default) or harmonic, or a sigmoidal ladder (default) that concentrates more inverse temperatures near 1} \item{k.min}{ Minimum inverse temperature desired } \item{c0n0}{ Stochastic approximation parameters used to tune the simulated tempering pseudo-prior (\code{$pk}) to get a uniform posterior over the inverse temperatures; must be a 2-vector of positive integers \code{c(c0, n0)}; see the Geyer \& Thompson reference below } \item{lambda}{ Method for combining the importance samplers at each temperature. Optimal combination (\code{"opt"}) is the default, weighting the IS at each temperature \eqn{k}{k} by \deqn{\lambda_k \propto (\sum_i w_{ki})^2/\sum_i w_{ki}^2.}{lambda[k] = sum(w[k,]))^2/sum(w[k,]^2).} Setting \code{lambda = "naive"} allows each temperature to contribute equally (\eqn{\lambda_k \propto 1}{\lambda[k] = 1}, or equivalently ignores delineations due to temperature when using importance weights. Setting \code{lambda = "st"} allows only the first (cold) temperature to contribute to the estimator, thereby implementing \emph{simulated tempering}} } \details{ The geometric and harmonic inverse temperature ladders are usually defined by an index \eqn{i=1,\dots,m}{i = 1:m} and a parameter \eqn{\Delta_k > 0}{delta > 0}. The geometric ladder is defined by \deqn{k_i = (1+\Delta_k)^{1-i},}{k[i] = (1 + delta)^(1-i),} and the harmonic ladder by \deqn{k_i = (1+\Delta_k(i-1))^{-1}.}{k[i] = (1 + delta*(i-1))^(-1).} Alternatively, specifying the minimum temperature \eqn{k_{\mbox{\tiny min}}}{k.min} in the ladder can be used to uniquely determine \eqn{\Delta_k}{delta}. E.g., for the geometric ladder \deqn{\Delta_k = k_{\mbox{\tiny min}}^{1/(1-m)}-1,}{delta = k.min^(1/(1-m))-1,} and for the harmonic \deqn{\Delta_k = \frac{k_{\mbox{\tiny min}}^{-1}-1}{m-1}.}{delta = (k.min^(-1)-1)/(m-1).} In a similar spirit, the sigmoidal ladder is specified by first situating \eqn{m}{m} indices \eqn{j_i\in \Re}{j[i] in Re} so that \eqn{k_1 = k(j_1) = 1}{k[1] = k(j[1]) = 1} and \eqn{k_m = k(j_m) = k_{\mbox{\tiny min}}}{k[m] = k(j[m]) = k.min} under \deqn{k(j_i) = 1.01 - \frac{1}{1+e^{j_i}}.}{k(j[i]) = 1.01 - 1/(1+exp(-j[i])).} The remaining \eqn{j_i, i=2,\dots,(m-1)}{j[2:(m-1)]} are spaced evenly between \eqn{j_1}{j[i]} and \eqn{j_m}{j[m]} to fill out the ladder \eqn{k_i = k(j_i), i=1,\dots,(m-1)}{k[2:(m-1)] = k(j[2:(m-1)])}. For more details, see the \emph{Importance tempering} paper cited below and a full demonstration in \code{vignette("tgp2")} } \value{ The return value is a \code{list} which is compatible with the input argument \code{itemps} to the \code{b*} functions (e.g. \code{\link{btgp}}), containing the following entries: \item{c0n0 }{ A copy of the \code{c0n0} input argument } \item{k }{ The generated inverse temperature ladder; a vector with \code{length(k) = m} containing a decreasing sequence from \code{1} down to \code{k.min}} \item{pk }{ A vector with \code{length(pk) = m} containing an initial pseudo-prior for the temperature ladder of \code{1/m} for each inverse temperature} \item{lambda}{ IT method, as specified by the input argument} } \references{ Gramacy, R.B., Samworth, R.J., and King, R. (2007) \emph{Importance Tempering.} ArXiV article 0707.4242 \url{http://arxiv.org/abs/0707.4242}. To appear in Statistics and Computing. For stochastic approximation and simulated tempering (ST): Geyer, C.~and Thompson, E.~(1995). \emph{Annealing Markov chain Monte Carlo with applications to ancestral inference.} Journal of the American Statistical Association, \bold{90}, 909--920. For the geometric temperature ladder: Neal, R.M.~(2001) \emph{Annealed importance sampling.} Statistics and Computing, \bold{11}, 125--129 Justifying geometric and harmonic defaults: Liu, J.S.~(1002) \emph{Monte Carlo Strategies in Scientific Computing.} New York: Springer. Chapter 10 (pages 213 \& 233) \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \seealso{ \code{\link{btgp}} } \examples{ ## comparing the different ladders geo <- default.itemps(type="geometric") har <- default.itemps(type="harmonic") sig <- default.itemps(type="sigmoidal") par(mfrow=c(2,1)) matplot(cbind(geo$k, har$k, sig$k), pch=21:23, main="inv-temp ladders", xlab="indx", ylab="itemp") legend("topright", pch=21:23, c("geometric","harmonic","sigmoidal"), col=1:3) matplot(log(cbind(sig$k, geo$k, har$k)), pch=21:23, main="log(inv-temp) ladders", xlab="indx", ylab="itemp") \dontrun{ ## using Importance Tempering (IT) to improve mixing ## on the motorcycle accident dataset library(MASS) out.it <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,22000,2), R=3, itemps=default.itemps(), bprior="b0", trace=TRUE, pred.n=FALSE) ## compare to regular tgp w/o IT out.reg <- btgpllm(X=mcycle[,1], Z=mcycle[,2], BTE=c(2000,22000,2), R=3, bprior="b0", trace=TRUE, pred.n=FALSE) ## compare the heights explored by the three chains: ## REG, combining all temperatures, and IT p <- out.it$trace$post L <- length(p$height) hw <- suppressWarnings(sample(p$height, L, prob=p$wlambda, replace=TRUE)) b <- hist2bar(cbind(out.reg$trace$post$height, p$height, hw)) par(mfrow=c(1,1)) barplot(b, beside=TRUE, xlab="tree height", ylab="counts", col=1:3, main="tree heights encountered") legend("topright", c("reg MCMC", "All Temps", "IT"), fill=1:3) } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ misc } tgp/man/lhs.Rd0000644000175100001440000000444012506600653012717 0ustar hornikusers\name{lhs} \alias{lhs} \title{Latin Hypercube sampling} \description{ Draw a (random) Latin Hypercube (LH) sample of size \code{n} from in the region outlined by the provided rectangle } \usage{ lhs(n, rect, shape=NULL, mode=NULL) } \arguments{ \item{n}{ Size of the LH sample } \item{rect}{ Rectangle describing the domain from which the LH sample is to be taken. The rectangle should be a \code{matrix} or \code{data.frame} with \code{ncol(rect) = 2}, and number of rows equal to the dimension of the domain. For 1-d data, a vector of length 2 is allowed} \item{shape}{ Optional vector of shape parameters for the Beta distribution. Vector of length equal to the dimension of the domain, with elements > 1. If this is specified, the LH sample is proportional to a joint pdf formed by independent Beta distributions in each dimension of the domain, scaled and shifted to have support defined by \code{rect}. Only concave Beta distributions with \code{shape} > 1 are supported. } \item{mode}{ Optional vector of mode values for the Beta distribution. Vector of length equal to the dimension of the domain, with elements within the support defined by \code{rect}. If \code{shape} is specified, but this is not, then the scaled Beta distributions will be symmetric } } \value{ The output is a \code{matrix} with \code{n} rows and \code{nrow(rect)} columns. Each of the \code{n} rows represents a sample point. } \references{ McKay, M. D., W. J. Conover and R. J. Beckman. (1979). \emph{A Comparison of Three Methods for Selecting Values of Input Variables in the Analysis of Output from a Computer Code}, Technometrics 21: (pp. 239--245). } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{The domain bounds specified by the rows of \code{rect} can be specified backwards with no change in effect.} \seealso{ \code{\link{tgp.design}}, \code{\link{dopt.gp}}, \code{\link{sens}} } \examples{ # get and plot a 2-d LH design s1 <- lhs(10, rbind(c(-2,3), c(0.5, 0.8))) plot(s1) # plot a grid to show that there is one sample # in each grid location abline(v=seq(-2,3,length=11), lty=2, col=3) abline(h=seq(0.5,0.8,length=11), lty=2, col=3) } \keyword{ design } \keyword{ spatial } tgp/man/friedman.1.data.Rd0000644000175100001440000000767612654547265015020 0ustar hornikusers\name{friedman.1.data} \alias{friedman.1.data} \alias{fried.bool} \title{ First Friedman Dataset and a variation } \description{ Generate X and Y values from the 10-dim \dQuote{first} Friedman data set used to validate the Multivariate Adaptive Regression Splines (MARS) model, and a variation involving boolean indicators. This test function has three non-linear and interacting variables, along with two linear, and five which are irrelevant. The version with indicators has parts of the response turned on based on the setting of the indicators } \usage{ friedman.1.data(n = 100) fried.bool(n = 100) } \arguments{ \item{n}{Number of samples desired} } \details{ In the original formulation, as implemented by \code{friedman.1.data} the function has 10-dim inputs \code{X} are drawn from Unif(0,1), and responses are \eqn{N(m(X),1)}{N(m(X),1)} where \eqn{m(\mathbf{x}) = E[f(\mathbf{x})]}{m(X) = E[f(X)]} and \deqn{m(\mathbf{x}) = 10\sin(\pi x_1 x_2) + 20(x_3-0.5)^2 + 10x_4 + 5x_5}{m(X) = 10*sin(pi*X[,1]*X[,2]) + 20*(X[,3]-0.5)^2 + 10*X[,4] + 5*X[,5]} The variation \code{fried.bool} uses indicators \eqn{I\in \{1,2,3,4\}}{I in 1:4}. The function also has 10-dim inputs \code{X} with columns distributed as Unif(0,1) and responses are \eqn{N(m(\mathbf{x},I), 1)}{N(m(X,I), 1)} where \eqn{m(\mathbf{x},I) = E(f(\mathbf{x},I)}{m(X,I) = E[f(X,I)]} and \deqn{m(\mathbf{x},I) = f_1(\mathbf{x})_{[I=1]} + f_2(\mathbf{x})_{[I=2]} + f_3(\mathbf{x})_{[I=3]} + m([x_{10},\cdots,x_1])_{[I=4]}}{m(X,I) = fI(X) if I in 1:3 else m(X[,10:1])} where \deqn{f_1(\mathbf{x}) = 10\sin(\pi x_1 x_2), \; f_2(\mathbf{x}) = 20(x_3-0.5)^2, \; \mbox{and } f_3(\mathbf{x}) = 10x_4 + 5x_5.}{f1(X)=10*sin(pi*X[,1]*X[,2]), f2(X)=20*(X[,3]-0.5)^2, f3(X)=10*X[,4]+5*X[,5] } The indicator I is coded in binary in the output data frame as: \code{c(0,0,0)} for \code{I=1}, \code{c(0,0,1)} for \code{I=2}, \code{c(0,1,0)} for \code{I=3}, and \code{c(1,0,0)} for \code{I=4}. } \value{ Output is a \code{data.frame} with columns \item{X.1, \dots, X.10 }{describing the 10-d randomly sampled inputs} \item{I.1, \dots, I.3}{boolean version of the indicators provided only for \code{fried.bool}, as described above} \item{Y}{sample responses (with N(0,1) noise)} \item{Ytrue}{true responses (without noise)} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Friedman, J. H. (1991). \emph{Multivariate adaptive regression splines.} \dQuote{Annals of Statistics}, \bold{19}, No. 1, 1--67. Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, \bold{to appear}. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} Chipman, H., George, E., \& McCulloch, R. (2002). \emph{Bayesian treed models.} Machine Learning, \bold{48}, 303--324. \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{An example using the original version of the data (\code{friedman.1.data}) is contained in the first package vignette: \code{vignette("tgp")}. The boolean version \code{fried.bool} is used in second vignette \code{vignette("tgp2")} } \seealso{ \code{\link{bgpllm}}, \code{\link{btlm}}, \code{\link{blm}}, \code{\link{bgp}}, \code{\link{btgpllm}}, \code{\link{bgp}}} \keyword{ datagen } tgp/man/tgp-package.Rd0000644000175100001440000000630212654547265014330 0ustar hornikusers\name{tgp-package} \alias{tgp-package} \docType{package} \title{ The Treed Gaussian Process Model Package } \description{ A Bayesian nonstationary nonparametric regression and design package implementing an array of models of varying flexibility and complexity. } \details{ This package implements Bayesian nonstationary, semiparametric nonlinear regression with \dQuote{treed Gaussian process models} with jumps to the limiting linear model (LLM). The package contains functions which facilitate inference for seven regression models of varying complexity using Markov chain Monte Carlo (MCMC): linear model, CART (Classification and Regression Tree), treed linear model, Gaussian process (GP), GP with jumps to the LLM, GP single-index models, treed GPs, treed GP LLMs, and treed GP single-index models. R provides an interface to the C/C++ backbone, and a serves as mechanism for graphically visualizing the results of inference and posterior predictive surfaces under the models. A Bayesian Monte Carlo based sensitivity analysis is implemented, and multi-resolution models are also supported. Sequential experimental design and adaptive sampling functions are also provided, including ALM, ALC, and expected improvement. The latter supports derivative-free optimization of noisy black-box functions. For a fuller overview including a complete list of functions, demos and vignettes, please use \code{help(package="tgp")}. } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, \bold{to appear}. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} Robert B. Gramacy, Heng Lian (2011). \emph{Gaussian process single-index models as emulators for computer experiments}. Available as ArXiv article 1009.4241 \url{http://arxiv.org/abs/1009.4241} Gramacy, R. B., Lee, H. K. H. (2006). \emph{Adaptive design of supercomputer experiments.} Available as UCSC Technical Report ams2006-02. Gramacy, R.B., Samworth, R.J., and King, R. (2007) \emph{Importance Tempering.} ArXiV article 0707.4242 \url{http://arxiv.org/abs/0707.4242} Gray, G.A., Martinez-Canales, M., Taddy, M.A., Lee, H.K.H., and Gramacy, R.B. (2007) \emph{Enhancing Parallel Pattern Search Optimization with a Gaussian Process Oracle}, SAND2006-7946C, Proceedings of the NECDC \url{http://bobby.gramacy.com/r_packages/tgp} } \keyword{ nonparametric } \keyword{ smooth } \keyword{ models } \keyword{ spatial } \keyword{ tree } \keyword{ hplot } tgp/man/btgp.Rd0000644000175100001440000006026712654547265013113 0ustar hornikusers\name{btgp} \title{Bayesian Nonparametric \& Nonstationary Regression Models} \alias{blm} \alias{btlm} \alias{bcart} \alias{bgp} \alias{bgpllm} \alias{btgp} \alias{btgpllm} \description{ The seven functions described below implement Bayesian regression models of varying complexity: linear model, linear CART, Gaussian process (GP), GP with jumps to the limiting linear model (LLM), treed GP, and treed GP LLM. } \usage{ blm(X, Z, XX = NULL, meanfn = "linear", bprior = "bflat", BTE = c(1000, 4000, 3), R = 1, m0r1 = TRUE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, trace = FALSE, verb = 1, ...) btlm(X, Z, XX = NULL, meanfn = "linear", bprior = "bflat", tree = c(0.5, 2), BTE = c(2000, 7000, 2), R = 1, m0r1 = TRUE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, trace = FALSE, verb = 1, ...) bcart(X, Z, XX = NULL, bprior = "bflat", tree = c(0.5, 2), BTE = c(2000, 7000, 2), R = 1, m0r1 = TRUE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv=FALSE, sens.p = NULL, trace = FALSE, verb = 1, ...) bgp(X, Z, XX = NULL, meanfn = "linear", bprior = "bflat", corr = "expsep", BTE = c(1000, 4000, 2), R = 1, m0r1 = TRUE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, nu = 1.5, trace = FALSE, verb = 1, ...) bgpllm(X, Z, XX = NULL, meanfn = "linear", bprior = "bflat", corr = "expsep", gamma=c(10,0.2,0.7), BTE = c(1000, 4000, 2), R = 1, m0r1 = TRUE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, nu = 1.5, trace = FALSE, verb = 1, ...) btgp(X, Z, XX = NULL, meanfn = "linear", bprior = "bflat", corr = "expsep", tree = c(0.5, 2), BTE = c(2000, 7000, 2), R = 1, m0r1 = TRUE, linburn = FALSE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, nu = 1.5, trace = FALSE, verb = 1, ...) btgpllm(X, Z, XX = NULL, meanfn = "linear", bprior = "bflat", corr = "expsep", tree = c(0.5, 2), gamma=c(10,0.2,0.7), BTE = c(2000, 7000, 2), R = 1, m0r1 = TRUE, linburn = FALSE, itemps = NULL, pred.n = TRUE, krige = TRUE, zcov = FALSE, Ds2x = FALSE, improv = FALSE, sens.p = NULL, nu = 1.5, trace = FALSE, verb = 1, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ Each of the above functions takes some subset of the following arguments... \item{X}{\code{data.frame}, \code{matrix}, or vector of inputs \code{X} } \item{Z}{ Vector of output responses \code{Z} of length equal to the leading dimension (rows) of \code{X}, i.e., \code{length(Z) == nrow(X)}} \item{XX}{ Optional \code{data.frame}, \code{matrix}, or vector of predictive input locations with the same number of columns as \code{X}, i.e., \code{ncol(XX) == ncol(X)}} \item{meanfn}{ A choice of mean function for the process. When \code{meanfn = "linear"} (default), then we have the process \deqn{Z = (\mathbf{1} \;\; \mathbf{X}) \mbox{\boldmath $\beta$} + W(\mathbf{X})}{Z = cbind(rep(1,nrow(X), X)) \%*\% beta + W(X),} where \eqn{W(\mathbf{X})}{W(X)} represents the Gaussian process part of the model (if present). Otherwise, when \code{meanfn = "constant"}, then \deqn{Z = \beta_0 + W(\mathbf{X})}{Z = beta0 + W(X).}} \item{bprior}{Linear (beta) prior, default is \code{"bflat"}; alternates include \code{"b0"} hierarchical Normal prior, \code{"bmle"} empirical Bayes Normal prior, \code{"b0not"} Bayesian treed LM-style prior from Chipman et al. (same as \code{"b0"} but without \code{tau2}), \code{"bmzt"} a independent Normal prior (mean zero) with inverse-gamma variance (\code{tau2}), and \code{"bmznot"} is the same as \code{"bmznot"} without \code{tau2}. The default \code{"bflat"} gives an \dQuote{improper} prior which can perform badly when the signal-to-noise ratio is low. In these cases the \dQuote{proper} hierarchical specification \code{"b0"} or independent \code{"bmzt"} or \code{"bmznot"} priors may perform better} \item{tree}{ a 2-vector containing the tree process prior parameterization \code{c(alpha, beta)} specifying \deqn{p_{\mbox{\tiny split}}(\eta, \mathcal{T}) = \alpha*(1+\eta)^\beta}{p(split leaf eta) = alpha*(1+depth(eta))^(-beta)} automatically giving zero probability to trees with partitions containing less than \code{min(c(10,nrow(X)+1))} data points. You may also specify a longer vector, writing over more of the components of the \code{$tree} output from \code{\link{tgp.default.params}}} \item{gamma}{Limiting linear model parameters \code{c(g, t1, t2)}, with growth parameter \code{g > 0} minimum parameter \code{t1 >= 0} and maximum parameter \code{t1 >= 0}, where \code{t1 + t2 <= 1} specifies \deqn{p(b|d)=t_1 +\exp\left\{\frac{-g(t_2-t_1)}{d-0.5}\right\}}{p(b|d)= t1 + exp(-g*(t2-t1)/(d-0.5))}} \item{corr}{ Gaussian process correlation model. Choose between the isotropic power exponential family (\code{"exp"}) or the separable power exponential family (\code{"expsep"}, default); the current version also supports the isotropic Matern (\code{"matern"}) and single-index Model (\code{"sim"}) as \dQuote{beta} functionality. % The option \code{"mrexpsep"} assumes % within each partition a version of % the multi-resolution stationary GP model described in Kennedy and O'Hagan % (2000). To use this option, the first column of the design % matrices \code{X} and \code{XX} must contain an indicator for % 'fine' (1) or 'coarse' (0) fidelity. \code{"mrexpsep"} is only % available with the \code{btgp} and \code{bgp} models, and % \code{linburn=TRUE} is not allowed. % See details below. } \item{BTE}{ 3-vector of Monte-carlo parameters (B)urn in, (T)otal, and (E)very. Predictive samples are saved every E MCMC rounds starting at round B, stopping at T. } \item{R}{ Number of repeats or restarts of \code{BTE} MCMC rounds, default \code{R=1} is no restarts} \item{m0r1}{If \code{TRUE} (default) the responses \code{Z} will be scaled to have a mean of zero and a range of 1} \item{linburn}{If \code{TRUE} initializes MCMC with \code{B} (additional) rounds of Bayesian Linear CART (\code{btlm}); default is \code{FALSE} } \item{itemps}{ Importance tempering (IT) inverse temperature ladder, or powers to improve mixing. See \code{\link{default.itemps}}. The default is no IT \code{itemps = NULL}} \item{pred.n}{\code{TRUE} (default) value results in prediction at the inputs \code{X}; \code{FALSE} skips prediction at \code{X} resulting in a faster implementation} \item{krige}{\code{TRUE} (default) value results in collection of kriging means and variances at predictive (and/or data) locations; \code{FALSE} skips the gathering of kriging statistics giving a savings in storage} \item{zcov}{If \code{TRUE} then the predictive covariance matrix is calculated-- can be computationally (and memory) intensive if \code{X} or \code{XX} is large. Otherwise only the variances (diagonal of covariance matrices) are calculated (default). See outputs \code{Zp.s2}, \code{ZZ.s2}, etc., below} \item{Ds2x}{\code{TRUE} results in ALC (Active Learning--Cohn) computation of expected reduction in uncertainty calculations at the \code{XX} locations, which can be used for adaptive sampling; \code{FALSE} (default) skips this computation, resulting in a faster implementation} \item{improv}{\code{TRUE} results in samples from the improvement at locations \code{XX} with respect to the observed data minimum. These samples are used to calculate the expected improvement over \code{XX}, as well as to rank all of the points in \code{XX} in the order that they should be sampled to minimize the expected multivariate improvement (refer to Schonlau et al, 1998). Alternatively, \code{improv} can be set to any positive integer 'g', in which case the ranking is performed with respect to the expectation for improvement raised to the power 'g'. Increasing 'g' leads to rankings that are more oriented towards a global optimization. The option \code{FALSE} (default) skips these computations, resulting in a faster implementation. Optionally, a two-vector can be supplied where \code{improv[2]} is interpreted as the (maximum) number of points to rank by improvement. See the note below. If not specified, the entire \code{XX} matrix is ranked. } \item{sens.p}{ Either \code{NULL} or a vector of parameters for sensitivity analysis, built by the function \code{\link{sens}}. Refer there for details} \item{nu}{ \dQuote{beta} functionality: fixed smoothness parameter for the Matern correlation function; \code{nu + 0.5} times differentiable predictive surfaces result} \item{trace}{ \code{TRUE} results in a saving of samples from the posterior distribution for most of the parameters in the model. The default is \code{FALSE} for speed/storage reasons. See note below } \item{verb}{ Level of verbosity of R-console print statements: from 0 (none); 1 (default) which shows the \dQuote{progress meter}; 2 includes an echo of initialization parameters; up to 3 and 4 (max) with more info about successful tree operations} \item{...}{ These ellipses arguments are interpreted as augmentations to the prior specification generated by \code{params <- \link{tgp.default.params}(ncol(X)+1)}. You may use these to specify a custom setting of any of default parameters in the output list \code{params} except those for which a specific argument is already provided (e.g., \code{params$corr} or \code{params$bprior}) or those which contradict the type of \code{b*} function being called (e.g., \code{params$tree} or \code{params$gamma}); these redundant or possibly conflicting specifications will be ignored. Refer to \code{tgp.default.params} for details on the prior specification} } \details{ The functions and their arguments can be categorized by whether or not they use treed partitioning (T), GP models, and jumps to the LLM (or LM) \tabular{lll}{ blm \tab LM \tab Linear Model \cr btlm \tab T, LM \tab Treed Linear Model \cr bcart \tab T \tab Treed Constant Model \cr bgp \tab GP \tab GP Regression \cr bgpllm \tab GP, LLM \tab GP with jumps to the LLM \cr btgp \tab T, GP \tab treed GP Regression \cr btgpllm \tab T, GP, LLM \tab treed GP with jumps to the LLM } Each function implements a special case of the generic function \code{tgp} which is an interface to C/C++ code for treed Gaussian process modeling of varying parameterization. Documentation for \code{tgp} has been declared redundant, and has subsequently been removed. To see how the \code{b*} functions use \code{tgp} simply examine the function. In the latest version, with the addition of the ellipses \dQuote{...} argument, there is nothing that can be done with the direct \code{tgp} function that cannot also be done with a \code{b*} function Only functions in the T (tree) category take the \code{tree} argument; GP category functions take the \code{corr} argument; and LLM category functions take the \code{gamma} argument. Non-tree class functions omit the \code{parts} output, see below \code{bcart} is the same as \code{btlm} except that only the intercept term in the LM is estimated; the others are zero, thereby implementing a Bayesian version of the original CART model The \code{sens.p} argument contains a vector of parameters for sensitivity analysis. It should be \code{NULL} unless created by the \code{sens} function. Refer to \code{help(sens)} for details. % If \code{corr="mrexpsep"} and the matrices X and XX are properly % formatted with an indicator first column (0='coarse', 1='fine'), % the stationary GP model fit within each partition has: % \deqn{ % Z_{\mbox{\tiny coarse}} \sim m(x) + \mbox{GP}(\sigma^2 + K_c) % }{ % Z[coarse] ~ 'meanfn' + GP(sigma^2 * K[c]) % } and % \deqn{ % Z_{\mbox{\tiny fine}} \sim Z_{\mbox{\tiny coarse}} + % \mbox{GP}(\sigma^2 \delta + K_f) % }{ % Z[fine] ~ Z_coarse + GP(sigma^2 * delta * K[f]) % } % Where each matrix \eqn{K_c}{K[c]} and \eqn{K_f}{K[f]} are based on the % same separable power exponential family plus a nugget effect that is % used for \code{corr="expsep"}. If \code{itemps =! NULL} then importance tempering (IT) is performed to get better mixing. After each restart (when \code{R > 1}) the observation counts are used to update the pseudo-prior. Stochastic approximation is performed in the first burn-in rounds (for \code{B-T} rounds, not \code{B}) when \code{c0} and \code{n0} are positive. Every subsequent burn-in after the first restart is for \code{B} rounds in order to settle-in after using the observation counts. See \code{\link{default.itemps}} for more details and an example Please see \code{vignette("tgp")} for a detailed illustration } \value{ \code{bgp} returns an object of class \code{"tgp"}. The function \code{\link{plot.tgp}} can be used to help visualize results. An object of class \code{"tgp"} is a list containing at least the following components... The \code{parts} output is unique to the T (tree) category functions. Tree viewing is supported by \code{\link{tgp.trees}} \item{X}{Input argument: \code{data.frame} of inputs \code{X}} \item{n}{Number of rows in \code{X}, i.e., \code{nrow(X)}} \item{d}{Number of cols in \code{X}, i.e., \code{ncol(X)}} \item{Z}{Vector of output responses \code{Z}} \item{XX}{Input argument: \code{data.frame} of predictive locations \code{XX}} \item{nn}{Number of rows in \code{XX}, i.e., \code{nrow(XX)}} \item{BTE}{Input argument: Monte-carlo parameters} \item{R}{Input argument: restarts} \item{linburn}{Input argument: initialize MCMC with linear CART} \item{params}{\code{list} of model parameters generated by \code{\link{tgp.default.params}} and subsequently modified according to the calling \code{b*} function and its arguments} \item{dparams}{Double-representation of model input parameters used by the C-code} \item{itemps}{\code{data.frame} containing the importance tempering ladders and pseudo-prior: \code{$k} has inverse inverse temperatures (from the input argument), \code{$k} has an \emph{updated} pseudo-prior based on observation counts and (possibly) stochastic approximation during burn-in and (input) stochastic approximation parameters \eqn{c_0}{c0} and \eqn{n_0}{n0}. See \code{\link{default.itemps}} for more info} \item{Zp.mean}{Vector of mean predictive estimates at \code{X} locations} \item{Zp.q1}{Vector of 5\% predictive quantiles at \code{X} locations} \item{Zp.q2}{Vector of 95\% predictive quantiles at \code{X} locations} \item{Zp.q}{Vector of quantile norms \code{Zp.q2-Zp.q1}} \item{Zp.s2}{If input \code{zcov = TRUE}, then this is a predictive covariance matrix for the inputs at locations \code{X}; otherwise then this is a vector of predictive variances at the \code{X} locations (diagonal of the predictive covariance matrix). Only appears when input \code{pred.n = TRUE}} \item{Zp.km}{Vector of (expected) kriging means at \code{X} locations} \item{Zp.vark}{Vector of posterior variance for kriging surface (no additive noise) at \code{X} locations} \item{Zp.ks2}{Vector of (expected) predictive kriging variances at \code{X} locations} \item{ZZ.mean}{Vector of mean predictive estimates at \code{XX} locations} \item{ZZ.q1}{Vector of 5\% predictive quantiles at \code{XX} locations} \item{ZZ.q2}{Vector of 95\% predictive quantiles at \code{XX} locations} \item{ZZ.q}{Vector of quantile norms \code{ZZ.q2-ZZ.q1}, used by the ALM adaptive sampling algorithm} \item{ZZ.s2}{If input \code{zcov = TRUE}, then this is a predictive covariance matrix for predictive locations \code{XX}; otherwise then this is a vector of predictive variances at the \code{XX} locations (diagonal of the predictive covariance matrix). Only appears when input \code{XX != NULL}} \item{ZpZZ.s2}{If input \code{zcov = TRUE}, then this is a predictive \code{n * nn} covariance matrix between locations in \code{X} and \code{XX}; Only appears when \code{zcov = TRUE} and both \code{pred.n = TRUE} and \code{XX != NULL}} \item{ZZ.km}{Vector of (expected) kriging means at \code{XX} locations} \item{ZZ.vark}{Vector of posterior variance for kriging surface (no additive noise) at \code{XX} locations} \item{ZZ.ks2}{Vector of (expected) predictive kriging variances at \code{XX} locations} \item{Ds2x}{If argument \code{Ds2x=TRUE}, this vector contains ALC statistics for \code{XX} locations} \item{improv}{If argument \code{improv} is \code{TRUE} or a positive integer, this is a 'matrix' with first column set to the expected improvement statistics for \code{XX} locations, and the second column set to a ranking in the order that they should be sampled to minimize the expected multivariate improvement raised to a power determined by the argument \code{improv}} \item{response}{Name of response \code{Z} if supplied by \code{data.frame} in argument, or "z" if none provided} \item{parts}{Internal representation of the regions depicted by partitions of the maximum a' posteriori (MAP) tree} \item{trees}{\code{list} of trees (\pkg{maptree} representation) which were MAP as a function of each tree height sampled between MCMC rounds \code{B} and \code{T}} \item{trace}{If \code{trace==TRUE}, this \code{list} contains traces of most of the model parameters and posterior predictive distributions at input locations \code{XX}. Otherwise the entry is \code{FALSE}. See note below} \item{ess}{Importance tempering effective sample size (ESS). If \code{itemps==NULL} this corresponds to the total number of samples collected, i.e.. \code{R*(BTE[2]-BTE[1])/BTE[3]}. Otherwise the ESS will be lower due to a non-zero coefficient of variation of the calculated importance tempering weights} \item{sens}{ See \code{\link{sens}} documentation for more details} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, to appear. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} Gramacy, R. B. and Lee, K.H. (2008). \emph{Gaussian Processes and Limiting Linear Models.} Computational Statistics and Data Analysis, 53, pp. 123-136. Also available as ArXiv article 0804.4685 \url{http://arxiv.org/abs/0804.4685} Gramacy, R. B., Lee, H. K. H. (2009). \emph{Adaptive design and analysis of supercomputer experiments.} Technometrics, to appear. Also avaliable on ArXiv article 0805.4359 \url{http://arxiv.org/abs/0805.4359} Robert B. Gramacy, Heng Lian (2011). \emph{Gaussian process single-index models as emulators for computer experiments}. Available as ArXiv article 1009.4241 \url{http://arxiv.org/abs/1009.4241} Chipman, H., George, E., \& McCulloch, R. (1998). \emph{Bayesian CART model search (with discussion).} Journal of the American Statistical Association, \bold{93}, 935--960. Chipman, H., George, E., \& McCulloch, R. (2002). \emph{Bayesian treed models.} Machine Learning, \bold{48}, 303--324. M. Schonlau and Jones, D.R. and Welch, W.J. (1998). \emph{Global versus local search in constrained optimization of computer models.} In "New Developments and applications in experimental design", IMS Lecture Notes - Monograph Series 34. 11--25. \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{ Inputs \code{X, XX, Z} containing \code{NaN, NA}, or \code{Inf} are discarded with non-fatal warnings Upon execution, MCMC reports are made every 1,000 rounds to indicate progress Stationary (non-treed) processes on larger inputs (e.g., \code{X,Z}) of size greater than 500, *might* be slow in execution, especially on older machines. Once the C code starts executing, it can be interrupted in the usual way: either via Ctrl-C (Unix-alikes) or pressing the Stop button in the \R-GUI. When this happens, interrupt messages will indicate which required cleanup measures completed before returning control to \R. Whereas most of the \pkg{tgp} models will work reasonably well with little or no change to the default prior specification, GP's with the \code{"mrexpsep"} correlation imply a very specific relationship between fine and coarse data, and a careful prior specification is usually required. The ranks provided in the second column of the \code{improv} field of a \code{tgp} object are based on the expectation of a multivariate improvement that may or may not be raised to a positive integer power. They can thus differ significantly from a simple ranking of the first column of expected univariate improvement values. Regarding \code{trace=TRUE}: Samples from the posterior will be collected for all parameters in the model. GP parameters are collected with reference to the locations in \code{XX}, resulting \code{nn=nrow{XX}} traces of \code{d,g,s2,tau2}, etc. Therefore, it is recommended that \code{nn} is chosen to be a small, representative, set of input locations. Besides GP parameters, traces are saved for the tree partitions, areas under the LLM, log posterior (as a function of tree height), and samples from the posterior predictive distributions. Note that since some traces are stored in files, multiple \code{tgp}/\R sessions in the same working directory can clobber the trace files of other sessions } \seealso{ \code{\link{plot.tgp}}, \code{\link{tgp.trees}}, \code{\link{predict.tgp}}, \code{\link{sens}}, \code{\link{default.itemps}}} \examples{ ## ## Many of the examples below illustrate the above ## function(s) on random data. Thus it can be fun ## (and informative) to run them several times. ## # # simple linear response # # input and predictive data X <- seq(0,1,length=50) XX <- seq(0,1,length=99) Z <- 1 + 2*X + rnorm(length(X),sd=0.25) out <- blm(X=X, Z=Z, XX=XX) # try Linear Model plot(out) # plot the surface # # 1-d Example # # construct some 1-d nonstationary data X <- seq(0,20,length=100) XX <- seq(0,20,length=99) Z <- (sin(pi*X/5) + 0.2*cos(4*pi*X/5)) * (X <= 9.6) lin <- X>9.6; Z[lin] <- -1 + X[lin]/10 Z <- Z + rnorm(length(Z), sd=0.1) out <- btlm(X=X, Z=Z, XX=XX) # try Linear CART plot(out) # plot the surface tgp.trees(out) # plot the MAP trees out <- btgp(X=X, Z=Z, XX=XX) # use a treed GP plot(out) # plot the surface tgp.trees(out) # plot the MAP trees # # 2-d example # (using the isotropic correlation function) # # construct some 2-d nonstationary data exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z XX <- exp2d.data$XX # try a GP out <- bgp(X=X, Z=Z, XX=XX, corr="exp") plot(out) # plot the surface # try a treed GP LLM out <- btgpllm(X=X, Z=Z, XX=XX, corr="exp") plot(out) # plot the surface tgp.trees(out) # plot the MAP trees # # Motorcycle Accident Data # # get the data require(MASS) # try a GP out <- bgp(X=mcycle[,1], Z=mcycle[,2]) plot(out) # plot the surface # try a treed GP LLM # best to use the "b0" beta linear prior to capture common # common linear process throughout all regions (using the # ellipses "...") out <- btgpllm(X=mcycle[,1], Z=mcycle[,2], bprior="b0") plot(out) # plot the surface tgp.trees(out) # plot the MAP trees } \keyword{ nonparametric } \keyword{ nonlinear } \keyword{ smooth } \keyword{ models } \keyword{ regression } \keyword{ spatial } \keyword{ tree } \keyword{ optimize } tgp/man/mapT.Rd0000644000175100001440000000544212654547265013052 0ustar hornikusers\name{mapT} \alias{mapT} \title{ Plot the MAP partition, or add one to an existing plot } \description{ Plot the maximum a' posteriori (MAP) tree from a \code{"tgp"}-class object, or add one on top of an existing plot. Like \code{plot.tgp}, projections and slices of trees can be plotted as specified } \usage{ mapT(out, proj = NULL, slice = NULL, add = FALSE, lwd = 2, ...) } \arguments{ \item{out}{ \code{"tgp"}-class object which is the output of one the model functions with tree support (e.g. \code{\link{btgpllm}})} \item{proj}{1-or-2-Vector describing the dimensions to be shown in a projection. The argument is ignored for 1-d data, i.e., if \code{x$d == 1}. For 2-d data, no projection needs to be specified--- the default argument (\code{proj = NULL}) will result in a 2-d plot. 1-d projections of 2-d or higher trees are are supported, e.g., \code{proj = c(2)} would show the second variable projection. For 3-d data or higher, \code{proj=NULL} defaults to \code{proj = c(1,2)} which plots a 2-d projection of the trees for the first two variables. Slices have priority over projections--- see next argument (\code{slice})--- when non-null arguments are provided for both.} \item{slice}{\code{list} object with \code{x} and \code{z} fields, which are vectors of equal length describing the slice to be plotted, i.e., which z-values of the treed partitions in the \code{x$d - 2} inputs \code{x$X} and \code{x$XX} should be fixed to in order to obtain a 2-d visualization. For example, for 4-d data, \code{slice = list(x=(2,4), z=c(0.2, 1.5)} will result in a 2-d plot of the first and third dimensions which have the second and fourth slice fixed at 0.5 and 1.5. The default is \code{NULL}, yielding to the \code{proj} argument. Argument is ignored for 1-d data, i.e., if \code{x$d == 1}} \item{add}{ Specify whether the to add partitions to an existing plot (\code{add = TRUE}) or to make a new plot showing the data \code{out$X} along with the partitions (default \code{add = FALSE})} \item{lwd}{ Plotting argument specifying the width of the lines used to depict the partitions} \item{...}{ Additional arguments to \code{plot} used when \code{add = FALSE}} } \value{ The only output of this function is a beautiful region-representation of the MAP tree. } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \note{ For examples, see \code{vignette("tgp")} and the examples provided in the documentation for the \code{\link{tgp.design}} function } \seealso{ \code{\link{plot.tgp}}, \code{\link{tgp.trees}}, \code{\link{tgp.design}}, \code{vignette("tgp")}} \keyword{ hplot } \keyword{ tree } tgp/man/tgp.design.Rd0000644000175100001440000001133712654547265014213 0ustar hornikusers\name{tgp.design} \alias{tgp.design} \title{ Sequential Treed D-Optimal Design for Treed Gaussian Process Models } \description{ Based on the maximum a' posteriori (MAP) treed partition extracted from a \code{"tgp"}-class object, calculate independent sequential treed D-Optimal designs in each of the regions. } \usage{ tgp.design(howmany, Xcand, out, iter = 5000, verb = 0) } \arguments{ \item{howmany}{Number of new points in the design. Must be less than the number of candidates contained in \code{Xcand}, i.e., \code{howmany <= nrow(Xcand)}} \item{Xcand}{ \code{data.frame}, \code{matrix} or vector of candidates from which new design points are subsampled. Must have \code{nrow(Xcand) == nrow(out$X)} } \item{out}{ \code{"tgp"}-class object output from one of the model functions which has tree support, e.g., \code{\link{btgpllm}}, \code{\link{btgp}}, \code{\link{btlm}}} \item{iter}{number of iterations of stochastic accent algorithm, default \code{5000}} \item{verb}{positive integer indicating after how many rounds of stochastic approximation in \code{\link{dopt.gp}} to print each progress statement; default \code{verb=0} results in no printing} } \details{ This function partitions \code{Xcand} and \code{out$X} based on the MAP tree (obtained on \code{"tgp"}-class \code{out} with \code{\link{partition}}) and calls \code{\link{dopt.gp}} in order to obtain a D-optimal design under independent stationary Gaussian processes models defined in each region. The aim is to obtain a design where new points from \code{Xcand} are spaced out relative to themselves, and relative to the existing locations (\code{out$X}) in the region. The number of new points from each region of the partition is proportional to the number of candidates \code{Xcand} in the region. } \value{ Output is a list of \code{data.frame}s containing \code{XX} design points for each region of the MAP tree in \code{out} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Gramacy, R. B., Lee, H. K. H. (2006). \emph{Adaptive design and analysis of supercomputer experiments.} Technometrics, to appear. Also avaliable on ArXiv article 0805.4359 \url{http://arxiv.org/abs/0805.4359} Gramacy, R. B., Lee, H. K. H., \& Macready, W. (2004). \emph{Parameter space exploration with Gaussian process trees.} ICML (pp. 353--360). Omnipress \& ACM Digital Library. \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{ Input \code{Xcand} containing \code{NaN, NA, Inf} are discarded with non-fatal warnings D-Optimal computation in each region is preceded by a print statement indicated the number of new locations to be chosen and the number of candidates in the region. Other than that, there are no other indicators of progress. You will have to be patient. Creating treed sequential D-optimal designs is no speedy task. At least it faster than the non-treed version (see \code{\link{dopt.gp}}). The example below is also part of \code{vignette("tgp")}. Please see \code{vignette("tgp2")} for a similar example based on optimization using the \code{\link{optim.step.tgp}} } \seealso{ \code{\link{bgpllm}}, \code{\link{btlm}}, \code{\link{blm}}, \code{\link{bgp}}, \code{\link{btgpllm}}, \code{\link{plot.tgp}}, \code{\link{dopt.gp}}, \code{\link{lhs}}, \code{\link{partition}}, \code{\link{optim.step.tgp}}} \examples{ # # 2-d Exponential data # (This example is based on random data. # It might be fun to run it a few times) # # get the data exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z Xcand <- exp2d.data$XX # fit treed GP LLM model to data w/o prediction # basically just to get MAP tree (and plot it) out <- btgpllm(X=X, Z=Z, pred.n=FALSE, corr="exp") tgp.trees(out) # find a treed sequential D-Optimal design # with 10 more points. It is interesting to # contrast this design with one obtained via # the dopt.gp function XX <- tgp.design(10, Xcand, out) # now fit the model again in order to assess # the predictive surface at those new design points dout <- btgpllm(X=X, Z=Z, XX=XX, corr="exp") plot(dout) } \keyword{ design } \keyword{ optimize } \keyword{ spatial } \keyword{ tree } tgp/man/optim.tgp.Rd0000644000175100001440000001617712654547265014101 0ustar hornikusers\name{optim.tgp} \alias{optim.step.tgp} \alias{optim.ptgpf} \title{ Surrogate-based optimization of noisy black-box function } \description{ Optimize (minimize) a noisy black-box function (i.e., a function which may not be differentiable, and may not execute deterministically). A \code{b*} \pkg{tgp} model is used as a surrogate for adaptive sampling via improvement (and other) statistics. Note that this function is intended as a skeleton to be tailored as required for a particular application } \usage{ optim.step.tgp(f, rect, model = btgp, prev = NULL, X = NULL, Z = NULL, NN = 20 * length(rect), improv = c(1, 5), cands = c("lhs", "tdopt"), method = c("L-BFGS-B", "Nelder-Mead", "BFGS", "CG", "SANN", "optimize"), ...) optim.ptgpf(start, rect, tgp.obj, method=c("L-BFGS-B", "Nelder-Mead", "BFGS", "CG", "SANN", "optimize")) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{f}{ A function to be optimized, having only one free argument } \item{rect}{ \code{matrix} indicating the domain of the argument of \code{f} over which an optimal should be searched; must have \code{ncol(rect) = 2} and \code{nrow} agreeing with the argument of \code{f} indicating the dimension of the data. For 1-d data, a vector of length 2 is allowed} \item{model}{ The \code{b*} regression model used as a surrogate for optimization; see \code{\link{btgp}}, and others, for more detail } \item{prev}{ The output from a previous call to \code{optim.step.tgp}; this should be a \code{list} with entries as described the \dQuote{Value} section below } \item{X}{\code{data.frame}, \code{matrix}, or vector of current inputs \code{X}, to be augmented } \item{Z}{ Vector of current output responses \code{Z} of length equal to the leading dimension (rows) of \code{X}, i.e., \code{length(Z) == nrow(X)}, to be augmented} \item{NN}{ Number of candidate locations (\code{XX}) at which to sample from the improvement statistic } \item{improv}{ Indicates the \code{improv} argument provided to a \code{b*} \code{model} function for sampling from the improvement statistic at the \code{NN} candidate locations (\code{XX}); see \code{\link{btgp}}, and others, for more detail} \item{cands}{ The type of candidates (\code{XX}) at which samples from the improvement statistics are gathered. The default setting of \code{"lhs"} is recommended. However, a sequential treed D-optimal design can be used with \code{"tdopt"} for a more global exploration; see \code{\link{tgp.design}} for more details } \item{method}{ A method from \code{\link{optim}}, or \code{"optimize"} which uses \code{\link{optimize}} as appropriate (when the input-space is 1-d)} \item{\dots}{ Further arguments to the \code{b*} \code{model} function} \item{start}{ A starting value for optimization of the MAP predictive (kriging) surface of a \code{"tgp"}-class object. A good starting value is the \code{X} or \code{XX} location found to be a minimum in the mean predictive surface contained in \code{"tgp"}-class object } \item{tgp.obj}{ A \code{"tgp"}-class object that is the output of one of the \code{b*} functions: \code{\link{blm}}, \code{\link{btlm}} \code{\link{bgp}}, \code{\link{bgpllm}}, \code{\link{btgp}}, or \code{\link{btgpllm}}, as can be used by \code{\link{predict.tgp}} for optimizing on the MAP predictive (surrogate) kriging surface } } \details{ \code{optim.step.tgp} executes one step in a search for the global optimum (minimum) of a noisy function (\code{Z~f(X)}) in a bounded rectangle (\code{rect}). The procedure essentially fits a tgp \code{model} and samples from the posterior distribution of improvement statistics at \code{NN+1} candidates locations. \code{NN} of the candidates come from \code{cands}, i.e., \code{"lhs"} or \code{"tdopt"}, plus one which is the location of the minima found in a previous run via \code{prev} by using \code{\link{optim}} (with a particular \code{method} or \code{\link{optimize}} instead) on the MAP \code{model} predictive surface using the \code{"tgp"}-class object contained therein. The \code{improv[2]} with the the highest expected improvement are recommended for adding into the design on output. \code{optim.ptgpf} is the subroutine used by \code{optim.step.tgp} to find optimize on the MAP (surrogate) predictive surface for the \code{"tgp"}-class object contained in \code{prev}. Please see \code{vignette("tgp2")} for a detailed illustration } \value{ The \code{list} return has the following components. \item{X }{ A \code{matrix} with \code{nrow(rect)} columns whose rows contain recommendations for input locations to add into the design } \item{progress }{ A one-row \code{data.frame} indicating the the \code{X}-location and objective value of the current best guess of the solution to the (kriging) surrogate optimization along with the maximum values of the improvement statistic } \item{obj }{ the \code{"tgp"}-class object output from the \code{model} function } } \references{ Matthew Taddy, Herbert K.H. Lee, Genetha A. Gray, and Joshua D. Griffin. (2009) \emph{Bayesian guided pattern search for robust local optimization.} Technometrics, to appear. \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{ The ellipses (\code{\dots}) argument is used differently here, as compared to \code{\link{optim}}, and \code{\link{optimize}}. It allows further arguments to be passed to the \code{b*} \code{model} function, whereas for \code{\link{optim}} it would describe further (static) arguments to the function \code{f} to be optimized. If static arguments need to be set for \code{f}, then we recommend setting defaults via the \code{\link{formals}} of \code{f} } \seealso{ \code{\link{btgp}}, etc., \code{\link{optim}}, \code{\link{optimize}}, \code{\link{tgp.design}}, \code{\link{predict.tgp}}, \code{\link{dopt.gp}} } \examples{ ## optimize the simple exponential function f <- function(x) { exp2d.Z(x)$Z } ## create the initial design with D-optimal candidates rect <- rbind(c(-2,6), c(-2,6)) Xcand <- lhs(500, rect) X <- dopt.gp(50, X=NULL, Xcand)$XX Z <- f(X) ## do 10 rounds of adaptive sampling out <- progress <- NULL for(i in 1:10) { ## get recommendations for the next point to sample out <- optim.step.tgp(f, X=X, Z=Z, rect=rect, prev=out) ## add in the inputs, and newly sampled outputs X <- rbind(X, out$X) Z <- c(Z, f(out$X)) ## keep track of progress and best optimum progress <- rbind(progress, out$progress) print(progress[i,]) } ## plot the progress so far par(mfrow=c(2,2)) plot(out$obj, layout="surf") plot(out$obj, layout="as", as="improv") matplot(progress[,1:nrow(rect)], main="optim results", xlab="rounds", ylab="x[,1:2]", type="l", lwd=2) plot(log(progress$improv), type="l", main="max log improv", xlab="rounds", ylab="max log(improv)") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ optimize } \keyword{ design } tgp/man/plot.tgp.Rd0000644000175100001440000001776412654547265013732 0ustar hornikusers\name{plot.tgp} \alias{plot.tgp} \title{ Plotting for Treed Gaussian Process Models } \description{ A generic function for plotting of \code{"tgp"}-class objects. 1-d posterior mean and error plots, 2-d posterior mean and error image and perspective plots, and 3+-dimensional mean and error image and perspective plots are supported via projection and slicing. } \usage{ \method{plot}{tgp}(x, pparts = TRUE, proj = NULL, slice = NULL, map = NULL, as = NULL, center = "mean", layout = "both", main = NULL, xlab = NULL, ylab = NULL, zlab = NULL, pc = "pc", gridlen = c(40,40), span = 0.1, legendloc = "topright", maineff = TRUE, mrlayout="both", rankmax = 20, ...) } \arguments{ \item{x}{ \code{"tgp"}-class object that is the output of one of the \code{b*} functions: \code{\link{blm}}, \code{\link{btlm}} \code{\link{bgp}}, \code{\link{bgpllm}}, \code{\link{btgp}}, or \code{\link{btgpllm}}} \item{pparts}{If \code{TRUE}, partition-regions are plotted (default), otherwise they are not} \item{proj}{1-or-2-Vector describing the dimensions to be shown in a projection. The argument is ignored for 1-d data, i.e., if \code{x$d == 1}. For 2-d data, no projection needs be specified--- the default argument (\code{proj = NULL}) will result in a 2-d perspective or image plot. 1-d projections of 2-d or higher data are are supported, e.g., \code{proj = c(2)} would show the second variable projection. For 3-d data or higher, \code{proj=NULL} defaults to \code{proj = c(1,2)} which plots a 2-d projection for the first two variables. Slices have priority over the projections--- see next argument (\code{slice})--- when non-null arguments are provided for both.} \item{slice}{\code{list} object with \code{x} and \code{z} fields, which are vectors of equal length describing the slice to be plotted, i.e., which z-values of the \code{x$d - 2} inputs \code{x$X} and \code{x$XX} should be fixed to in order to obtain a 2-d visualization. For example, for 4-d data, \code{slice = list(x=(2,4), z=c(0.2, 1.5)} will result in a 2-d plot of the first and third dimensions which have the second and fourth slice fixed at 0.5 and 1.5. The default is \code{NULL}, yielding to the \code{proj} argument. Argument is ignored for 1-d data, i.e., if \code{x$d == 1}} \item{map}{Optional 2-d map (longitude and latitude) from \pkg{maps} to be shown on top of image plots} \item{center}{Default \code{center = "mean"} causes the posterior predictive mean to be plotted as the centering statistic. Otherwise the median can be used with \code{center = "med"}, or the kriging mean with \code{center = "km"}} \item{as}{Optional string indicator for plotting of adaptive sampling statistics: specifying \code{as = "alm"} for ALM, \code{as = "s2"} for predictive variance, \code{as = "ks2"} for expected kriging variance, \code{as = "alc"} for ALC, and \code{as = "improv"} for expected improvement (about the minimum, see the \code{rankmax} argument below). The default \code{as = NULL} plots error-bars (1d-plots) or error magnitudes (2d-plots), which is essentially the same as \code{as = "alm"}} \item{layout}{Specify whether to plot the mean predictive surface (\code{layout = "surf"}), the error or adaptive sampling statistics (\code{layout = "as"}), or default (\code{layout = "both"}) which shows both. If \code{layout = "sens"}, plot the results of a sensitivity analysis (see \code{\link{sens}}) in a format determined by the argument \code{maineff} below. } \item{main}{Optional \code{character} string to add to the main title of the plot} \item{xlab}{Optional \code{character} string to add to the x label of the plots} \item{ylab}{Optional \code{character} string to add to the y label of the plots} \item{zlab}{Optional \code{character} string to add to the z label of the plots; ignored unless \code{pc = "p"}} \item{pc}{ Selects perspective-posterior mean and image-error plots (\code{pc = "pc"}, the default) or a double--image plot (\code{pc = "c"})} (only valid for 2-d plots) \item{gridlen}{ Number of regular grid points for 2-d slices and projections in x and y. The default of \code{gridlen = c(40,40)} causes a \code{40 * 40} grid of \code{X}, \code{Y}, and \code{Z} values to be computed. Ignored for 1-d plots and projections} \item{span}{ Span for \code{\link[stats]{loess}} kernel. The \pkg{tgp} package default (\code{span = 0.1}) is set lower than the \code{\link[stats]{loess}} default. Smaller spans can lead to warnings from \code{\link[stats]{loess}} when the data or predictive locations are sparse and ugly plots may result. In this case, try increasing the span} \item{legendloc}{ Location of the \code{\link{legend}} included in the plots of sensitivity analyses produced with \code{layout = "sens"}, or 1-d plots of multi-resolution models (with \code{corr = "mrexpsep"}) and option \code{mrlayout = "both"}; otherwise the argument is ignored} \item{maineff}{ Format for the plots of sensitivity analyses produced with \code{layout = "sens"}; otherwise the argument is ignored. If \code{maineff=TRUE} main effect plots are produced alongside boxplots for posterior samples of the sensitivity indices, and if \code{FALSE} only the boxplots are produced. Alternatively, \code{maineff} can be a matrix containing input dimensions in the configuration that the corresponding main effects are to be plotted; that is, \code{mfrow=dim(maineff)}. In this case, a 90 percent interval is plotted with each main effect and the sensitivity index boxplots are not plotted.} \item{mrlayout}{ The plot layout for double resolution tgp objects with \code{params$corr == "mrexpsep"}. For the default \code{mrlayout="both"}, the coarse and fine fidelity are plotted together, either on the same plot for 1D inputs or through side-by-side image plots of the predicted \code{center} with axis determined by \code{proj} for inputs of greater dimension. Note that many of the standard arguments -- such as \code{slice}, \code{pc}, and \code{map} -- are either non-applicable or unsupported for \code{mrlayout="both"}. If \code{mrlayout="coarse"} or \code{mrlayout="fine"}, prediction for the respective fidelity is plotted as usual and all of the standard options apply.} \item{rankmax}{ When \code{as = "improv"} is provided, the posterior expected improvements are plotted according the the first column of the \code{improv} field of the \code{"tgp"}-class object. Text is added to the plot near the \code{XX} positions of the first \code{1:rankmax} predictive locations with the highest ranks in the second column of the \code{improv} field. } \item{\dots}{ Extra arguments to 1-d (\code{\link[graphics]{plot}}) and 2-d plotting functions \code{persp} and \code{image}} } \value{ The only output of this function is beautiful plots } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \note{ This plotting function is provided with the intention that it will be used as an aid in the visualization of \code{"tgp"}-class objects. Users are encouraged to use the source code for this function in order to develop custom plotting functions. 1-d projections for 3-d or higher data are also available by specifying a 1-d projection argument (e.g. \code{proj=c(1)} for projecting onto the first input variable). For examples, see \code{vignette("tgp")} and the help files of those functions in "See Also", below } \seealso{ \code{\link[graphics]{plot}}, \code{\link{bgpllm}}, \code{\link{btlm}}, \code{\link{blm}}, \code{\link{bgp}}, \code{\link{btgpllm}}, \code{\link{predict.tgp}}, \code{\link{tgp.trees}}, \code{\link{mapT}}, \code{\link{loess}}, \code{\link{sens}}} \keyword{ hplot } \keyword{ tree } tgp/man/exp2d.Z.Rd0000644000175100001440000000452112654547265013400 0ustar hornikusers\name{exp2d.Z} \alias{exp2d.Z} \title{ Random Z-values for 2-d Exponential Data } \description{ Evaluate the functional (mean) response for the 2-d exponential data (truth) at the \code{X} inputs, and randomly sample noisy \code{Z}--values having normal error with standard deviation provided. } \usage{exp2d.Z(X, sd=0.001)} \arguments{ \item{X}{Must be a \code{matrix} or a \code{data.frame} with two columns describing input locations} \item{sd}{Standard deviation of iid normal noise added to the responses} } \value{ Output is a \code{data.frame} with columns: \item{Z}{Numeric vector describing the responses (with noise) at the \code{X} input locations} \item{Ztrue}{Numeric vector describing the true responses (without noise) at the \code{X} input locations} } \details{ The response is evaluated as \deqn{Z(X)=x_1 * \exp(x_1^2-x_2^2).}{Z(X) = X1 * exp(-X1^2-X2^2),} thus creating the outputs \code{Z} and \code{Ztrue}. Zero-mean normal noise with \code{sd=0.001} is added to the responses \code{Z} and \code{ZZ} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, \bold{to appear}. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} \url{http://bobby.gramacy.com/r_packages/tgp} } \seealso{\code{\link{exp2d}}, \code{\link{exp2d.rand}}} \examples{ N <- 20 x <- seq(-2,6,length=N) X <- expand.grid(x, x) Zdata <- exp2d.Z(X) persp(x,x,matrix(Zdata$Ztrue, nrow=N), theta=-30, phi=20, main="Z true", xlab="x1", ylab="x2", zlab="Ztrue") } \keyword{datagen} tgp/man/dopt.gp.Rd0000644000175100001440000000673212506600653013512 0ustar hornikusers\name{dopt.gp} \alias{dopt.gp} \title{Sequential D-Optimal Design for a Stationary Gaussian Process} \description{ Create sequential D-Optimal design for a stationary Gaussian process model of fixed parameterization by subsampling from a list of candidates } \usage{ dopt.gp(nn, X=NULL, Xcand, iter=5000, verb=0) } \arguments{ \item{nn}{ Number of new points in the design. Must be less than or equal to the number of candidates contained in \code{Xcand}, i.e., \code{nn <= nrow(Xcand)}} \item{X}{ \code{data.frame}, \code{matrix} or vector of input locations which are forced into (already in) the design} \item{Xcand}{ \code{data.frame}, \code{matrix} or vector of candidates from which new design points are subsampled. Must have the same dimension as \code{X}, i.e., \code{ncol(X) == ncol(Xcand)}} \item{iter}{number of iterations of stochastic accent algorithm, default \code{5000}} \item{verb}{positive integer indicating after how many rounds of stochastic approximation to print each progress statement; default \code{verb=0} results in no printing} } \details{ Design is based on a stationary Gaussian process model with stationary isotropic exponential correlation function with parameterization fixed as a function of the dimension of the inputs. The algorithm implemented is a simple stochastic ascent which maximizes \code{det(K)}-- the covariance matrix constructed with locations \code{X} and a subset of \code{Xcand} of size \code{nn}. The selected design is \emph{locally} optimal } \value{ The output is a list which contains the inputs to, and outputs of, the C code used to find the optimal design. The chosen design locations can be accessed as list members \code{XX} or equivalently \code{Xcand[fi,]}. \item{X}{Input argument: \code{data.frame} of inputs \code{X}, can be \code{NULL}} \item{nn}{Input argument: number new points in the design} \item{Xcand}{Input argument: \code{data.frame} of candidate locations \code{Xcand}} \item{ncand}{Number of rows in \code{Xcand}, i.e., \code{nncand = dim(Xcand)[1]}} \item{fi}{Vector of length \code{nn} describing the selected new design locations as indices into \code{Xcand}} \item{XX}{\code{data.frame} of selected new design locations, i.e., \code{XX = Xcand[fi,]}} } \references{ Chaloner, K. and Verdinelli, I. (1995). \emph{Bayesian experimental design: A review.} Statist. Sci., 10, (pp. 273--304). } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{ Inputs \code{X, Xcand} containing \code{NaN, NA, Inf} are discarded with non-fatal warnings. If \code{nn > dim(Xcand)[1]} then a non-fatal warning is displayed and execution commences with \code{nn = dim(Xcand)[1]} In the current version there is no progress indicator. You will have to be patient. Creating D-optimal designs is no speedy task } \seealso{ \code{\link{tgp.design}}, \code{\link{lhs}}} \examples{ # # 2-d Exponential data # (This example is based on random data. # It might be fun to run it a few times) # # get the data exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z Xcand <- exp2d.data$XX # find a treed sequential D-Optimal design # with 10 more points dgp <- dopt.gp(10, X, Xcand) # plot the d-optimally chosen locations # Contrast with locations chosen via # the tgp.design function plot(X, pch=19, xlim=c(-2,6), ylim=c(-2,6)) points(dgp$XX) } \keyword{ design } \keyword{ spatial } \keyword{ optimize } tgp/man/tgp.trees.Rd0000644000175100001440000000435712654547265014070 0ustar hornikusers\name{tgp.trees} \alias{tgp.trees} \title{ Plot the MAP Tree for each height encountered by the Markov Chain} \description{ Plot the maximum a' posteriori (MAP) tree as a function of tree height, and show the log posterior probabilities for comparison. } \usage{ tgp.trees(out, heights = NULL, main = NULL, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{out}{ \code{"tgp"}-class object which is the output of one the model functions with tree support (e.g. \code{\link{btgpllm}})} \item{heights}{ Index vector of length less than \code{length(out$trees)} describing trees to plot by their height. Default (\code{NULL}) is to plot all trees, one for each height encountered when sampling from the Markov chain of the tree posterior. This is equivalent to \code{heights = out$posts$height}. Specifying \code{heights = "map"} causes (only) the maximum a' posteriori (MAP) height tree to be plotted } \item{main}{ Optional character string to add to the main title of the plot} \item{\dots}{ Extra arguments to the \code{\link[maptree]{draw.tree}} function from \pkg{maptree}} } \details{ The maximum a' posteriori (MAP) tree encountered at each height (in the MCMC chain) is plotted, and the log posterior probabilities are shown for comparison. The text at the branches in the tree show the splitting variable and value. The text at the leaves show the number of input data points (\code{X} and \code{Z}) that fall into the region(s) along with an estimate of the variability therein. } \value{ The only output of this function is beautiful tree diagrams. } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \note{ Plotting trees that the \pkg{maptree} library is installed, which itself requires that the \pkg{combinat} library also be installed. See \code{vignette("tgp")} and the examples sections of the functions under \dQuote{See Also}, below} \seealso{ \code{\link{bgpllm}}, \code{\link{btlm}}, \code{\link{blm}}, \code{\link{bgp}}, \code{\link{btgpllm}}, \code{\link{plot.tgp}}, \code{\link{mapT}}, \code{vignette("tgp")}} \keyword{ hplot } \keyword{ tree } tgp/man/itemps.Rd0000644000175100001440000000524312654547265013451 0ustar hornikusers\name{itemps} \alias{itemps.barplot} \alias{hist2bar} \title{ Functions to plot summary information about the sampled inverse temperatures, tree heights, etc., stored in the traces of a "tgp"-class object} \description{ Functions for making barplots summarizing the progress of importance tempering. The \code{itemps.barplot} function can be used to make a histogram of the inverse temperatures visited in the trans-temporal Markov chain. The \code{hist2bar} function is useful for making a histogram of integer-valued samples (e.g., tree heights) encountered in one or several Markov chains } \usage{ itemps.barplot(obj, main = NULL, xlab = "itemps", ylab = "counts", plot.it = TRUE, ...) hist2bar(x) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{obj}{ \code{"tgp"}-class object } \item{main}{ Main plot label to be augmented by \code{itemps.barplot} } \item{xlab}{ Label for the x-axis } \item{ylab}{ Label for the y-axis } \item{plot.it}{ whether to plot the \code{\link{barplot}} in addition to returning the \code{data.frame} for later use in a \code{\link{barplot}} call } \item{\dots}{ other arguments passed to \code{\link{barplot}} if \code{plot.it = TRUE} } \item{x}{ \code{matrix} of integers whose columns are treated as different realizations of similar processes producing where each row represents a sample (e.g., tree height) under that process } } \details{ \code{itemps.barplot} specifically works with the \code{$trace} field of a \code{"tgp"}-class object. An error will be produced if this field is \code{NULL}, i.e., if the \code{b*} function used the create the object was not run with the argument \code{trace=TRUE} The \code{hist2bar} function can be used on any integer (or discrete) valued matrix. The columns are interpreted as different realizations of similar processes for comparison with one another via a histogram. The histogram is obtained with the \code{\link{barplot}} command used with the argument \code{beside=TRUE}. See the examples section of \code{\link{default.itemps}} } \value{ Both functions return a \code{data.frame} that can be used within the \code{\link{barplot}} function with argument \code{beside=TRUE} } \references{ Gramacy, R.B., Samworth, R.J., and King, R. (2007) \emph{Importance Tempering.} ArXiv article 0707.4242 \url{http://arxiv.org/abs/0707.4242} \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \seealso{ \code{\link{default.itemps}}, \code{vignette(tgp2)}, \code{\link{barplot}} } \keyword{ hplot } tgp/man/partition.Rd0000644000175100001440000000301312654547265014152 0ustar hornikusers\name{partition} \alias{partition} \title{ Partition data according to the MAP tree } \description{ Partition data according to the maximum a' posteriori (MAP) tree contained in a \code{"tgp"}-class object. } \usage{ partition(X, out) } \arguments{ \item{X}{\code{data.frame}, \code{matrix}, or vector of inputs \code{X} with the same dimension of \code{out$X}, i.e., \code{ncol(X) == ncol(out$X)}} \item{out}{ \code{"tgp"}-class object which is the output of one the model functions with tree support (e.g. \code{\link{btgpllm}}, \code{\link{btgp}}, \code{\link{btlm}}) } } \value{ Output is a list of \code{data.frame}s populated with the inputs \code{X} contained in each region of the partition of the MAP tree in the \code{"tgp"}-class object \code{out} } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \seealso{ \code{\link{tgp.design}}, \code{\link{tgp.trees}} } \examples{ # # 2-d Exponential data # (This example is based on random data. # It might be fun to run it a few times) # # get the data exp2d.data <- exp2d.rand() X <- exp2d.data$X; Z <- exp2d.data$Z Xcand <- exp2d.data$XX # fit treed GP LLM model to data w/o prediction # basically just to get MAP tree (and plot it) out <- btgpllm(X=X, Z=Z, pred.n=FALSE, BTE=c(2000,3000,2)) tgp.trees(out) # find a treed sequential D-Optimal design # with 10 more points Xcand.parts <- partition(Xcand, out) } \keyword{ tree } tgp/man/tgp.default.params.Rd0000644000175100001440000002112312654547265015642 0ustar hornikusers\name{tgp.default.params} \alias{tgp.default.params} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Default Treed Gaussian Process Model Parameters } \description{ Construct a default list of parameters to the \code{b*} functions-- the interfaces to treed Gaussian process modeling } \usage{ tgp.default.params(d, meanfn = c("linear", "constant"), corr = c("expsep", "exp", "mrexpsep", "matern", "sim"), splitmin = 1, basemax = d, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{d}{ number of input dimensions \code{ncol(X)}} \item{meanfn}{ A choice of mean function for the process. When \code{meanfn = "linear"} (default), then we have the process \deqn{Z = (\mathbf{1} \;\; \mathbf{X}) \mbox{\boldmath $\beta$} + W(\mathbf{X})}{Z = cbind(rep(1,nrow(X), X)) \%*\% beta + W(X),} where \eqn{W(\mathbf{X})}{W(X)} represents the Gaussian process part of the model (if present). Otherwise, when \code{meanfn = "constant"}, then\deqn{Z = \beta_0 + W(\mathbf{X})}{ Z = beta0 + W(X)}} \item{corr}{ Gaussian process correlation model. Choose between the isotropic power exponential family (\code{"exp"}) or the separable power exponential family (\code{"expsep"}, default); the current version also supports the isotropic Matern (\code{"matern"}) and single-index model (\code{"sim"}) as \dQuote{beta} functionality. The option \code{"mrexpsep"} uses a multi-resolution GP model, a depricated feature in the package (docs removed)} \item{splitmin}{ Indicates which column of the inputs \code{X} should be the first to allow splits via treed partitioning. This is useful for excluding certain input directions from the partitioning mechanism} \item{basemax}{ Indicates which column of the inputs \code{X} should be the last be fit under the base model (e.g., LM or GP). This is useful for allowing some input directions (e.g., binary indicators) to only influence the tree partitioning mechanism, and not the base model(s) at the leaves of the tree} \item{...}{ These ellipses arguments are interpreted as augmentations to the prior specification. You may use these to specify a custom setting of any of default parameters in the output list detailed below} } \value{ The output is the following list of \code{params}... \item{col}{dimension of regression coefficients \eqn{\mbox{\boldmath $\beta$}}{beta}: 1 for input \code{meanfn = "constant"}, or \code{ncol(X)+1} for \code{meanfn = "linear"}} \item{meanfn}{ copied from the inputs } \item{corr}{ copied from the inputs } \item{bprior}{Linear (beta) prior, default is \code{"bflat"} which gives an \dQuote{improper} prior which can perform badly when the signal-to-noise ratio is low. In these cases the \dQuote{proper} hierarchical specification \code{"b0"}, \code{"bmzt"}, or \code{"bmznot"} prior may perform better } \item{beta}{\code{rep(0,col)} starting values for beta linear parameters} \item{tree}{\code{c(0.5,2,max(c(10,col+1)),1,d)} indicating the tree prior process parameters \eqn{\alpha}{alpha}, \eqn{\beta}{beta}, \emph{minpart}, \emph{splitmin} and \emph{basemax}: \deqn{p_{\mbox{\tiny split}}(\eta, \mathcal{T}) = \alpha*(1+\eta)^\beta}{p(split leaf eta) = alpha*(1+depth(eta))^(-beta)} with zero probability given to trees with partitions containing less than \code{nmin} data points; \emph{splitmin} indicates the first column of \code{X} which where treed partitioning is allowed; \emph{basemax} gives the last column where the base model is used} \item{s2.p}{\code{c(5,10)} \eqn{\sigma^2}{s2} inverse-gamma prior parameters \code{c(a0, g0)} where \code{g0} is rate parameter} \item{tau2.p}{\code{c(5,10)} \eqn{\tau^2}{tau2} inverse-gamma prior parameters \code{c(a0, g0)} where \code{g0} is rate parameter} \item{d.p}{c(1.0,20.0,10.0,10.0) Mixture of gamma prior parameter (initial values) for the range parameter(s) \code{c(a1,g1,a2,g2)} where \code{g1} and \code{g2} are rate parameters. If \code{corr="mrexpsep"}, then this is a vector of length 8: The first four parameters remain the same and correspond to the "coarse" process, and the second set of four values, which default to \code{c(1,10,1,10)}, are the equivalent prior parameters for the range parameter(s) in the residual "fine" process.} \item{nug.p}{\code{c(1,1,1,1)} Mixture of gamma prior parameter (initial values) for the nugget parameter \code{c(a1,g1,a2,g2)} where \code{g1} and \code{g2} are rate parameters; default reduces to simple exponential prior; specifying \code{nug.p = 0} fixes the nugget parameter to the \dQuote{starting} value in \code{gd[1]}, i.e., it is excluded from the MCMC} \item{gamma}{\code{c(10,0.2,10)} LLM parameters c(g, t1, t2), with growth parameter \code{g > 0} minimum parameter \code{t1 >= 0} and maximum parameter \code{t1 >= 0}, where \code{t1 + t2 <= 1} specifies \deqn{p(b|d)=t_1 + \exp\left\{\frac{-g(t_2-t_1)}{d-0.5}\right\}}{p(b|d)= t1 + exp(-g*(t2-t1)/(d-0.5))}} \item{d.lam}{\code{"fixed"} Hierarchical exponential distribution parameters to \code{a1}, \code{g1}, \code{a2}, and \code{g2} of the prior distribution for the range parameter \code{d.p}; \code{"fixed"} indicates that the hierarchical prior is \dQuote{turned off}} \item{nug.lam}{\code{"fixed"} Hierarchical exponential distribution parameters to \code{a1}, \code{g1}, \code{a2}, and \code{g2} of the prior distribution for the nug parameter \code{nug.p}; \code{"fixed"} indicates that the hierarchical prior is \dQuote{turned off}} \item{s2.lam}{\code{c(0.2,10)} Hierarchical exponential distribution prior for \code{a0} and \code{g0} of the prior distribution for the s2 parameter \code{s2.p}; \code{"fixed"} indicates that the hierarchical prior is \dQuote{turned off}} \item{tau2.lam}{\code{c(0.2,0.1)} Hierarchical exponential distribution prior for \code{a0} and \code{g0} of the prior distribution for the s2 parameter \code{tau2.p}; \code{"fixed"} indicates that the hierarchical prior is \dQuote{turned off}} \item{delta.p}{\code{c(1,1,1,1)} Parameters in the mixture of gammas prior on the delta scaling parameter for \code{corr="mrexpsep"}: \code{c(a1,g1,a2,g2)} where \code{g1} and \code{g2} are rate parameters; default reduces to simple exponential prior. Delta scales the variance of the residual "fine" process with respect to the variance of the underlying "coarse" process. } \item{nugf.p}{\code{c(1,1,1,1)} Parameters in the mixture of gammas prior on the residual \dQuote{fine} process nugget parameter for \code{corr="mrexpsep"}: \code{c(a1,g1,a2,g2)} where \code{g1} and \code{g2} are rate parameters; default reduces to simple exponential prior.} \item{dp.sim}{\code{basemax * basemax} RW-MVN proposal covariance matrix for GP-SIM models; only appears when \code{corr="sim"}, the default is \code{diag(rep(0.2, basemax))}} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, \bold{to appear}. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} Robert B. Gramacy, Heng Lian (2011). \emph{Gaussian process single-index models as emulators for computer experiments}. Available as ArXiv article 1009.4241 \url{http://arxiv.org/abs/1009.4241} \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{Please refer to the examples for the functions in "See Also" below, \code{vignette("tgp")} and \code{vignette(tgp2)} } \seealso{ \code{\link{blm}}, \code{\link{btlm}}, \code{\link{bgp}}, \code{\link{btgp}}, \code{\link{bgpllm}}, \code{\link{btgpllm}} } \keyword{ nonparametric } \keyword{ smooth } \keyword{ models } \keyword{ spatial } \keyword{ tree } tgp/man/sens.Rd0000644000175100001440000002244212506600653013103 0ustar hornikusers\name{sens} \alias{sens} \title{Monte Carlo Bayesian Sensitivity Analysis} \description{Fully Bayesian Monte Carlo sensitivity analysis scheme, based upon any of the regression models contained in the \pkg{tgp} package. Random Latin hypercube samples are drawn at each MCMC iteration in order to estimate main effects as well as 1st order and total sensitivity indices.} \usage{ sens(X, Z, nn.lhs, model = btgp, ngrid = 100, span = 0.3, BTE = c(3000,8000,10), rect = NULL, shape = NULL, mode = NULL, ...) } \arguments{ \item{X}{\code{data.frame}, \code{matrix}, or vector of inputs \code{X} } \item{Z}{ Vector of output responses \code{Z} of length equal to the leading dimension (rows) of \code{X}, i.e., \code{length(Z) == nrow(X)}} \item{nn.lhs}{Size of each Latin hypercube drawn for use in the Monte Carlo integration scheme. Total number of locations for prediction is \code{nn.lhs*(ncol(X)+2)}} \item{model}{Either the regression model used for prediction, or \code{NULL}. If \code{model=NULL}, then the function just returns the \code{sens.p} vector of parameters to be passed with a regression model call. This can be used to perform sensitivity analysis through the \code{\link{predict.tgp}} framework} \item{ngrid}{The number of grid points in each input dimension upon which main effects will be estimated.} \item{span}{Smoothing parameter for main effects integration: the fraction of \code{nn.lhs} points that will be included in a moving average window that is used to estimate main effects at the \code{ngrid} locations in each input dimension.} \item{BTE}{ 3-vector of Monte-Carlo parameters (B)urn in, (T)otal, and (E)very. Predictive samples are saved every E MCMC rounds starting at round B, stopping at T } \item{rect}{ Rectangle describing the domain of the uncertainty distribution with respect to which the sensitivity is to be determined. This defines the domain from which the LH sample is to be taken. The rectangle should be a \code{matrix} or \code{data.frame} with \code{ncol(rect) = 2}, and number of rows equal to the dimension of the domain. For 1-d data, a vector of length 2 is allowed. Defaults to the input data range (\code{X}).} \item{shape}{ Optional vector of shape parameters for the Beta distribution. Vector of length equal to the dimension of the domain, with elements > 1. If specified, the uncertainty distribution (i.e. the LH sample) is proportional to a joint pdf formed by independent Beta distributions in each dimension of the domain, scaled and shifted to have support defined by \code{rect}. Only concave Beta distributions with \code{shape} > 1 are supported. If unspecified, the uncertainty distribution is uniform over \code{rect}. The specification \code{shape[i]=0} instructs \code{sens} to treat the i'th dimension as a binary variable. In this case, \code{mode[i]} is the probability parameter for a bernoulli uncertainty distribution, and we must also have \code{rect[i,]=c(0,1)}. } \item{mode}{ Optional vector of mode values for the Beta uncertainty distribution. Vector of length equal to the dimension of the domain, with elements within the support defined by \code{rect}. If \code{shape} is specified, but this is not, then the scaled Beta distributions will be symmetric. } \item{\dots}{Extra arguments to the \pkg{tgp} \code{model}. } } \details{ Saltelli (2002) describes a Latin Hypercube sampling based method for estimation of the 'Sobal' sensitivity indices: 1st Order for input \eqn{i}{i}, \deqn{S(i) = \mbox{Var}(E[f|x_i])/\mbox{Var}(f),}{S(i) = var(E[f|x[i]])/var(f),} where \eqn{x_i}{x[i]} is the \eqn{i}{i}-th input. Total Effect for input \eqn{i}{i}, \deqn{T(i) = E[\mbox{Var}(f|x_{-i})]/\mbox{Var}(f),}{T(i) = E[var(f|x[-i])]/var(f),} where \eqn{x_{-i}}{x[-i]} is all inputs except for the \eqn{i}{i}-th. All moments are with respect to the appropriate marginals of the uncertainty distribution \eqn{U}{U} -- that is, the probability distribution on the inputs with respect to which sensitivity is being investigated. Under this approach, the integrals involved are approximated through averages over properly chosen samples based on two LH samples proportional to U. If \code{nn.lhs} is the sample size for the Monte Carlo estimate, this scheme requires \code{nn.lhs*(ncol(X)+2)} function evaluations. The \code{sens} function implements the method for unknown functions \eqn{f}, through prediction via one of the \pkg{tgp} regression models conditional on an observed set of \code{X} locations. At each MCMC iteration of the \pkg{tgp} model fitting, the \code{nn.lhs*(ncol(X)+2)} locations are drawn randomly from the LHS scheme and realizations of the sensitivity indices are calculated. Thus we obtain a posterior sample of the indices, incorporating variability from both the Monte Carlo estimation and uncertainty about the function output. Since a subset of the predictive locations are actually an LHS proportional to the uncertainty distribution, we can also estimate the main effects through simple non-parametric regression (a moving average). Please see \code{vignette("tgp2")} for a detailed illustration } \value{ The output is a \code{"tgp"}-class object. The details for \code{\link{btgp}} contain a complete description of this output. The list entry that is relevance to sensitivity analysis is \code{sens}, which itself has entries: \item{par}{ This contains a \code{list} of the input parameters used in the sensitivity analysis, as outlined above.} \item{Xgrid}{A \code{matrix} containing a grid in each input dimension (by column) over which the main effects are estimated.} \item{ZZ.mean}{A \code{matrix}, where each column contains the mean main effects over the corresponding column of \code{sens.Xgrid}.} \item{ZZ.q1}{A \code{matrix}, where each column contains the 5th percentile main effects over the corresponding column of \code{sens.Xgrid}.} \item{ZZ.q2}{A \code{matrix}, where each column contains the 5th percentile main effects over the corresponding column of \code{sens.Xgrid}.} \item{S}{A \code{matrix}, where each column contains the posterior sample of 1st order sensitivity indices for the corresponding input dimension.} \item{T}{A \code{matrix}, where each column contains the posterior sample of total sensitivity indices for the corresponding input dimension.} } \references{ R.D. Morris, A. Kottas, M. Taddy, R. Furfaro, and B. Ganapol. (2009) \emph{A statistical framework for the sensitivity analysis of radiative transfer models.} IEEE Transactions on Geoscience and Remote Sensing, to appear. Saltelli, A. (2002) \emph{Making best use of model evaluations to compute sensitivity indices.} Computer Physics Communications, 145, 280-297. } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{ The quality of sensitivity analysis is dependent on the size of the LH samples used for integral approximation; as with any Monte Carlo integration scheme, the sample size (\code{nn.lhs}) must increase with the dimensionality of the problem. The total sensitivity indices \eqn{T}{T} are forced non-negative, and if negative values occur it is necessary to increase \code{nn.lhs}. The \code{plot.tgp} function replaces negative values with zero for illustration. } \seealso{ \code{\link{btgp}}, \code{\link{plot.tgp}}, \code{\link{predict.tgp}}, \code{\link{lhs}} } \examples{ # Take a look at the air quality in New York: Sensitivity of # ozone levels with respect to solar radiation, wind, and # temperature. See help(airquality) for details. X <- airquality[,2:4] Z <- airquality$Ozone # Uncertainty distribution is the default: uniform over range(X) # There is missing data, which is removed automatically by tgp # range(X). s <- suppressWarnings(sens(X=X, Z=Z, nn.lhs=300, model=btgp, ngrid=100, span=0.3, BTE=c(5000,10000,10))) # plot the results plot(s, layout="sens", ylab="Ozone", main="main effects") # plot only the sensitivity indices plot(s, layout="sens", ylab="Ozone", maineff=FALSE) # plot only the main effects, side by side plot(s, layout="sens", ylab="Ozone", main="", maineff=t(1:3)) # build a 'sens.p' parameter vector for a data-dependent # informative uncertainty distribution. For each variable, # the input distribution will be a scaled Beta with shape=2, # and mode equal to the data mean rect <- t(apply(X, 2, range, na.rm=TRUE)) mode <- apply(X , 2, mean, na.rm=TRUE) shape <- rep(2,3) # plot a sample from the marginal uncertainty distribution. Udraw <- lhs(300, rect=rect, mode=mode, shape=shape) par(mfrow=c(1,3)) for(i in 1:3) hist(Udraw[,i], breaks=15,xlab=names(X)[i]) # build sens.p with the 'sens' function. sens.p <- suppressWarnings(sens(X=X,Z=Z,nn.lhs=300, model=NULL, ngrid=100, rect=rect, shape=shape, mode=mode)) # Use predict.tgp to quickly analyze with respect to this new # uncertainty distribution without re-running the MCMC, then # plot the results. s.new <- predict(s, BTE=c(1,1000,1), sens.p=sens.p, verb=1) plot(s.new, layout="sens", ylab="Ozone", main="main effects") } \keyword{ htest } \keyword{ multivariate } \keyword{ regression } \keyword{ spatial } \keyword{ tree } tgp/man/exp2d.rand.Rd0000644000175100001440000001316212654547265014114 0ustar hornikusers \name{exp2d.rand} \alias{exp2d.rand} \title{ Random 2-d Exponential Data } \description{ A Random subsample of \code{data(\link{exp2d})}, or Latin Hypercube sampled data evaluated with \code{\link{exp2d.Z}} } \usage{exp2d.rand(n1 = 50, n2 = 30, lh = NULL, dopt = 1)} \arguments{ \item{n1}{Number of samples from the first, interesting, quadrant} \item{n2}{Number of samples from the other three, uninteresting, quadrants} \item{lh}{If \code{!is.null(lh)} then Latin Hypercube (LH) sampling (\code{\link{lhs}}) is used instead of subsampling from \code{data(\link{exp2d})}; \code{lh} should be a single nonnegative integer specifying the desired number of predictive locations, \code{XX}; or, it should be a vector of length 4, specifying the number of predictive locations desired from each of the four quadrants (interesting quadrant first, then counter-clockwise)} \item{dopt}{If \code{dopt >= 2} then d-optimal subsampling from LH candidates of the multiple indicated by the value of \code{dopt} will be used. This argument only makes sense when \code{!is.null(lh)}} } \value{ Output is a \code{list} with entries: \item{X}{2-d \code{data.frame} with \code{n1 + n2} input locations} \item{Z}{Numeric vector describing the responses (with noise) at the \code{X} input locations} \item{Ztrue}{Numeric vector describing the true responses (without noise) at the \code{X} input locations} \item{XX}{2-d \code{data.frame} containing the remaining \code{441 - (n1 + n2)} input locations} \item{ZZ}{Numeric vector describing the responses (with noise) at the \code{XX} predictive locations} \item{ZZtrue}{Numeric vector describing the responses (without noise) at the \code{XX} predictive locations} } \details{ When \code{is.null(lh)}, data is subsampled without replacement from \code{data(\link{exp2d})}. Of the \code{n1 + n2 <= 441} input/response pairs \code{X,Z}, there are \code{n1} are taken from the first quadrant, i.e., where the response is interesting, and the remaining \code{n2} are taken from the other three quadrants. The remaining \code{441 - (n1 + n2)} are treated as predictive locations Otherwise, when \code{!is.null(lh)}, Latin Hypercube Sampling (\code{\link{lhs}}) is used If \code{dopt >= 2} then \code{n1*dopt} LH candidates are used for to get a D-optimal subsample of size \code{n1} from the first (interesting) quadrant. Similarly \code{n2*dopt} in the rest of the un-interesting region. A total of \code{lh*dopt} candidates will be used for sequential D-optimal subsampling for predictive locations \code{XX} in all four quadrants assuming the already-sampled \code{X} locations will be in the design. In all three cases, the response is evaluated as \deqn{Z(X)=x_1 * \exp(x_1^2-x_2^2).}{Z(X) = X1 * exp(-X1^2-X2^2),} thus creating the outputs \code{Ztrue} and \code{ZZtrue}. Zero-mean normal noise with \code{sd=0.001} is added to the responses \code{Z} and \code{ZZ} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, \bold{to appear}. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} \url{http://bobby.gramacy.com/r_packages/tgp} } \seealso{\code{\link{lhs}}, \code{\link{exp2d}}, \code{\link{exp2d.Z}}, \code{\link{btgp}}, and other \code{b*} functions} \examples{ ## randomly subsampled data ## ------------------------ eds <- exp2d.rand() # higher span = 0.5 required because the data is sparse # and was generated randomly eds.g <- interp.loess(eds$X[,1], eds$X[,2], eds$Z, span=0.5) # perspective plot, and plot of the input (X & XX) locations par(mfrow=c(1,2), bty="n") persp(eds.g, main="loess surface", theta=-30, phi=20, xlab="X[,1]", ylab="X[,2]", zlab="Z") plot(eds$X, main="Randomly Subsampled Inputs") points(eds$XX, pch=19, cex=0.5) ## Latin Hypercube sampled data ## ---------------------------- edlh <- exp2d.rand(lh=c(20, 15, 10, 5)) # higher span = 0.5 required because the data is sparse # and was generated randomly edlh.g <- interp.loess(edlh$X[,1], edlh$X[,2], edlh$Z, span=0.5) # perspective plot, and plot of the input (X & XX) locations par(mfrow=c(1,2), bty="n") persp(edlh.g, main="loess surface", theta=-30, phi=20, xlab="X[,1]", ylab="X[,2]", zlab="Z") plot(edlh$X, main="Latin Hypercube Sampled Inputs") points(edlh$XX, pch=19, cex=0.5) # show the quadrants abline(h=2, col=2, lty=2, lwd=2) abline(v=2, col=2, lty=2, lwd=2) \dontrun{ ## D-optimal subsample with a factor of 10 (more) candidates ## --------------------------------------------------------- edlhd <- exp2d.rand(lh=c(20, 15, 10, 5), dopt=10) # higher span = 0.5 required because the data is sparse # and was generated randomly edlhd.g <- interp.loess(edlhd$X[,1], edlhd$X[,2], edlhd$Z, span=0.5) # perspective plot, and plot of the input (X & XX) locations par(mfrow=c(1,2), bty="n") persp(edlhd.g, main="loess surface", theta=-30, phi=20, xlab="X[,1]", ylab="X[,2]", zlab="Z") plot(edlhd$X, main="D-optimally Sampled Inputs") points(edlhd$XX, pch=19, cex=0.5) # show the quadrants abline(h=2, col=2, lty=2, lwd=2) abline(v=2, col=2, lty=2, lwd=2) } } \keyword{datasets} \keyword{datagen} tgp/man/tgp-internal.Rd0000644000175100001440000000257212654547265014556 0ustar hornikusers\name{tgp-internal} %% Part of the sensible export list but (currently?) documented as %% internal (or waiting for documentation to be written): %% \alias{tgp} \alias{tree2c} \alias{tgp.postprocess} \alias{print.tgptraces} \alias{tgp.read.XX.traces} \alias{tgp.read.traces} \alias{tgp.cleanup} \alias{tgp.choose.as} \alias{tgp.choose.center} \alias{tgp.check.params} \alias{tgp.partition} \alias{tgp.get.trees} \alias{tgp.plot.tree} \alias{tgp.plot.parts.1d} \alias{tgp.plot.parts.2d} \alias{tgp.plot.slice} \alias{tgp.plot.proj} \alias{tgp.cands} \alias{framify.X} \alias{slice.interp} \alias{slice.image} \alias{slice.image.contour} \alias{slice.contour} \alias{slice.persp} \alias{mean0.range1} \alias{undo.mean0.range1} \alias{check.matrix} \alias{mr.checkrez} \alias{check.itemps} \alias{check.slice} \alias{check.proj} \alias{check.sens} \alias{getlocs} \alias{print.tgp} \alias{sens.plot} \alias{mr.plot} \alias{mr.checkres} %% %% Currently (?) exported as used in the grid.layout.Rd \example ... %% \alias{layout.torture} %% \title{Internal Treed Gaussian Process Model Functions} \description{ Internal Treed Gaussian Process Model functions } \details{ These are not to be called by the user (or in some cases are just waiting for proper documentation to be written :)). } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \keyword{ internal } tgp/man/exp2d.Rd0000644000175100001440000000416412654547265013173 0ustar hornikusers\name{exp2d} \alias{exp2d} \docType{data} \title{ 2-d Exponential Data } \description{ A 2-dimensional data set that can be used to validate non-stationary models. } \usage{data(exp2d)} \format{ A \code{data frame} with 441 observations on the following 4 variables. \describe{ \item{\code{X1}}{Numeric vector describing the first dimension of \code{X} inputs} \item{\code{X2}}{Numeric vector describing the second dimension of \code{X} inputs} \item{\code{Z}}{Numeric vector describing the response \code{Z(X)+N(0,sd=0.001)}} \item{\code{Ztrue}}{Numeric vector describing the true response \code{Z(X)}, without noise} } } \details{ The true response is evaluated as \deqn{Z(X)=x_1 * \exp(x_1^2-x_2^2).}{Z(X) = X1 * exp(-X1^2 -X2^2).} Zero-mean normal noise with \code{sd=0.001} has been added to the true response } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \references{ Gramacy, R. B. (2007). \emph{\pkg{tgp}: An \R Package for Bayesian Nonstationary, Semiparametric Nonlinear Regression and Design by Treed Gaussian Process Models.} Journal of Statistical Software, \bold{19}(9). \url{http://www.jstatsoft.org/v19/i09} Robert B. Gramacy, Matthew Taddy (2010). \emph{Categorical Inputs, Sensitivity Analysis, Optimization and Importance Tempering with \pkg{tgp} Version 2, an \R Package for Treed Gaussian Process Models.} Journal of Statistical Software, \bold{33}(6), 1--48. \url{http://www.jstatsoft.org/v33/i06/}. Gramacy, R. B., Lee, H. K. H. (2007). \emph{Bayesian treed Gaussian process models with an application to computer modeling} Journal of the American Statistical Association, \bold{to appear}. Also available as ArXiv article 0710.4536 \url{http://arxiv.org/abs/0710.4536} \url{http://bobby.gramacy.com/r_packages/tgp} } \note{This data is used in the examples of the functions listed below in the \dQuote{See Also} section via the \code{\link{exp2d.rand}} function} \seealso{ \code{\link{exp2d.rand}}, \code{\link{exp2d.Z}}, \code{\link{btgp}}, and other \code{b*} functions} \keyword{datasets} \keyword{datagen} tgp/man/interp.loess.Rd0000644000175100001440000000666012654547265014601 0ustar hornikusers\name{interp.loess} \alias{interp.loess} \title{ Lowess 2-d interpolation onto a uniform grid } \description{ Use the \code{\link[stats]{loess}} function to interpolate the two-dimensional \code{x}, \code{y}, and \code{z} data onto a uniform grid. The output produced is an object directly usable by the plotting functions \code{\link[graphics]{persp}}, \code{\link[graphics]{image}}, and \code{\link[graphics]{contour}}, etc. This function is designed as an alternative to the \code{\link[akima]{interp}} functions from the \pkg{akima} library. } \usage{ interp.loess(x, y, z, gridlen = c(40,40), span = 0.1, ...) } \arguments{ \item{x}{ Vector of \code{X} spatial input locations } \item{y}{ Vector of \code{Y} spatial input locations } \item{z}{ Vector of \code{Z} responses interpreted as \code{Z = f(X,Y)}} \item{gridlen}{ Size of the interpolated grid to be produced in x and y. The default of \code{gridlen = c(40,40)} causes a \code{40 * 40} grid of \code{X}, \code{Y}, and \code{Z} values to be computed.} \item{span}{ Kernel span argument to the \code{\link[stats]{loess}} function with default setting \code{span = 0.1} set significantly lower than the the \code{\link[stats]{loess}} default -- see note below. } \item{\dots}{ Further arguments to be passed to the \code{\link[stats]{loess}} function} } \details{ Uses \code{\link[base]{expand.grid}} function to produce a uniform grid of size \code{gridlen} with domain equal to the rectangle implied by \code{X} and \code{Y}. Then, a \code{\link[stats]{loess}} a smoother is fit to the data \code{Z = f(X,Y)}. Finally, \code{\link[stats]{predict.loess}} is used to predict onto the grid. } \value{ The output is a list compatible with the 2-d plotting functions \code{\link[graphics]{persp}}, \code{\link[graphics]{image}}, and \code{\link[graphics]{contour}}, etc. The list contains... \item{x }{Vector of with \code{length(x) == gridlen} of increasing \code{X} grid locations} \item{y }{Vector of with \code{length(y) == gridlen} of increasing \code{Y} grid locations} \item{z }{\code{matrix} of interpolated responses \code{Z = f(X,Y)} where \code{z[i,j]} contains an estimate of \code{f(x[i],y[j])}} } \references{ \url{http://bobby.gramacy.com/r_packages/tgp} } \author{ Robert B. Gramacy, \email{rbgramacy@chicagobooth.edu}, and Matt Taddy, \email{taddy@chicagobooth.edu} } \note{ As mentioned above, the default \code{span = 0.1} parameter is significantly smaller that the default \code{\link[stats]{loess}} setting. This asserts a tacit assumption that the input is densely packed and that the noise in \code{z}'s is small. Such should be the case when the data are output from a \pkg{tgp} regression -- this function was designed specifically for this situation. For data that is random or sparse, simply choose higher setting, e.g., the default \code{\link[stats]{loess}} setting of \code{span = 0.75}, or a more intermediate setting of \code{span = 0.5} as in the example below} \seealso{ \code{\link[akima]{interp}}, \code{\link[stats]{loess}}, \code{\link{persp}}, \code{\link{image}}, \code{\link{contour}} } \examples{ # random data ed <- exp2d.rand() # higher span = 0.5 required because the data is sparse # and was generated randomly ed.g <- interp.loess(ed$X[,1], ed$X[,2], ed$Z, span=0.5) # perspective plot persp(ed.g) } \keyword{ smooth } \keyword{ loess } tgp/INDEX0000644000175100001440000000362612506600653011666 0ustar hornikusersblm Bayesian hierarchical linear model btlm Bayesian treed Linear (CART) model bgp Bayesian Gaussian process model bgpllm Bayesian Gaussian process with jumps to the limiting linear model (LLM) btgp Bayesian treed Gaussian process model btgpllm Bayesian treed Gaussian process with jumps to the LLM default.itemps creating inverse temperatures ladder for simulated/importance tempering dopt.gp sequential D-optimal design for a stationary Gaussian process exp2d 2-d exponential Data, for examples exp2d.rand randomly subsampled 2-d exponential Data, for examples exp2d.Z Z-values for 2-d exponential Data, for examples friedman.1.data first Friedman dataset, for examples fried.bool a version of the First Friedman dataset, with boolean indicators interp.loess Loess based interpolation of spatial data onto a regular grid lhs Latin Hypercube sampling mapT plot the MAP partition, or add one to an existing plot optim.step.tgp one step in the optimization of a noisy black box function optim.ptgpf calls the R optim function on the predictive surface of a tgp model partition partition data according to the MAP tree plot.tgp plotting for treed Gaussian process Models predict.tgp prediction for (MAP estimates of) treed GP Models sens Bayesian Monte Carlo sensitivity analysis for treed GP Models tgp generic interface to treed Gaussian process models tgp.default.params default treed Gaussian process model parameters tgp.design sequential treed D-Optimal design for treed Gaussian process models tgp.trees plot MAP tree for each height encountered by the Markov chain