Iso/0000755000176000001440000000000013663122576011047 5ustar ripleyusersIso/NAMESPACE0000644000176000001440000000011713006042445012250 0ustar ripleyusersexport(pava, pava.sa, ufit, biviso, unimode.sa) importFrom("stats", "stepfun") Iso/ChangeLog0000644000176000001440000001072512533532717012623 0ustar ripleyusers # Information about versions 0.0-0 (?) 0.0-1, ..., 0.0-3, # is lost in the mists of time. # # Information about the changes 0.0-4 |--> 0.0-5 |--> 0.0-6 # will be added ``when I get around to it''. :-) Version 0.0-6 |--> 0.0-7: # 24/August/2009 (1) Added namespace; changed name of .First.lib() in First.R to .onLoad(). (As one must when adding a namespace, apparently.) Thanks to Tobias Verbeke for instigating this change and for showing me how to do it. (2) Removed announcement of old changes from .First.lib(); put in announcement of addition of namespace. Version 0.0-7 |--> 0.0-8: # 23/October/2009 (1) Added bivariate isotonic capabilities, using Applied Statistics Algorithm AS 206, at the request of Paramjit Gill. (2) Corrected the spelling of ``NAMESPACE'' (!!!) in a message produced by the .onLoad() function. Version 0.0-8: |--> 0.0-9: # 5/September/2011 (1) Changed some titles in the help files to avoid cock-ups in the INDEX file (since R CMD INSTALL now seems to truncate titles that are over 72 characters long. Version 0.0.9 |--> 0.0-10 # 04/November/2011 (1) Got rid of the INDEX file completely! Seems not to be needed, and just causes trouble. (2) Got rid of the "now has a NAMESPACE" message in First.R, since *everything* now has a namespace! Version 0.0-10 |--> 0.0-11 # 11/January/2013 (1) Fixed a bug in the Fortran code for the "smooth" algorithm underlying the biviso() function. In this code some dimensions were hard-wired at 20. This caused the function to throw an error if the matrix of values being isotonized was bigger than 20 x 20. I revised the code so that the dimensions are now dynamic. Thanks go to Jing Qin by whom this bug was drawn to my attention. (2) While doing some checking I noticed that the function was returning results that weren't *quite* isotonic. Made adjustments to value of "eps" and made "EPS" an argument of the "PAV" subroutine. This appeared to reduce the problem substantially but did not quite eliminate it completely. (3) It also made the algorithm sometimes fail to converge, so I incremented the default value of "ncycle" from 1000 to 10000, which seems to fix the problem. Version 0.0-11 |--> 0.0-12 # 12/January/2013 (1) Changed the file First.R to contain two functions: .onLoad() to load the Fortran code, and .onAttach() to produce the startup message. Version 0.0-12 |--> 0.0-13 # 16/January/2013 (1) Changed biviso() to use two "epsilon" arguments, namely "eps" and "eps2" and changed the code of "smooth.f" to make use of these. The "eps" argument is used for determining convergence. The "eps2" argument gets passed to the PAV() subroutine and is used for determined whether there are adjacent violators. Version 0.0-13 |--> 0.0-14 # 31/March/2013 (1) Fixed a typo in biviso.R and one in biviso.Rd. # 1/April/2013 (2) Added arguments "fatal" and "warn" to biviso(); the first (if set to FALSE) permits the return of "intermediate" values where convergence has not yet been achieved. (This addition prompted by a request from Revathi Ananthakrishnan.) (3) Added a check in biviso() that ncycle is at least 2. (4) Modified the first example for biviso() to introduce some random non-isotonicity. (5) Added an example illustrating the use of fatal=FALSE in biviso(). Version 0.0-14 |--> 0.0-15 # 18/April/2013 (1) Fixed up the Fortran dimension statements, getting rid of dummy 1's as the last dimensions (which now throws a warning from the compiler). Version 0.0-15 |--> 0.0-16 # 31/May/2015 (1) Corrected the comment at the beginning of ufit.r. (2) Changed unimode to deal with the linear ordering cases immediately without further fooling about. (3) Consequently removed checks on k1 == 0 and k2 == 0 (if either of these happens something is toadally screwed up; goof is set to .true. and the function returns). Uploaded to CRAN 31/05/2015 Version 0.0-16 |--> 0.0-17 # 31/May/2015 (1) Added unimode.sa() (standalone function for fitting a unimodal isotonic regression) to the package. It is an "internal" undocumented function. (2) Fixed the munged-up date field in DESCRIPTION. # 01/June/2015 (1) Fixed glitches in unimode.sa(). (2) Fixed glitch in ufit.r. Uploaded to CRAN 01/06/2015 Version 0.0-17 |--> 0.0-18 (1) Wrote vignette explaining the algorithm used. (2) Added exemplary data set "vigour", the data on vigour of growth in stands of spruce trees in New Brunswick, Canada. Iso/data/0000755000176000001440000000000012533533254011752 5ustar ripleyusersIso/data/vigour.rda0000644000176000001440000000141413475566552013772 0ustar ripleyuserseT HTA}ۖRaaeD>!!_ZH"!!!Qi[l BDBDB","f`gyw9sߤ%fĨ3Ԃ (T`3OP ثN/, B!! ‚&D3BhA"D;ˆ@faEvDBBq`ժ`4&5^tzhlBSTmGY?h|X$ΛFP9y9hySD>M8PHrp:\u)ݏATdKVQ1lG?K,"ێЃYƝ` T!=& ̀:yn'#aw/WN狫Li|GWy^S{J#=nP]&c49މ` r_,l|: #ǚ{(:E \xCpέ4bc͢oy}]:& \^l27rNn;~~#)WӃX0W~ MЂ.R^)/M WBW1Z\CyLWV[` o3~qLB_+.JE[E'\Ypj<"Mdw/О+ @yZbK>QOmkTjKt/=PWXMqqf; h$Iso/man/0000755000176000001440000000000013224003473011605 5ustar ripleyusersIso/man/pava.Rd0000644000176000001440000000635512271576147013052 0ustar ripleyusers\name{pava} \alias{pava} \alias{pava.sa} \title{ Linear order isotonic regression. } \description{ The ``pool adjacent violators algorithm'' (PAVA) is applied to calculate the isotonic regression of a set of data, with respect to the usual increasing (or decreasing) linear ordering on the indices. } \usage{ pava(y, w, decreasing=FALSE, long.out=FALSE, stepfun=FALSE) pava.sa(y, w, decreasing=FALSE, long.out=FALSE, stepfun=FALSE) } \arguments{ \item{y}{ Vector of data whose isotonic regression is to be calculated. } \item{w}{ Optional vector of weights to be used for calculating a weighted isotonic regression; if w is not given, all weights are taken to equal 1. } \item{decreasing}{Logical scalar; should the isotonic regression be calculated with respect to \emph{decreasing} (rather than increasing) order?} \item{long.out}{ Logical argument controlling the nature of the value returned. } \item{stepfun}{ Logical scalar; if \code{TRUE} a step function representation of the isotonic regression is returned. } } \value{ If long.out is TRUE then the result returned consists of a list whose components are: \item{y}{ the fitted values } \item{w}{ the final weights } \item{tr}{ a set of indices made up of the smallest index in each level set, which thus "keeps track" of the level sets. } \item{h}{ a step function which represents the results of the isotonic regression. This component is present \emph{only if} \code{stepfun} is \code{TRUE}. } If \code{long.out} is \code{FALSE} and \code{stepfun} is \code{TRUE} then only the step function is returned. If \code{long.out} and \code{stepfun} are both \code{FALSE} then only the vector of fitted values is returned. } \details{ The function \code{pava()} uses dynamically loading of a fortran subroutine "pava" to effect the computations. The function \code{pava.sa()} ("sa" for "stand-alone") does all of the computations in raw R. Thus \code{pava.sa()} could be considerably slower for large data sets. The \code{x} values for the step function returned by these functions (if \code{stepfun} is \code{TRUE}) are thought of as being 1, 2, \dots, \code{n=length(y)}. The knots of the step function are the \code{x} values (indices) \emph{following} changes in the \code{y} values (i.e. the starting indices of the level sets, except for the first level set). The \code{y} value corresponding to the first level set is the ``left hand'' value of \code{y} or \code{yleft}. The step function is formed using the default arguments of \code{stepfun()}. In particular it is \emph{right} continuous. } \author{Rolf Turner \email{r.turner@auckland.ac.nz} \url{http://www.stat.auckland.ac.nz/~rolf} } \references{ Robertson, T., Wright, F. T. and Dykstra, R. L. (1988). Order Restricted Statistical Inference. Wiley, New York. } \seealso{\code{\link{ufit}()} \code{\link{stepfun}()} \code{\link{biviso}()} } \examples{ # Increasing order: y <- (1:20) + rnorm(20) ystar <- pava(y) plot(y) lines(ystar,type='s') # Decreasing order: z <- NULL for(i in 4:8) { z <- c(z,rep(8-i+1,i)+0.05*(0:(i-1))) } zstar <- pava(z,decreasing=TRUE) plot(z) lines(zstar,type='s') # Using the stepfunction: zstar <- pava(z,decreasing=TRUE,stepfun=TRUE) plot(z) plot(zstar,add=TRUE,verticals=FALSE,pch=20,col.points="red") } \keyword{regression} \keyword{nonlinear} Iso/man/biviso.Rd0000644000176000001440000001134512271576134013405 0ustar ripleyusers\name{biviso} \Rdversion{1.1} \alias{biviso} \title{ Bivariate isotonic regression. } \description{ Bivariate isotonic regression with respect to simple (increasing) linear ordering on both variables. } \usage{ biviso(y, w = NULL, eps = NULL, eps2 = 1e-9, ncycle = 50000, fatal = TRUE, warn = TRUE) } \arguments{ \item{y}{ The matrix of observations to be isotonized. It must of course have at least two rows and at least two columns. } \item{w}{ A matrix of weights, greater than or equal to zero, of the same dimension as \code{y}. If left \code{NULL} then \code{w} is created as a matrix all of whose entries are equal to \code{1}. } \item{eps}{ Convergence criterion. The algorithm is deemed to have converged if each entry of the output matrix, after the completion of the current iteration, does not differ by more than \code{eps} from the corresponding entry of the matrix after the completion of the previous iteration. If this argument is not supplied it defaults to \code{sqrt(.Machine$double.eps)}. } \item{eps2}{ Criterion used to determine whether isotonicity is \dQuote{violated}, whence whether (further) application of the \dQuote{pool adjacent violators} procedure is required. } \item{ncycle}{ The maximum number of cycles of the iteration procedure. Must be at least 2 (otherwise an error is given). If the procedure has not converged after \code{ncycle} iterations then an error is given. (See below.) } \item{fatal}{ Logical scalar. Should the function stop if the subroutine returns an error code other than 0 or 4? If \code{fatal} is \code{FALSE} then output is returned by the function even if there was a \dQuote{serious} fault. One can set \code{fatal=FALSE} to inspect the values of the objective matrix at various interim stages prior to convergence. See \bold{Examples}. } \item{warn}{ Logical scalar. Should a warning be produced if the subroutine returns a value of \code{ifault} equal to 4 (or to any other non-zero value when \code{fatal} has been set to \code{FALSE})? } } \section{Error Messages}{ The subroutine comprising Algorithm AS 206 produces an error code \code{ifault} with values from \code{0} to \code{6} The meaning of these codes is as follows: \itemize{ \item 0: No error. \item 1: Convergence was not attained in \code{ncycle} cycles. \item 2: At least one entry of \code{w} was negative. \item 3: Either \code{nrow(y)} or \code{ncol(y)} was less than 2. \item 4: A near-zero weight less than \code{delta=0.00001} was replaced by \code{delta}. \item 5: Convergence was not attained \emph{and} a non-zero weight was replaced by \code{delta}. \item 6: All entries of \code{w} were less than \code{delta}. } If \code{ifault==4} a warning is given. All of the other non-zero values of \code{ifault} result in an error being given. } \details{ See the paper by Bril et al., (\emph{References}) and the references cited therein for details. } \value{ A matrix of the same dimensions as \code{y} containing the corresponding isotonic values. It has an attribute \code{icycle} equal to the number of cycles required to achieve convergence of the algorithm. } \references{ Bril, Gordon; Dykstra, Richard; Pillers Carolyn, and Robertson, Tim ; Isotonic regression in two independent variables; Algorithm AS 206; JRSSC (Applied Statistics), vol. 33, no. 3, pp. 352-357, 1984. } \author{Rolf Turner \email{r.turner@auckland.ac.nz} \url{http://www.stat.auckland.ac.nz/~rolf} } \section{WARNING}{ This function appears not to achieve exact isotonicity, at least not quite. For instance one can do: \preformatted{ set.seed(42) u <- matrix(runif(400),20,20) iu <- biviso(u) any(apply(iu,2,is.unsorted)) } and get \code{TRUE}. It turns out that columns 13, 14, and 16 of \code{iu} have exceptions to isotonicity. E.g. six of the values of \code{diff(iu[,13])} are less than zero. However only one of these is less than \code{sqrt(.Machine$double.eps)}, and then only \dQuote{marginally} smaller. So some of these negative values are \dQuote{numerically different} from zero, but not by much. The largest in magnitude in this example, from column 16, is \code{-2.217624e-08} --- which is probably not of \dQuote{practical importance}. Note also that this example occurs in a very artificial context in which there is no actual isotonic structure underlying the data. } \seealso{ \code{\link{pava}()} \code{\link{pava.sa}()} \code{\link{ufit}()} } \examples{ x <- 1:20 y <- 1:10 xy <- outer(x,y,function(a,b){a+b+0.5*a*b}) + rnorm(200) ixy <- biviso(xy) set.seed(42) u <- matrix(runif(400),20,20) v <- biviso(u) progress <- list() for(n in 1:9) progress[[n]] <- biviso(u,ncycle=50*n,fatal=FALSE,warn=FALSE) } \keyword{regression} \keyword{nonlinear} Iso/man/vigour.Rd0000644000176000001440000000320512533556164013423 0ustar ripleyusers\name{vigour} \alias{vigour} \docType{data} \title{ vigour } \description{ Growth vigour of stands of spruce trees in New Brunswick, Canada. } \usage{data("vigour")} \format{ A data frame with 23 observations (rows). The first column is the year of observation (1965 to 1987 inclusive). The other five columns are observations on the vigour of growth of the given stand in each of the years. } \details{ The stands each had different initial tree densities. It was expected that vigour would initially increase (as the trees increased in size) and then level off and start to decrease as the growing trees encroached upon each others' space and competed more strongly for resources such as moisture, nutrients, and light. It was further expected that the position of the mode of the vigour observations would depend upon the initial densities. } \source{ These data were collected and generously made available by Kirk Schmidt who was at the time of collecting the data a graduate student in the Department of Forest Engineering at the University of New Brunswick, Fredericton, New Brunswick, Canada. The data were collected as part of his research for his Master's degree (supervised by Professor Ted Needham) at the University of New Brunswick. See Schmidt (1993). } \references{ K. D. Schmidt (1993). \emph{Development of a precommercial thinning guide for black spruce}. Thesis (M.Sc.F.), University of New Brunswick, Faculty of Forestry. } \examples{ matplot(vigour[,1],vigour[,2:6], main="Growth vigour of stands of New Brunswick spruce", xlab="year",ylab="vigour",type="b") } \keyword{datasets} Iso/man/ufit.Rd0000644000176000001440000000767712271576162013077 0ustar ripleyusers\name{ufit} \alias{ufit} \title{ Unimodal isotonic regression. } \description{ A "divide and conquer" algorithm is applied to calculate the isotonic regression of a set of data, for a unimodal order. If the mode of the unimodal order is not specified, then the optimal (in terms of minimizing the error sum of squares) unimodal fit is calculated. } \usage{ ufit(y, lmode=NULL, x=NULL, w=NULL, lc=TRUE, rc=TRUE, type=c("raw","stepfun","both")) } \arguments{ \item{y}{ Vector of data whose isotonic regression is to be calculated. } \item{lmode}{ Gives the location of the mode if this is specified; if the location is not specified, then all possible modes are tried and that one giving the smallest error sum of squares is used. } \item{x}{ A largely notional vector of \eqn{x} values corresponding to the data vector \code{y}; the value of the mode must be given, or will be calculated in terms of these \eqn{x} values. Conceptually the model is \code{y = m(x) + E}, where \code{m()} is a unimodal function with mode at \code{lmode}, and where E is random "error". If \code{x} is not specified, it defaults to an equi-spaced sequence on [0,1].} \item{w}{ Optional vector of weights to be used for calculating a weighted isotonic regression; if \code{w} is not given, all weights are taken to equal 1.} \item{lc}{ Logical argument; should the isotonization be left continuous? If \code{lc==FALSE} then the value of the isotonization just before the mode is set to \code{NA}, which causes line plots to have a jump discontinuity at (just to the left of) the mode. The default is \code{lc=TRUE}.} \item{rc}{ Logical argument; should the isotonization be right continuous? If \code{rc==FALSE} then the value of the isotonization just after the mode is set to \code{NA}, which causes line plots to have a jump discontinuity at (just to the right of) the mode. The default is \code{rc=TRUE}.} \item{type}{String specifying the type of the output; see \dQuote{Value}. May be abbreviated.} } \value{ If \code{type=="raw"} then the value is a list with components: \item{x}{ The argument \code{x} if this is specified, otherwise the default value. } \item{y}{ The fitted values. } \item{lmode}{ The argument \code{lmode} if this is specified, otherwise the value of \code{lmode} which is found to minimize the error sum of squares. } \item{mse}{ The mean squared error.} If \code{type=="both"} then a component \code{h} which is the step function representation of the isotonic regression is added to the foregoing list. If \code{type=="stepfun"} then only the step function representation \code{h} is returned. } \details{ Dynamically loads fortran subroutines "pava", "ufit" and "unimode" to do the actual work. } \author{Rolf Turner \email{r.turner@auckland.ac.nz} \url{http://www.stat.auckland.ac.nz/~rolf} } \references{ Mureika, R. A., Turner, T. R. and Wollan, P. C. (1992). An algorithm for unimodal isotonic regression, with application to locating a maximum. University of New Brunswick Department of Mathematics and Statistics Technical Report Number 92 -- 4. Robertson, T., Wright, F. T. and Dykstra, R. L. (1988). Order Restricted Statistical Inference. Wiley, New York. Shi, Ning-Zhong. (1988) A test of homogeneity for umbrella alternatives and tables of the level probabilities. Commun. Statist. --- Theory Meth. vol. 17, pp. 657 -- 670. Turner, T. R., and Wollan, P. C. (1997) Locating a maximum using isotonic regression. Computational Statistics and Data Analysis vol. 25, pp. 305 -- 320. } \seealso{\code{\link{pava}()} \code{\link{biviso}()} } \examples{ x <- c(0.00,0.34,0.67,1.00,1.34,1.67,2.00,2.50,3.00,3.50,4.00,4.50, 5.00,5.50,6.00,8.00,12.00,16.00,24.00) y <- c(0.0,61.9,183.3,173.7,250.6,238.1,292.6,293.8,268.0,285.9,258.8, 297.4,217.3,226.4,170.1,74.2,59.8,4.1,6.1) z <- ufit(y,x=x,type="b") plot(x,y) lines(z,col="red") plot(z$h,do.points=FALSE,col.hor="blue",col.vert="blue",add=TRUE) } \keyword{regression} \keyword{nonlinear} % Converted by Sd2Rd version 1.21. Iso/man/Iso-internal.Rd0000644000176000001440000000043012532504045014437 0ustar ripleyusers\name{Iso-internal} \alias{unimode.sa} \title{Internal Iso functions} \description{ Internal Iso functions. } \usage{ unimode.sa(y,lmode) } \details{ This functions is for debugging and pedagogical use; it is not meant to be called by the average user. } \keyword{internal} Iso/DESCRIPTION0000644000176000001440000000107513663122576012560 0ustar ripleyusersPackage: Iso Version: 0.0-18.1 Date: 2019-06-05 Title: Functions to Perform Isotonic Regression Author: Rolf Turner Maintainer: Rolf Turner Depends: R (>= 1.7.0) Description: Linear order and unimodal order (univariate) isotonic regression; bivariate isotonic regression with linear order on both variables. LazyData: true License: GPL (>= 2) URL: http://www.stat.auckland.ac.nz/~rolf/ NeedsCompilation: yes Packaged: 2020-05-25 13:47:19 UTC; ripley Repository: CRAN Date/Publication: 2020-05-26 05:13:34 UTC Iso/build/0000755000176000001440000000000013475566552012155 5ustar ripleyusersIso/build/vignette.rds0000644000176000001440000000030213475566552014507 0ustar ripleyusersb```b`f@&0rH&ed啣Ir:$q*HICF2h0X X%gwI-HK î?"5lP5,n90{C2K7(1 棸(\^Pp7@btr$$ [qIso/src/0000755000176000001440000000000013662746105011635 5ustar ripleyusersIso/src/unimode.f0000644000176000001440000000446413077250530013444 0ustar ripleyusersC Output from Public domain Ratfor, version 1.03 subroutine unimode(y,w,y1,w1,y2,w2,ind,kt,tau,n,goof) implicit double precision(a-h,o-z) integer goof dimension y(n), w(n), y1(n), w1(n), y2(n), w2(n), ind(n), kt(n) goof = 0 if(tau .ge. dble(n))then call pava(y,w,kt,n) return endif if(tau .le. 1.d0)then do23004 i = 1,n j = n+1-i y2(i) = y(j) w2(i) = w(j) 23004 continue 23005 continue call pava(y2,w2,kt,n) do23006 i = 1,n j = n+1-i y(i) = y2(j) w(i) = w2(j) 23006 continue 23007 continue return endif k1 = 0 k2 = 0 do23008 i = 1,n if(i .lt. tau)then y1(i) = y(i) w1(i) = w(i) k1 = k1+1 endif if(i .gt. tau)then j = n+1-i y2(j) = y(i) w2(j) = w(i) k2 = k2+1 endif 23008 continue 23009 continue if(k1.eq.0 .or. k2.eq.0)then goof = 1 return endif if(k1+k2 .eq. n)then call pava(y1,w1,kt,k1) do23018 i = 1,k1 y(i) = y1(i) w(i) = w1(i) 23018 continue 23019 continue call pava(y2,w2,kt,k2) do23020 i = 1,k2 j = n+1-i y(j) = y2(i) w(j) = w2(i) 23020 continue 23021 continue return endif if(k1+k2 .eq. n-1)then yk = y(k1+1) call pava(y1,w1,kt,k1) call pava(y2,w2,kt,k2) i1 = 1 i2 = 1 i = 1 23024 continue if(i1 .le. k1)then t1 = y1(i1) else t1 = y2(k2)+1.d10 endif if(i2 .le. k2)then t2 = y2(i2) else t2 = y1(k1)+1.d10 endif if(t1 .lt. t2)then y(i) = y1(i1) ind(i) = i1 i1 = i1+1 else y(i) = y2(i2) ind(i) = n-i2+1 i2 = i2+1 endif i = i + 1 if(i .eq. n)then goto 23026 endif 23025 goto 23024 23026 continue y(n) = yk ind(n) = k1+1 do23035 i = 1,n w1(ind(i)) = w(i) 23035 continue 23036 continue do23037 i = 1,n w(i) = w1(i) 23037 continue 23038 continue call pava(y,w,kt,n) do23039 i = 1,n y1(ind(i)) = y(i) w1(ind(i)) = w(i) 23039 continue 23040 continue do23041 i = 1,n y(i) = y1(i) w(i) = w1(i) 23041 continue 23042 continue else goof = 1 endif return end Iso/src/pava.f0000644000176000001440000000156612532750401012730 0ustar ripleyusersC Output from Public domain Ratfor, version 1.0 subroutine pava(y,w,kt,n) implicit double precision(a-h,o-z) logical same dimension y(n), w(n), kt(n) do23000 i = 1,n kt(i) = i 23000 continue 23001 continue if(n.eq.1)then return endif 23004 continue same = .true. do23007 i = 2,n if(y(i-1) .gt. y(i))then k1 = kt(i) k2 = kt(i-1) do23011 j = 1,n if(kt(j).eq.k1)then kt(j) = k2 endif 23011 continue 23012 continue wnew = w(i-1) + w(i) ynew = (w(i-1)*y(i-1)+w(i)*y(i))/wnew do23015 j = 1,n if(kt(j).eq.k2)then y(j) = ynew w(j) = wnew endif 23015 continue 23016 continue same = .false. endif 23007 continue 23008 continue if(same)then goto 23006 endif 23005 goto 23004 23006 continue return end Iso/src/ufit.f0000644000176000001440000000266113077250512012750 0ustar ripleyusersC Output from Public domain Ratfor, version 1.03 subroutine ufit(xk,wk,xmode,x,w,mse,x1,w1,x2,w2,ind,kt,n,goof) implicit double precision(a-h,o-z) integer goof double precision mse dimension xk(n), wk(n), x(n), w(n),x1(n), w1(n), x2(n), w2(n), ind *(n), kt(n) if(xmode .lt. 0)then m = n-1 x0 = 1.5d0 xmax = -1.d0 ssemin = 1.d200 do23002 i = 1,m do23004 j = 1,n x(j) = xk(j) w(j) = wk(j) 23004 continue 23005 continue call unimode(x,w,x1,w1,x2,w2,ind,kt,x0,n,goof) if(goof .gt. 0)then return endif sse = 0.d0 do23008 j = 1,n sse = sse + (x(j)-xk(j))**2 23008 continue 23009 continue if(sse .lt. ssemin)then ssemin = sse xmax = x0 endif x0 = x0+1.d0 23002 continue 23003 continue k1 = int(xmax-0.5d0) k2 = int(xmax+0.5d0) else xmax = xmode endif do23012 j = 1,n x(j) = xk(j) w(j) = wk(j) 23012 continue 23013 continue call unimode(x,w,x1,w1,x2,w2,ind,kt,xmax,n,goof) if(goof .gt. 0)then return endif if(xmode .lt. 0)then mse = ssemin/dble(n) if(x(k1).ge.x(k2))then xmode=dble(k1) else xmode=dble(k2) endif else sse = 0.d0 do23020 j = 1,n sse = sse + (x(j)-xk(j))**2 23020 continue 23021 continue mse = sse/dble(n) endif return end Iso/src/init.c0000644000176000001440000000230313662746105012742 0ustar ripleyusers#include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Fortran calls */ extern void F77_NAME(pava)(double *, double *, int *, int *); extern void F77_NAME(smooth)(int *, int *, int *, double *, double *, double *, double *, int *, int *, double *, double *, double *, int *, double *, double *, double *, double *, int *); extern void F77_NAME(ufit)(double *xk, double *wk, double *xmode, double *x, double *w, double *mse, double *x1, double *w1, double *x2, double *w2, int *ind, int *kt, int *n, int *goof); /* Note that the unimode routine does not feature in the foregoing since unimode is called only by ufit and never called directly by .Fortran(). */ static const R_FortranMethodDef FortranEntries[] = { {"pava", (DL_FUNC) &F77_NAME(pava), 4}, {"smooth", (DL_FUNC) &F77_NAME(smooth), 18}, {"ufit", (DL_FUNC) &F77_NAME(ufit), 14}, {NULL, NULL, 0} }; void R_init_Iso(DllInfo *dll) { R_registerRoutines(dll, NULL, NULL, FortranEntries, NULL); R_useDynamicSymbols(dll, FALSE); } Iso/src/smooth.f0000644000176000001440000001455512126131467013320 0ustar ripleyusers SUBROUTINE SMOOTH(NROW, NCOL, NDIM, X, W, A, B, NCYCLE, ICYCLE, G, * EPS1, EPS2, IFAULT, FX, PW, W1, WT, NW) C C ALGORITHM AS 206 APPL. STATIST. (1984) VOL.33, NO.3 C C Subroutine to order a two-dimensional array using an algorithm of C Dykstra & Robertson (1982). The ordering is done so that the C regression function is increasing in each independent variable. C C Incorporates corrections from Applied Statistics vol.35(3), C vol.36(1) and vol.40(1). C IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION X(NROW,NCOL), W(NROW,NCOL), A(NROW,NCOL,4) DIMENSION B(NDIM,5), G(NROW,NCOL) DIMENSION FX(NDIM), PW(NDIM), W1(NDIM), WT(NDIM) INTEGER NW(NDIM) DATA ZERO/0.0d0/, DELTA/0.00001d0/, FRACT/0.5d0/ C IFAULT = 0 C Rprintf("epsilon =%f12.6",EPS) C Rprintf("zero =%f12.6",ZERO) C Rprintf("delta =%f12.6",DELTA) C Rprintf("fract =%f12.6",FRACT) C C Check that there are at least 2 rows and columns C IF (NROW .LT. 2 .OR. NCOL .LT. 2) GO TO 120 C C Check that weights are positive or zero C WSUM = ZERO WXSUM = ZERO WMIN = 1.0d+08 DO 3 I = 1, NROW DO 3 J = 1, NCOL WW = W(I,J) IF (WW .LT. ZERO) GO TO 110 IF (WW .LT. DELTA) GO TO 3 WSUM = WSUM + WW WXSUM = WXSUM + WW * X(I,J) IF (WW .LT. WMIN) WMIN = WW 3 CONTINUE IF (WSUM .LT. DELTA) GO TO 130 WMEAN = WXSUM / WSUM C DO 5 I = 1, NROW DO 5 J = 1, NCOL WW = W(I,J) A(I,J,3) = WW A(I,J,4) = X(I,J) IF (WW .GE. DELTA) GO TO 5 A(I,J,3) = FRACT * WMIN A(I,J,4) = WMEAN ICT = ICT + 1 IFAULT = 4 5 CONTINUE C C Initialize R and C to zero, and set up workspace C IFLAG = 0 DELR = ZERO DELC = ZERO ITIC = 0 8 ITIC = ITIC + 1 DO 10 I = 1, NROW DO 10 J = 1, NCOL G(I,J) = A(I,J,4) A(I,J,2) = ZERO A(I,J,1) = ZERO 10 CONTINUE C C Initialize counter for number of cycles C ICOUNT = 0 IF (IFLAG .EQ. 1) GO TO 55 IF (ITIC .EQ. 3 .AND. DELC .GT. DELR) GO TO 55 C C Smooth over rows C 25 JCOUNT = 0 DO 50 I = 1, NROW DO 30 J = 1, NCOL B(J,1) = G(I,J) - A(I,J,1) B(J,2) = A(I,J,3) 30 CONTINUE C CALL PAV(NCOL, NDIM, EPS2, B, 1, B(1,2), B(1,3), FX, * PW, W1, WT, NW) C KCOUNT = 0 DO 40 J = 1, NCOL ORD = B(J,3) A(I,J,1) = ORD - B(J,1) IF (ABS(ORD - G(I,J)) .LT. EPS1) KCOUNT = KCOUNT + 1 G(I,J) = ORD 40 CONTINUE C C Determine if there is no change in the Ith row from the previous C iteration C IF (KCOUNT .EQ. NCOL) JCOUNT = JCOUNT + 1 50 CONTINUE C ICOUNT = ICOUNT + 1 IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 1) * CALL DIST(A(1,1,1), NROW, NCOL, DELR, IFLAG) IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 2 .AND. ITIC .EQ. 2) GO TO 8 IF (ICOUNT .EQ. 1) GO TO 55 IF (NCYCLE .EQ. ICOUNT) GO TO 100 C C Determine if there has been no change in all rows from the C previous iteration C IF (JCOUNT .EQ. NROW) GO TO 90 C C Smooth over columns C 55 LCOUNT = 0 DO 80 J = 1, NCOL DO 60 I = 1, NROW 60 A(I,J,2) = G(I,J) - A(I,J,2) C CALL PAV(NROW, NDIM, EPS2, A(1,J,2), 1, A(1,J,3), B(1,3), FX, * PW, W1, WT, NW) C MCOUNT = 0 DO 70 I = 1, NROW ORD = B(I,3) A(I,J,2) = ORD - A(I,J,2) IF (ABS(ORD - G(I,J)) .LT. EPS1) MCOUNT = MCOUNT + 1 G(I,J) = ORD 70 CONTINUE C C Determine if there is no change in the Jth column from the C previous iteration C IF (MCOUNT .EQ. NROW) LCOUNT = LCOUNT + 1 80 CONTINUE C ICOUNT = ICOUNT + 1 IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 0) * CALL DIST(A(1,1,2), NROW, NCOL, DELC, IFLAG) IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 1) GO TO 8 IF (ICOUNT .EQ. 1) GO TO 25 C C Determine if there is has been no change in any column from the C previous iteration C IF (LCOUNT .EQ. NCOL) GO TO 90 C C Check if number of cycles has been reached C IF (NCYCLE .EQ. ICOUNT) GO TO 100 GO TO 25 90 ICYCLE = ICOUNT RETURN C 100 ICYCLE = ICOUNT IFAULT = IFAULT + 1 RETURN 110 IFAULT = 2 RETURN 120 IFAULT = 3 RETURN 130 IFAULT = 6 RETURN END SUBROUTINE PAV(K, NDIM, EPS2, X, IORDER, W, FINALX, *FX, PW, W1, WT, NW) C C ALGORITHM AS 206.1 APPL. STATIST. (1984) VOL.33, NO.3 C C Apply pool adjacent violators theorem C IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER NW(NDIM) dimension X(NDIM), W(NDIM), FINALX(NDIM), FX(NDIM), PW(NDIM) dimension W1(NDIM), WT(NDIM) C C DATA EPS/1.0d-06/ C C Set up workspace C NWC = K DO 10 I = 1, K NW(I) = 1 FX(I) = X(I) IF (IORDER .EQ. 0) FX(I) = -FX(I) WT(I) = W(I) PW(I) = WT(I) * FX(I) W1(I) = W(I) 10 CONTINUE IBEL = K - 1 20 I = 0 30 I = I + 1 35 IF (I .GT. IBEL) GO TO 50 I1 = I + 1 C C Determine if pooling is required C IF (FX(I) - FX(I1) .LE. EPS2) GO TO 30 C C Pool the adjacent values C PW(I) = PW(I) + PW(I1) W1(I) = W1(I) + W1(I1) FX(I) = PW(I) / W1(I) NW(I) = NW(I) + NW(I1) NWC = NWC - 1 IF (I1 .GT. IBEL) GO TO 45 DO 40 J = I1, IBEL J1 = J + 1 PW(J) = PW(J1) W1(J) = W1(J1) FX(J) = FX(J1) NW(J) = NW(J1) 40 CONTINUE 45 IBEL = IBEL - 1 GO TO 35 50 ICOUNT = 0 IF (IBEL .LE. 0) GO TO 70 C C Determine if all values are ordered C DO 60 L = 1, IBEL 60 IF (FX(L) - FX(L+1) .LE. EPS2) ICOUNT = ICOUNT + 1 IF (ICOUNT .NE. IBEL) GO TO 20 C C Recover final ordered values C 70 J = 1 JL = 1 JU = NW(1) 80 DO 90 L = JL,JU 90 FINALX(L) = FX(J) J = J + 1 IF (J .GT. NWC) GO TO 100 JL = JU + 1 JU = JU + NW(J) GO TO 80 100 IF (IORDER .EQ. 1) RETURN DO 110 I = 1, K 110 FINALX(I) = -FINALX(I) RETURN END SUBROUTINE DIST(A1, NROW, NCOL, DEL, IFLAG) C C ALGORITHM AS 206.2 APPL. STATIST. (1984) VOL.33, NO.3 C IMPLICIT DOUBLE PRECISION (A-H,O-Z) dimension A1(NROW,NCOL) C DATA ZERO/0.0d0/ C DEL = ZERO DO 20 I = 1, NROW DO 20 J = 1, NCOL DEL = DEL + A1(I,J) * A1(I,J) 20 CONTINUE IFLAG = IFLAG + 1 RETURN END Iso/vignettes/0000755000176000001440000000000013475566552013066 5ustar ripleyusersIso/vignettes/algorithm-004.eps0000644000176000001440000003222212535257220016050 0ustar ripleyusers%!PS-Adobe-3.0 %%DocumentNeededResources: font Helvetica %%+ font Helvetica-Bold %%+ font Helvetica-Oblique %%+ font Helvetica-BoldOblique %%+ font Symbol %%DocumentMedia: special 432 432 0 () () %%Title: R Graphics Output %%Creator: R Software %%Pages: (atend) %%BoundingBox: 0 0 432 432 %%EndComments %%BeginProlog /bp { gs sRGB gs } def % begin .ps.prolog /gs { gsave } bind def /gr { grestore } bind def /ep { showpage gr gr } bind def /m { moveto } bind def /l { rlineto } bind def /np { newpath } bind def /cp { closepath } bind def /f { fill } bind def /o { stroke } bind def /c { newpath 0 360 arc } bind def /r { 4 2 roll moveto 1 copy 3 -1 roll exch 0 exch rlineto 0 rlineto -1 mul 0 exch rlineto closepath } bind def /p1 { stroke } bind def /p2 { gsave bg fill grestore newpath } bind def /p3 { gsave bg fill grestore stroke } bind def /p6 { gsave bg eofill grestore newpath } bind def /p7 { gsave bg eofill grestore stroke } bind def /t { 5 -2 roll moveto gsave rotate 1 index stringwidth pop mul neg 0 rmoveto show grestore } bind def /ta { 4 -2 roll moveto gsave rotate show } bind def /tb { 2 -1 roll 0 rmoveto show } bind def /cl { grestore gsave newpath 3 index 3 index moveto 1 index 4 -1 roll lineto exch 1 index lineto lineto closepath clip newpath } bind def /rgb { setrgbcolor } bind def /s { scalefont setfont } bind def % end .ps.prolog /sRGB { [ /CIEBasedABC << /DecodeLMN [ { dup 0.03928 le {12.92321 div} {0.055 add 1.055 div 2.4 exp } ifelse } bind dup dup ] /MatrixLMN [0.412457 0.212673 0.019334 0.357576 0.715152 0.119192 0.180437 0.072175 0.950301] /WhitePoint [0.9505 1.0 1.0890] >> ] setcolorspace } bind def /srgb { setcolor } bind def %%IncludeResource: font Helvetica /Helvetica findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font1 exch definefont pop %%IncludeResource: font Helvetica-Bold /Helvetica-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font2 exch definefont pop %%IncludeResource: font Helvetica-Oblique /Helvetica-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font3 exch definefont pop %%IncludeResource: font Helvetica-BoldOblique /Helvetica-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font4 exch definefont pop %%IncludeResource: font Symbol /Symbol findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall currentdict end /Font5 exch definefont pop %%EndProlog %%Page: 1 1 bp 38.02 326.02 206.50 403.49 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 44.26 348.82 m 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 3.58 l 7.09 0 l 7.10 0 l 7.09 2.31 l 7.09 0 l 7.09 5.74 l 7.09 4.46 l 7.09 0 l 7.09 0 l 7.09 4.62 l 7.09 -6.50 l 7.09 0 l 7.09 0 l 7.10 0 l 7.09 0 l o 0.00 0.00 432.00 432.00 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 44.26 326.02 m 141.81 0 l o np 44.26 326.02 m 0 -4.76 l o np 79.71 326.02 m 0 -4.76 l o np 115.17 326.02 m 0 -4.76 l o np 150.62 326.02 m 0 -4.76 l o np 186.07 326.02 m 0 -4.76 l o /Font1 findfont 8 s 44.26 308.91 (1965) .5 0 t 79.71 308.91 (1970) .5 0 t 115.17 308.91 (1975) .5 0 t 150.62 308.91 (1980) .5 0 t 186.07 308.91 (1985) .5 0 t np 38.02 328.89 m 0 71.73 l o np 38.02 328.89 m -4.76 0 l o np 38.02 340.84 m -4.76 0 l o np 38.02 352.80 m -4.76 0 l o np 38.02 364.75 m -4.76 0 l o np 38.02 376.71 m -4.76 0 l o np 38.02 388.66 m -4.76 0 l o np 38.02 400.62 m -4.76 0 l o 26.61 328.89 (0.00) .5 90 t 26.61 352.80 (0.10) .5 90 t 26.61 376.71 (0.20) .5 90 t 26.61 400.62 (0.30) .5 90 t np 38.02 326.02 m 168.48 0 l 0 77.47 l -168.48 0 l 0 -77.47 l o 0.00 288.00 216.00 432.00 cl /Font2 findfont 12 s 0 0 0 srgb 122.26 413.44 (stand 1) .5 0 t /Font1 findfont 8 s 114.48 289.90 (y) 0 ta -0.160 (ear) tb gr 7.60 364.75 (vigour) .5 90 t 38.02 326.02 206.50 403.49 cl /Font1 findfont 8 s 1 0 0 srgb 44.26 346.95 (+) .5 0 t 51.35 354.84 (+) .5 0 t 58.44 354.36 (+) .5 0 t 65.53 344.80 (+) .5 0 t 72.62 346.23 (+) .5 0 t 79.71 340.49 (+) .5 0 t 86.80 342.89 (+) .5 0 t 93.89 343.84 (+) .5 0 t 100.98 361.78 (+) .5 0 t 108.07 345.99 (+) .5 0 t 115.17 343.36 (+) .5 0 t 122.26 352.69 (+) .5 0 t 129.35 352.69 (+) .5 0 t 136.44 358.43 (+) .5 0 t 143.53 365.36 (+) .5 0 t 150.62 363.69 (+) .5 0 t 157.71 359.62 (+) .5 0 t 164.80 367.51 (+) .5 0 t 171.89 360.58 (+) .5 0 t 178.98 356.52 (+) .5 0 t 186.07 358.91 (+) .5 0 t 193.17 361.54 (+) .5 0 t 200.26 367.51 (+) .5 0 t 254.02 326.02 422.50 403.49 cl 254.02 326.02 422.50 403.49 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 260.26 354.95 m 7.09 0.87 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.10 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0.32 l 7.09 19.61 l 7.09 20.80 l 7.09 -7.17 l 7.09 -6.22 l 7.09 -8.60 l 7.10 -4.55 l 7.09 -4.06 l o 0.00 0.00 432.00 432.00 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 260.26 326.02 m 141.81 0 l o np 260.26 326.02 m 0 -4.76 l o np 295.71 326.02 m 0 -4.76 l o np 331.17 326.02 m 0 -4.76 l o np 366.62 326.02 m 0 -4.76 l o np 402.07 326.02 m 0 -4.76 l o /Font1 findfont 8 s 260.26 308.91 (1965) .5 0 t 295.71 308.91 (1970) .5 0 t 331.17 308.91 (1975) .5 0 t 366.62 308.91 (1980) .5 0 t 402.07 308.91 (1985) .5 0 t np 254.02 328.89 m 0 71.73 l o np 254.02 328.89 m -4.76 0 l o np 254.02 340.84 m -4.76 0 l o np 254.02 352.80 m -4.76 0 l o np 254.02 364.75 m -4.76 0 l o np 254.02 376.71 m -4.76 0 l o np 254.02 388.66 m -4.76 0 l o np 254.02 400.62 m -4.76 0 l o 242.61 328.89 (0.00) .5 90 t 242.61 352.80 (0.10) .5 90 t 242.61 376.71 (0.20) .5 90 t 242.61 400.62 (0.30) .5 90 t np 254.02 326.02 m 168.48 0 l 0 77.47 l -168.48 0 l 0 -77.47 l o 216.00 288.00 432.00 432.00 cl /Font2 findfont 12 s 0 0 0 srgb 338.26 413.44 (stand 2) .5 0 t /Font1 findfont 8 s 330.48 289.90 (y) 0 ta -0.160 (ear) tb gr 223.60 364.75 (vigour) .5 90 t 254.02 326.02 422.50 403.49 cl /Font1 findfont 8 s 1 0 0 srgb 260.26 352.93 (+) .5 0 t 267.35 374.45 (+) .5 0 t 274.44 351.02 (+) .5 0 t 281.53 349.82 (+) .5 0 t 288.62 350.30 (+) .5 0 t 295.71 372.06 (+) .5 0 t 302.80 350.78 (+) .5 0 t 309.89 350.06 (+) .5 0 t 316.98 348.15 (+) .5 0 t 324.07 350.06 (+) .5 0 t 331.17 351.02 (+) .5 0 t 338.26 355.08 (+) .5 0 t 345.35 349.58 (+) .5 0 t 352.44 349.58 (+) .5 0 t 359.53 351.25 (+) .5 0 t 366.62 354.12 (+) .5 0 t 373.71 373.73 (+) .5 0 t 380.80 394.53 (+) .5 0 t 387.89 387.36 (+) .5 0 t 394.98 381.14 (+) .5 0 t 402.07 372.54 (+) .5 0 t 409.17 367.99 (+) .5 0 t 416.26 363.93 (+) .5 0 t 38.02 182.02 206.50 259.49 cl 38.02 182.02 206.50 259.49 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 44.26 197.80 m 7.09 7.65 l 7.09 0.48 l 7.09 0 l 7.09 0 l 7.09 5.14 l 7.09 0 l 7.09 1.49 l 7.09 0 l 7.09 0 l 7.10 0 l 7.09 2.21 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0.48 l 7.09 18.89 l 7.09 18.41 l 7.09 -0.24 l 7.09 -3.82 l 7.09 -10.28 l 7.10 -14.35 l 7.09 -9.80 l o 0.00 0.00 432.00 432.00 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 44.26 182.02 m 141.81 0 l o np 44.26 182.02 m 0 -4.76 l o np 79.71 182.02 m 0 -4.76 l o np 115.17 182.02 m 0 -4.76 l o np 150.62 182.02 m 0 -4.76 l o np 186.07 182.02 m 0 -4.76 l o /Font1 findfont 8 s 44.26 164.91 (1965) .5 0 t 79.71 164.91 (1970) .5 0 t 115.17 164.91 (1975) .5 0 t 150.62 164.91 (1980) .5 0 t 186.07 164.91 (1985) .5 0 t np 38.02 184.89 m 0 71.73 l o np 38.02 184.89 m -4.76 0 l o np 38.02 196.84 m -4.76 0 l o np 38.02 208.80 m -4.76 0 l o np 38.02 220.75 m -4.76 0 l o np 38.02 232.71 m -4.76 0 l o np 38.02 244.66 m -4.76 0 l o np 38.02 256.62 m -4.76 0 l o 26.61 184.89 (0.00) .5 90 t 26.61 208.80 (0.10) .5 90 t 26.61 232.71 (0.20) .5 90 t 26.61 256.62 (0.30) .5 90 t np 38.02 182.02 m 168.48 0 l 0 77.47 l -168.48 0 l 0 -77.47 l o 0.00 144.00 216.00 288.00 cl /Font2 findfont 12 s 0 0 0 srgb 122.26 269.44 (stand 3) .5 0 t /Font1 findfont 8 s 114.48 145.90 (y) 0 ta -0.160 (ear) tb gr 7.60 220.75 (vigour) .5 90 t 38.02 182.02 206.50 259.49 cl /Font1 findfont 8 s 1 0 0 srgb 44.26 195.78 (+) .5 0 t 51.35 203.43 (+) .5 0 t 58.44 205.34 (+) .5 0 t 65.53 202.47 (+) .5 0 t 72.62 203.91 (+) .5 0 t 79.71 212.99 (+) .5 0 t 86.80 205.10 (+) .5 0 t 93.89 221.36 (+) .5 0 t 100.98 206.78 (+) .5 0 t 108.07 208.45 (+) .5 0 t 115.17 205.58 (+) .5 0 t 122.26 214.19 (+) .5 0 t 129.35 214.67 (+) .5 0 t 136.44 210.12 (+) .5 0 t 143.53 212.04 (+) .5 0 t 150.62 213.23 (+) .5 0 t 157.71 232.12 (+) .5 0 t 164.80 250.53 (+) .5 0 t 171.89 250.29 (+) .5 0 t 178.98 246.47 (+) .5 0 t 186.07 236.19 (+) .5 0 t 193.17 221.84 (+) .5 0 t 200.26 212.04 (+) .5 0 t 254.02 182.02 422.50 259.49 cl 254.02 182.02 422.50 259.49 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 260.26 199.95 m 7.09 13.23 l 7.09 0 l 7.09 0 l 7.09 7.93 l 7.09 0 l 7.09 9.21 l 7.09 -13.44 l 7.09 0 l 7.09 0 l 7.10 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.10 0 l 7.09 0 l o 0.00 0.00 432.00 432.00 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 260.26 182.02 m 141.81 0 l o np 260.26 182.02 m 0 -4.76 l o np 295.71 182.02 m 0 -4.76 l o np 331.17 182.02 m 0 -4.76 l o np 366.62 182.02 m 0 -4.76 l o np 402.07 182.02 m 0 -4.76 l o /Font1 findfont 8 s 260.26 164.91 (1965) .5 0 t 295.71 164.91 (1970) .5 0 t 331.17 164.91 (1975) .5 0 t 366.62 164.91 (1980) .5 0 t 402.07 164.91 (1985) .5 0 t np 254.02 184.89 m 0 71.73 l o np 254.02 184.89 m -4.76 0 l o np 254.02 196.84 m -4.76 0 l o np 254.02 208.80 m -4.76 0 l o np 254.02 220.75 m -4.76 0 l o np 254.02 232.71 m -4.76 0 l o np 254.02 244.66 m -4.76 0 l o np 254.02 256.62 m -4.76 0 l o 242.61 184.89 (0.00) .5 90 t 242.61 208.80 (0.10) .5 90 t 242.61 232.71 (0.20) .5 90 t 242.61 256.62 (0.30) .5 90 t np 254.02 182.02 m 168.48 0 l 0 77.47 l -168.48 0 l 0 -77.47 l o 216.00 144.00 432.00 288.00 cl /Font2 findfont 12 s 0 0 0 srgb 338.26 269.44 (stand 4) .5 0 t /Font1 findfont 8 s 330.48 145.90 (y) 0 ta -0.160 (ear) tb gr 223.60 220.75 (vigour) .5 90 t 254.02 182.02 422.50 259.49 cl /Font1 findfont 8 s 1 0 0 srgb 260.26 197.93 (+) .5 0 t 267.35 214.19 (+) .5 0 t 274.44 209.17 (+) .5 0 t 281.53 210.12 (+) .5 0 t 288.62 220.64 (+) .5 0 t 295.71 217.54 (+) .5 0 t 302.80 228.30 (+) .5 0 t 309.89 207.97 (+) .5 0 t 316.98 206.06 (+) .5 0 t 324.07 209.65 (+) .5 0 t 331.17 212.28 (+) .5 0 t 338.26 213.71 (+) .5 0 t 345.35 211.32 (+) .5 0 t 352.44 211.08 (+) .5 0 t 359.53 214.91 (+) .5 0 t 366.62 217.54 (+) .5 0 t 373.71 218.25 (+) .5 0 t 380.80 222.80 (+) .5 0 t 387.89 218.97 (+) .5 0 t 394.98 220.64 (+) .5 0 t 402.07 217.54 (+) .5 0 t 409.17 217.06 (+) .5 0 t 416.26 218.01 (+) .5 0 t 38.02 38.02 206.50 115.49 cl 38.02 38.02 206.50 115.49 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 44.26 59.30 m 7.09 7.59 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0.06 l 7.09 0 l 7.09 0 l 7.09 0 l 7.09 0 l 7.10 0 l 7.09 1.75 l 7.09 0 l 7.09 0 l 7.09 3.27 l 7.09 1.20 l 7.09 8.84 l 7.09 12.91 l 7.09 -4.54 l 7.09 -3.35 l 7.09 -4.78 l 7.10 -4.06 l 7.09 -1.68 l o 0.00 0.00 432.00 432.00 cl 0 0 0 srgb 0.75 setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10.00 setmiterlimit np 44.26 38.02 m 141.81 0 l o np 44.26 38.02 m 0 -4.76 l o np 79.71 38.02 m 0 -4.76 l o np 115.17 38.02 m 0 -4.76 l o np 150.62 38.02 m 0 -4.76 l o np 186.07 38.02 m 0 -4.76 l o /Font1 findfont 8 s 44.26 20.91 (1965) .5 0 t 79.71 20.91 (1970) .5 0 t 115.17 20.91 (1975) .5 0 t 150.62 20.91 (1980) .5 0 t 186.07 20.91 (1985) .5 0 t np 38.02 40.89 m 0 71.73 l o np 38.02 40.89 m -4.76 0 l o np 38.02 52.84 m -4.76 0 l o np 38.02 64.80 m -4.76 0 l o np 38.02 76.75 m -4.76 0 l o np 38.02 88.71 m -4.76 0 l o np 38.02 100.66 m -4.76 0 l o np 38.02 112.62 m -4.76 0 l o 26.61 40.89 (0.00) .5 90 t 26.61 64.80 (0.10) .5 90 t 26.61 88.71 (0.20) .5 90 t 26.61 112.62 (0.30) .5 90 t np 38.02 38.02 m 168.48 0 l 0 77.47 l -168.48 0 l 0 -77.47 l o 0.00 0.00 216.00 144.00 cl /Font2 findfont 12 s 0 0 0 srgb 122.26 125.44 (stand 5) .5 0 t /Font1 findfont 8 s 114.48 1.90 (y) 0 ta -0.160 (ear) tb gr 7.60 76.75 (vigour) .5 90 t 38.02 38.02 206.50 115.49 cl /Font1 findfont 8 s 1 0 0 srgb 44.26 57.28 (+) .5 0 t 51.35 70.67 (+) .5 0 t 58.44 63.97 (+) .5 0 t 65.53 60.62 (+) .5 0 t 72.62 64.21 (+) .5 0 t 79.71 69.71 (+) .5 0 t 86.80 65.65 (+) .5 0 t 93.89 64.93 (+) .5 0 t 100.98 64.69 (+) .5 0 t 108.07 62.54 (+) .5 0 t 115.17 62.06 (+) .5 0 t 122.26 67.80 (+) .5 0 t 129.35 65.88 (+) .5 0 t 136.44 66.36 (+) .5 0 t 143.53 69.95 (+) .5 0 t 150.62 71.15 (+) .5 0 t 157.71 79.99 (+) .5 0 t 164.80 92.90 (+) .5 0 t 171.89 88.36 (+) .5 0 t 178.98 85.01 (+) .5 0 t 186.07 80.23 (+) .5 0 t 193.17 76.17 (+) .5 0 t 200.26 74.49 (+) .5 0 t ep %%Trailer %%Pages: 1 %%EOF Iso/vignettes/algorithm-004.pdf0000644000176000001440000001526412535257220016041 0ustar ripleyusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20150608212120) /ModDate (D:20150608212120) /Title (R Graphics Output) /Producer (R 3.3.0) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 2764 /Filter /FlateDecode >> stream x]ݶϯХ*9M0E Iq@}g8Cu==7r9oo6~|;dscJc>uWo/nwmo3ooowO۟.1^a{I~iȟ/ U洧am/^e{u*[kS[B=4ˢ}@Sn}S܇Xs[oOVu飝uC]|oc]xӣN x~4ޡҵ˥Dxy{{0.h9ǜ# 23bh8jAᇏL0=m2=Yau{x-û~sq{ٻC}}{cz^L(U%xK߼I>^׫D{4.4D2uLSO2.ӌzFSkLzFG^ ؟M@^o dO@Fo d?!H,>F0O#BӈiD@uP#bXjD 5"EnF|S/1RgtKY)=<+;%ˣ nIZ7z*HeԴX]BiI;T41(52vm,SM(]q]팕tjZ<WzM]GEӟɴ7^ZzM{⨴·S5ĉIe&rҟNT13QDDgg94ޯԞXh&kךz"bj5}P"by6'o:C.*/ts>Y!z6`L G %&9̠H0Ԕ̠TvS<Ԕ̠nAA-RjA.E(R J53(LK,$eP@D2([*aPWC ʠhY{2(IIwD+"1W jvs=%gQ#D/Q(5. 3;<Ǡ ʠ AW)ΓxdP8+퀷 D.V%ri2(K;& D.|B]F'4_ -;eP^iCCj+t3zaPb(܎)/eP@OfPOwaPjEfP@X}1=; fPS Fk} k 3(o.OA]wAђj Lͬ(٘  aEଘ`An h2`dI +X/3(| ) n+u]\=㓞#WE 2(̠Mʠ7A\2(̠T3Xte243(̠xC3(Q J53ExAM-Xe0^aPSߏA!!,:bhu+r4BFψJǑH暄AM N&aP'}0Ig|\2A-6w<uO$@uP#bXjD 5"EN#,>1i#O;)~JIǽq j#=<+;uP_A}bAP zR=I߇A:S 030(Z&: | ь$ ̕$y6WE)X3( GtAզ :M̠W;bbAQ͉ M' 4 Eyo<|nAT^ PL0#g~PR=%3);9iJNS2sŒn r* MD;SM|S_M־ftleKkg3Z:t"K>%zxKY :b%zN+m`VzN+muIE)Niv= ;ORyL,ɻL9S=$YWtt#xI|/<rs1}v BdLpŲ>gD/;2?!#*1Oѣ8#V6'#h@Q$(BnlD7U15ºQFfGAFX?)cb&Y疁nb^T'F\1-#[,"r5\Xendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000003128 00000 n 0000003211 00000 n 0000003334 00000 n 0000003367 00000 n 0000000212 00000 n 0000000292 00000 n 0000006062 00000 n 0000006319 00000 n 0000006416 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 6518 %%EOF Iso/vignettes/algorithm.Rnw0000644000176000001440000005334412535262153015537 0ustar ripleyusers\documentclass[11pt]{article} %\VignetteIndexEntry{Algorithm} \usepackage{graphicx,float} \usepackage{Sweave} \usepackage{bm} \usepackage{anysize} \usepackage{wasysym} %\marginsize{2cm}{2cm}{2cm}{2cm} \newcommand{\pkg}[1]{\texttt{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\R}{{\sf R}} \newcommand{\Iso}{\pkg{Iso}} \newcommand{\fol}{\mbox{$\prec \prec$}} \newcommand{\iuc}{\mbox{${\cal I}^c$}} \newcommand{\ilc}{\mbox{${\cal I}_c$}} \newcommand{\qued}{\rule{2mm}{3.5mm}} \parindent 0 cm \begin{document} \thispagestyle{empty} <>= options(SweaveHooks=list(fig=function() par(mar=c(1,1,1,1)))) @ \SweaveOpts{eps=TRUE} \setkeys{Gin}{width=0.6\textwidth} <>= library(Iso) sdate <- read.dcf(file = system.file("DESCRIPTION", package = "Iso"), fields = "Date") sversion <- read.dcf(file = system.file("DESCRIPTION", package = "Iso"), fields = "Version") options(useFancyQuotes=FALSE) @ \title{The algorithm for calculating unimodal isotonic regression in \texttt{Iso}} \author{Rolf Turner} \date{For \Iso\ version \texttt{\Sexpr{sversion}}} \maketitle \begin{abstract} The \Iso\ package provides an algorithm for applying isotonic regression to data having an underlying unimodal structure. This algorithm consists essentially of ``divide and conquer'' approach to this class of isotonic regression problems. Repeated application of the algorithm permits the estimation of the location of the maximum of a data set assumed to have an underlying unimodal structure. This estimation procedure is ``easily'' (for some value of the word ``easily'') shown to be consistent. The performance of the resulting procedure for locating a maximum has been assessed through a simulation study described in one of the references. This document supplies some of the background on the algorithm used calculating unimodal isotonic regression and gives a theoretical justification of why this algorithm works. \end{abstract} \tableofcontents \newpage \section{Introduction} \label{S:intro} Algorithms for implementing isotonic regression under orderings other than the simple linear order are difficult to construct. The best known of such algorithms is the Maximum Lower Sets algorithm \cite[p. 24]{RobertsonEtAl1988}. This algorithm is complicated and hard to program. It is also reputed to run rather slowly, and indeed the number of operations required grows exponentially in certain cases. The motivation for developing an improved algorithm for performing such regressions came in part from a data set being studied by members of the Faculty of Forestry at the University of New Brunswick. These data consisted of observations which had been made of the ``vigour'' of growth of five stands of black spruce. The stands each had different initial tree densities. It was expected that vigour would initially increase (as the trees increased in size) and then level off and start to decrease as the growing trees encroached upon each others' space and competed more strongly for resources such as moisture, nutrients, and light. It was further expected that the position of the mode of the vigour observations would depend upon the initial densities. Plots of the data did not make it completely clear as to where the leveling-off point or mode occurred; the Forestry researchers requested a procedure for determining the location of this mode. A procedure which comes immediately to mind is to fit unimodal isotonic regressions with mode at each of the possible locations in turn. The location yielding minimal error sum of squares is then chosen as the location of the mode. It is thus desirable to be able to perform a large number of unimodal isotonic regressions quickly and efficiently. Formally the unimodal isotonic regression problem may be stated as follows: Suppose that $Y_{ij}$, $i=1, \ldots, p$, $j = 1, \ldots, n_i$, are independent random variables such that $Y_{ij} = \mu_i + E_{ij}$ for all $i$ and $j$, where the $E_{ij}$ have mean 0 and variance $\sigma^2$. Further suppose that the $\mu_i$ have a {\em unimodal ordering}, i.e. that \begin{equation} \label{unimod1} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k_0} \geq \mu_{k_0 + 1} \geq \ldots \geq \mu_p \end{equation} for some $k_0$, $1 \leq k_0 \leq p$. Of course if $k_0 = p$ then we have the usual linear isotonic regression problem and if $k_0 = 1$ we the linear \emph{decreasing} order isotonic regression problem. The problem is to estimate the values of $\mu_1, \ldots, \mu_p$. The (weighted) least squares estimates of the $\mu_i$ are given by minimizing \[ SS = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i)^2 w_i \] subject to the constraint (\ref{unimod1}), where $w_1, \ldots, w_p$ are a (given) set of positive weights. This problem may initially be subdivided into three sub-problems involving only {\em linear} orderings: (a) estimating $\mu_1, \ldots , \mu_{k-1}$; (b) estimating $\mu_k$; and (c) estimating $\mu_{k+1}, \ldots , \mu_n$. Sub-problem (b) is of course trivial as it stands, and sub-problems (a) and (c) can be solved by standard and well-known techniques. The question is how to combine the solutions of the three subproblems appropriately. The answer is essentially to ``interleaf'' the estimates resulting from solving sub-problems (a) and (c) in {\em numerical} order, tack on $\hat{\mu}_k = \bar{Y}_{k.}$ at the upper end, solve the corresponding isotonic regression with respect to the resulting linear ordering, and then put the estimates back in their original order. In the next section we make this answer slightly more precise and demonstrate that it is indeed correct. The idea may be generalised to other partial orderings and to other ``tree-like'' structures as well as to unimodal ones but we will not elaborate on the details. \section{Notation and Terminology, and the Main Result} \label{mainres} Let $k_0 \in S = \{1, \ldots, p\}$ be given (to avoid trivialitie assume $1 < k_0 < p$ and let $\prec$ be the partial order on given by $x \prec y$ if either $x \leq y \leq k_0$ or $x \geq y \geq k_0$. If $x < k_0$ and $y > k_0$ or vice versa then $x$ and $y$ are not comparable under $\prec$. Recall that an isotonic function (with respect to the partial order $\prec$) is a (real-valued) function $f$ such that $x \prec y$ implies $f(x) \leq f(y)$. If $g$ is an arbitrary function on $S$, and $w$ is a non-negative (weight) function on $S$, then the {\em isotonic regression} of $g$, with respect to $\prec$ and $w$, (denoted $g_*$) is that value of $\hat{g}$ which minimizes \[ \sum_{s \in S} [g(s) - \hat{g}(s)]^2w(s) \] over all \emph{isotonic} functions $\hat{g}$. Let $S_1$ and $S_2$ be two subsets of $S$. We say that $S_2$ {\em follows} $S_1$, (in symbols $S_1 \fol S_2$) if $x \prec y$ for every $x$ in $S_1$ and every $y$ in $S_2$. Let $S_1 = \{k \in S \mid k \neq k_0\}$ and $S_2 = \{k_0\}.$ Let $g_1$ be the restriction of $g$ to $S_1$, and let $g_{1*}$ be the isotonic regression of $g_1$r. The weight function used to form $g_{1*}$ is of course the restriction of the overall weight function $w$ to $S_1$. An elementary but important fact about isotonic regression is that $g_*$ takes the form \[ g_*(s) = c_i \mbox{ on } L_i, \; i = 1, \ldots, r \] where $L_1, \ldots, L_r$ form a disjoint and exhaustive collection of subsets of $S$, and $c_1 < c_2 < \ldots < c_r$. Moreover $c_i$ is the weighted mean over $L_i$ of the values of $g(s)$; i.e. \[ c_i = \frac{\sum_{s \in L_i} w(s)g(s)}{\sum_{s \in L_i} w(s)}\;\;. \] (See \cite[p. 18, Theorem 1.3.5]{RobertsonEtAl1988}.) We call the sets $L_i$ the {\em level} sets and the values $c_i$ the {\em level} values of the isotonic regression. Let the level sets and level values for $g_{1*}$ be $L_1, \ldots, L_{r}$ and $c_1 < \ldots < c_{r}$, and let $L_{r+1} = \{k_0\}$ and let $c_{r+1} = g(k_0)$. Define a function $f$ on $\{1, \ldots, r + 1 \}$, by $f(t) = c_t$ for $t = 1, \ldots r+1$, and a weight function $u$ by \[ u(t) = \sum_{x \in L_t} w(x) \;\;. \] {\bf Theorem 1:} Let $f$ and $u$ be as given above. Let $f_*$ be the isotonic regression of $f$ with respect to the usual order on $\{1, \ldots, r+1 \}$ and the weight function $u$. Then the isotonic regression of $g$ with respect to $\prec$ and $w$ is given by \[ g_*(s) = f_*(t) \mbox{ for } s \in L_t \;\;. \] \textbf{Remark:} Note that $S_1$ consists of the two disjoint sets $\{1, \ldots, k-1 \}$ and $\{k+1, \ldots, n \}$ which are unrelated with respect to $\prec$. It is easy to see (and well-known; see, e.g. \cite[p. 57]{RobertsonEtAl1988}) that an isotonic regression on their union is simply the amalgamation of separate isotonic regressions on each component. That is $g_1*$ is obtained by doing an ``ordinary'' isotonic regression of the restriction of $g$ to $\{1, \ldots, k-1 \}$ and an isotonic regression of the restriction of $g$ to $\{k+1, \ldots, p \}$ with respect to decreasing order on this set. To prove Theorem 1 we require the following definitions and a couple of preliminary lemmas. {\bf Definition:} For any constant $c$ we define \[ \iuc = \{g | g \mbox{ is isotonic and~} g(s) \leq c \mbox{~for all~} s \in S \} \] and \[ \ilc = \{g | g \mbox{ is isotonic and~} g(s) \geq c \mbox{~for all~} s \in S \} \;\;. \] Let $g_*(s)$ be the isotonic regression of $g$ and define \[ g_{cu}(s) = \left \{ \begin{array}{cl} g_*(s) & \mbox{ if } g_*(s) \leq c\\ c & \mbox{ if } g_*(s) > c \;\;.\end{array} \right. \] {\bf Lemma 1:} The function $g_{cu}$ uniquely minimizes \begin{equation} \sum_{s \in S} [g(s) - \hat{g}(s)]^2 w(s) \label{eq:trunciso} \end{equation} subject to $\hat{g} \in \iuc$. {\bf Proof:} For any $\hat{g}$ in $\iuc$, \begin{eqnarray*} \sum_{s \in S} [g(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s)]w(s) & = & \sum_{s \in S} [g(s) - g_*(s)][g_{cu}(s) - g_*(s)]w(s)\\ & & + \sum_{s \in S} [g_*(s) - g_{cu}(s)] [g_{cu}(s) - \hat{g}(s)]w(s)\\ & & + \sum_{s \in S} [g(s) - g_*(s)] [g_*(s) - \hat{g}(s)]w(s)\\ & = & \Sigma_1 + \Sigma_2 + \Sigma_3 \end{eqnarray*} Now $ \Sigma_1 = 0 $ by \cite[Theorem 1.3.6, p. 23]{RobertsonEtAl1988} since $g_{cu}(s) - g_*(s)$ is a function of $g_*(s)$. It is also true that $ \Sigma_3 \geq 0 $ since $g_*$ is the isotonic regression of $g$ (applying \cite[Theorem 1.3.1, p. 15]{RobertsonEtAl1988}). Finally \begin{eqnarray*} \Sigma_2 & = & \sum_{g_*(s) > c} [g_*(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s)]w(s)\\ & = & \sum_{g_*(s) > c} [g_*(s) - c][c - \hat{g}(s)]w(s) \geq 0 \;\;. \end{eqnarray*} Since $\iuc$ is a convex lattice we may apply the converse part of \cite[Theorem 1.3.1, p. 15]{RobertsonEtAl1988} and the result follows. \qued Exactly analogous to Lemma 1 is {\bf Lemma 2:} The function \[ g_{cl}(s) = \left \{ \begin{array}{cl} g_*(s) & \mbox{ if } g_*(s) \geq c\\ c & \mbox{ if } g_*(s) < c \;\;. \end{array} \right. \] uniquely minimizes (\ref{eq:trunciso}) for $\hat{g} \in \ilc$. Lemma 3, given below, is an immediate consequence of Lemma 1 and 2: {\bf Lemma 3:} Let $c_{k_1}, \ldots, c_{k_m}$ be a subset of the level values of $g_*$, and let \[ S' = S \setminus \bigcup_{l=1}^m \{s | g_*(s) = c_{k_l} \} \neq \phi \;\; \] The isotonic regression of $g$ restricted to $S'$ is $g_*$ restricted to $S'$. We can now prove the main result: {\bf Proof of Theorem 1:} Since $x \prec k_0$ for all $x \in S_1$ it is easy to see that there is a constant $c$ such that: \begin{eqnarray*} g_*(s) & < & c \mbox{~implies~} s \in S_1 {\rm and}\\ g_*(s) & > & c \mbox{~implies~} s = k_0 \;\;. \end{eqnarray*} The set $\{s | g(s) = c \}$ may contain elements from $S_1$ and may contain $k_0$ as well. For this $c$ \[ g_*(s) = \left \{ \begin{array}{cl} g_{cu}(s) & \mbox{ if } s \in S_1 \\ g_{cl}(s) & \mbox{ if } s = k_0 \end{array} \right. \] otherwise we would contradict the definition of $g_*$. Applying Lemmas 1 and 2, it follows that \[ g_{cu}(s) = \left \{ \begin{array}{cl} g_{1*}(s) & \mbox{ if } g_{1*}(s) < c \\ c & \mbox{ if } g_{1*}(s) \geq c \end{array} \right. \] for $s \in S_1$ and \[ g_{lu}(s) = \left \{ \begin{array}{cl} c & \mbox{ if } g_{2*}(s) \leq c \\ g_{2*}(s) & \mbox{ if } g_{2*}(s) > c \end{array} \right. \] for $s \in S_2$. Therefore $g_*(s)$ is a function of $g_{1*}(s)$ on $S_1$. In other words, $g_*(s)$ is constant on all of the level sets $L_i$ of $g_{1*}$. (Since $L_{r+1}$ consists of the single point $k_0$, $g_*(s)$ is trivially constant on $L_{r+1}$.) Let $g_*(s) = d_i$ on $L_i$ for $i = 1, \ldots, r+1$. Now \begin{eqnarray*} \sum_S [g(s) - g_*(s)]^2w(s) & = & \sum_{S_1} [g(s) - g_{1*}(s) + g_{1*}(s) - g_*(s)]^2w(s)\\ & & + \sum_{S_2} [g(s) - g_{2*}(s) + g_{2*}(s) - g_*(s)]^2w(s)\\ & = & \sum_{S_1} [g(s) -g_{1*}(s)]^2w(s) + \sum_{S_2} [g(s) -g_{2*}(s)]^2w(s)\\ & & + \sum_{S_1} [g_{1*}(s) -g_*(s)]^2w(s) + \sum_{S_2} [g_{2*}(s) -g_*(s)]^2w(s)\\ & & + 2 \sum_{S_1} [g(s) - g_{1*}(s)] [g_{1*}(s) - g_*(s)]w(s)\\ & & + 2 \sum_{S_2} [g(s) - g_{2*}(s)][g_{2*}(s) - g_*(s)]w(s) \end{eqnarray*} % Check. Pete had written Theorem 1.31. The last two terms are zero by \cite[Theorem 1.3.1, p. 15]{RobertsonEtAl1988} since $g_{1*}(s) - g_*(s)$ is a function of $g_{1*}(s)$, and $g_{2*}(s) - g_*(s)$ is a function of $g_{2*}(s)$. The first two terms do not involve $g_*(s)$. Hence $g_*(s)$ minimizes \begin{equation} \sum_{S_1} [g_{1*}(s) - g_*(s)]^2w(s) + \sum_{S_2} [g_{2*}(s) - g_*(s)]^2w(s) \label{eq:minim} \end{equation} and hence is the isotonic regression of \[ h(s) = \left \{ \begin{array}{cl} g_{1*}(s) & \mbox{~if~} s \in S_1 \\ g(s) & \mbox{~if~} s = k_0 \end{array} \right . \] It follows readily that the values of $g_*(s)$ on $L_i$, i.e. $d_i$, are in increasing order. Since $g_*(s)$ minimizes (\ref{eq:minim}), equal to \[ \sum_{t=1}^{r} [ c_t - d_t ]^2 u(t) \] under the assumption that $g_*$ is isotonic, it follows that $d_1, d_2, \ldots, d_r$ minimize this expression under simple linear order on $1, 2, \ldots, r$, and hence $d_t = f_*(t)$ for all $t$. \qued \section{Estimating the Location of a Maximum} \label{locmax} \subsection{Consistency} Let $Y_{ij}$ and $w_i$, $i=1, \ldots, p$, $j = 1, \ldots, n_i$, be as described in Section \ref{S:intro}. Suppose that the value of $k_0$ is unknown and one wishes to estimate it in some rational manner. The (weighted) least squares estimate of $k_0$ may be determined by assuming that $k_0 = k$ for each $k = 1, \ldots , p$ and finding the (weighted) least squares estimates of the $\mu_i$, say $\hat{\mu}_i(k)$ under this assumption. Let $SS(k)$ be the corresponding error sum of squares, i.e. \[ SS(k) = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i(k))^2 w_i \] The estimated value of $k_0$ is then that value of k which minimizes $SS(k)$. If we assume that the mode is a strict one, i.e. that \begin{equation} \label{unimod2} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k_0 - 1} < \mu_{k_0} > \mu_{k_0 + 1} \geq \ldots \geq \mu_p \;, \end{equation} then it is not hard to demonstrate that this procedure yields a consistent estimate of $k_0$. We will not go into the details here. There are other ``obvious'' ways of estimating the location of the maximum of a theoretical function underlying an observed data set. These include using the maximum of a fitted quadratic function or the single knot of a fitted ``broken stick'' (piecewise linear) model. The performance of unimodal isotonic regression is compared with these and other methods in \cite{turnerWollan1997}. \subsection{Estimating a maximum in \Iso} For a given data set, the \Iso\ function \texttt{ufit} (``unimodal fit'') calculates the best (least squares) unimodal fit with mode at a specified location given by the argument \texttt{lmode} (``location of mode''). If \texttt{lmode} is unspecified (i.e. left with its default value of \texttt{NULL}) then \texttt{ufit} searches over all possible modal locations and chooses that which yields the minimal error sum of squares. The search is feasible since there are a finite and limited number of possibilities for the modal location. If the largely notional ``predictor'' vector is \texttt{x} then the possible modal locations are \texttt{x[i]}, with \texttt{i} running from \texttt{1} to \texttt{n} $=$ \texttt{length(x)} and \texttt{(x[i] + x[i+1])/2} with \texttt{i} running from \texttt{1} to \texttt{n-1}. Note that all possible modal locations that are strictly between \texttt{x[i]} and \texttt{x[i+1]} are equivalent, so we restrict attention to the midpoints. The possibilities are even more limited than that, however. Suppose that the optimal mode is at \texttt{x[i]} with \texttt{i} $>$ \texttt{1}. This says that the correponding isotoniation of \texttt{y}, \texttt{y*} say, is increasing on \texttt{x[1]} to \texttt{x[i]} and decreasing on \texttt{x[i]} to \texttt{x[n]}. Let the corresponding error sum of squares be SSE$_i$. Now consider the isotonisation of \texttt{y} with respect to the unimodal structure with mode at \texttt{(x[i-1]+x[i])/2}, say \texttt{y**} and let the corresponding error sum of squares be SSE$_{i-0.5}$. Note that \texttt{y*} satisfies the unimodal constraint that \texttt{y**} has to satisfy and hence SSE$_{i-0.5}$ $\leq$ SSE$_i$. But SSE$_i$ is minimal over all possible modal locations, whence SSE$_i$ $\leq$ SSE$_{i-0.5}$ and so SSE$_i$ is equal to SSE$_{i-0.5}$. If the optimal mode is at \texttt{x[1]} then similar reasoning shows that SSE$_1$ is equal to SSE$_{1.5}$. Thus to find the optimal mode we need only search over the ``half-points'' \texttt{(x[i] + x[i+1])/2}, \texttt{i} running from \texttt{1} to \texttt{n-1} If values of \texttt{y} are only meaningful at \texttt{x[1]}, \dots, \texttt{x[n]}, e.g. if the values of \texttt{y} are some sort of annual amount or annual maximum, then the ``half-points'' only constitute a computational device and the optimal mode would be said to occur at the ``whole-point'' \texttt{x[i]} having the co-minimal value of SSE. Note that if in searching over the ``half-points'' we find the minimal sum of squares to be at \texttt{(x[i] + x[i+1])/2}, then either \texttt{x[i]} or \texttt{x[i+1]} will give rise to a co-minimal value of SSE. Letting \texttt{y*} be the isotonisation of \texttt{y} corresponding to a mode at \texttt{(x[i] + x[i+1])/2}, we see that if \texttt{y*[i]} $\geq$ \texttt{y*[i+1]} then \texttt{y*} is also the isotonisation of \texttt{y} corresponding to a mode at \texttt{x[i]}. In this case \texttt{x[i]} will be an optimal modal location. Likewise if \texttt{y*[i]} $\leq$ \texttt{y*[i+1]} then \texttt{y*} is also the isotonisation of \texttt{y} corresponding to a mode at \texttt{x[i+1]}. In this case \texttt{x[i+1]} will be an optimal modal location. If \texttt{y} consists of response values which can be observed over a continuum of \texttt{x} values but which \emph{was} observed only at \texttt{x[1]}, \dots, \texttt{x[n]}, then it is meaningful for the response in question to have a mode at a ``half-point''. In this case there is ambiguity --- there are always (at least) two ``optimal'' modal locations. \begin{figure}[H] \centering <>= require(Iso) OP <- par(mfrow=c(3,2),mar=c(4,4,3,1)) for(i in 2:6) { plot(ufit(vigour[,i],x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main=paste("stand",i-1),cex.main=1.5) points(vigour[,1],vigour[,i],pch="+",col="red") } par(OP) @ \caption{Unimodal isotonisation of growth vigour for each of five stands of spruce trees over the years 1965 to 1987. The black line represents the optimal unimodal isotonic fit. The red $+$ symbols represent the raw data. } \label{fig:isoByStand} \end{figure} \subsection{Examples} Consider the data set \texttt{vigour} which is included in the \Iso package. We can find the optimal location of maximum vigour over the years 1965 to 1987 for each stand. The code to fit the isotonic models and plot the graphs of the fits follows. The resulting plots are shown in Figure~\ref{fig:isoByStand}. <>= par(mfrow=c(3,2),mar=c(4,4,3,1)) for(i in 2:6) { plot(ufit(vigour[,i],x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main=paste("stand",i-1),cex.main=1.5) points(vigour[,1],vigour[,i],pch="+",col="red") } @ Note that in this setting the ``vigour'' values are determined in terms of an annual growth cycle whence they make sense only for integrer values of ``year''. Hence ``half=point'' modes are not meaningful. It may also be of interest to look for the optimal unimodal fit to the mean, over stands. A plot of the resulting fit is shown in Figure~\ref{fig:isoMean}. <>= xm <- apply(vigour[,2:6],1,mean) par(mar=c(4,4,3,1)) plot(ufit(xm,x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main="Mean over stands",cex.main=1.5) points(vigour[,1],xm,pch=22,col="red") for(i in 2:6) points(vigour[,1],vigour[,i],pch="+",col="blue") @ \begin{figure}[H] \centering <>= xm <- apply(vigour[,2:6],1,mean) par(mar=c(4,4,3,1)) plot(ufit(xm,x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main="Mean over stands",cex.main=1.5) points(vigour[,1],xm,pch=22,col="red") for(i in 2:6) points(vigour[,1],vigour[,i],pch="+",col="blue") @ \caption{Unimodal isotonisation of the mean growth vigour over five stands of spruce trees for the years 1965 to 1987. The black line represents the optimal unimodal isotonic fit. The blue $\Square$ symbols represent the raw means. The red $+$ symbols represent the data for all of the individual stands. } \label{fig:isoMean} \end{figure} {\bf Acknowledgement:} The author would like to thank Kirk Schmidt, a graduate student in the Department of Forest Engineering, U.N.B., and his advisor Professor Ted Needham, for drawing the problem on tree growth vigour to his attention. \newpage \addcontentsline{toc}{section}{References} \bibliographystyle{plain} \bibliography{algorithm} \end{document} Iso/vignettes/algorithm.bib0000644000176000001440000000067012535263731015522 0ustar ripleyusers@article{turnerWollan1997, title={Locating a maximum using isotonic regression}, author={T. R. Turner and P. C. Wollan}, journal={Computational Statistics \& Data Analysis}, volume={25}, number={3}, pages={305--320}, year={1997}, } @book{RobertsonEtAl1988, author = {T. Robertson and F. T. Wright and R. L. Dykstra}, year = {1988}, title = {Order Restricted Statistical Inference}, publisher = {Wiley}, address= {New York} } Iso/R/0000755000176000001440000000000013475566420011251 5ustar ripleyusersIso/R/unimode.sa.R0000644000176000001440000000150712532750170013427 0ustar ripleyusersunimode.sa <- function(y,lmode) { # Note that the corresponding "x" vector is taken to be 1:n, so # "lmode" makes most sense if it is one of 1, 1.5, 2, 2.5, ... n-1, # n-0.5, n. It can take other values but. Results are based on # size comparisons of y with lmode. # n <- length(y) x <- 1:n y1 <- y[xlmode] n1 <- length(y1) n2 <- length(y2) if(n1 <=1 ) return(pava(y,decreasing=TRUE)) if(n2 <=1 ) return(pava(y)) yh1 <- if(n1>0) pava(y1) else NULL yh2 <- if(n2>0) pava(y2,decreasing=TRUE) else NULL if(n1+n2==n) { yh <- c(yh1,yh2) } else { yh2 <- rev(yh2) o <- order(c(yh1,yh2)) r <- rank(c(yh1,yh2)) ys <- c(c(yh1,yh2)[o],y[n1+1]) yhs <- pava(ys) yyy <- (yhs[-n])[r] s1 <- seq(to=n1,length=n1) s2 <- seq(to=n-1,length=n2) yh <- c(yyy[s1], yhs[n], rev(yyy[s2])) } yh } Iso/R/ufit.R0000644000176000001440000000342713077250100012330 0ustar ripleyusersufit <- function(y,lmode=NULL,x=NULL,w=NULL,lc=TRUE, rc=TRUE, type=c("raw","stepfun","both")) { # # Function `ufit'. Calculates the isotonic unimodal fit to a data # sequence y, with mode at ``lmode''. If lmode==NULL, then it determines # the optimal (least squares) location for the mode, and the fit # for this optimum value. The optimum mode may, by virtue of the # nature of the procedure, be taken to be one of the points x_i, i = # 1, ..., n. NOTE that the optimum will occur at one of the # midpoints (x_i + x_{i+1})/2, i = 1, ..., n-1 AND at one of the two # adjacent points, i.e. either at x_i or at x_{i+1}. If x is null, x # is taken to be an equispaced sequence on [0,1]. # type <- match.arg(type) n <- length(y) if(is.null(w)) w <- rep(1,n) if(is.null(x)) x <- seq(0,1,length=n) if(is.null(lmode)) lmode <- -1 else { mode.save <- lmode k1 <- sum(x <= lmode) k2 <- n + 1 - sum(x >= lmode) lmode <- (k1+k2)/2 } rslt <- .Fortran( "ufit", yk=as.double(y), wk=as.double(w), xmode=as.double(lmode), y=double(n), w=double(n), mse=double(1), y1=double(n), w1=double(n), y2=double(n), w2=double(n), ind=integer(n), kt=integer(n), n=as.integer(n), goof=integer(1), PACKAGE="Iso" ) if(rslt$goof > 0) stop('Goof in unimode subroutine called by ufit subroutine.\n') imode <- if(lmode < 0) rslt$xmode else lmode lmode <- if(lmode < 0) x[imode] else mode.save ys <- rslt$y if(type%in%c("stepfun","both")) { kind <- 1+which(diff(ys)!=0) if(!(n%in%kind)) kind <- c(kind,n) y0 <- c(ys[1],ys[kind]) h <- stepfun(x[kind],y0) } i <- floor(imode) if(!lc) ys[i] <- NA if( (!rc) & (i < n) ) ys[i+1] <- NA switch(type,raw=list(x=x,y=ys,mode=lmode,mse=rslt$mse), stepfun=h, both=list(x=x,y=ys,mode=lmode,mse=rslt$mse,h=h)) } Iso/R/biviso.R0000644000176000001440000000363212126132350012652 0ustar ripleyusersbiviso <- function(y, w=NULL,eps=NULL,eps2=1e-9,ncycle=50000, fatal=TRUE,warn=TRUE) { # # Function 'biviso'. To perform bivariate isotonic regression for simple # (increasing) linear ordering on both variables. Uses Applied Statistics # Algorithm AS 206 (Isotonic regression in two independent variables; # Gordon Bril, Richard Dykstra, Carolyn Pillers, and Tim Robertson; # Algorithm AS 206; JRSSC (Applied Statistics), vol. 33, no. 3, pp. # 352-357, 1984.) # Check that ncycle makes sense: if(ncycle!=round(ncycle) | ncycle < 2) stop("Argument ncycle must be an integer with value at least 2.\n") # Check that y is of the right shape: if(!is.numeric(y) | !is.matrix(y)) stop("Argument \"y\" must be a numeric matrix.\n") if(is.null(w)) w <- matrix(1,nrow=nrow(y),ncol=ncol(y)) else { if(!isTRUE(all.equal(dim(y),dim(w)))) stop("Arguments \"y\" and \"w\" must have the same dimension.\n") } # Set epsilon: if(is.null(eps)) eps <- sqrt(.Machine$double.eps) nr <- nrow(y) nc <- ncol(y) nd <- max(nr,nc) rslt <- .Fortran( "smooth", nrow=as.integer(nr), ncol=as.integer(nc), ndim=as.integer(nd), x=as.double(y), w=as.double(w), a=double(4*nr*nc), b=double(5*nd), ncycle=as.integer(ncycle), icycle=integer(1), g=double(nr*nc), eps1=as.double(eps), eps2=as.double(eps2), ifault=integer(1), fx=double(nd), pw=double(nd), wi=double(nd), wt=double(nd), nw=integer(nd), PACKAGE="Iso" ) if(rslt$ifault != 0) { if(rslt$ifault == 4 && warn) { warning(paste("A near zero weight less than delta=0.00001\n", "was replaced by delta.\n",sep="")) } else if(fatal) { stop(paste("Failed with ifault = ",rslt$ifault,".\n",sep="")) } else if(warn) { warning(paste("Algorithm gave ifault = ",rslt$ifault,".\n",sep="")) } } m <- matrix(rslt$g,nrow=nr,ncol=nc) attr(m,"icycle") <- rslt$icycle attr(m,"ifault") <- rslt$ifault m } Iso/R/pava.R0000644000176000001440000000245612024004060012302 0ustar ripleyuserspava <- function(y, w=NULL, decreasing=FALSE, long.out = FALSE, stepfun=FALSE) { # # Function 'pava'. To perform isotonic regression for a simple # (increasing) linear ordering using the ``pool adjacent violators # algorithm''. If long.out = TRUE then the result returned consists # of a list containing the fitted values, the final weights, and a set # of indices `tr', made up of the smallest index in each level set, # which thus keeps track of the level sets. Otherwise only the fitted # values are returned. # if(decreasing) y <- rev(y) n <- length(y) if(is.null(w)) w <- rep(1, n) else if(decreasing) w <- rev(w) if(n == 1) { if(long.out) return(list(y=y,w=w,tr=1)) else return(y) } rslt <- .Fortran( "pava", y=as.double(y), w=as.double(w), kt=integer(n), n=as.integer(n), PACKAGE="Iso" ) y <- if(decreasing) rev(rslt$y) else rslt$y if(long.out | stepfun ) { tr <- rslt$kt if(decreasing) tr <- unname(unlist(tapply(1:n,-rev(tr), function(x){rep(min(x),length(x))}))) } if(long.out) { w <- if(decreasing) rev(rslt$w) else rslt$w lout <- list(y = y, w = w, tr = tr) } if(stepfun) { knots <- 1+which(diff(tr)!=0) y0 <- c(y[1],y[knots]) h <- stepfun(knots,y0) } ntype <- 1+sum(c(long.out,stepfun)*(1:2)) switch(ntype,y,lout,h,c(lout,list(h=h))) } Iso/R/First.R0000644000176000001440000000032612074141334012447 0ustar ripleyusers.onLoad <- function(lib, pkg) { library.dynam("Iso", pkg, lib) } .onAttach <- function(lib, pkg) { ver <- read.dcf(file.path(lib, pkg, "DESCRIPTION"), "Version") packageStartupMessage(paste(pkg, ver)) } Iso/R/pava.sa.R0000644000176000001440000000333011512506443012711 0ustar ripleyuserspava.sa <- function(y,w=NULL,decreasing=FALSE,long.out=FALSE,stepfun=FALSE) { # # Function 'pava.sa' (stand-alone pava). To perform isotonic # regression for a simple (increasing) linear ordering using the ``pool # adjacent violators algorithm''. This version is programmed in raw # R; i.e. it does not invoke dynamically loaded fortran. If # long.out is TRUE then the result returned consists of a list # containing the fitted values, the final weights, and a set of # indices `tr', made up of the smallest index in each level set, which # thus keeps track of the level sets. If in addition stepfun is TRUE, # then the step function represention of the isotonic regression is # added to the forgoing list. If stepfun is TRUE and long.out is FALSE # then only the stepfunction representation is returned. If stepfun # and long.out are both FALSE then only the fitted values are # returned. # if(decreasing) y <- rev(y) n <- length(y) if(is.null(w)) w <- rep(1,n) else if(decreasing) w <- rev(w) r <- rep(1,n) repeat { stble <- TRUE i <- 1 while(i < n) { if(y[i] > y[i+1]) { stble <- FALSE www <- w[i] + w[i+1] ttt <- (w[i]*y[i] + w[i+1]*y[i+1])/www y[i+1] <- ttt w[i+1] <- www y <- y[-i] w <- w[-i] r[i+1] <- r[i] + r[i+1] r <- r[-i] n <- n-1 } i <- i+1 } if(stble) break } y <- rep(y,r) if(decreasing) y <- rev(y) if(long.out | stepfun) { if(decreasing) r <- rev(r) tr <- rep(tapply(1:length(y),rep(1:length(r),r),min),r) } if(long.out) { if(decreasing) w <- rev(w) w <- rep(w,r) lout <- list(y=y,w=w,tr=tr) } if(stepfun) { knots <- 1+which(diff(tr)!=0) y0 <- c(y[1],y[knots]) h <- stepfun(knots,y0) } ntype <- 1+sum(c(long.out,stepfun)*(1:2)) switch(ntype,y,lout,h,c(lout,list(h=h))) } Iso/MD50000644000176000001440000000330313663122576011356 0ustar ripleyusersdb12c0e21506023c16746a2f81f990ba *ChangeLog 032624737b080250ceec9f3422595802 *DESCRIPTION db737cab1c5d6510e6db594982c882e5 *NAMESPACE 7a25105b8776d573a2131cbfb209b5fb *R/First.R e721e931a4d92024a34c98d9a7a62c8e *R/biviso.R a3e9fa72a57481820dedb68c198ff1d7 *R/pava.R bdb2898a60e100904d83265d23457d32 *R/pava.sa.R d40158e7aa6de4235e89b138049d885d *R/ufit.R cc5b9822d775ee053452cd907c45ef27 *R/unimode.sa.R a9e0aa28e64881131d72febeb8814afb *build/vignette.rds 66c27d3db915474aaea5bafae0746394 *data/vigour.rda 2b4c131e64a60203c7067430ccd4e0a6 *inst/Isotonic.for 64343f1991c8a5e904a8eca653db898b *inst/doc/algorithm.R 2b96dc2a65fa6b2ff4ba651d916476c8 *inst/doc/algorithm.Rnw 009edbd30ebeb8056c2d8ecf30cd7d31 *inst/doc/algorithm.pdf 4ba2284e1f3be41f19c5d686abd36971 *inst/draft0.tex fdba334fd941b0641e4158e4ae2c5e78 *inst/makefor 5cb8558f099b856dd8a27fc6773c0f8e *inst/pava.r cbbebf81197204959510757e372eaf5e *inst/smooth.f.orig 530d2d69b7cca7d521a24ba14bbf8f5a *inst/ufit.r 92d7e2d22d7a67af4be1b21a2e42a423 *inst/unimode.r 69d0216830f2a0b7a23d14e5e0b3d2f2 *man/Iso-internal.Rd 4d70792aa183f83497f4a0b2c28804a4 *man/biviso.Rd 42ecac604a72602340260882cbd879a3 *man/pava.Rd 705bc7f1ca9f794d5b5e5a32a86cc44d *man/ufit.Rd da587b8453ff535e7087ea0273ef33af *man/vigour.Rd 70fc0aabf851954419ba735a10be338f *src/init.c 7e357534fc2e0be02f5f402a47c6c7d2 *src/pava.f 2cc99b732e6467d634d990b4f9ac6315 *src/smooth.f 806434c5891db7f585ec56b8c154e043 *src/ufit.f 203742908792778d25ce67b30cecccf5 *src/unimode.f 9c2722b6180b51250ef4161f7c70aaaa *vignettes/algorithm-004.eps 15ac5b2a94173550808e301d8140f661 *vignettes/algorithm-004.pdf 2b96dc2a65fa6b2ff4ba651d916476c8 *vignettes/algorithm.Rnw 369cd05e589a24d8bf9e951205d58e43 *vignettes/algorithm.bib Iso/inst/0000755000176000001440000000000013475566552012033 5ustar ripleyusersIso/inst/unimode.r0000644000176000001440000000267713077250474013661 0ustar ripleyuserssubroutine unimode(y,w,y1,w1,y2,w2,ind,kt,tau,n,goof) implicit double precision(a-h,o-z) integer goof dimension y(n), w(n), y1(n), w1(n), y2(n), w2(n), ind(n), kt(n) goof = 0 # Handle the linear ordering cases: if(tau >= dble(n)) { call pava(y,w,kt,n) return } if(tau <= 1.d0) { do i = 1,n { j = n+1-i y2(i) = y(j) w2(i) = w(j) } call pava(y2,w2,kt,n) do i = 1,n { j = n+1-i y(i) = y2(j) w(i) = w2(j) } return } k1 = 0 k2 = 0 do i = 1,n { if(i < tau) { y1(i) = y(i) w1(i) = w(i) k1 = k1+1 } if(i > tau) { j = n+1-i y2(j) = y(i) w2(j) = w(i) k2 = k2+1 } } if(k1==0 | k2==0) { goof = 1 return } if(k1+k2 == n) { call pava(y1,w1,kt,k1) do i = 1,k1 { y(i) = y1(i) w(i) = w1(i) } call pava(y2,w2,kt,k2) do i = 1,k2 { j = n+1-i y(j) = y2(i) w(j) = w2(i) } return } if(k1+k2 == n-1) { yk = y(k1+1) call pava(y1,w1,kt,k1) call pava(y2,w2,kt,k2) i1 = 1 i2 = 1 i = 1 repeat{ if(i1 <= k1) t1 = y1(i1) else t1 = y2(k2)+1.d10 if(i2 <= k2) t2 = y2(i2) else t2 = y1(k1)+1.d10 if(t1 < t2) { y(i) = y1(i1) ind(i) = i1 i1 = i1+1 } else { y(i) = y2(i2) ind(i) = n-i2+1 i2 = i2+1 } i = i + 1 if(i == n) break } y(n) = yk ind(n) = k1+1 do i = 1,n { w1(ind(i)) = w(i) } do i = 1,n { w(i) = w1(i) } call pava(y,w,kt,n) do i = 1,n { y1(ind(i)) = y(i) w1(ind(i)) = w(i) } do i = 1,n { y(i) = y1(i) w(i) = w1(i) } } else goof = 1 return end Iso/inst/doc/0000755000176000001440000000000013475566552012600 5ustar ripleyusersIso/inst/doc/algorithm.pdf0000644000176000001440000071541513475566552015276 0ustar ripleyusers%PDF-1.5 % 3 0 obj << /Length 1556 /Filter /FlateDecode >> stream xWKF W9@h^z"R=,|kzڵJrGr$)K{59WoޅbaԚEҲ riNozi]\,K<_#<`~njZ6wo, xݷ̷ys(!q9hAQY޼3oCj˰ī" YV!XRgK1Beiى^48 #$yzԇR߁iIJIa֦ιHiiˤF/\E2"K2W*C sޓ99=z3mΕ)SS G0#7yO_%iޏ?-ː'#Ӗw,>W@ce*d*vk/0|;%{zbG;W0NQj81:x Z> #, *gTu7td[ 0t Dƀcц#c1z,EdՐe8U?A6Wyd\"R#aO AQ Ss]]R?mUrmeq}`4 ) k5dab!9݄<$!V Ym$&O}&xDGǺM{aa"V D4ȢaPqn/Ikylceoh9pmVKŸMHα[/Met jTE>U)t<+cy`J fE_%-ؽP[$κC1Y~UL.{5b 0(;Z}tɽQo8,Wdj`ċ8HjkjRȳJabcyYūDhU_K%x2cj#M[ wJ,IAGnVrD}nU%t}XhIs+$XV7.NN:s[T'XEn7h{/yi rV4{ի6bzVA'/:G+yH@ȽzCfԿ"l;Y^XvL"T5:QT'|a||6M兣D?nU?F2.Gkj>ae:EǑAK:~ޓaʈwEnX:Z0M je 'TzwLz? Nke&qjs3WUfJ~H3oNe= 8KMh>ˋSG+5.%.ʐɬ_q#Sa>5W|=7M՚*%\cj5oҊ>9hgTdL_glwG^fT͔w%&,k?H,.Fa8ǣ#4mq\[|Ǽݡ9<VnqeK+hBJ7y'ԃe endstream endobj 15 0 obj << /Length 4306 /Filter /FlateDecode >> stream xڭ;َF¼, ñ~ƀs,^`ӳKbU-ro\yQE2####ПmslilotuY5mi`柅])[Un*pnW*6Ok|N4ݍʾnVQipi{X~]YӉppx[--%yB4~5p0a",7!|,Dp^F~q*z$LY۞+ zL10m?Tm= 7Ό( p"7x~a=+E  W_CNz`bm£zmqו){̋-RYd3 .A֓?P,yI^QG94Q? )/'\$;ЙKC,qŧϷ-NHGrr? Q82#q0BTlb6MJ3+'Kpy8bh >xCq= Y%ǶPIW4}Gv`nxk0ޱ2!B$`7ÁyÍ𤍀]rydyH$#O"}N&#o9IQ]:0gCyH=mRFzՠ?HۇwɆg%kLVxE|L&0s N OYp8GH$ɱn:í8\E([&hgg ;I{ϯJvqġ QѻJ' IP06cR٭AO?(c? · i39^s GR؏ ⽓,B<7X$@q3@4)S-h.Msxp3 P`&aXљB8uދ*.'_:;Fl )O];=##PGw Z3ىGbʿ+^=Sޛ .CLt>`Y3\NںII6:[I3qb1}Exⳤt)8EHיڑxdx)‘a~r&j;r&x )ƙ$jىspBan ]lsrfE?;GQal Nahνɟى_9_М BE٫ G'8V?PM]gllV qpA tmL 6+6#,4 I>'>oپnxa=F >/tNĶN-ī=?z3~IZbX\ܶd_prDdIwc|z?<*fKp2igHh ޟ1 3 @s67ޤ$1eI$ Zw>,l%{7*iu.%8 N`zᡭCPŠ|)?3W Ay-!/yak0M^x무+,4] „x?P,$kc}t6,\ L'VQR'R9X|ޗ-2]9\dbVXDɲ&4ÊoU6TSγ05I7+j\\!MWH,)V$וyR@۲ ^y%R6t U9_po*Ye[n/Kam[(PKu5zR@U7`tu/Z_%y6Ғ#M{rBw@iXm;-gV3K/r)mJmTԬ&JڀZή8|5eg "+6X_O]^'}UulݮP9VM}Y7NML!cͼϭe45ݿ){yc=pkGuїbMHzI`.9D*|du!=h1: &eFPoG}HI;Uja&II:\;Nm 6F*^x'wq _UkhHj+mk:{;vWؾT@# >Z*Ne;TUsTCpuJ~0nF0O [Weڄ Pyds짬WNp!Ȫu62S J|޶T_PԘ/JW(yjA7(6rb=g(kJd܂_aƧ$$?ʆK=YLZ!kV8Ĕt\Z0?gvuտҺiE㘯s6ɺ%AV5`:$vYTꏞo.oynPC-n{8҇ɦSpӼ`fjW$IL3HM=`ׂ.\lr_Kk;DBN; t`Js%+48*"V.y?㝀 Ja~޵b N4=[bM?"Lˈ!VgK:>Zֻ\]pGwNU*,Bs9O[fBvs>g: +c+6ո(hpKJL)h_^}G;˝X!Lz|Z9LwNT}^UwKVekxS-\&bt+]&os<.Nw/# ],y"SIKX1yx$׷#I Po2wmDlTul)]k|Xd󀙭^%E`m>Ӫ:ER&cRJNWMտ*oݗ'2UB-{e.)t%a\8^^ĵ&OK]0gCEsCTWsV|3E6],8OZƉ|w`[/-pׄ4Z09G.+g<]sY4patvvaվ A_fq8%fщd18vIcJήl<Q|ࡔ|ɉGͻ-"n38.O!Z0 -<0']KsUv?޴]XUQ3 endstream endobj 26 0 obj << /Length 4668 /Filter /FlateDecode >> stream xȈa݋ә6`I6@-˶flɱqz~ϩ :ERmODU~?^F1ՙUM+3#L#?_2/l-ڝ/Q8bwx{]ÿX|OWc܄g'=63$fI DNa{4u|j {$..4Oƶ4F7 F pIl)lK&sq)YiR=ÝOti/j]:m g8poW~mmjrf"uZ$E"$Q0:OHsN{r;C\`y|TRZ᪢U +9Y\MgO@x5[ aQyYЀ_CA,H'q= VA*tFb}jiVہº j!8zwro>ݦAOnT.XK>!yCI -+ \E{ɼzQs; rz\U3E⍿̥{s*6UU29PP-%3 V˲;q+wZr/ӌ)F'MOK)Mr둦@gN5ne1`6 Qe{43Q3ƩY00kM6\1 %Iә>C*:+cTQSU7Zq3"Gj>>e냓M+$rduxBus.eK,&. z`=Ӧ݂k/zbjŀZQk3 0|.T&"?l d T>]ڨNMyH2(z{iO-ԤFըN 6 ܠSQMxS NWsNP5Y|$Gd6=xr/>7)y[zVT¤X$l#ő{4M@֒YG|j(A+7G_1~&w%q" {DCGCP|X=%pb"SO@"=7ȓT܁11t'ZEx$f>R=Z#v0nG<,aL4`,H>yqB 4XM]qBSyQ hsa`A!T)uqO;@6֦$#|޳638'^X]Ҩ.b衋zB jG*ԂݟܗIC%oV W>V4%doHt=l{Ow$Q]hf6}PwϨpBs.O.MkahmhT-/C; H2(3zfe1G%,\G2fwH(N!5+nKcRqzL l~RX=VMřį%>r8CY3WwRxeڠSSi^qIBC"7iڣ4QMyHD92QwD耶UgR3/u\15<$9|YF}K6c,.$u!+-LX,~>y pc0mŞ@K9&괗?J  BKh&6jRGBd #r$ߣɈlHpߕGߡG#ܫvx[E[W) 4c[\WD]S/@>jkSª.R`1$>ڤl2s BH['w2{tAUAx9^&J̓y5Ba| ^9-*6"cwq}tnOΛp hu NGq~ M*½>J;w+KS hݚD+Iq[:X5kyӡP1RW|WqLˬP"b[ZBW ֖#:H. #B9hIK)x9,A!+,-hڗB#8l& BeKų+_[3 3vɭ4vp57\f^SRPiڅl*Yy5Wa ꥛\/bl Y?roɛ`6dgleIʵ4OКT*i|&1ԋ2u3i)c zP S̔/.vwujNBt-KOp0v^(wg*2G|jZTM.x&~1l#rrPZjs-jT>ɓ^8N9T{c= ) Hݫ<):H2Z EjWź'zY#+m؃D݉!կL\Ml+(Z6R3] D3,ٗ㡄qI/_3pBoXxp.0f]cu\D7g4Fj O*E_|^?'S&f`NcrwCMt aB9~[Hv'WkBZKmd@ }RTuU@ډz~{2t|]D$cB# t1˖7̃jѴ`/(֠bItjLn]HA.$|'\ WP;P̵J NffKy2XVA7$Hd[D]j'cvoP* 9ܱ8w+|C/W'v9nyuDuCQʸ|[Nˠ>?!rC8Ƕ.)˫=OJcNvLyLTOr+`x:5x44ST։Uj>y1EzkAro}COȢ}S/]GE%@anVP"Tuxmlŷ˟ݩ\ PT|メ7]Ug/&_(1kK[vJ+ 1x){T' CVAg/0"L=);2[<٦O>)qګ,yĊ܊қQun٥:I y$]./*¯.?~"ZO'W׸ 8!_:)wB<*E/>0!I ^- GZg4_Е,ҕ؁ÚN d֪5hqDžVTQS>c1:W%68X#?r /ܚ"M;?^ ުa5`[(eX%QXg1%ުwuP!NC wH~g[&^2!/s 3 !Hx?ƸYwƪBuٖg; Cՠ>6e9}ogB: %}92%H?]- G$=ֱc.Uüv!c?Hk:X&e a`]R){)+*O*HUW_q!e6~ ״`j~1th 7{èjd% bgu~䬱MF w?k + n endstream endobj 30 0 obj << /Length 2818 /Filter /FlateDecode >> stream x\YoG~ׯ#g1"6 M+rD);_U=3DΐŞ>h}?U9rvt~t8~RZ,7PLҌ GAÂ)fUnsg;&Bg f$! ôэ1Ոa&F#Նy5Qu60)]#pܟ( ^qv)~L؍ON5ԲZV55I';!iGՋ@-gʨn`:.4)9y!z;mg[*zM &JPuI|E6%?QjH^ow+⹚9%Gܭ)C\'Ҏwo :K:I2sr z-wOl=>Tm:S\zMoULdW N6v|uqH\Jm їx=K2Ip{mtHBĦWZ?d =;$eJE39̤ޟb_I'K-ldt@[m6K0@] [EFsb`*xf>b”1~50} } lx lhV"+ ?j 8n}3Hb-=hWrzH 5WziT*KXG84qqk~Ua{X*}t#Roاoy^ۙ{'A(R-|u!+|\'Qw o Q}/#d6軉|gL1"Ù  VIfN;=B2\wa=kf @?p'yl$W W` @XsL|`-O)*#fF_erUwV)5Ƞ&s}x7%T*d8bZrX`t:.Pk/6}k?ҏ:J,SNgdS9ng?X\\MK6MČ. ^bR (@'a%ͣ?HQBtȃ'xR:Y*L1M#}6gW㇓<={6S)ПBC^p{etۀ iW!TK)6g Dcg)%1s8uA7%n(- ڴ s7q紟iυFd$v,EZ2A]jyfl'EzǶoxYF9leЅtWiJfVULv$zI혒wH_SF#MyEwCeRtxH]=@+@>XSr0è]`O>ky~'H @pD }o;:=ƎU~(_nG(&u羅' MT' ]1|=sO󑽳$xƋiSEF*x2Sy!fzJ@-:2GVH_wFee"Ni s"kj+/Ocчq02rha{aFA{`A .{~x`0mTK^ z:zm 6S* (镠=iNiC6V$uc;@uGђsv#qG!mrt*,nf,v͒Nqqe<1pUcqm׉u!0;hێ9ۘw'i7DE\l15GICcaG=(%kJ&QdϊdBǶ+g-I $ X~=Qq]JfnUw)S.FG9_  Ŵ;=W޶Oڒ2.o su⏓(+e6l!#8a&r>]fntm]V=ЁZc*uTD SDk Ue"fsK%R&w oc5L-\>S)OC,PC_?r h솂EKr],dUXS?;P %\|2>bsa ,_ endstream endobj 34 0 obj << /Length 2847 /Filter /FlateDecode >> stream x\ݏ۸߿2ѻ zEP}(z=ۛ4w,ѦlmVܾ2EÙ|3?^_}%:6XEp# Fo_ K!D?{hMdr@;t&H\'0&!`|j1im*E.Hl@6,şs1KUqn^wԎPkw!78/Ƌb M<,ngw^&w \C8C}Mu-" ̐-Z FsMw3 TlF'W )M:8ip0H,RૃRHENQ0›bAL=s EI4QAhm62{JEfNDvqln4 fE*RD¼dㇼDhw2._,NqC,s{&7},9(T|pS"qLt 1&v!+Z$Pla-0־^>-^Q@?{q4csoC |{7yq_yg$J&f_㼾ptN*$eR>/p"I<..+Uhey0RJ{Z,y]p{g2s k]|q i<:6!pF0JC橁1|;b7i%!0e)h9SP= g)uZ'ahzDU|>}ɬ! k0I|a0C)-eGO#tJXO%X G6O@\~$AdGA+V. "93=/ ek bAK<c `ɻXanKʅ4@:dP?LEUB/d>N?X #ٝ] {,y:jxBS ΢¥WװT[\ڎ>p|.#E6b(Med?s ׅT&A6cpیc)N35>h08*6-Š/ex|qYf# U IS<U&-i Mg{PNXL#_ed0}7H\ h2"S 'f0o  <HgR`qz;<6o+&ic@KĴ5< {Z܆K_Oxb21`6+Ơ县Z2+tϑ(;C>IzgItN*4z׶yhSu|zQN-F>^ & @IUEUx[8s~K#JS]?6+Y,crsYi@HeYegGT{!XF=B H QDN%#w+ a~{ бp "d2-}vD2Zg[:0L-Iڼz⧷)sPs}mXہU7珞 Xx Y6O*vkδ)}Oi/0<ӯ>ݎ_ Br"vg$D#$1F/"j$\w==]Jآk8FNCOe U-KJ1f$^™*9ԒL}MV *7 a@0".~;!pEu '<}wϾS -⳨9`4i9ǭgRЩzvv{s?266h9O&ٯ6~ȀIx5*|($HX"\J'x<'Rv*l;uiX;Rx>Sގu1LAl%c`D_"(g9}i`Uh8l!NHv Ty72Pd[śd>'LO*]ժr@-d 4&MbYV3RU)|OCb8?,r. s2⧏L N+8PI.;u2{: "0D֚ ZE2{VʹΗçX(A? un{p} ՊPC-, F|YJ x:X3\?=!U+W4Cj$SMp  ݱVV c6 <^lfם@.rNYԘeE6 %d4"zkI.!O2F;F&(PȨ$= ÖS 3CfَX|(tA݄atj4?jS~.wDL+(b0kRh$ÿ#o=`=$h\5jrjz YcSW)Z!Lqt(VJЊ١;,k_F^SX_f7;群ޜuG,k~,u XT UU O0_HѿrWZu%g*N Fb|*O DI9큡}fkR+]p4}@pL;^h_ ѨCA۬H Ɏmz?ƴPw3N+9ݹ{ow]+L{Dsd տ~ܩ {J]cU} endstream endobj 37 0 obj << /Length 4460 /Filter /FlateDecode >> stream x[[sǕ~` \ qT%J,o$"1(ϹuTy0ӗ WB7J[yʙUUFA3u=Bb6{Xloӳhc;[.ݖv|_вJ̎׿+L41j.uө ڙ'Np.?JM"L6)~XxQ!-o"U]K#lƆlYY ! [lasڢR4ҘSeѮq\jj٦.U6uaws:uV]8շp,t[n|&{V&y~5ZFjEv܅j2Dys[؞(7[ Z#.=NlO {$V \ϵm=P~mlq87nՁ 8î\!z:%Τa'DL o^g\P+@Q8Qhk0?VԀpzgH?S>zBA_m._?UXQ2%&sSCiմ(9ˍ?! >4AHE\dؑ _%ȾHZ&HfBg!9#ɳ˳좦f#/uc#LE_T~E?Z,Uu]) d:˜I˦ҍ05㠤K*NGʩlO`k:qsQ!rGK]愀T}N؛2e>"?N\u/r!LpZSO18b &pl3;݁c%DE\p0,Xs=- q\%"tPDzXl(v+N`tњ'=#3y{qKbKdİ"]6(:u 8{|VUPzGO;ɢz Wd@ZqXv|/#Fx[~`!K Gdu)[m, e ׂ (.3Vjqa3'4=Xkζwu@0 4\͚?(1o=1E32+9>x8r%iK7_bzŽ?=u-/=ȴSm&(*YjbƷGYpȁ;N1:O7&)=tIآЯ4"Z7Z"kVl$*q@G4j w~nd?F4.ߋ&V& mcxEx';`? Ve||0t,OYl3x<?пe(Tk\Mv+Ӥ=b`=b+|2A=O =1~S3pb TіzǶO݌Sl^d9Xq2R%Em, BNwejȀ{lC}2p7xgd;H ~lD |P6x}xNJ'4ia ^o aMd%zAqMYA(3|s5mTaix QTѹNU*_e h²"˔NpʕiՀR#LE kf7<ԖXcFA% ̕SyFw[GR;VCGN2:ͻ2XTH5ozG`Gƹ('CU-Ft_omG)(,P{m*w)mi(c=*>b{L٧z,~@.PR)ݳ:ۋXUR:'VaGUPa}0Ǹe-dĘW|ȍ2<>=X6T$<ՖU`\rM90B\-m]'gvY};,`f/dNHǷ;6 DPKyaPNv{YUd2T0!ڽmm?twrQM]cq2Ȯ;gL%͉u]VI 4B+p`rRt Q)0L8(i^UvNSTid*c|$iŴ6\} .lsփ)!4ؔ./`~AIV!Iav¡~(0J߲ӜL%0zڇ{ly}QH5ŧpԲ |:pFa$ e\O3e%6A|gOnKQv`JsgUf_碔š࠺< 7䱧JS}G2|;T6a]! rd£ X粕M+͸3X ~:P[dnE^YuRu;s碣೶|as#O8~Jyr'8&䡨z,|l%BJ]q *ة:Mr2X l0IetZucSb`j.pytC>'baKEpe/*%pY{UC`(9a,vy9Ijqm\b0F?cwy.hK!Eq\W*{ ikՂ1دq!rT`I46Q IM$Y@cy}x+υA_uMc⊳i@O; 1w$pd c~y*d؛ dl(n}| KrvJϵh\EPX3y5&yY 3X` OXSBJ>P Z|ه2 E$иS+Law|w^Z14AJ]?X4zwp3T ǐVkfG?"a5Cy2|®[u :]ZYqc F|MȚ[0ʹDIՙOT*HyGd(R=D%p y9KD|[u`߸zR ^֞Ѧ`Uۄ{+տs= endstream endobj 41 0 obj << /Length 2196 /Filter /FlateDecode >> stream xڽn_!c&3:>}`%S#Z1{jv<}z~:{Z\yW7ʫ֋Җʖj5{Y\9Sg8yy/=0H$hڽ,L{ೄfuwVn[+Sdcsڟ#˞#k01F0^ZB;aG?"JvhH5"@߮CS動ʻ)9 ߯ߖ+olv?| 4; ..+FT.#Df+( Mϰ[8U{|IՔ.@wSUsx/1J|K[A㷼p'KF0lg++6g/K3rcDAN/B6+ ]s[w; [+}4#> i#EGVw(ȜYב>r IbHCg(dÆYu`1:ĝ\ַ)ہ9ʏMv|gjKgulD5xVe7~t)Eʘ3=Q1N)qp:@?RS$q[p=v[:ᶦܶRqoOږ|euӨ2s.b>l9Nuߜk[rwn dc+5KIn&؍vUU~J6:IpŒQI0yP0䕝RM. \7ACzx^=f1ԭkUå^_ q"  5=Dۊ 9VM?UERŔ~6\.C F=C_XKD eˤ x@}m /^'7*j㱧H@dG!랫X-Fc/AI .Q~zr//hו2/c RʖIs9\+_ &5 Yz|UZN\vI euAӟao!67(=WKH|ג i({7݁IabeE%}$y0(j;d9kG%dq[y,p34y W*Zi٩ϗڐRSCLCB)VZ&y JpnI=L'\͖Zrų%6!P.x DvNZU9(&ޔ#{Jg0CХꡄ \*LMgH»;kwV*AөSkA\0{{Y3e3K G-5GGgW g.T?S1mX̷Ok m$bh 'oB(yjf*p9h_ 2h*Iudž+G%[2.2<pⅪ޴vABƕ!LO6'R*p^cV~iix4'-Oڿ  ӷS)V UvRDJWX1M7_.H C@*aC(Ci`'z±@XřuԒJ+%Re{ySJ.D50;@tۀgUsQ@m!"A.jI-s w$r6v '~$] Kz2^/C%'''߀AG 3cvFI8+W=GLjeU.f(E㯢o^ %{m+h΅syyhy','dJ:!,O٘Ÿ|,!(6IFqΓFltf5vKQH+P'j8a-]rQNЉ{ŕ"]D& Z0F;M:;5WT _1ЧE endstream endobj 38 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmpjotsde/Rbuild68ac64b46c9f/Iso/vignettes/algorithm-003.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 44 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 45 0 R/F3 46 0 R>> /ExtGState << >>/ColorSpace << /sRGB 47 0 R >>>> /Length 2745 /Filter /FlateDecode >> stream x]ݶϯХ*9M0E Iq@}g8Cu^ў79oo6~|;dscJc>uWo/nwmo3ooowO?]b!o!ֽҐ?_-iOAe="^ʚTצ;{t]iEUH!H5=&1渷ޞ\G;5 77 C]|oc]xӣN x~4ޡҵ˥Dxy{{aHO?].hr9GZ{,CkèQ_=4i&0ѷmu?]<+LnWz{xwCOW .`*Cz*z{,RkCS~81\#NvK;ދxvK;B^2%lg׺,]Nh/Ξou"13w}跏S1K7G@pDw}^5'aBi<ٻPr>sF!-opdR-tJ/?n{=ed[߾ ?n{xs̖=jR?i]ۗ2\vyo7NAlhLn ; H\u`,{(}%Œ5EH)D53go8ZjQik:M(1%E=$%1/Pܨz"gNSX]PjOD,45XZ-"mX{ Dě}lӾmSdEW #rnT808"GS28RAxOGS28pJT3Pp)EjGfg!)8znK- 8"#WDLWpD[l .I"L$#Z sfHm9#^z,jKèt.3;fptCqGi{ѲYp4Ɗ04+9{/Hϋ#膂yz\pip{p違dpdm#ڳap? ?hև U + W_GEu|C4Hm/FHm_c w2A =̈́X3:[lB+D/)43# wߔV F++mwޔZW jPB K;l׳`y3Pu @'>/ͺÇ}I!7ܗgλL&kW,Cw>1Ovo&Pxf.ez&> +`[=l-PhO.Z`0VĬ2>fNHVf`cz9f[< g)OM7B܏(0D endstream endobj 49 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 53 0 obj << /Length 1456 /Filter /FlateDecode >> stream xڭXKoFW>`.F] Fb4)jrJr%J",*)ֿ6ZrCܝٙan'gWw?rM^A{iaxM7ۑVhZr b k\|:| #š iD}a$,oq'O8QŪGގmɋY)K|&H $5s=<٤ 5+>] Z"Mw/^uQ@=S(lFfSU#)9,{WqF;oZ^T:ԲG$D0B_ @EMbgE{>&Vhm0r.I~7@7F% U3ȁsא.'ɂ5 5Oqj| xOv nr@6|BA+N!劗<2W%;IƦoMY=|"݌-zUR]22Re9dwF,q6{`Mi8 5[k.Qw(e˭*Pr~DlޯxX xqlB ,Ǽ,`_ <@fie# 2_B% qDS9goW_;4Hgh'MSǶ{ɽ"\hE ;1bȹd_#a 냆׹y9jJ}p48'8s'?2qRW4\@y#}*/)mZw&A㼿}I|7C6bRL2.4fs\𺷓g{zyqcTd :.2g&g <4(LQ{3?1y#>؜;BoL90S,*kaĠ`hk֕DVg[,tNO@ ' J9j{ѓ`qĄ5wǶÖBV'RwYP[HFStĸC&bb 5T()T-{~3L!;Bלf\r6#ʞѨr&UAODPeC'μXKA3 ]eB3\Y.ɝGfr,,j&.E7?APO!zvt9}N(L%!,$}X۰Jy\0ybǿ?>;TIRR2'm ՟T@用.}2?H/9p^$)I,"թ >-{ME>|UHoPOBc"?bW~`?!2sx endstream endobj 50 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmpjotsde/Rbuild68ac64b46c9f/Iso/vignettes/algorithm-006.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 55 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 56 0 R/F3 57 0 R>> /ExtGState << >>/ColorSpace << /sRGB 58 0 R >>>> /Length 1614 /Filter /FlateDecode >> stream xMoU7Wx j<-D%H] ҪHZ{O ( a2c{~!ܐyo>^&fꓳS >g_/h=zmyw =!;[PlPuPƦd}ؘHC=ȖsqNveKdֻl[Tؑeu';e[⭋Ů2d؞p6H;gS ~Y>h3~}|NlS>h@8ژ +vϜqIkt0iЫգWo>OՍw_IZa"+r gNFOLԄ(* EHvEt9k"YcS,4ݍQ&_܉+ZFz o![&Ιx]=(c28/CSĒo`L횳,`vRZZ9 V}4 xTseXs\gT\D W`VbuL:(BES]Wq Ҳ>eLQbp@I]42w2;uLpyr weuMUQ]4ި:w t}oNFUyrd9YJ&"]Zo΃C.6sW#-˂`]tU]\wn`Jbͼ<.$C0_s٪op7:E&w:mJ!'wI.:D䮊yZֹ+7 6+<ק=[boOBoݨz_uܭAQ]bpWW]Oлc1nU]թe|˳zWu/epWw3P]dܕ=ney˦ԻA/úҞU)AuT;lrIWsgYIU]]{NKYkwCT${rW(&wUzΏ{z7G9] U] ]ݻ(DG"䮓ea>rWQVJ  *6Od]p}ڃH] ʟ$3pn$NЦ endstream endobj 60 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 63 0 obj << /Length 519 /Filter /FlateDecode >> stream xmSMo0 9Rܠe%PDBv˪ AşgfE3yWoaxY ↬OC\*^E*Ec> stream xڍp mw8mc۶msbL4񄓉ms O^k_uNuU{ݸ[$J¦ c3 3=3@T^D GAt1B LPdq09x9y,LL19Č\y Bdt~??*j377'ݟa[3G@D#*h?T|1{=n?hgjG.v@3imEp,̜LLL\3%y؛dC=` bo"8ff)`lf]lf~#>~?>}0S?QRQXAU9,Lff6(_v _?!=T/5@kgؙL޿?.AIGod }r]߷@ vT٘_.Y@' qKǢ̔@N?=3ѽo>ޗ3e,6rt4{o;bx1S `d9ޓ(;Q_ (0qAF'Q΢_`TUAlF"w;?="w h!j2 21Ҿ'k/n/^m/Ϳ{d'lwWFK&蟴ޝA~_=ޕN?.9~vt4}@rx_x_,|IGK}^| -̓Lxw= MRiS{-9~uyDNpNGYZ&~:ioHR|~6HP[*>n$%W~qlwpBR*Dpto\Sޯ㐅AP8g3=! ڥ;ۻY7bZ8/Mskj,N:8h3^"2 ^ q#sJ8Yr=yn&Y6&S Oč0^!Id9@/dZ঴_zO{hpxc&mѷs|9d2J1['[VP1Z#2T;VPzOoi]l3΅4dttqRo9\q4b3ʚyL'͂-tV5"4aD9huJB03(4}V)|vvf%?ɐag0=A u:iUs)Kѵ8b<7ϖls68,KIR&gm`9kZ;CrB2]7BovKؚJGOI2Q"^\S&/ Il l6󫶫R!W3= KeX>DiF](%Z%4:K~ ZG:1x{VxseqI/afP*9HrrOSGxifm{%$E4wCTH^!YhO?0ďъQƒn .u790,Ý^Gp22(MFc:@͔fqJ`ȲnQygsdhh#X3"#ϨTrVdIlY::;n{GͨA''O{Ui= 2HTx+=[62υP.35$!8"췀؏}J{, wNUyS] } C~\;&cP[+=mr<]uHhS*ĩ/ b[ruە8z4[BJ)S8J/YV?FP@RdZ~xe2bM6gb_lxHc\T6]ĦWL't^d_* e8'$danyM|PI$T Jeo"(#3)p6:l<}s$fO/kc'm C!<]>櫏LnenEp:;Ih;S%dՆв|ܨt8 ,g_Еٽ"ZOۦ4LqV4>گBvY ʮNC+ aU ۭ!0 ݽ>ĸݥ_4t!q@qٛ'l׉(I4P8gbS1t1B**j S!'uyXbUZ+'WD}mKP\.:669; b> P:ulm̓()=HRg(%ڹŚ3oif:P-PM;@Y}|½֮_ԁL r|\` . ,YN$|AN*-0/U_wb֎{9>~/ B%l'< Ƕgi>ݖe PIkĜu(j%G4{#]˸ <;"mv\Ԅb9Ko|T{ש YҢ_qVH]G}6CFL%|fV >c 啱*'Mg~b8ɋ%0ls=9_׮$~]]?ﭫ  \zbYkAc]u3LArH-c t2pKUi.8"= `*]T%fJCEe[/o=R˥~q)|?x wGg~Kev_Mpͯ74VO5HK1t||EצŲm4 }fzEBLLh>^?Sϳ%{9tJޗ]*\7D@- f=9 ? :-s tE$º(~ڪdw7wѐہܷXe(4Ȼu u_Byq^b*jܘѢ3"mHBAeQRѹJ3r{ؾTXFj;8i'o$=t_v6/#Kp`RC6çE~W܇B4hI9z, /HstO +zY軭2hEbED4R-k̎=&TiYed<Í$\mS+m:9ΔIr.8TQ ?({S|sǰe,rzxWq*TYx} 1Z*+_˽ k61㢶%(ǽ ^F]7Ux9)ƭy!wDD ϝ}`¥T&H%2ϴPüW=.\|Q-{\4g1d5;&sʓYcP紟?/&П),Q%1JVaw *$ցd7_(L#•g0KNUŎSsN#`f\\ 'x{:Qc;8uPQ@m}j׫0_P.["sL(ɘg@.MO$8~=T-rtTi.+s"5!PPԠXnoJ4n69Q#H Fjs>/,/7ث RGvӅ2);']3^4JL :BH)񹘯.uoh ×5IJ0F{~ %ޚ.}D4hcc>n򙘨`^%SEL i;V$:;B|Qw6?^HV.oe ЧvzmA?2aXL |sv<6ypP/nW%~/P*rw%=Ԗ9W._{"4}E j?0a0xDgx+@km%߽< /@@(\ G, êKrR 8?*]f¢[o)2dm%ChY`MA| @w}РpS"NAE3vdJWE!r%1͚F%ƏSXidow^VZ}f!ke-H?r]t[T:6s! LvNNQ龍#<"2:R[1Lr}#ZEG0FׁK^0G9gK0FA/1~ProE WQm[ &OBZ U+yXaI:h|[-*eb+ߗRdվǒHͩ0yI/BVGIcn) h3<θ ֦rGt#@ sUll0#5L|Z^>OtyCV j19Y1&}T{|Z88 9RG투RX`!2qJ)d߉ThLԷԶr[e?P4^F1VQzs:I.f=ojD(t/p`ѓLX9-& 2bˇW]SHd1܃g!w"LAdʆJvE|-~][+UƦe9*T%,AA#oj[WjZ-l}73 DnM{GAM{ ˘)<#8ؙR#d{d\ށ& *eD> T1Z%TzRp1>-*$o?ɧ4%Xb6 v|GR[h`18U4lCZx{ciftʻEJ!^DOitUHNL YNK\AGt>ۡوA6nA_4&Sy Ú.ia YUf<#Te_yS (/fX t\.XRCu>Xru{=<"<ٓ$ Q4"16ek&Z95aN*wv.BoAz7r]jSغ#*T\ӈD='Rh{Q9N c/" M) [L@SYbQ%èa9Β;ALsR':b+}}SBl)/ zV+Ε8 #~?&RȇJsT?>'!@ܳns9$Eo-hFJ\tb8yRXj{1Ut&* фbrXn,|U7[p)`IU#Jd4eS͗M.k\ S6_[gӥ~gQc看md)j 7k8$J`qo9%p'AګLuPIZ\L-ݷf|A=&:s |qEK5I)KuvTprjbOEZ҈ 53e祧UoZ=c6_5$m`-ܦs$w9loIGx-o-p}a\9+W5iV|Xu nJ?|:eL8Ic57%%!?ݥ#N;6"]ذ=@> ik)[>>(7 =s TazmJ`^HO,Av>7 *u;3=3D[>EʂZq~8Nj6qP`#fC+-r*۝ }X&Ԧ/;g0pXm'茱`7Q^<xՁ.^G; ))=]Sk  ɩigʛ%dR"vk7Ztlbq>:nB&*GT̷\>͌ DsGٱL? X|~^D|n&*|On6}~k;ÏDC*ir琁?ZEѣVbʘ&]R?}٦zP)'IJ;k˛cVKŠ{1̺%K8= Rg>õ^^37U$MoT8N*Y?xLF*BoN"U1]>jVl'/,RcLd.H᜜dA@|c^=Ye%BKm>\, jˏ+ .Ať*_qK<lz'IL3i;8!!wUJ]ՕI1S/0:EuG2G0hwJ\ؒb*`:㐚Ė;pxNN05{T.%:|ſƜo|_4?pLN_ku~L8_,?HCWIYl`xU"&kzmfsUuRw:B^nB-C>r,2B@$NϏc1=o`Axx u)D_%j]x9<x!HtPqˢ(D{F47ۿQ/h t{| 0STˁfKdWFD?ktNx2's‚b\磳h x뾥jjVr4tŬ8HWiḣyNpp!3 K\'i8 3ٴmR|<ݏ!1 4IBs] ~#eJOgMQki.,@$ 4vp)oW|9.6mI& m-^$'翺lx0ܐ81& dAon c.2$ 嫙7$jxnH6__u*᧲u{~{} DWsk0r[كkS&\t>_~]^{v3e⮽EAw\M=1oؕE}z \Z)+1Z/$ [E4ϯ1 9]Wĉ1TD5+kt;IE_EvP[Pg4:8N3eӮ19lo ~j#ۺ6"%䤰HQ; υSp8:D?70ç_JWZ92KT8I槾2 \JlɣjdKSra_A$"LuscY^BH4.ȆA }UV-=K Rb N$/u]M~V7GkQƐx?>ʟu'E9s|۞DUUYQ&HFԔ? מQ#ƈ `te^aF;R |kʗ4ӎLP2XW0#XR813 7G=HqT( j^skֺ*0S /4EXIO(3obOh$+O| -Rtrdͧtwm4\4W.\VTRk#C' \:7U:c_ ]Z^$W >GzVEډ$P @\o{sy5Rׇs~0!AЬOQg7ƹR5&q|ԡjB; ie2sKXqJӠzM>)lc; e=Ub\E gk Pob]{KVwH&^gNvs5p(W 5c)"9#F:h܀'SYfו<8aVV۵t0?_hְTH*0s>`gJiL/#1k6ȉ#S&s<93[AA`e8Uc%JAXӽ:U,{&43z}탶7ﵚyZnë~}Ϸ˷eM-O!gSQIi<}^"3^1#,c\nnԻu-Gw)v눓8}nOp5'vn2TBm2(p坋Ep +Yvܱ<ԣG#$N>3](1 &̝?7rQҒy!-z i :~lUdMώl=#s@ ~ELa1%WH5ƚa:\ /TmyF%1jXnͬ>)fxT]t6euAEWzfmqIfWK9bI[ju Qb_TL^M{ B>s@&^ѝw8fW5qf 9a_2Q^GSc9/?huω)YTNW2J#){Mc8(0لGi,˰X8]Y= Qe'Kz8Q0!";S14c ~ދNˡ[ E"g3#/apcUW &s}I2eti FɮɧEFK*o0#AqR<"^siZAWT""pWluV_Sy(ٌ<,A:5 [UY0: R)Q8plT~] @qoŘ=a91|qh4Ni+G/£Qؿn`>}ߖSN 2Wy_/S9qۜB  ?wd v؊ỹzXkjsŸT]i.:Z0g]4Q 38h;fDmEJ%nR@rw<ϷHY Gi%c/4~t?zK%n cqfDݒRg6Ѐ4ŊN+oBlĴOd?VrצPu~(Fyf|ZUB5(' H`x/x0'|X5rI͜,.H_Ln(-kUF9)f1`hGƾj)>m>5WU7!_uE.k`ƫ_WGNH;00rL)y7Bc3uVNSm.ԕB^PGjTv_5*bP0}=DrXqTp\e6BaJ!^'t(o}2!L@Lmgwo}"W^w }!SLe%=`u]1%%XR~h> (K*׳9絰l6Fr&6 sPth~ZȊ &^hJ%uh_Z.5f ˺3]h"gcѾL& ܳJjλ5oeRކJKKnL4͎D@Ikz'ݰҜ!Nv"Gy0&O8^ffkF't4<Ko@We z^E4UJ2D;-xt@~ 6P-ÔYxhP6yo6sN)uk,7|1ʝ2ҬA6Ir'BAD9R^N$:aH@JW=UnUqN5o8(%"1Z.[BDw(5:erAJEU4.4XE?Wx}_aoyF/cb̴1""J'%dS$?`D!^W: V`[Gff.)k +;/i}?Ja쥀 2DetF3uz+e#;C^]] xqYx b5R)i69IJFs".H{Z>ˋuV-Z|Kw`I y'+rY UXﳔκH罹}Ip=Y =3d+֎N #eJ ͈ o㎚*X\O0B8 b3hbԒM&\Rvk w6'Mwۤ=5aޒ62<1J'rJn$@- G5lTF;MDxݓ- 1]9l UZH^[N磽2("YѡW[i .+֍""6NFsj={y/\ |smf_Wl U#YPy, A7譡 [uDƠg⤦:\"S4k%\6J> mx{x)L3^(]k9@|ڱ2) ll̷ Wm% "'W}i_l v?Z?#<}80w?&ė puv\N m!::KGOKh8بb Rp*k1,HK94pͣFYgqPi3i|->^:Oο@Y%ws&E=cF0~Z-cTN.:+-!?mΗwy-[!F\b>`ͩ`TpMYVa[X^aRfr}z, 7n߳8PO,x[?ku;,u;uJXL2`>/H ƃڽ* {h7xV~LrLrn~WK48ө#!+xe\ȣyR-Yj^l[qV0 Η*b a9VY$Tmmc3CȿWDgkf' Tk9Ffo'IuJji 6B jx?qb'B|KLbcIɝp„#@ёD ]=Q(aPo28A:_怯*ֲtMsr+gc%mwiRvϰi5Q?nw!3[/" ]K,E+m]FWđBߵiȑYJ$P-< ܖ' c}bk%55w`(ޘ;4V4|F$C~A2 endstream endobj 85 0 obj << /Length1 1837 /Length2 11459 /Length3 0 /Length 12608 /Filter /FlateDecode >> stream xڍP Pܝ;@I(.)Z܊XqCq+wl9g̽$g- mv),sspdT y\\\\< :{ z`'g */ '0Y& ty6TAJn^K?0', r`P3: bm?LnaaA?R`'% P؀3Z0KB0ٸ8prs9`Nlw @ vr P:ncqK rq:{% ڊ*uG0/c p{hi spB=!Pk PWppa? ΰgbx6t @^J|- .?z# G}'=9~\;(dhȩ s+m,BGf vsqq `K?x:Tr!~zn ?{;'Wй l Y ?`L?n3}f'TQycwUJK<v~n770@ q4WjUS`{AK \0psY>q.XGWߊ]3e:@=xfžwM4u.]Zwgyq.uX4{sqZ\\G]v)堖0[/:9=ѹ~^GO890gss+/* Cp 8ANг?H_$8u|E|ϖg r8ω|g/ >l/\?9/_9/:mu8~3a*Z=\ Otqy@gǿs?P`<:`Khm]H') w?әٽ:\oQSkV.R.m1]H.P?x4&iܛ'hMlύ}ܗzAɮ#G/K!F7ᰙ-eIh)|Ӥ(.Th,8S?sǞX}yL{q&'3"B`MU".-S *2i㫥+["e(S1g =^;?^dۼYs+j*)X@'㇡o߫TWde?T'vGp u)q VOQ됩mq"e"T 'I\o6)ldM}ty:@o:n!SĤ7irM3/6ĩ9sOjFU9FggL*׷®T}\fU^ڔNMȎhLE6FBd/eY|[wȝ$kKSaz{fm#yңЍ4)3_H,R`._yq*=BG>78^Z0w؍GsjOdhHH.v{m#mnv$L^C+X6+Gn';4B$R2dn 5eCu=a CFvqJA˔*w sF92~7m #"k6~%ߘ|lQcTa^=o@gf̾Buc: (5;ֵI}dnWN FT|fX ߻S㴌ld;O4m,B|Cq~{]h]SG4&ũ E[`)\y1&lus432\WT;˷٤&^Ӳ/O|LMW TfGhqA2dWHǰ- /<3لE}P;(+Xv܈sF,Т0^d#~sc?y7܂(5ٝ/vd3´(j=ǀ]wo)KnY8p2E+h,>RiXϫibJ7{7bXLrM 4D7J#,7ؾ=w`3<C]&ڞֻKEAW#~?^<)J!c`z94MU (QxxvSS}z'-/a))d/2lu?~%i[TE)`زwB0Cཧjc͘NV %f&)tnDơc D;ʛEf ~Ж*Ur;6!BA V1g >~X7JϚGBeAm0rނQ| 9$#dSyIL+ХBa0e]kf9yx@2l΃:p}6ՠ_~pύ>uԪhֱ'o}ZD{2Mםk-z++}bg2K$k%cJQh (U"VOjȐC3+) Bd9p&o k]z+Ȥ$ r9Y3É>mi*4\֬UQK٦bx` ΨJ+vD^1K"+^"xW qn3qɼWyY;Uukd҇4)Zn{Q_v,w6T%T9Lޝw2H/D.Sβn~)-о0V=\3*[;"J騍?kʒ[Cg}'Wô=.o+R,x]l't]O@70S]H, >s&(t/h\Xۘtz<"YL~%+#۟/ nRd iIh6<𸭷K+ߥۥN 0ni:sSت&9Y3I|B2t}/|qÔ)h]dQb`i;4okC!w&MN/߾-;ߩ:ivמԹ_4/0]TlEW%j 9d= &3N~/=dkK–o, $2c|i")r;yz!Mz7l0y.E<7pp]"%teSvRyʐeQm3+hmysVNvɇ]*6K'db鱅T(h9@wnt7WnmI+H|D "EayA7ȰP˚-u%fLYHܤ;~ûeM:lEKXPK hg<2#([}1  ' DEzve#x$Z7GkWXdc~"K<K<1"mxHoaIq&$95eN|+@߻f/6 =N_E[išTbK>0\<䌘ݩ|

ʗ̓:~FRD\qA(J~L~_z͞hт;; w(^ MpbgP$v\&<5?QvwZ|/y]uqx}ijX3:k˚$цmV*gQ@UT`]#%Z-2n鷏4$jJDG;f8.4IlsZl0Xj5AiX7N3 "p\u>er7aR3 ?1*\܄>p5b`ǃHQ*T_S*G3aLEqa|#@hUыs 5˯?bcWYb_7+ ڇK6E8b^~jr0^:o+};S 9[@߲)nWhI=6P hq V7Po*Ά t|2[fzh.{e9WI[//eHg@rrK|]b{Ȃ s;v~nf V(/VO;qos]xY}gpW,Fh_'ҥ͊>E)~ Y5Ve;"@ܡWCgz?;tB" 7Ω  F%[H=$b4MD6À>YVox{arPJ JRvA&g]􃚩r/Bp ƸV %yQ@ڔJ.80dbi}6T1D.:{`"QI6ڨģ n-zx ҅ScI8,Zb=+MG"~hUwa:/T(Ԅ^G;amL O]<9 |ئZ/vL2`(- yzN4-Iơ7A_Z"t{TA;V "? a3f4 $\ܯ~S\P1T^v\M`܀:TӗeqWF D5CVV(v(8;DG JU:ǧ@IY&UZ[x܇|tH򽫏"Mn刘P7JuLjn&A_qUEs1I-g jT G={Sj7'ю5Vx_ٍ-Xթx0JϣC2fϙL "RӑqU,3U͌>$~nw"Q~^4 AtकE`JnvsN95ӓr(n1Tִ5c ;Z5uPc|l8+{[h+LcBՍ?/ڏcF-lZDўm WoCPK&Ȝd矌L RUL83IXbC)]ZIm"C |urh>r71+jp` :O;y ^x3v5' uF2Eol'/{˻-rܯtF2LWД?4 bl0jKq@泗7wH烲7Py^Ӓjv|\(UA8Uogga9 *f 0 y`M晢{OŠ^c5*Ս7 I\o QQW]L)w ݎi_TdHԐr:P~ZAR))9ɤ& >*L6yu j`r$*":* 91)fe wy2i'{MOCWm˻CY((<վ/i'cp*o^"e?M.g>U p3{5=J!;G!9FX*=D TegN#li<}>{X,mO&Z'%neΑyņpIZ FCJ fYpg[ yyҗIC)?G~PoTt$((#}ӗ Yc 2)uTRYl\Qd>z9MX̓ZK-gxa#骰 'GǛ5"KDVx_ğn&Gl}8lT{Aͨ/m4&ϱ}uOѼg9vW/O.+Z+Ev/3= ~jzݸ>Tӌ_%ƨNdPLy()/²?pyK ,E4G_/®.M_o6y$g뗋T]w\XDWժ/$ZFlz5D+1F- a6.*曫IQkgrZ +X8K0޽k-d.Id6@RtƆ3`rc˔Tlao%qd Dp0 L5OxdU9  ShW˻MH!khp+J-*_t]E}1Z~G8ܮWz 6@*I6mh]JJX>iDY]2Do\S_] VS1:# m";[iҍ>x¯.|0d5l!ܑ\"kxtޘP vh Ÿ%)ڶ$G0=y |$75cMH-B@ [m3B`8נ"-6ۤrYfygD{k:VkvG]v ujn?5ߙ)d꡸7!5) AqxEr*UeI\D~5ԓl+-F3W.!u-MQ2I9)Da?E\ףW" d(4Kg0S cƠ:$=jAU1:I'$yS =w4g#h"e,seǚh*p?wmhkiSǦVU1w(LkWF"4{fc5"ԔQ2 8"#%=@izG%!,m{?Ocs0Z~;N<=dAv x9} PK !d~\ൾ0u8JA.s^yZ(cUq܏WOQ' XDY tSTdҘר"GprbMqo R~hW_~\#<uxO]C||1FK1K8k|6_ w[5NW<}=Sz+׭'O 8۰[ "6[,::~L$Gw7>+&vK9­Y!|KcJ5~a3so8:w2|&4ٱ⼓4]{ܢt<ҨXC ^y-=N ,G|aȩŭ|T dG6b˷I[rUZ[>bo󛑷r|OYcfR ډj킵 ߏ& 7=&]D{  ^jOϛf>)M"Gɯ"I'?ݑ0ưZӎ@4Օ]+o۶9KurGy%xJ Qmzy٨+Օ .YϒBӿӣ(}͡sO$:~crdKaw/fBbV,Q2s<b<;sJ$F:&J<;}% vM?LLaҬJFP} f[EpТ02#zJ,Ȟ]( ЃX+=,h%lcjSM0|B>κ?pJ9ݛ6yeE‡pZTIwM30?”Y8G]l9`0vb2=Jd-aYv#tL8"y.Z)mF5>tQO"9x-;w%ぴ!@4⎣dv}ySϜry4AnYL$P2wxrbI~wm#՝X%/@aKmbVT oW6>7oDzt65Uz_,>Q4]~} kSLu/Q2pJbg b]'(:ncm"/3-I\OLa5zΑkjiOvgpqɀR+w0qtfPYԗX4̵^yYl`BqJ=6:N7OX gA"C#3˪:ˏjtGX6ⴚ ksϻ4fQc&h|1OM65K!^|nX(URwrmUn0/ۍs]W,kMDQxۓd#/LMd%W =(M*fWK+1k\p';1kk=y|z`SR ?Mc )Mo@Sp# fUs7&&]h!W1djyóR+K}$TKW}EVG Dzۼq}aꋥ9d*x8-/rUO1\&d\s%ݶ̱P XVտ6&&mxdZ$1 ։r0X.'Y듟EEitR*Ctz&?_Io-;m)tH\Cc̿Gd^.qp,JAWVD$Vpw͛?* IҤ ;t)5j]5EW%_"~n}=>zW#2s'Sc}qZQmȻax>6Ηb]uZaD$ \o(C{+"9NN=Ԙ dř0,L_-s1 ;Llx/HaIq<KY'{L* E~S@=cw^ ՘BM/J_s{LMn9#—BH]*h63ǤиKcRTHZ" 1bxOl\\/O (X,rǩ}3!yѭݲq Ŵɹ!NnyyrVŨ'+VVtڈoW8ٛQAm UnP*mT"q&cq:]j;ѣ0`c*r*kw@gk[b\eŃ2\s͐#]-oc*%(V-*OJ2RM}|]N P&+4Y~LN"Ki ._lCPb*f_5gc{?}|׽O'fsL@xL w 4ڿ ZJHqz.KE53~1fPB?F@O:nn$m6}}灦ȯQw hnS4˥zS0k9Bcl\u EC M Ӥz9ɧ}gx{x5.HzѠMPqC1QXyR/{ŽtOڙzX&@;P@uwaV&1a>7,TR%֢/ #fbYGϜ TQ8;1Ν>c oNeMbqSȽ7)~DO<)dk|-)%X'uU%/ nYLoX:&>N M|w$ktKI^EwBVG7߸~󂁗@Ɛl͠h}V@fkF~뗁n_3ؠa _AKN> stream xڍvT6)t"C)ݍ  C "4!%-Hw JJ}{y}Ykgu׽װ1"l 8' PT2  (o;E%P76Eꆨ@!PT(&) @JAP[&1q#`S@x#<8ow3 M| `(P(I~~OOO>i/z7b 2@ CyCn7.p[pv"kEp;`  0@[Y඿ @67ߥrMs#.(7>7(WlV ~էEB7pO8nk [w~C8sc"H ؁Woo|Ӄiܼn tB(  'w3#^s}Y(yu5u /P^@ x%D@aa t@?ޛf?"3!BH-D7?d+HsEp3q#]wh"nTc_ ;7݌)C :P/e75k0(p]@n ts7TMPDB"A7|7i -d?qܴC ~ C`;<;;ln.0AQ/Կ _.(DoYExASTЦ*{C>s򢧐?R8+3r)}3JGLZgOꍬ6LSw*ؖb5]t5 r®l}̖.NOqAūUݵJQ;%qAliYnxns{&t)7NP!lA0lg@Э>-Ǒh4_Es/ǘ\Ud̏ PN"ڄ:As >y@ G#}=s)hڪc?05@z9n)5r wʢ|கg)Bv`㼃|)K16?+g>Ϲ M=<_| }=~j`"b[Xka~qag\'K%%2L`:>,O/b!pwcm3Gai; uܤ-eK=cWTjΏM;Sov"h.e+oRT/MfH]M_Bo}( V̮F5<]Pu眵K2<{㠸P)׽Ek$'Z#=^.p^TbhTyJ_T1;_sbŃMɡG0qƝ#wj# ŔC5OJtyLcO7({'L-U\~OFyPZށePT _[40Xfm?<4fd\=_pNqJնye5b7o7:W!j缑58 SLB0SG@yǶvl~-V vL Ͼ0 lW [-\:LrMOe_|ŋ:,*UR㰚I4'66+2on73Ν$Uh5^R*-*c,:[9OY5jS #mR_oL>H;>ӪKrJ^ĵ870ϝ$pۏxf'{}L珚LI]˙4mok!Elr N,ެΡi+;&IZCk&>9>2A4k*m=(`V$^)#Xm%8bE vԐzX"N#4RU;‰?0SZo K(DÌeO|J);0X=+=޷bG^p}ϓ Y2Ǎ+RB~%9gQ" ʭV tc3a7cO uDz2ٷRK?[+]x1T}evYxGKeH!>{葱P9:2> Խ/ֹPMYhFY>GL_2.ABz˧BLˈ7\z_x'D#Wcmؽ!4ʈ eH xa>} Wh\]8aOIQA䀦{Ȥ| ,3h>6iPT",ʲ)2ķҚ %u @y#sr)=8»Q-E.P,l`2{?OC3#D<ʦGޮ*2H_ By:۾6q)l;C$V{ ;g=~&* 9 3nj0ý :ϮQӢy^]vӭ6 ~yF3u5ba-.#j DyK0eMj/TiyHVM&MLSUOFIP.^6|WňBaW>7a)" 5)iReC+:V D:o~͙[Fc3𒿈s:JI%w\'n98]_MBQ;[.8N]+Hßϒ\m<3 i",!ӣ32д2|Ҿеs1fϐyk(Wik# d (7Ş"!ƾmP}j>Z#,[n:Ev{X*>G)+kmVGIJL;aضy[C=)&:͗լZum2eb/}.R{6ɹJ -mwo-hPB8(N-xh\,ߵvח{aOL^ Tbwesu{[,Mȹ2'!WfcݙϡȮc{[M ƶ\:o-X 6B ^8$RcY#i3Ayo'quqw#RWĮMZÔ.I6V^Q9=X ?lY*pfmъ%OX&|NB27֊˳#k Z/w$HH"ӵE`i @'Èi9t虞D"&KF#6T_4`$N/<{9[ϴ'+oYY1`m0 s.2J:C]GL#TA5v-̆CT|P|p_D6ˢo(md 0#cm/Dg[;(U+ r8=C{bw DHMWچ<24ZFj#S>W^VY:rCekYL$f! *z֌)B;‹Y_G zD%3ANYJH}f Z:\ɣ \x>c]Һ}7$\Åa&7GS>,& R*!Z [ȺgvMu;T4l9L?HWx F=y2DhHrݞ^!.Kne(!o;R!FkbtH5Ҕ~Mf|^ 1V;ɡƖm;ܼ;{வ)k8Jȓ3$RbQ*E䣃}ߞDu8Z𮍰 Tf/%Wd K^'H)#A%8e. +#0kWk ˦O1z '9>2|4TVj>A9ΠkƐCy@]e ٢M3Pu@(x m˲KNEyl}Ut=fӒq-VAg/> WX9%ii~$_K  GsU ȕnA&Hs9Y#UHo.-Tv*P&0)zlv,iן?WܜT?S9Ǚ._Y-Mmcsh~{("4s=J?)."z-ّ-ո %<. )sM;ua mhrx?Ke%d3`k5ͦOS--1uQVQo[i?`nm,CHDXB<$Qx򔅵])B~*_t~7YN{{\I9'(YnqӰlV>[@R=j~!Hrc CL K"7_}@*6VPNvK+X4y.(ǮΧ A10A6VY8A)eATL6ߕ3F e*-6#NB ӎ{sOR?t5q\~2֤mR/~%IZo䈫 `V9%a܇8e|I`ldD؜+Mx|-=%q +poӱ~c,08.#\`mbcg =e8eb0MKɘ` Qw|v|h"[L nq7NkK7K4(yWcJ?y Z{3²]HVm$7yu둙vF7KmU|"#b{Z'J-kBw2Ɇ9;)Q*ƀd:Sʉv!3x1_@ʯ*=V5 rU3;3dF%rC䤾sb uM"Vp%kwǰrcy ~gTT&y=צ_JxĊ`؟xA=c)UU򧝒$o̙8}OŒ{`wkĝ3@fy 6.>7q '@NenPؽw}FC[b~ƨիqb·Ssσ^CJ2A$gE4z'6q",AZ TǺFS^WN4’>TN`SWtCG&j|$ӮE1Kŕǥgvs/P,N.k2/̄DDg$dqj[G84{J{eB;̭LW62KNYGO&vbQ{|ӥfsq`ʪaUc}p-{GYx 4rpI!dZMԋ]u@q@, M[R\?WPY &a#œ%~]1C7V0AJcӵ4u৚#D&(ҴRWWtH9ڟ'l,ZHTy1eI ?lVt: G.ia/mnWw4$Aք2/NVLa\ׅQ +{粗<(;FWĨd2b\On#ىͺn_;T 0@oX3Xq7cFE"C-H o.+Y ֱDs6~д@x#$-Vf_ gDGu%b2rE p3j-Z,w]S6zҖJeh3y20_lskHםFK|+z$ DWtE 9e*N: Es+ب~.lٴtpڐ^;֌#y?8- endstream endobj 89 0 obj << /Length1 1812 /Length2 11399 /Length3 0 /Length 12554 /Filter /FlateDecode >> stream xڍTk6t4CJwIww+ 0P3 CwwwHJw"-R͇Yy]}g1 4:Rs<% QSSpqrpq`001A0g0Q_ D5#@ pq]52 z6:y0Y0_d# -5 XhЁXApJ$jC99883 hA0W%u806`?:+< GGK X Ѐ$I`u8n;` t;Z *:Z&!@W hHu @^J |-``(ܙl{FiYRr;cO Y<_kqs;ZZʩvr)y4ac\BBnaq/( z=~ax9]A8o# nn%0Y1hYvq=ʏɣ,!bN )E5ֿF)- qxy\|BΣ ǿb ~xP/0!̀Ny.ҍ,p??Uv$boOt{x q TП8W |\)GGIsqpi;˃A`͟Ӯ{ M3+1|[faq~.T݇ 0?qM-A?gXA`/Z%S$(T 8uAWo=)o8-yVN/ǻp;pﱶS籀?Gs: > # }G>_W܏c3`cGƿy<> c5Ann{+(?^ ;cnb!l[~Y-Eƾ9*r~i>Z /7a6{^\.ui˜o'^u|3O.(hgp RKaQx: /j{gC;˲U)^׆?%y!.h=8"M=VE #ѭ oup"~Ǩe#P8' YU8{^ {VS/kՏm6Lhm̒=(D鰼­H˅0jA g brwJ;[4%Lljb> 1V/S7Xw} .3L ۴늗, n7vWp6|Z˓ळSqީ*1 sn;(sEFMڹwا³݁7h0:nWdp Gkmz_U9b%Bzއ/v^ ײ=ϻ=L:3.k~LD9_i|R\#wڼ3-,D:Y [7^⯅]6%ohH.0bi} InZ=mɍb!^&ݏS^krl1jNS#i ᧍?I7fw 5-y[ܢ*&d}Ύ&JiY_m2Ⱥ ۼ%[=۬&܏۫C #F.ZCAKk tRF?=ĮfܞSdQd4$YUǂ靚bhz9;%5..Mybp s8Tu}`f`u| AC--{!]|bݵGLO7Ļt%{ ODhin[EFFKBb9~akW": 8VϯϞFWxbiM6c[FUC$@c bV-G*v &x/6Uujr{9EN{v[~W:ݍ1dPAÊDFn'ȁ[0FU=u# f0ּaAP+Ѕ?l# "q-9iZ!߬Jv5HA"-R3,q -S SϷq" EstPBT Q `[~-׼$o?R|W"F`2^FC,ޫXk|'b_`m U6oX>*xξp#l S+ecitx_yu.j''IJׁ~5h[ӅRnc;{qe]b] :}7h̉hɅ[ƽ 1m8p7=SbUM2[:jiyXxYڎ?>Ρi\l'ۙWM1ðJUVolM}iAiPو$j%[M '}m{(tP$$0OfW<U|Q#ow~p`!%z ׂXla>:1ZqETDE3,㜘 Gzq=[z7a?qv=Zd+m/V9;߭;۾eTp?kvwua:AS]QvWBp1Boɬ[۷-Pyz -r15hfi+̉u]ý^ ˵IZ|f4=ɶ¿{`ǭ .[W)it9oj}kSaW}z8tE! hBֱ2E;wypxYT_r3ɠ|h{|0˽OWq@`^y\ċR_gs1da:c:.gyXߛ6vUY-`t!ɄKI7/8BpH4.B3_GV.aȴ f-!5[~ha#[+vd*NzC ґa =h fk0PSUV2PkʹCCNP F?IQ1͙m~E#:_P1>RcuC'\t'}ea;Hh\M)3# EKҽ]T{ˈij@!j%YuɗQ4cI$n6s׳ =Pvq͐$H.N*NūMᥔY;c¹ GĶ$Z9yެꊅs(A#KuS"U} w5Iz:9D:7K&9s"ˇwj$|H?Z1V03r*lgZ>F)~pDÃkWT=>BDzd?Gp "OeHG}W}=f) pa;I9`.xgwù鵂3 # 2_,m7ФKx2B}bN+WJyF YI:!,gd7b2G KW{<Ę$|+&UEpo1{Od *XǶ_}&ƽ{I }K@'M:5\d{ BK.}mhY{8\ +aCr u7Eg'{bs3@ܞR)UN>UJ6rbA&&0nbvR,%J:0~#4D ;=UH"?| n7Ԝg\urUʴCͨ!K4M-gd(-mD/: ź\YKIJ#2U  tTvA%r[a~K#"wƴ'+*Rg[7t2yLDYиr#UoE]g0bg#ti]pZ&tZv5,~,(ީd+CDVe;r_tʝz ML13|3M_j1 -,:֓B1=:ѷhN(o'WzNA( ,fy0 )̊$=~H<  [ޮ\QdDD;!1'1khq\U۶άn!pۜqb9 ̤^1RAɆˉ;H}6eths\-|?+c6 ;!|PY};r}i} TuWB]u(g>XXa_`yʕ u$)Χbܸt%!GKq"vw͎n)4QR'[Tȇ-yUOBV8Ф( ( $L]m%5(L!b>N5J.\13D86ᨐ`U*%; z.I8+v‚ ZKawEr$= ޓn}~j^* &4^Õ6urSyilO>X(^[ڏ5=[b/wǚV5r3Tg$s .iz(mq+haB!?6eQb(bO=d纞:%GRݘVq+z@7pC.$㖇dO!ݩ88;f1`WK-SnWg 'u viש5AvPM' A5wLSlp[D>կZ<-2N39Ϭ0fXG{rb3ΛR@SJ(j$]J!E"!PN`&w6dJf"ݵFBv5d,h-#f7{*ri.2~'||rkP ù5+]bh,#|'VSz5Rw4(4|̣(`y0d!GYL$qs7VqouC(Hȧf' :Nc/]}*^PgY't3K8:PZt!U>>c&(,".5/ƄBMp] P#> wzDb/ IʇTLhf %AG#`ATvc4]dt;m`ǪI"3T-ţ#UfaKN F)YAӓXfޘ6gD7oG ` 2k$b|x7hvx. DJISy5jc:w];Ie}lMaG3-‹@f_Ҵwn^%Խ) Z$R[S+I|іW+^^݅v[ͯ :"#tpZ$T#0RhvBn|A>$Cc1-q@PFI#}XG\AT(eA&DŽĞqa%_wIOhS$pB>B3S" z{ݧAZSմk KkCAwV>(fP; +?eYlV(!eϔoM yɸ{JR\!Áqc_RmgTy{ݼm Ⴗcn8wj~5ջ§W6Q4t/C7;["8((5NyO-8,:gf" ;^cQE.5{E7N꒴z.BH|NI-2κ9f[R"w|!qoTYiMSk 헹WyRsGav~'r>{$Z!M۳E^xg`_FXGgW>F?"+5%s C-mXhx@}rFz ڣbQ9׮AG?М%q2d`[oA(L%%Guxhv5wY_:9(2kSm:fE1uVU: Eem}TV?sO} n # TG&ܣhN j* 挗&Jx:>MDkDy5Ľk$8(C Ί}l_mm8Ҿ7NYsK03og7Y蔴J-H֋g.ۼ})*CI]2⟏B6`w[s JQ((6mhLtm% Ⱥ S0B2l~ޥke=6J[ z &}lzaJuW,*o8\>n=oa2$/V~8kNy 2fw}{5``nu 3Y3b[}g:sNyq4("}d 6J?_g}cV)IY/1CFHRs]_Y#4%/!E-b˓lAsVC" g:p*fځdF͎UrHn1{Sv2䆄K^ے3Ee#T10*>2QpZehin?oց+b8ld|qG/9W0 ri=]H#EUch}"*2@nݧA2gv DXp;-e>n :l]mOX瘸͙p-vv"՟Nb1sa}9Qn,BU5DSxTʀgigܕzЙ.&Pc&T{(Fej|W|2G.fȪ >֟&JE[jiiaZ%@8Vg -)qN,.!a.Cɛӿ24kvyBmt;_6i&џaPg! ekTw+MaMte~xd{JN*oB?Cp a7%/+PAۚ৩ztV'OfrX] +f͜\ԾW*XXOO&p̚ GyJOt(̂Pfb;^wO&V &.bՙ9Nm¥-eXDf#CۃQJ! Q`铗4/Ek92G( ;-iJ)FeZ"'7V0r˫-=ħ"L Hz%? pH)?'DhTP'f~^?6cƏ"T1 M^AFκW G~OnJaq _L*.^UWDARişĠbܥk99c^0z.nc-T{+;)3<8.e.d:qZFV.mNc)S;#5$}>W)E?)ٹ5Vކi?a19d "j*u] I }o54c+:m#:҈k`K1{+>Wl_ $IY7Pz K5^ŶY!W+nu™]cSB$t o7||u{S!+d)@:/vÂ2^=1Pgᾡ$F{gq~]8y-cYO\krvMlxCq *Zސy:?dP34aFNEC[8W0Qezy'mxBV*%Q?$N+Z,}NWF:u]ѫQ ."XKv#<[ #j9ֈy`O?h㫩~rJWD]x1yOdH ksEqK_2{a>H4Ynσc1u++I`il G5Z$jl\.YʷL@ 6;L(Xl cmvE΅#mCY~j$ITnijԃgؖa:>K1d~)İi?f_f+K9Kxk9iDN^kK/KÇ^h]_j{k`b&;"5w";p\FNoBg#_0VIKo~Ɲ(=nXy(IY]0^|o6lq"ÜS~{<(بB!Fψ]ZOHm_T>܍`4R#X+T>rOC&m{!ˮ-oK9= u VGɑ#,L07Q0kmݤY'KFn^ Ap|.ɵ|K\zi2!TAe&2fI{9^rT_9zAfrxs\>eυxFhj8Z^js?H3vL;\7$bwK/`쳉 uy~ ۷|wVe|Q_Z%'pv-D{d 헓D-^vي6'R5#y͖"0Ie;jiW :7ra7|.$!kTĒy ]p.D!TYE߂\dKtj:%ޙx@4)LBސO{{ŬDtyHABe6YwP\))YS7YIbʱ:R T6v8 x1>!#xUA։:$[npYk思 ɹ.x~  qwJ>&(F; (7a{U݁E ĄVî{-m7.­O4TBR+`_õݾM#{{?nu/3LkD^(3J4W i(11)zMCYM'Z| endstream endobj 91 0 obj << /Length1 1430 /Length2 6769 /Length3 0 /Length 7737 /Filter /FlateDecode >> stream xڍtTm? -݌H iFH؈тR*hA)iFRAw eh!0P) ń@Qb#@!eAAcu4Ohy@b HJrDyT!@GB=yTPn~G4|P~HZZJw8@B q8)h7a0A_@; po8 a.3ab#exX  Gzb#0{9PSp Al aп+;\ H?`pѾhA qDa! r`=O )pբȯ4)!a*(WW8I>Uȟ:#Q>Ȁ{f 1T"[G$wpw(+A` `mcaJctHP$.ϚKGjB>guYW%72 By,AZ8g(C:8;>ޚﭤncV r}l-b%w/)$,@h!6[՚՘=5Ph" jZ19AB 0iD L"$tԟSh,hmO>^%1-!GV9?Hs+󚩾fu\EYY};}.W99" mU 7[cb:S/…cةfmw薃撩41"^M (=mFv)ί"e6aVev4TX'b o$<db?~|3̸;zw65!n*X pwBԢ~=;n=׮dIDtZ SUi c'O+  O<#$^9M_@@gKpih/cɹ[ [w>}YyG8Ի&S6x&~.zwLx%k-bǟ|| 7tNr O:Dhz]Ԥv6[ga M%Uo↏~1AIb'V.?񙇾@ 5#"39(˚Vg4<$F8^5HOv*oW[>0 %vaTrږ)Jod(k-H1rxb^ϼ `^ $Yt f8x14un/VLDxKu57NiwӯpӟT#"AړI+%YP`B?K5Q[sOHpdc߫ 7^;_>ZΕq>n>Wa5A=O-&7Xj_ġu'XJ:}@r-Fu+ϳ]v\_w8YҮ>߇fnmߛ[*xr袞ɗ\gb*E5mc$SmA2 rB I !f$+f*վEObavGf\#]/k.2m[t{uӼj.~ɚE}US!>v)v ?w,\2:egB,ٓAm sG0'z\-ƷxaZ3ksk wL\,u?I9~g .d9ա)`RElxӼvo]L_QL@p3+>߮q}CIYf O-bȴp>9M֨2s}1zx- Ѷ[W{,%BA&[% Q\&_U :?ddH 0xU EMZ#-lnmMo_Ts7Hpg* JcѰkpTSD`ձgca# $Y˝Ϸ{^;ζ ƷP֯.aXJ`4LFs-J]ʅ34WLk9W'ze+nt=TLѵ IxASMv?gzԱY;҂KddJq!ϣUѼPIʓ]5˥a!4YR[MOU:ǩʍĕ X &pצZNeOظu J`u7 ^gԗKrQC?4+5c\ؑХxCWnM?5= it C庞'x|4=UWxM;t:̷KZF{=\:;𠔲J-NZQy >_Rƽ ~ vǨi lGn jNW:"[T8 xRJb[BLQ7:c(^e?c/mE4;e,*2&ImWvvDH|a5Xy SEIo$Z'xٴ͜\pw-̧|1P1t2':3{6\>K8-kWt6{D=9-_@,+)҂Aooxƀ }xŹ[sa]6@&Gv(@3yjI^ºg#?b,U߂JĢ`1'L/R2ێv٦f,p㞶6mmieA>x0aH{M K*nFs+K_?LNEq`U4C~~a&ų]fs|?ph9Nn1DuXSnHb;8tcr7EO-&ڜl22|I뷙q#\ /Yȿ,)Q~|E̎6%j, .ԕp{.6O٨4\ALU&,ppYzph! 0Lw;-8MexqgL%N.ױDS"Ax̷ eLh]@]bĽ(I\o${oiwB^kEص?%h@)kS~Խ39 #.T-Y _`gW5+i6MoaWϦnP tviN ܝHU6_FaEF=/8So:]3z;\[ex5b+CO]c YLY>GTw6tD:86z&HJ.W 2I| !N- k}- (@mG{ӽIby!ggnpβ۶|K6݃}~VOJEf}8os Zٴt1:H YnmK +)xr˕W@hĵN,F k:}0g+9c\9?f}yE`Yw]_',;6u/Fk*GDxƠgTRb%8)nE)a3葉9Z~deh:=n5Fd\'0yysuA8U#htxOƶ<|OG~ˀ{6/ƞb2S }˫QI1V gcE)ӣAy bO]qSfꫭIqj-Ps27~v$M-?ER+Gׯ-!ϠLvݡϷFM[Okqep|hy.]|mQl p&,CX֤CFvIG8.,VQl#]|l4mRDA]|f6oZ85B֞λJ+q∇]Vijg4%NuYlssˏ{wWM@~p;x`|>=rfmf?_=;21_UnpŬFlL+;>/RRo 59 4 )S=L:E ߀.?g MO g;áYԝ~p9@Q]2U#6pFU'Jx7rVPq/f(_|`~oHh_Zwv}S঑Q?5ꮃà)p @*&SU1 Y2U'~!$7}r*ߘٓ^u@ղ);&/$q N)|F$A1e*¬0b~n֝ZO$kO [HUSc!p34Gs Ďo+R%G"wUI/Qo{-O95-g}<-)\qz$7żtuGiks5H͊Us]7o#ę(9q"6rxb/2 ҿ ";Z }`V;AQ\ScQ؅loc 1sZL t\` Wnhse[8](5&n)9 tkL5sjg^s M6PAvc9rıdl{dOɚJ^!@1m N6) B1 qBU^„֯eK 3V9N34TH~3%pq.E}DlIRGS`gYLe1x_|6Gh ŐڸdO_s_Հw`KTE{6qV\3ީ;o^k3@4iFd p [r$y޷R2+28z^6e$5SRBXR.rVl-w4;d+KW0l6my"o*/dLjrQ*y~А8 * 1,FC۳'%F9] p/ +7yl_ a)AᢺUÌZny ?󋗦m~ꅬKFގQޞ񙘨_ rC (vDBٲ'IJ;RƧSƤmCŲja~W;ΠfZM'nt۰˖gON֠!sds'3&a򱈺{L5nSàdu0;LSGG'>)?Y3:X3)qpET?n[E2mȦ*g(wjHg'of.j5 J[ vM%A=gU.:>Bߝ|&`]>;rPSudG*XFd / endstream endobj 93 0 obj << /Length1 1647 /Length2 9430 /Length3 0 /Length 10508 /Filter /FlateDecode >> stream xڍT-Ip?%;꿶le Pr=ffg'Yo*߂$pS6`kϪu>o@ skA`'JCϛ 1V3 ;#3vdX?w ):?.Q{^0Yc>w[ߋ :8PqUMtHd42Y8J̵}KX$~2['P,q>b1vJ2Yf"O Ρſ[:9M( ei8wN7X( ΆْhmD9h󂃔D(ÛqBBr[NY{5^:]FIVEåY&1SpJe4C e|@j$`LG1`{8N>ĦBg aU6>fkYӝ(|2J0sr#O2 rpMB׾k+2ur&>c8r"^$|g<Nm]YCHEA3롕`+VLOxʷIOT_/«CQS2 6|0@w=S{N{wK"}J:1\&@rxOBW+xViDUI!߹3ݽAHW[~D ߐsrv~Rf鐨.;&ӝd8=>z_t̔Ȏ/ )+:+ɨ/*:?x4oHxNN;U=i|{%׵n7/Ok:< bf+QƋP(;OLjjg vxQL>c1<ɛ|nle1x|55eXߓ* &6VqL~a NLE7%7m"Ң>U.59g*B_EJ #9YKz ~oi(||/=5Īrv72jaYiP$lhyβhw8- rj&Ď}i*C T3Zs#TIp*kNn6M3^\6>H@x{luS4e*5fq06]g:JC W-Mm]$ЋF~jЌ7Ψ:Y;!!9۬*Ieqi*~|HiL~0ACuHGLK4*Ysg]-,OD`44үS $C\Dߕ M=Y_/'i\,Ѧpͯ "m3:)t:hY1C{w:`A'WY-JmQ,}*YnqyY-`(=L2;+()+c`C7o߻:X O $цn Z yvl.1ΏO$( u`ikLkD"[[v[Xabd=`Z( J$hw5l2sfPLJi@o=Qr`%9qC;չZ3ڰ\w,A f}tpy1k?s }ShKr6hYDWU%ru:2%J/2=@]Pq%g'"~Y86 o36>ݞaBoև׌j8~/6c ԅiay$r&MNtFQP-?R|g>ui[R˸HF98J%% L҇2}֟0Bz LcVukx`z9q0h{_)ٽzhp!)5t'O`{q΄+mUTU7'i+{dj<_wߪ,|ϕ[=fb"t`zvO3)?)7\x>=,Za'r6I,)yCLK`lfS!ܸɴ!3dOȫc Dbc3Ӗ-!On3.2cOdK,=DAFkCZZ Q/H"gq`䬕vMǂ2~;;(?7XeI`Z5C+U~R*-4L1Yv8xv>y^$˾/} I+7i%[TwAUy~e﷾zj]2w[ˍ¯X>bm_LXe:yӢ/ȿ޸Nfȏhg kFzV龥=1ٍ4ĘҚlaX,@ȟBW,yWxkNTM#6ew[pڵČ{N$:E? ͆+- J\ - $/8JbsXITNrnAaG:Um{;HY*\dYHHMai`/8EGa14J~K˟R|C Y@x!w $!B m'8wwV1kc;ʍ-:fFj wr=|yN{F5Rh]a|{#'qq U/ï`*밙y>%i>JT> uQ/]1Ye8f5h/ \=l`j?߾#Yܢ|RS>PЋQȤ{grȼ,͸0ͷ(aLGSصfEgfߒH.KQ7+~cvtKP D8F m(Fإv;;'Ԩ3G;"՜EU?3 ? XKHefgPqY`N}z=H>~N/)7,t?&k00W"Z{rmGuL.O’%],163>-Hajλ&rQ :Je^7ː:QgAaJr1RO3/"~r rnqEֲ`@d0=yqRBCq\C+!$.ȡ3}!0T_-]GV9&wsB{f".lJ A?6 1OfU^ vgǩ͙ؓy?z/b̗HHegjdu?34MPɺjlUhK Y L<Kh1e+'/,fc8QLgBMh[ۈ~c$?MC0=YV0NjKQDWęj.*-![9E{rN,%uaX2ơ%&NjD!tyޱTnA3fMSQCKd_[R_B J[#nR"+OQDwq#JDɬ͍~LqJ'->ݽ#IJX0wԿ&1K~1UFCrUuPf|<6m" (5 z0PŲRb>"n+{MfY-#E4es7*{uL1'1;rp7 jVԅxy;c'3N_qQe| &]hH*"ߨ#W{X*D [ܑO:ثXSձQ#ߖ]JŋmyB[=R(J|eu@M 6Q/I ibpO;VSvm\*8 PFcW/_F ܻ.OZI|n{(^= H 1r킊;0oAJg}n7B0OU_<Ff Ot)Y#hE\DgRK'?vƢ]+q[SYf`^+LUf69pվ4Kq-#GfMvogzb# /b1[#Vm#z5CA}ŧBD^_۵BʂiuJbgz幜ªJ۳3y e WT19ۊO2e_6ȗ&,f5 9pR j%eg!0!_~'/၈6;>ŌjnwރZw^"6'UQ 9t1i%IìӠ>w- R) Ձ< ڸ)J}zq\騵k}"W ˟HW%s[]=EQyE9YgG>e, O}z&/-ȷY%˭ Z6Jm$ҩkէ*T0{ͫ7`^~w\QHz~fq$@7m-ǪWz䡿*qcVr>(vhZ/rd>S{Z"yJNi/YMolmTt!w!TV$S`94(1T{|EzDOZk:1qamn8u]sdno%m"fֽ ?a."5m5LWguzO2ENuQvl%+m+GM:Gê<%Kx[ dqv-hWv !5s  s 7.':xO?N=QYj̷yhDk˖Yߵ4Mswذ+r(cYD9dO{&;e LDԡ.)PI>cdyEI05ni66 [ӱgHI+YuҐ8rk3x^N>c7!0iD=_Z6f[ٴxXgDVA)uMz?4/*s0$ѿx@}y{ٵUYCljQ%٥8W,> xYvSG1| [4n)--29]b>>2eJA[?݋YLφ q|GhBnb2EM^lUz)嬡0bA_>b:"IC0*v&Ϻ+:B׌o^ܼ Ƞ]ӵVʦ7u{pb2alTQK PtP}3.>bN5mQoH*RA-WS/5+47*Bf¤8zN^=Zke,Rq0/O$K\&?NytE-<|ARUŦۃM-u5b ~BIr6^Z󬂖]2bDm[bEEӵjZLmIgkgj#@+]plu_ڏHxbͫ6֯~v "i6|g2k!0?Br4ѝNLec4ȏ^ ,`yJ;9nƨxhakuaJ2͞ۋ@~UԨ 1az%]ğ,U:yZ),` ']X%oDG^tSM-{[kS붪ٷ 41Wfn6g?P*Dm[d&y&C޸<&Qb$SmWSTz [x֟g8yFt{H/OlJ=6>gKw/ȾEzCۛN_3E`2?C=]jFu skrugy/5ct΢ϼ@Le]y;M JpVs3F8(Ò/ "9lt&:pby&3̽О"Q_ ۨ`䑊- GF&ϔh{ؗTKT-)@i~⎻wA*-J=ʸ^2,FVvA| k8ݓ= H^[iZ.ٜT֞ 2K-O]3h'sEVC{fH outq NYןrPZG@s\dIm.EmLXa4+Nެ,l8uNȴ86ZRJ4aEr +Fs=`/k uw`\jB󘬍M:d+H/v1yE 2MEEu͝T )iYWMz3<_{s 9I$Z" 'tXʼnե{DdSCr^h 9{3GWY8"؀$߭+!BO7(֫Ad_?#%ଏ~Դ}nXI3$PoXэ,%`8*! .-Ұm5Oz)$V輱M=)6aj82Gfzұ(_]dWXD.o@/Vw3J6aB:{ w}cǍ׵COp??-[%*L^8--*b Հo? gVe'Q~E]1b#\}5#ȱB6t[aKtpƮIy~ܷ@V@vt0%0n4]Ef1;oTmpB_y£n&R"%㋹Rk˙T=Aϐ$"*P˃>(>B㮋o4$>@ގmmS3p=²ﳹQ|ZeǝY9taYv߿>v0Wb+8pڲ) 3}Qy'HzʅY=oqETRꨠGU˾`uipV׵_-5 siVZ.Q1@"5Z,8/8<)GOuϔ=҅RCNjsLښu/r4)}W68hzϒi5 8XqՖjSa Vpi["a.Aj ϭ-%G#d9NAڅhJ#,9`%s9rOT3&qTUBBPe >v(_L0Wn3O!ME/Ƚa;P:܋Й-"BAQ>q~k׳ x/6u3scU endstream endobj 95 0 obj << /Length1 2630 /Length2 21966 /Length3 0 /Length 23456 /Filter /FlateDecode >> stream xڌt] Ƕm۶s6145fcvi̻v?ƽ#c$y3$j "f&@I{WFf^* 3B1&1g+H&n SpȺX,,\Vff:8čݭ Y{ +(Ԧ4."v@g+Sc{%`jt5#/ = t: P4S#@3Z]@nf@g(8@MFXzz`ad"`ne (I3z24uq[  )0\L]]]l*/P%.'n 4݋;x[ٛU#PF?& o:Lѫ{9V%U02 n@??F,,3+SW 7;H 4l e =eґTDE<> Vf_Kz7WO67c,o.EԿ\ob[j?jc;+[t 3ZVhff2ƠC_\$)Ϻձ=jN9h9EkK-E9_Y3Tz-g z?#[Y3vua76 ws[ns/+<3uo9dmnz/M#~Z%BB,k_]!2Xh+ơ>A,;:нcg~ ߷m=0߂9L:\\YIeQeHtۈR63]lU0y'p,]H-V GyY?0iVjs8b?l 5;ܹUA#Bt8v[+$wՀ.4)(^xSuQw8T-ugrq e~#pe%^aO7MJ`HhdMɼzgwIFw}l+J|i $6#_#74=V43$=Gɍ-RRX|6KwsPڇᖘ>IF[߃ustS@3) ݶޅEk%Pnd=GG~;yXsFĊ¤p'!L{?X4D]?0'vk9x?>L PUvNc{lol;n _d,GQD$a6- yqul%KCp9Ԯ<(gkKy~ Q%{iyT|_@Iew7Æj("U8i'ܤ5V[XifB Mh~ ۗd~ӛeA,K)B&*ϴ_sƁY.-RyeW3څHMֺ^&. ,,Gu!OC W9_DC̅/Z蛯 ^?8~33v&Vb9c$EDk8%կ iW=-a[GV )%JwI6jGwQrӌS&3Yޡx!5yUk;A3kjdu} ~ecse|H>Pn!P'78aM8րW"1q t&a|>c*l8|Ky(UJJ[V_OzB-rI%$LRkRZTugTƬ4ϧ̏m<ʳY\2VHt19w1ͰGN膃,8(] ӏE(wF,/vW C.#oJ$d~ޖ <\>NR_~XyP)VDw=,c6^{ojyLkej/+9Pdo<o#=-"]4xٲ"VY(2ɨ^jZVxǵ$]G'M#!+^':Da6AZKTQ5m/7e_|m՛C̩.A CxZ,gs_6v 1 ^7 +Ydq8_u#g%.2:|"Ƕocys-7&+Q ϝ+9d(H +ok쵢<y=8/y3ҥA*YL(T(rc[%iBAog=؟;kI,v"og.X=u6!iF\n.2L}HĈ|ޙ1j43G2q pQN5#gֻˠwhFDmQ}8ܗHg>1ULmX+]5v*>WbxpnB;p\ eX{=Ixma/59i GI)Y$M7$6u#=Cs}j=J-`ic^s,z޿ߖ# sϒ2vjʡxS(%& ,т[UPj{"}w`8Q YMh.Ak)=+S y6_Vl(SVk4?$3weLդ)SߠϠ`ܘYAzWxy^aex^@L*.|f2cL8-%*KA<2Wp#|Ԭc0Ha=>H"ݸ>+M42A ^*lhq^zՈʨJ6^sͬrȉ|s GC%c%H]GJn75r竔_n~Nt^I^whWwͥٷ╾ڷJ]eT <"4#Xv }!GqF|2ŦY8ŝ*`Ўj\mGml+ 'IfAZʍP*a Օ)zu+fla7J'qA?G}r Kr~p}s%)[>0mP?dEJE6ѭ*z^uL`h;ŬAD\ёhvZ [-w&ytJpyBʌ?NjT ݁z4\%Cn!_R.ekIE-1ѦCR;q~7Y؟y` z?nv/ UqBqX>`)k"x9Rz"hDvA~71{<}+yw~#5O{~Zаi{.(>(նB:e޿G0O) F=F)g.Bmzϟh^TFKMCVۿod;,h{Oi1n#6ޭ^2w:ãzsy#m;ĐVxRūt)'yCmf鯏HwES\'4Ҥ!ZK+EH|TX]_\lxd>\'eNCM5Y(у3riw̚z ;i(E8AR+nWe*bqsW'?_Y`^>o^#vp'[gִ,VCTIpcz 3ݚez C5koLֽ^>t2Ys#>>!9C%^wm_/Tʪ)-7SŶ5Q5:lޅ:C&eZp0ԵhCP,E^m"0w_Dd1E!0X9FmP^"3i׵ƫDʥpM͌I.MI+su&:5P+9!>$i'L_e>6I ʠYt!գOb8q {Q?N5_ʆ8**E%wJ/ZJfە$_E !V5Q-1A5ku#6cl&ELf?J= JŖ A)~lap`/.$ͦb0~ RG?*EC _… %|F;ZxZ`δis *Li= IKْ)LD|%ҸVNK^tʩ5@S)^vm[>Z1hQ%/UϬPby*QSq50vó2̻R.g! zӚTȝl:k]&1B@%Kq@T]W!p26eċ(a{êX \|uLrvGaTLv#F%|TuW$BW,*q'&+ /vo>^9K9xѾ>Se?#ۈB1$ ؓ">tWWS|2(p29iBYKg)dw2^/CÍ(7dZU>(1Vy50s nkؘ]6_~0d(9E%^IyQ,{ k\P4d4 򨙪|z{WsOCNSEu6`;*VP6"r*VVYC.҉ӇM KMtyL$8*9e6(ғR6-`IS ~CjCtR=3Lԍ5Wv7F+Œ`1}QW -B+vy2x 恭Kg`֒Rg'\F{+Y72HcvjH0bI䋑{gqÒPUPh˺;-#՟ZKYhe I%-NP.+ǹ/Fuc PF[콢)^6|ã.X Pp$q2_th7IÇGByta bJiʍpҶM=8[|,48?jv OېҝyuOEim!!ȄObh1޻BRQ<[Y#@?7I1S޿icI OpG̹~Q஢ < rbL&IŮ %vC.[3NjbR;9SX.0'ȅ~^b|jheDA9ar@F@S NȽNtS`,*άKF[ېҖ;晢!ir,e_OLq~ [S͑[Z.d30 yb@nTg͗R7| ǡLU:FPe{4_uE! og-dY$e2$ NG-"FU-l-[ EZsɲZNXފFa=xmg.^L3-"%m @Rڙk"\P03P*PQqXlN]wA֬W(ُCAB_PuGˤL],*,|=щDQ#-:`=HDi*B{r j љ'xY0 nnNǓqQ'K >2j,T| +95>l*8&ݑ~~0>- )stH;-le,CnM(SgmҜ<6S5gt5љiYyR.]IuU4[뾶P:eqsOeF<B/lZB¥KC#%NEE8D/;=0Ip7- hR3^c$n R0_9<“%{hyojGbX.CO{<chqVKY͚R,˩癐Vp4irqpT.-T2oۑ}~SDVٓciZ;v < %^ņ)= vmw $ kVJWjӆ$,T۝)?׹l @"w MV[Z} `840p5la$uiUi% el)p61f \ުIe[״3o6pχW4=ꯪK97niRd~ 3"18bN2 f EvF*9H 5NXX"i(ݓ}b=R~gykQ;b]9L̗z!ܰGJ<c80÷P~eG^kTW]Rn$8'/\K:ϕ˫>I9!#ۤ.l6Kz&މ F&5T-PhbkTlvvLIDfagOls}Gc\ E[ŲxAGmņB ְ6 'c:7 Qbmx*0{hxRLE鿌i~ \!cbw^0g+xd[/"9T}8CUO7Ŝk Hdz+K<柖 _<Z lfT%NL9-`Jdیj $* A-l)2v~쐜ϷwW6Ӛo{6$~XOs,L#kr*f}]r??T/oQB5 ʹ>a$2հE wYCJ&ފ.%3 L\Ak LX=`uxl&xoT*b=7<]=27  %hcC=ʥ$W=Viw gƇ4 "۹GΌUz5U㑚&/OT$ nYܓ_UXtgK}.3IS o['G~<E yN:LvE䥺Xt9˧bTSZKȑNb()mU[v噠phmCr%x>{Z0)+;Og]0dq!nOڦ S w|죔--.jvuՋPz+ v"cxf;T=k<^V )0FfSk)\(I}7jX2z/a׼8r"rZf[3qKԟror~_SRӍ r){2sc,JHMeN'MLJ_)%E2_0Zr0#!rS,U㫸\q|3 nBJ$TɐvҧJX pH-IfE@~%@c.ϼ3A" 7 s';/صَ]IZOUڽ F1Ƨ"mi_ >4Hލ헒Z1=~S8V>?zVrXTQ#MD64 7ir74'(.9i@7\xtݼZl+uz ZBDY9":?+,u{'n)zD<ޟUN~)u,8Hk@;(dli_Bde7i iuegzVOgK|ue @°9x+Gv>y#r¤Iy$Xad#B ]#G=S=!6%"b[4z8 0Es C 헎?K\F&Uғ^l*Ta}zs"./9Y_E>Th]*vB 5%!˨h}uDVx?Meˎ~{D%j>>fY=s~}e Rp=ޒQeټޑ ?eteL:|ax0Yy6yWNex >Ԯ1KMF<Έ\##V'pJɀ,^ev}~6/, +RAWKp7 }s0WֳE%|dE4 'K#|A/'Q4)m?cEQ*ҖNK<*-Z7;ȾUNX1,_&)x aʰNm0Ozmdž֘TTRui;@[3YDD 9U 6k5۟!6d)fG)Fc$zyP\!BO-uy4=.aC"TXS"9u#ua](Nj+ht5>f]>#Fm?Eu~58Gv!:duJDyN?!Zz Kk}L&f)*&5C[*jKYq:wzvYsT9ՓdƐd d+Ol1`ܯ^Du<]=Sy%ԋ[&4IO SaObo^s.:e9gX;3|+ :Y_(2DmUJ۲ò<7$^m^ȣ#mW{l%kgɞ1`\("^P!4F˷ce0WCS\~"0Nm I-%Eq C^lGܩ%JP3~ĸMBU5=xF,PB絞R}G,5*Qca/vxzxb_8Ln(ne?[pgHs[Ď Gi-M]''$Gm`tzM%v磻?iMmD| 'Ucx>jP:0lU0Rncp}'Oe?g .h ]8kt4:09}4"LarB`w1Cf@a^z"` %`TjX#nPj&QLnÏ5}f, Bjako}v?>yLGk3d;M #I!}&Ӏyv/c[d.ou9Ta7UQ[u+~$>^VCCsHҧ־WfTӀad)#@HALl`W 鰍erDjMkْ }GACf $$C*!vaE[}RQpG'3wȴ+e5{py]*z#F+$b[U-4ECB1-FwckuL)wyb>`([3k-N^%J\Ǖ 1p3:C&u|+3tKnaڷ)vE;:9nd nqDXĎڽ`*%MŊh-/u"O'tc&YuD CƦ6n7S:t (h2sIG*4y е 9z `w.k#{# }'6J)0K 4aCmoQT&lq:̬*CeG;j \*"6t18BWp>S0 IEQ*ڧmNUZ>')4&ݽ;V$y AM홬&`yuF ܖpÏ0URJ{+%ރoiXŎO$5wkndH飯൑CQsinWmy7x|snдmDҝOPؖҩNAGXikxa`5ZAs1l1PrЙT[*t ;"j^MZ1>Qh.i:,K~ylgDN|40g# m?VN@M("XM {T' 8g &&ևLǂ{14f>ԜiXNlޞn},VFqm!-Rx;8Lnˡ"eN{J۱(c 'my^jD=Bz9!QdeSF: 0Q+\z)k_1EJvD8p_cZhv AC7>0sd+ ,܊7E/@oq9SRrZ1O5߲p=oA ᡽,瓏̓[QRo݈1LaqjzM[Ë#i -MY37ȉwl"ҎR^҅g 7vnMf_![K?9f~'C*u0ʌzI(GѪDc4_Q|$ϕ D-l5k|z1":;#DWyrAKW͢YFWtҌ粦[ K ͒;)F4#a=W͋E\!4&'=uO&?[ECl8 Hrq9 DgLIb ]+2k<*Q,&OҲ:Yy-''W_C#VzLƞ!M?oQK-2oK豭iv4T ^~t,FbuETwp5URF,_uz)낥?? `gV2cPkW;t['KnH}N xcwDǭ0 ZWHY=S> u%ɘuQz0\BOO0G#)> 4A`O8L@6皣0]PN"3q2B4$dTTwc2kaVI]UME2Br|l bwʚqz:)d.$owݻP mmf =gm]v[m"Gg;fw] ͌1;?tehk_-y(0$׷ eb):R;gv+q7bW;LSo(?GE2Hfa60Ox3IjL2KKYa(ʲW,*c|[XP+tuS3Ά!W\NjY-K B1a_ BkvIXs-fLn); Ȁu#׶I2(MЯ%gl,Whd8Sn,꭬a[ kt;HA=NÕ^}t92a,%*pd rBus^nNKʸ*[uuܣZY=bY7zTwF[_WeْV HYTׯMoVrؘpɳGSh)Kg%om_vfImB3O#0:XT_вqGpz`V+[1[ fds0>N8姽*S,2uw}zvu dl>V ,Yk𲰙5[Be6L SE*ɻ vwֈG^@)/clIz/%+c3` 'ŵ0VùG L̍Q B{O~[|2bkF!_fnQŴP=8I=S_)7[l%ܤ.!OH)L#꡽e9ݽF> ,2P@a`۽Z(?RN|= κ k7M_k> ҫΆkN>$d3bp]{تև&hF&kSzıTU b?u tn~%$ق1Q8- 4&_G)eaƀ]].$ݬd^GZ=fb}i@D"eU9Mϙ/c/^:MLfKL{.(3LnsXDi@)GHAXSINiW)=ewPĂ[-^.%xnPe7`<1bCU5rp;RFC򿒲ZB]6Op\_E-GN~g(di&>wG%ِ!a435O&1Ƕpֈ1Ӏg.. ,F0Teǁr(jTvC5yj{iHn~N@ྪzj:D\2:d!*ӳ|Z6X]!:I$\vpء6z|ح (,RX^S*$雱Kt2ۨa*;2JR)U$g _cZQujr6Ӷ9y\lnY)[w  JǪ?>^9%_겶!D6'ʆ]lwRhN,x^r.q.0WSBg(E`Y `띃Y'˧ a|ΕjNBnL.ܾ769ṣ1ene;M _тKq&mv$Z53רY:_KL*3c%`^443=vCkJ=eنGO܅JpP fًv?qaȟ$f>%?,c0m~TW6iv ^qr^\}H=y6@齒1@_K+t(RBⅅlUY5O, *xA[9-X Z$fOK/XDVWʞ8H|a ab?/B=I5|cx Sq{nr =~a kQxx `f}۳q8lx$%LRalȕq,ڒo6kE^!$ k˽?~. "2ۺGFA2'y{ouFW0Rz`eI?JTjϦ6'9^UC)g5OZhq`Xpe\IF=C#j)q,*vf筒y0Z?fįu_.A/Ftmwp' <h9ơ0 \^gnդѐsKI(P_xBOF{OckÌMT|ZOs"[ZfV3,:&,wUz#a#3ɝD܍oG!dwwZuFZJO;N!NCVRE0S|8@ȍxhOVgŬ>(=a$jC 5H!'͸V_2ml];'=8pUẉ /47nȴ&ު|z׬֝VZFyf_2TgKSj;SZpm.TuP])eEǨEŽ{ӹFaՌd UϓH}S3%ZЎհBf  \%,q7kFTP^OibgkXjlvVaܭ SWR;اŽzn(zt>Qu)m_Xed@ ` KM&Q7h0_KZ擥L=R=(.peV1[Je!3ffz#~<8D3{) )I\SQN;(4*eܗr[ަޏ1Y,uBjIO~?.>NF=c)ݑYeAFt3(ށթAbSjq !<^2fD`93 `G *}> C#1oy1~ua2S@ݍWπe:sG :8H|ogLo폺V5ƫ<~gMIJRUAc#ҤX~e+Eޣn(eOM?pWX\-,yEnd/F]RgH ڥd eVrA\?mL4桤|-`i3†I&Bͽ$`̼ o'𧅇%;S3~A%gng{0 ȫh7Yz樟[e)#+QF+\L-E-y #UQԖvV\醄#y4J*,F>=>Gfz UlJơJXqD.ꯢtzDDz'G7WC>3#' }Ib5~9`t涺P5z *$OFƔ+#AsW ]Qayڮ0XNaތ9=2`{[t(Z4֭*ĬQp"k_|!s$K 81y&7n\]c\fK'ϤEjY f+YC}7e-YP8,jOO(S0; k"Gz'vMѥ< (|УZ#+^ҿ  :Q!l8\@e~ 1T=TZyvf鑕S({}Go 2U{Kveo jYQHyy,3/Xļ y"W!|`# p X7Rf0{k?T! wr4t5g8*L(ϓH#YwClxl˵O͵IZH[Q.$HMU(.]txJRM~c%e?Wxw6}_R= F,rHPJq "N-~k~n]U eUɃg5@nk0gC~g;̌!#[+4r2xo9&s o u }O &O+3j\怆GΕc Lj9ypA@O\<>WksN(_6>h:pmˎ-o aa0BfD c̹s xHyPB"z̶mmNyAc\Q ?8EJ9m L|y,]hFhxRvf>0kGm?kt >]^m8aГķ's}bVVɯ*&AӅ,S (ۯ@/&'sL1ۀtRÚy#ܮ&ݲͿrLt3Jt툷"ܹrCbˠb;k_֕9FD|>,6WAUcD.ܚvٕ1/:{lo2/iO9"tJaiD G=rh[bWNȃY4h!v]`rD%\e0q1mlYpn \k]7oY[K¼)KY~[{RulQ}\Y >g0#bjr$ս݈v NL2xQft'&_8tx<ʒtw(+Ƣ Y>&5P!M*'<$)/5tRr}ڒ-+&;2BXuy@bvb9XKG]^ fXxLZ"Bh;JQ::]zZAsyؾg%2!QA|8bhBr{&gV CME}n%sly:>JQAz;j(rN8b2FJN$qXtaloBU@X]ʢƢ{ڭxrYʫr vܦK3/~7&! HiY.PL(HWrl=d{!v:m!Ƞϛ0Z"A _jyu=h''ݦ~vM4 %Ƨ֯QE@J[UbOOz 轥;se0"-CqDy endstream endobj 97 0 obj << /Length1 1540 /Length2 8006 /Length3 0 /Length 9027 /Filter /FlateDecode >> stream xڍT.LGz"A{ BoҫD#ң ҫs_뽕|3fe7U#l ;Pc @A|VV#; t" (!! ;24=`!$%ED % O(D!nJ$̿8l9b< $ wmA0! q.^^^| g7>^uw@ HOa.Wg|#_vC `P[. w=/_߳ ;ѿAAg Aa6;&`nx' PUx 5w{nHEi+!!pw7S"!wcf/ no z@4ܙcD@0 x:Nom k iO?;yp_P\STDxx" qqYAпOOwSׁ=w߹tw8@ݗ w@07 r|&iN:-/@Pj@nnPoXnX^2GA*^ |wetr) r8]Rn0AQ$("[E0|p]஽Fŀ~ߦ?H\o$ 77S?k(awewwww=yݔ;7~a+Xq^ŋ(3Ŋ2MGvz\pVg ORߓ.mp/0imlK~~,`Վ?z`B}?#}^#\M0[ѻ4Y]=ĉ )νԼG#fPVj\O> .f-LǝOo)[&Dn8b?UϾ_ u=3eCpfUo{Gߠ,7.U&{ь6AiMRyU,j%Sk0wxxD;uŗc"Y瘉3bQz9/) i g(/T=jz7mVq"o ~^9Wpz_n$ Y8DӜ_A~0T?m}{D|V$t{2 ÖfD'd;Mlt6,a>iδΏ)$D4p A(vlLf /۩DrI% }7uV8 'ԙ"|wՄ=E_|DI< 3e.dD]q1|:Qr3%NHwz[/;]̍W^iч28W~ ˫-yg-lR!쩼Yeu) \E֘ 0iՃ WH1̿Z 7KlOk,VjbC)f[v)֖_|7W{DZ)".M%N:db[ ί4~{|8s֡i2Bm"\-f|[z3ƢѺ lyz?8Ѿܑ4Ŵ1G3z`Ƞt4_ Vty1a[4I;dƘs']Nnp{xDɽ%S"SfL jJh,{*|2\^`>Or r?0|6bRYY,4JȷM@nko7x m)%V86sqR iEUN̠fyTq-ƆaR1\iCu ?Y0UbS̙C֨sܩf6#扼<㣩5=cqc/5!{Ơp1Nl7F*0xģ[t=]i+}vAzI<ČN9<@&gM#|跩xհpK|C&>q"ѡGO@kԩ_I/K]yKNoʻǹEʮ 'hTp<0;L* PZ Bg-&jCʝyZ K<~&JuĞJIhډˈ2DT`עCrWAYM¥P}h|HŭAw"ֹS,al]l UV_x:qWTRi)|ʯPQh.W 7ߩ#<!ᣜ`j+>^M*mٚT~iT%GD#fF5E([ݬ>Y\Hk0ǎ5|F)h'[ld<5DDC+ʋ ޑV$T@v?ηq 6UZPd۵z V%yS/}p5[$,i!E {ï̝诲2q6%V+)zl\ F[ 8@u}f+x̖վK|MAeT"{h "ϐJWjo%![c/o߻R~^?=Gā t.mb#x#ݱ,Y`lSҴJT0 KZc#K/0.vgt\2vIG9Zt>w,_Hs)tUn̊ yD};)J@3Ք\N%>~ JV;;gTs7gdlM^Uy~QRqbBzLSy"p7 PqEaiޫNy+ e[ٶ|#J]|7I,yAj\KZXr5jng>0ίL<)h=הHz'WuiaT~BmŚqr:ƟG7-.44@1%GpMrD-1sm几c{ه%9b5r pqFEc"ӉC ʐl92Q ](^wXod5.3]Tac7K)Dqڒb.TPRHn||u8icҝr,dKJKErHZ7NPvY[+j*WsGg~DLPO: dR}oڣON}-V酱qƵވRslX "&w0kg=v2̮oErdvB 1b{‚j# EQryX!xPuYi,ZI/U_JN(,bO~ R[@;z+U!FPC/uKr-prdd:44[AHN4π4O}m;nwXj9!3W7є"5VH)9z$ug̡oWβ"\d" ed9>4xvNg6lhlTqV`%m 2UŅ!K8J1)|C, T ϧa4x Tgiv Ggށ/w&~{x9GnuWjl#0}kX(o}*$4?g$t3{FW`_rze $5X44?qti[d4Źqڟ=wv,U22HAD$ab.`E::YsilJ y]Q/Vڥ,An9Ee׻( ȃU[ռtOcCWQ}g(/.!/Tld<(r _P@ӲY&&6hav N3ykLMQƛ6nˎL)پrb\| Ɍ.y4R+YFb'־}KAK[ضlБ*#` bi(ȹȢh~ޏ_x7Q;oY${Л GJr\Sdk¦. 16N(F3b#]3 Azt嵏BSm־O\6Z2VI~չ~tQnQ ;@tLgTHv[zf¸b] f0e3&\56:J"T4dv|jh-ު7$Oyj@U2F3}(~r iȿojcMe2 }SEM_=tV\s&՜9~'_ξc4`<&_&?AW~ttZ ۔i+ӯxȪ_24,Kߨf KȉlyKb[O [G!qӬO q<\&_/u=C2Iu?6/afC BKhɺzLF]cBޙwmɊat.8=Ju![K)?_Z696ܫF,xNN Y(Vu_ |'dȢS9${G(ꃥ7&yIz Ks?)~a񄩥 [F^kؔWc%e'&:HQ<#2Ǹ *}^[e+5!{w25P`TiC\ N,B rVXΛz57^cȀI- YxY FEUJ99@fLC_!s?hKJ3)pT:fKO2r)nc7+m;!az/9d9t3E,(Ec|ͬ+ m!{)|2kSIGb]BR z11&I:hgRTlol+$z Wvm uVIV]${' 1?eJmE+^S6Yt14k -,[D69 ,0hGF&9d* g{5Mbr3Fl X)Q]?$Rł 0.c8.>SqGDBic'}Zp>׼nqXaۍ,bX`, g,okPNy*c}eGBtb@&͔dBGfeu}4&tto5==t[3Fei2 ѿJ65mʳ{o98tYf$F6j%D2Ή[3 x1UKU؅6[tlJ-E=q2/HO\-!Y̩#bV0Pr :}yp|$S]pcPȾOf:Itvܢ\s_YvOj?ňEfh-Jb]Z^D n; %4F--Q,W!Y+e]i| >Oԍg&q)p]4c~o%t]fM0%[Lq+FAu;r,j+ !HUaPӠpz23 L =ZÓhdDxҭO_nv 9\~!Q9~3DYʯ^Į;SDbN4"mAޣ'we˰ڕ\*zeoj uK&Q桲vom!uQ2&̥C@IxŦ*b Ҷ\;ަ½]TXۻ6, ]#3Sp$̓o4'G{;s4X%̭].cmOlq{[9~qk3e 1]Y. I?n7q!間-1ؚTB6ƽrs.GM37*KSPp̍@y#_tJN=En!/6|eCиZū30, #-b/Wg{nQgA}3)`IU%eNSZ<͢o|,IxsҬbpu]q;U;Bk-Ag}Ҟ3O,ƏJLMMW2cHԪ8%)Ǭ11֖dowe0sj*R?Y* ~X$zwF [R1vNx'JM7)w:kx{+, 8x`_Xx"na׉^\@ג!^$Ә FjQဟ^i̚Vk^mJ74\}δ5ɕt+,ߧOv*!{>] :C FPmiYiJŠQ=G_P̃4AI.'F1=m͵7|@ m۠U68?M^mjz݄v@!HrS"7k76oWvvĭS[P Ed|HON8+z=eOuKc<TP8K _H.ȫD^wnOW]6v6\ɼ % Nq|SK;GthͽҘL Ey4Q^2Uc"rƥb&Ş/_'?=aar>Pӊ'#+VG+Gv]6 ͔O{ (8&3ϺV)p{XjR endstream endobj 99 0 obj << /Length1 1600 /Length2 8793 /Length3 0 /Length 9833 /Filter /FlateDecode >> stream xڍTk6tw"ݝCww0 ]R%- ]""zk}ߚfkg4Y% !Rpppqppi@Qt@.`(D)ۓLN (;8|BB.B]`+2@ IA]6nOi`dp vH8\-)@j y+;'+F vh\A. +*掠:cChق]kB<]@'q}pX\OJU'/c Xp{ v6::C5P*y!V \O`s'ߕn v"0OSXIAA7W_I]@Ocfd!PO Մ6I /K[_ᵼ@O8AOM֠TWs`tXl?Aw{ 9 /"_W') rsXx9<~A߿Wy5 WOSO?߻w,iA8na.-[[Q;6x⬻O[_S]_; ;Vi$ 6#Y,m"_r_KԠ_ tOeits>1 8N)Z0.^>7*xy>Oha;xj` uAu<v_Hn[ `@n) OyOy!?Sd?Sd? ԟo!Z<]#i4wD]Z Ն_UKyf0,t`"2~ ^sHԋ%p.Du)5Y4Qcj uappD 9ウN=\˳.7jxW^u_Fww?)ULiX R 3š=͟xRHdF;.1Xz}=jR˵919 ɽ4>eocF rPLv|{.֣_x;Fv/K#z:CS>Yb\t^͹*Lf-1F9:W[_2U${i.t)rh_Sy*TZ&'JvnY)68aL`yNI)oَ˓XjjK?{g\9\ s{v +pk[sNd NDj+Y?vƆhQY|D6[eֲF$a!a+z` %֌M gη1_8I(@>QEZk*7ALa&csskpWa8G9GK^2)g~mĭ[T ٛo-,9\ v~5Co߳¶_|P;xui-ܘ ne4h$9'Zvr8KcU >;\fKL1c5(SagqDXYGDI"aOxl9cQz&b u u,_{^] I08 ÙwH#UeT)ċ=?!h]1\#?t@SSb%TB5 MMT*V.rK #I oG֮=+.\qis3O(?#x 뭰ڝtw\41}x^52 }0VE w)9Nq2کqM4GR<瞘9Y#LĢOmeZ![Gn?}gmXlyXrӕf۱zD4/ghG6/u*џk;a&ͧNB.'Ȕ/5(x*|H4}w Cts8Gõ2ߡ-N.kͅo_!e-x Рj-X=%e-#V!ᳺQvQXJdeX$m "~צZyŢtj滹C=j^y.1zZ$Wz\A:15K[i.Pp^g'ܖ|b :I-jE9,Xcahdt.V𑖞 Ѩ<s i|2Q]5+8 Y )׋3Kalr"$c$XQm  u^D/ڎ> n }Fj&}1:.GR\!Ɩfُ]He(#^ "P;RlO{ef1Ո)qFFk͹7w8mGEb+T̎gQZwEaV+"yq&+cDZ.[E5fH_Ws\ϑ=c{hwOoU%9xs;ɶ43U([UDn+Nx8t))CTQ-}ѰFԡi^sg{~a7= V7;QR5K)gL';9 T%+p8%0%=B`&ӛ&`x]v9k=Nv,Gf=-n8v xtIٓT*ع8JfgѪ16a&͸1qNRhWq&"w1/b!K\;nv?K5OƏjfV~)uGivV*f%0(SWŤ峕Vs;LDNׂoY{Tdx}ZiNIrYQKD66dRM^~3\Ϟ) aR *O=z%?02$J\?$uj, Js*ˁ4'ϔKYTbsmcGb095P7`j;'.6VNR g}-ڎ\e׉z2=ԓ3qY Mu3'٨W4x34`42G4颛LC0^ƸЭkeDZ N7/* m&)Pa)m_ಠFzn ƄT Iwͬ|̗GnO\S)W9pH*؉KrṘ מn? ͔{|юP >\&J~@fŞ&)#El^,E .\۠MtpB{.EZi@5h,)G%W~~^>rC녾N;|֭%iV2$/uI ?((CpC8`hP.EMm _zwm=q|e9*!(/DBf!hN' =@P)ݮ& stws9ך{UDo`: ~*LߴTۥ^1pN[[Be(pO U"'}g!_hv\ E3$Xu/K5yqZK_F8# [OŽ ɘ;A1;s}w4nMFLvPO[NncL[DIm ">Y&Ϻ K-J-ʲC2ӈ,y3$ı&O߶iQWI(ϗm,25eoydMk31wyXlFy_",Dд7eNRɑ=433}Ȍ_~ /z+v^YxgѝW"\QX-vp~&)D,^!R:d`9%_V|vO\.c/Oxpe$rKFHi3,?Ecv=˜:_+h&{E$)N:T١o=Nk!Boy%3KGUܡ3QAR1wb^R jbN5j M P0)tFP1 ݍg5.ya&\teQ!Jf}T\#"Mh}#\0&UO3T2H,ve8m6u(b1aYMsw;"Y &Z3 }v?'AK;9h0M)3Qcy_) n:IYz u˺$ofA/=|a4Ss;*yJ^)؇?wnfL|B<%"MzPlx`hF̭vDMGݺ@c^{ŝH%ۓ~n-lV (r o"k%Cnjm'h +c,lGw`(̹sgznN;m#ٶ%/gB gW#8 :KWo I!ჲ7LƊ⤉3[հ2QUIC~w?j51|R6p%ΨѲ XR>/Q.K 07.INSϙcnuF8BA+5| dAz`X3X+&>ͣO#V7̴2X)LP"E4K]&Ƥ/:yJ<$\̺OQ./P)?'C o# -b$)}fW%Džy.A^d;p [J _Mhk*6Dq WWʽJ/DըPm°?Jug._(k)f *.Cn|UӍQwn/ѽ .ei8ϒ۾ 4MUeʮ;C112e9 wub756{{{V^ o{aVgb"PY@}\Ƴ.x[y"}A:V7[#xT$QB6c\  ([]ߜ0[#g7WWW= rČ<|>"jR=!H6"zumOa4@e-tVa|^95<*2BD2MC :|@ % 2o74E:l!1<aAV[HS1*SĽ,ᗿZCn\)'.?Ϗ}f5@}=t0J"cqgQyq1SBA\"X WnOt3F;UWKGLDk 9"wy;W cqUN? Y|ON&X5 #Թi%E{l 1R!@4,GP!1")7MNmMZG}u<}TfkZ[n+)(L-cmpN:Ϭ}4eyM|ıQXA #c+n`wVd즼ԑyD;͓Y߄E Q:ciFh-o2_&CIJ\1x8T½ܹ TmqeF1ցD9G[M:J=%<<ϐRɝB \p t Vp6e:,0g'pv>*ed:Oثr/z-p|ɷ.GJWeDWML^?v?m%_+_`eI#|A/aQBWrX)8-ԑ,fk#M R|zDL;xŤkQzڷ&&G yk&<ɒo,kb5ozyU8k6λ^B;`Lew bʞ*_o&ȝUx lJ6t閔 uiD!b(!*eVi(pr.^np%5zdyJ`\:_n[X[%q%X&w\O"6Bb IVKj~c"9;b6w ֿ'wȻ`6'O& #/?y Tyh*25q{#D@χ?=eh ӑ+M$A%ֺQ>bf}Cҷ9~w*b:$5QEbZm0L# ìۡޗ],{UJzÆt1[KIњf3N* 8}!f鈽saNxwY5#*]E"E\KY.Q!D/~=+,b,[u"4J0/>(.%:ɨXX0NZTȋ);8HQU0zmŚ589, 7X="|$So&lyiUzLg}4?{OpJ#C؏8JrfR0gǼ T|R!fCPz ƄM2VLtPo,#a6ukFU.s=SߵGUonY._GޯdiQɈ_+nBe.);~i< hay~ [Δ5*@}oTB>2ěVGdbì(r['f;&u8dDbC4>^J6(B_f Tg'bىT4(m$5/MMb͢=M RJ)EIcDz"q9eWN 4l4C}̉jpN]gOȐxm*v^b{RN6r(.Uoa?>q!?}ᙺn;+NY+xwjٍs-~w7nzx_cN~}Y~[[~"sJ@D.ihixS;#։K]»mՀW̎ UAnFX}?4yf6FE Ɗi69עiь}e|Pkr/|ŬLdһKi7h|eL=O=6W&+cPo(jIsa"OB.뮜wrV:Ԑ=V?%}×"YN T <(t%{y`wĜ#CnDN25A@WHR-Ix\(̃ۚImL_o)^ >L[[ 86#T6 XQ(Ig`U"Ɨ<`4GG31ݎ'#23aC'"y3M`p^3}Ev&!(дC>Cp*q3r0q ]Mm "0Y@M8C7k0j1ij>OelZjAWЋߤS׼rJ>FBplT1ZJ{ҿ&m endstream endobj 101 0 obj << /Length1 1390 /Length2 6232 /Length3 0 /Length 7184 /Filter /FlateDecode >> stream xڍw4l߷hmĈ=bo޴FR$DػvQ.U#Vժ]5kתaVT{?w\=:'@v#S!GTG j&RH\#`(7-9!rˮQ8:sG:nQqd@>0G0@z$#Pq"a0F@q!`7)0JByȉ ݽHg%>A/ 0zA>PGq`wɁ3) FB8 {P$W`08q @`8w8ܠCM=a%9ݼxv9n T1q5 @y {~M(+ npG5;"՟: ඎ}p/ wt59 V"G E$A , !."a<Ը='@CPHoh6["8 ('';N u#n CA8@>lqrD0\s5-S#mRUEBb $ **+ ?p'@O-an/bC,m@ KCoGan8zpGoWKCamFqP;D& u4 .Go`n08DAXq=^8<6AqwI 8]bR0 Ɛ'IEq4t# " Gp!x'}JDp/oWG[A F"q \[ EC!S|ăڈ*7|V'+Ogާi|UaK*i]5x?o6Ց>l~lg]kQƞMoo2S^ 8 u%lo{zPB|[6.jjxJJl\(<&=!g%t ? ڼK6dbeēI 31f.f+[GƸUuO(^B˘dl*b`}n/3!v\Ry%7&/Aإt-QsU;7Vꆅ64(KPZ +nro~Q~47F%dira5mޏxB`d5R)sc[WɥD=$:?*D> ͚a~,`\Ag?9˷y(_vL\e8}p'{NX|`6/43.yr>85+]qu\I:Z);i1z >)ÝnIХfȼi9mKcDm^'3oM#@ibIݘKxàE2pbxTրDxG$Ɂ I@O[]^nzQ,C͆ڄE &jkBNGZv2I_77\>{ ,?f6ʮb[>٩nȧ|$BqMџPQ<4z$jእr)_ YgٝgnS LJOηމN5va)ɔ Z+}܇vez__Zzu~fOQ'O赽yQ6v/VD$)837D\FXoqY2]HliwG*_|RgsJPzsL>QIӷ&Idq$A|4$ >W43l^Yo粌낰W^sM%a\o¼\FKD6)_XLTT]OoTv!n:W5 S Xq<%=?.E^՞a㺭 &33٧v2ۨ_UAwdh~у?@a`okO޿!UKZp)}-ܵ즚Fv䩦mh&p$"AkFŪ.!'dLeHiF nMl1='IG0^i<10T]*zOEOTE@jUK\{Cv7g]_6%Yzj:/-Szɮ/fh@l rJ&7~T:!-xf6y(#^;\HJibr@^ R-4(2bѹws)K0kITQS^jSs5dT j '8VH, лLŲ' T\`nZùoeLHX$bg~XcUExB/Tl{W:LY8!Rh#۴߼L:30ɘdOی eNrQ]d}[u70ާdUvv(ӝJUK+K=ge.BQ cEFr ηdkI[lEGTA~{>9 y{OZǸF!QD7zK5ed&=zD`yj$IRrE8vM\+l_yJk@Zo|kr0+==+9UaW4TlvZ~q[D oSI$@gEʷXaJs3n;zKh=yo衵UTXjɗȶL?dBU5_2i%JwwZܛOy0~DIђxhmυ]^fty:p 9]o>PmyqT֠;dsc]CrH>J_fP\O0߇[1&P*ýdP4w݈Ǭ^&ukr>O =٣~# H2k{f  ;0.Lx}x7mf"|+svv=ӏ:M*2^QGmS ]@yF7GNIpήeQU㲯w0-b+?GD/OU9n_(:]/Z~\{K[." 7oHIޥl^Mi;DRL}S g}yONY%)M!ܼ;e'@e>94y{_DmDyPB1)zK?LY VG_ֳ-+gO D"-V~ެFvWͧi <"&4jt"4V(źMW>!PQ W9&\אIG96Pӏ|'p\J$}ǹ1p^z N/By BYauNO))0IAJ\5{H댑t3ӿªu8Z|(G^CqOf͜ IԕenpGn« eJV?3lR>z4yS'#sHt_yk<׏f:f&YQm 09V>V,Ff#!prkѨ goZi5D3Iv~+OL+JspOm =/9DŽOe.<l֊1[|aLzHK~\-`Wcjb.ΐlU\ 4ddl DaBGKy3jV4&(]YV)hG?({ެv÷iBcZi[Z:2ͽ #eLJH-E~{Ȋv dO*)kG;il.)FץiJ0W`Yd.qY{V-∫g\FE{scNE,̉ ~}ĥSݶj_Mu`t1Rsu&BB?|l}bjJqP{֡_-]Z& !0it' C-'j)c3CZW  p6|]I.RP!Vèmz{eUCzNpp3z'K+F.Y?Xz f|*3E-P6yrۊoѿ >"a;R6C_ʿ]ˌm$<>WsCT<ڂqR%jkЖA1Q|6tag"-$&YG6oTb U#o# L4 US$GhVI%@Ze$vzY7ioÜ8:ބnEh޾h3Z^8Z\aDB_լܰ4hƂ" C$l֫T=>giVP2Աn1HQک,>|^])P2>Xulax)%Y. B{LJ:!T 2w'v2W&7M% 8 SZ~#ᕺµ9s+rQ6P] zdoh&,f SMgLKl=+CMSjpZS-L;\.7?ȴ=hDr-@s5re' ʚ5)N:'|ůJV sC7k,7o nD8`k_RxvۭMs.xTaѶ$ҙ{]=*H57793_M/wThsFޗ[eꥳ!NH`yUs> stream xڍtTk/]ҍ 1H#ݩt003ttHJt7HJ* JJ~u<ώެ:v0  H5XY jraP%wY#5 < CPD(*! [.P4j0(*sq;8"}pr<. w5ip _a`_.89"^^^|.p>cNA ;tZ.߉ ?>e # ej C`Fv!p A*$ FWvp[w+C~e ȊP;y OEV݇w[0/ߟ=jg+;W~C(s!@ u[F s#SA?C'0_%(,vwCych`?@ax)MFd%+ 7oaf+ܩyE,֘4֓~ mi5Vd?q*p;9E2IorexW^z\:^m7g&5|71BB e-{Sqf!369LX^z.#oӳiҼ;$nL.W;iXhLOIG&v_QZuIl]wIBv9|.~XKpP󣓫Į6$2&c }R[V!dNiCD-{&_E$>74V Hx:U=բUctX!b'Ge"+1ᝤï3xzA4NBnBR4NӁFeMX]%;ZzzF֨s7cRɸ< 7 j>i[LcbyUnًnX` #x-sMANOZO*bAnU#֋=CJDBg$7JY/Ho"mCkh"?^}b[Nl.6S3,6#4U2ɑItDUv@s1.:B3͜/4tJw' @ ӱLo+F(~+}dJBA' V6.<:+N4Ԥ.el(Mu-{$bA Q1aBפ4ñqD5ms-)߸(Pѩ{zjPbZw?/OmTrGDHpb7KKhiV*?=MP}C t[??]R4uzoz>&{chA#t448i/ݘ;],9eͥ9sD#^9BX4Xqǰe`8~ƻY> c7/a+?[ړjĜ}iTYa-P1z/$Z_ N &qq/Lv(gd%_s_ %?')y$$B- gzQ] }n \/;WQ-vEe;X3Y|,Jٚ챫;KpjѰ+$2? (v3=>8wa2B7=ZzZ>`ed +E&\봠59ȃв.S^3T&J.yL@|}KVz[7uƈ2'="}7S&^rjHP(H+:PKw-ۜ 0MԺhk`ˎd]LVbMhjƧ*5c=XNN.O LI@Ue5-ḍMWu`>Tz}ccE:J\R()E+j{_9)fqgn0"-ɲaj? Ĩ|Dg髬vkz\R14%:'j!=旛ShQT8 ^bwKþZSaw7#O' R 3#흔rU>.B<߳ه)y?$kh{ o|'ƛ\즠7aq s |_Փ}Ajtdq$0[q+#PY:duI;?uW9G*nC{\uh.)$ѳŸa{1(4kەM)bݙE++W80Dl%oo!'I4ۢ]5R4@}ǴGU;ѧa%+ßȾt a5[=*-.٥?8(/v.OK1k[9Ȩp~N,*zسzpaAEafFj>VBпЃB]*RX%FkAW |v8{7]gAEb)F?XaLº ilj, $3Wv&T+|+tCXQDquJ}Y6I8ia"W3X={\I۶ծ4B%i:|}xf0-nqFҽͤSǘam|Áo5:zфp答Ƥs&'7&tӓavݸ N ,I)XfURI3|Ɣ׽wѢޕ(0p%P}<#Z`7XfKt_}q@}fU^;!sqqem0C'V[mBsIYs%{H^&爥 Ҷ&hIuHFG8Re",uXGtcs/.eLs(ABj-G2Pc53&[~zLڸԷ[\蘑j v/yF e{r% _q|յQڶXi(#JXN%Ew?埇% V6rXI6pMBf\\B}}"B ؑ.MdϤV.m*~f)hwiYA{PhvC&z2t_r-ܱr L)Ӂ\e986+'4'n`iSU0#7"c3̆OPnP)(sOz5qX6L9ebU$%pM*Tշ~$]늠-qJU_Nk*|5x =֓IRG?y27oVH\P&%ɹ cۈXՊ LU?^YH7* vv=r3ۆLN;z%ޭD>m hYiru[bPx@SdoGu8)6Å[mzi(>e!E `%wx;%{0bJ[}{i%OMUx+5h PzCQM#}f6`>NS*;!նbjDi汁!iKZg%".GV?K2Zw筷'w4ڐȭbUeΏ 'gYoĢ~sMХ`C?<V0YƩ{ExT]Zz>H,`g 7tazJ8tR0/_s&e! bOp.ǒiMQeZ_ն+%xl՛T;UAAoJ+Uw\r{.>y+\u{lz`UCX(?jC'9>X=}T7>w5VґX+dpf \e?:)5ٜ [0x_h b*ddu8Çh>[F;0nNJ*6(FO ؆z4r*9:f(S9J[4r|jp:2&9"|j1RRɊ5/?>m\2 H&$7E9~۰7~܉%YqWΎ 1[RTY py0yoc[WE _Jzڡ>kD\k_fN1sCvI;}K/gx4ʰ7rwޔy ;E{bh3'SpH&3ڠ ͿBwx a]޷݋ܗ'-[=x ;J3O"ϧ_Țz ^VcwHK]0qn鶖3vFJxvͽFH^6 +^_+_fWE}r1 1Nz3yDD!5MPK.pbMDr#|~v8`U*h^#TQhQgL~ːWOÍ4: TiCf@_s Hijچw5Fs3ٔb ebOں1~8WCOGGOr;PmN9}k#iٵmn,Վ\YlHD ƐE{რ{[z~ la[Q_C^W*<^Ӵ^!Vӡ k*]͓ti:l0z; FM6>_wxDkehPK``ԁٴ99utG*!gB*fXoZ&j"ko O|b$y_kHMDXT~ D~5wnM6H e]zĔMW'FmHF͏Nܒ̇W.6ztp'iwFhG|KB㺣ZVp,k8mƍQ]u_}T\9z 1YN^$orV,߉+U\$b)ҭVsCw~^ LMR^,L~׵%oD̫ 2˪# ^LT`ys>B^Fhi`yFkF=EBsJϛQ6=_:L׸bL3ֆ'X1sH}"1zA,rK_ڧ~1hX5ZAq'\W#z ) 6xwHb,֪~s+[ӴkmuD6yOMdq@*v ׋yO+ޥLr~ !*Շ"ֆߤlT#'a"?S.H+fD7OHnh&"F{cAѥޞ:]&|g63u3Vͽ!)V.(7X˾LS]vE %L6/Kn,E?DOl9Z^i}s^ ʌD?)w$,N )9FQN!mcG Gh)0/7tx%ئ#dP"ǂXRgRmP=3 5[<F~Bꄓ`,ҵu$a$A1ct7bB"cӘz 7]ox+wasLNbk$znqJЍI>TER3^*MZ4'20Ϋy#c!+-G0_>/O L&}bтF~%*q;Оy1L\=. qܮq쬸an[N$JEɌ>vkx{tիǬLwiג/]ھ}x)K%D ~OazyMang> stream xڍwuX.=  JwPCw#(%t(-%!uǽzνggfZ]FMC b8spAieZZ\ -h :`W7;iW;T'c*CJ.00 d=@ qqufW% KHH/w# ln vf4whB,>YY hڈm`7' m#h -[;Mkw/sW0p;A<h~ 3or_r68:;9U@wowv/oin`nU9@NR`,]݀nv:hY'+i# W}2v`K}8=N/'߲V<9\<2*:; B{[rJ K # C?=wWpߟиVv P5oW;o!JB.oPYA|~:hN]iy%,%qp<<~.? SNB=!?{X*(|7,o\߬E_Q?5y88`B;9RR8/T+<תn] I'(9VjvossA~]5.l]| NܠguX9n>~J*n>>t9 tC]W_G+ TKJ%Aſ7Tt5;Pu[_x! W涄8@ //~͋KrR7i;k;|?v_=O,EBal v!B;]?_oҜ^#XfhοP_g}_'+3!' mwq9^U@k43 8Ucg/IW^!{Ŷ y{߃'⍷ٍm U!zH!==b.԰Oz䐴!ǟdbZG?뾂i ̎ *1aܰm9{`4A`3Wwlᔰe׸qGf1.R= *Prǯ8ƣ3[T'J,6,Bߴ0'` :`>J24#U[foތ#X31ZY->De K@SqY^.{@:"ybJ2Lz "8>Ϯ?MUQFOuKk1M=|Nw5a4Ѯ(!@,?4ڀGi$iR qU`eYM )~ :9jX7ƻ4v N> )&j}fkk6/HKx+6<|Gʹ6dϒ][^֜mdT V4pw 0iݪK+scC(FP}#lm FI2*e uGwޕqݤZ7IC)k&IOlhZ{iBi[c@ɰ$VհqQ$-5Ҧ`Oo_o+|.fy;BsͿGj}9[ۚ K(A 9lPRtL#cX7LWQ|X#A,Wá N؃g5uZWBJjGs($pn zH;){N.aߓABۀ'[/W5}:vkTԱS9ip϶cm Mg$՛%tx[v{SJŵ}D#;>#b Yʿ=5)(!EB5!S1:/u =._ԭf.|*&ʡ(eAӿJM%xZm'ܨhǏ< 7>ƭ(,3ƩP=|h$ǻ_S~" ǝ7]//ÕT w_U6K^\oACOKAw 7CVdl_ܴOK{9jV΁,{CP&mω\x Leҫwi=%.}L_.d2+Ҁ f›'>e ^i˴ w,aq,cC#?(J("մ~^O[-F|3ţ4vP/p۲H^hFgtҢlKJ^HX3†f, ~@ !{pz{n"gIh2#,rL[|_,IaRݒ弈$W ÔꗜFSw ҃(gC*T'&na`:A!GEccRvhZEƯ„q^onZwdsbꎦz6Sl CO-_ۧD),u͏_F64`B`,៺[4蟙-{ߤ6`=͚5o9S @XeQ4bHCTqÃYN(hӰ$Q pŠy}Z3ݡGxΧCtx"~9#>/Ydu Ntd?;xۈ 4CZb#AW˻pClRUwVU]Y(L$kN;CĴv2J1u! QQl`in>2x߄Ȟ tG*\E\Oԍ7}|sagTGI2YZsrhSdD+۶-gdChVU?!iP-l'74O:q"|ϖM:jvWv3v>ŨZ5HMdYriEGx0Jh>}YwE7SU*ShY*ljӽ6jqѻM:nn:&SƦ|v% OwM)oͷF VeFR넯&p̜GOC;X~~!R.Fo =P; їs4nЏXG9r/þb%+}ja!!5'z1515raTԖ$zH}7W YsεtZEE賽OlyS\9I>9aQ׳TvGx/dC-#˓ *Ǽ>5%:1b q%׷Ie;S(}-.ToI:?62h+gzA k꾒(b#~1#0e;eS4:FWMy%DDr ɰB!j"F1,_tR=I3_SS>lL}'Dg+TeW@wa]*}];w{ ߢ6ENvm~ZCX!2爩Y!9oF|HBCbȳI_|~tOw7nQ@OL ~I|故 ^+Qqma]q>ۼ1N.`򣜜;_\Tw7htHN>G.?f]\?@ )__c%+ܑ^{v-o.y0i;Mya{׀7^+,)Dx38x!=8WEj}5~c) 2(]K2D ڹő][!'h6NR3 Naf$| Z 2NJtZVU}f4\7,KWJ"8'#ay26 RfTtcl|ٮl yi?Z3F25էd[!BoK/O-ob8VO&~xe!y$ͅqܓj>~ ;2tv55D1GJppRl*aN[5s x[Ea^(J4}Nqw@F &dzyi71sr|orMw~Fz'B.gjl݄^t.?(rf|+Xi:t8_}Y ҋ ԑ>[Ln&!&O'JsT{ nc+_y>v?t>ՅYYo.'}j+b䬗eftߚ*YI(~eř-Ofi! #DY 5&|3p7XÌnhӏ!|H){r>I-PK,@5g7Qo 175Jã fwlk}K<+WY" د#4hfgPrwļ fI?l Yy,֣gidZR-Wt߹(& gs-Ÿlُ׎'UY%)ѫ?mi,8C2X;x!"S!CBYl.-1[>;U0մ޳j8Y~q;+,E_8,)~$5{ߐ33.!Q0sjmI.drJ-G˰h@3ecC!1%J U˜0jS d9dhj|Ҕ0>Cq/ey̩jlXvcpFe\,pҘR`r?j“/-쩚|cY/eOp,ee;s۾Ҁ0.N~3a1`٣ oѨ3i9dSh/>JS wvWٟ{הPwhI~19LB<81^=t b,7R$t"%fjO-/ qejQ=!?_hA.?oRx/WplD! z <0cE[Q7њ~"\do1T>YQDɸWWB>Xo3O{X>K͘tzޑ%j# iA%.rNjY-S%޸ݼL=~nt=bC<|<)c>UR۪n >k[ΑҰ--ӏC$SeOR'u>&)!՟̱L 5B-_qyOLD{E1.EaÜ:lWe|#[ZaI# x]l=sZ=,zɽcRfM\+ @A|&K9~zw>-5]ݍilZq=pߨSCiNKbܕJ_͝ël k^-PU;:WҾ=2>kl}Ȼ:'8>>y= 2Z3E샆]$ Lqcn ώ7 S'`*3L67 a?,3V$z{FN ?gQ8BqnG{^+9Ļ--- +Bq}Rbw ~ :F{Uzfa]QDUWj/ю箸^Eaĕ|!|V!pNG=ޢ)Ҳ<[U*:{u/B:W,d4.613 {UX)VWC zkx"|ۊv8:'SI>Պ6(vAHT8O4#}o:Rvj@5! X#io%HM8})H{ߎ#l<4Db @e=VtE|~¸g.?542[h.,'ث.̷I@ ?t_}fcОNJ&Ik~{/ӣv)RY!ǡN/^M^ ɟ_X[Fo@,*pPj{dVVɄ퀈gZ~`!zr p(uxnߞFөۀ^-$ԃ~X~J5 :='i&JلB~F_(NkYɷby'{L%dF8,4`6u5?NTy9!}7ٙWi9lxD3wv!$8sdt؍ O(9gK'@b9JbT2 Fj=PI&N׭ !h:4;r6[qx3){w1mN :TЉ#XxS0NޡۡDų?|S~@EFnG&{"JU;݆Gll{]ŅҍƗiaY[(v1f4L_gK*cvNp6>{ǧßvJN{]DSڕIШ]bAzn&3IWq9^'TbVTޡمI o|"|kPiн)=txui1p8:OC}V" R+>Xw9e ,oa_E%+{m DFǘPK4䇕˲/Sv\Y 2D_rkd501˦m.6cyIt胛TT]  bv.]X:qssܓTߺ@>|̤ ψZx5!ɮP3r%rqәYMKP̴dWZ.<[[ϜJ qS`VwXtYHwOjrhE])&iwS^%x%"SRZlT)+ޤLPVc})LÎw'[Yy/d˝zu$U'8+itSXRM_g䭾KPvtWōGJhq&L^;&{k6&\h+ Bm?1Ezjel;yc}tRx+1@{+MC4Z|8Ѕ)Roz'$I< YWⱭvI:~IoJ/A& KyH%@.l!Uœ˔3Ǻ90"|Aw?U^fxrD>ȕE8*Z򵦋czv +M a2XY[Id80u ͷ ~ߔ ێ"})/rlJwE߃;I$Cz,•-fPNaEJgٗs?T3p]e:&8\U Rf޺yٺ @3Ҙޒ[׺8kρaVŝK)Eâ/wW}8meUJXVƦt[acD^ (³яTؼIW*;ݒ%22ec8$9j:4pQhG~vVE`kF-De_ TՂ?<?vvk6Pgd;ӯra;^-f~yB/-գg0kBphHZ ŶLѵxh65)ByfHg|."R.=NG'VMjdt9͕,MG/ G*,eAIZJ|B:8S3fXyigPL $IP@tIiU+Kf*g R²< &ꦅ:]; ,衅 2} W A_0g$OB~/dٿ2@=py|[gF5#(kW'3WT_^hQ3*~~v]=0qDIŁ)Oab`2`;@MHkh~ u!bP|ź}4Qߐg^p j ,,Ӵ$߲tp5r]PZe.'/+XWaŸ V*:%JnޜS-%j9@~]G'ahքZCr.iK"xM=QDc^"I=JYH&g]+?L\S[xl8nv@@0Of^ڟ &P&7,&}+ik(ֱ'<׵U'KBABivU cuKT0_U L \Q۾wZj}ʠ\DuF C>dn ޔ C]3Q@^J J֙rdT~ B aPBNd/8Es36~اAQ+0)1Gk4>[G]"FWi?{\&ղE;ݹUDD|fLˋM ,G|]$EBv Xw'=V_k~ݽ{|iyAu}V ac!%S:2ETe(4K,ХkĿAbY>`KHnN'% hNN8Sjڴ<^tAtiŃ[=bbtUFKZ}wć#" GQM<]>O +$9e (4G,9yr2ǻh5NFPC\uj6_߾~'Vs#uGE<\ȉSVoa.G;n,Js+}*%JGH4v$F3RG},a6y39Ȝ*++E@̗FlBV*n$Ҵ3sc/}F^i*0%\i&\w/Ou^<qpZƙ`ʖt#6l/\Tཌྷޫb#%\[2xң |n*r5=aȞw kzpS1Q )fˮk~)t2UJDK$RܙR`䰔4,fl%sD36V[ y {E _%sAUbZ)~`,DZ-a/N+2>!+Y8jNT_yD U]|Wmk (ygVMMKn`۫{;q$&xs"t;T="po +.:y89!8]RTN掊Xs˙P-'3Mza,xKŎGc ռ}㳋/n}W!E@L;(3d)nؑȷyě_z6`Ν;z7 $3WJ M슴ȄFrK0"FfZ' .^|)!gyu=~Ǟ/j?-ȕUЅh*F3 ǀ3U)sT}ceVV4Rtz/͈VQl"O8,UJʏmߒsvcU;jlcb Y\=䳴 1e9@ir\7ZqoQMMF 0^Aث"+UΧ xfX!]2ʼnh`GvV ; ?b1̘UF'fYiܳK3uсFk*7&O b\/ECvbBxӚzIKsFK~#Wџ.D&lcۿ1ž$,8zEo0L #SB6:^*eucКFq#q9Z CȐڦJL ۬7mWsҔ5;LlCt|[Aok8;wtd/שL>>LD91>0ZU^6N9wm#eRݔE/hg7EqGrURO[#O/kq?2 =l;p-I`=?T#ȭ!x^`M/eU@r0ywݻلb҂&Qi1G-|% @V!L{Fdd*Tb 񒘽NY7 r*b8sbHy Dω1J ,Y,+WS*G;%|ɁuQYVF䨎IU8eGz!@:,̢^> stream xڍT[6NIIJt] 9  3 )% %! !!%Rҝ"7}}k֚g?{yYƬgȧ` H>A~@I\@!|66#(g3xxBpb(y@@HDp ( B@D!jh O|6% G' ()) Ap6qE0WNH?Փ( "O7dWil#'!P =Q.^p{;P] !k!j@_py vW7 w8@a? A0O @v(A}U_y=nHO~O(W ڬ WBBHO_=z@ u.p<n {/7c8 / ADbb; v7!( p@ :@P o oÿW{( 8B!֨,( ^_k@@)-@0MY]T+U \0(z!QS@? zU BMh>A~A`?7CxB0(/ l!nO4 p0װ @ ?|YVATC| G Q.TA~P 'POԩ8 t%`x@~8  #qTQ(i8K!w/,10T+@W(?1EpK nbCW#^<~+׿0ƟF#D](c/-w$F"g^8idN+WQ>כ-޿ ]LWC)*~aG:?Y%=Hg H1~"-[M#+9L!c932rܒ$E Shb[wÚ9}υ 4{Ū"h5si(r4z++%F/bڊ/,kMjpQ xѫ!:-۽xLom])9Ɖ9"[=@A0,]1S{QRza1q1KgYIBVi20`nh1uV1O7> tG"X(&Bڳvo'U=Dj­,՜Atp%&LbvJ?cI0&7"1@3z2IBD_sK&4C $w߱N8µxd[áI6$^o*OO/)ې>sx#l L.,&s"xCxwc=ij WXdvR,E>c>ViGCwA iP79fH ViK`D?$m%Ru;<_ k_`HULW샟vΆ;0fhs&󄩡3=CUUe|A* m^4+S&,I쩫0&ZNUr펊Fx`JVnNzo)D8(uS]L̽Ͳ_elPͪ5r$B\D<ݸ7o~lP 'M3;29#J& \=; 0:N$|*p 'j U+u̟Mn ZMu[rwRSsjeFTtXT|oLˢ7ػm6[ hRކ7r03;؆5Fy]\YG5NpD؏zu#eÞOͫvF-26idG{jp>;iɸD[nGn9ō{:BܛhJf^O3hU8EP'YP8-hN¡%@_ެQOX 6F/B*ɉV@Ԙ5C/ 23Wz 9p(-|-ofHӊs|C׌qѕڻ6$~.!.R}sM$i{%5z-{ɱ,-ag3{DD@ʊ5W rX2eh!Ktfڵ5a q |7|>h*3vE0_pP@xGtYP"20h q~~T@9NYځ\Z̲N!ez絑NPY/ޱ2D"S7ڻۦ`kN2`ǬvוHw!v%]T(}o{Q҅4A-MǙU@3͞`ΘԡAUB [X dȇy6}X`&뷷R??q}lW?YdQٳIHAMv5I7uIkZDN瞁OFsZjEZ44rẽz[lnlpLo8NsFkː j(8ßp1m02`S1.}˥ng`Ԩ, Cf5-nx [&BBQ,0%7ӽljySa&kT3P g`^A"근u7XTłw qrťnp5L-ŪV4L=ld~p Fi9;{j#h5Oh<ly'G}KD972lZjsW;Q;vof9]D/%RPP܁9RMK4l 0{Z_c"w/dC7HQֳОoϗiKhNfߵdKi]7VZ x|ܒԛy\2ctJi>¹xO9{NfAz6ց#LЋF=>8y6oWP(.O<4[YsBD|zR,- #X4+D O|:?B > rɈc_th<>ҕ!b#g)Ml-yJL7q3Cԏ,<~b57=s{AͼX\:8П\52{ۄP$ƛYBڂna}+~1) WV]QzV};i?-$t 箦5:ؐo˒^bp~F#JvahFq}VHv5Ƙ7i{t2 >znʨ-'3q^kdHcx!ƢP/MBGQWhD8n]\OB ̒<*aZ[OgqtS t%U&}6E|^|$K@c iB!p$ y Yvu;׈BԮ9V.YѧTd49}z(\B,JP"N Eʾdg ͵]Ҋ{oF-42F& sWy;m؛'vvGaEBWϨN;}/TYEm7J}[JeCe83\S&C]L=^Ώ->@S~ni?!]G]y+Y3i%O %\<"l` uGÄސ4([EqQi_7|i>o {0^mПq G#^f1Hoqڽ{?yRDU!qz>4 tc(o|QZ|'CtU=Fý'vpBgTv朲,sܛO;> _"Vb/ѾBNbV 4_Z%Rؿ PN(y:GIJaD9wauqa٩:;4_U*a~q܍ _2E[f r) zKzq ,)N':sC]W-C;98)oBtSq.reB4\{i+~9Wm>ӑ03=|O6+x*<(/X ?;j?zFkLܶ0J6h{~ [;H6s(WZrƝn457y*$' ȴ=U%7.*s,)좆- u}JK:hZ<|(=ZFk.r*7~VRUs$2m¼"N&L;DžeiK;Hv4WKپ>ۗ0&U岹`JJZ@Oxx /KVOjMh܎qƟ7-ȴu)Faϝj9=֩hRَQ=4_p{0wn+VVhY^` 2&lYB#P:Axi &ٮ?^< ֜7 ў\IxV}l]ʔFԛ) I;Lx1%fd zryFo=)w1ύ^'ˌ޽I^ SxlM؎S͇q4^][^} KaG"1νT5E>?c~ŲU'}0-ۻ}Lq\Fx@ 1 Pv狦de`b\f'skq/a)8FyqJת+IDXDZ$4t>N[P-_}M_L, _]Fz1L&Fǽ:3@

@[}͠VFܼ俙.iݰV+w|-fI5ɎOU6云؆ƺ#>"g!%Wⲡ.W.Eefo)s)љB;{ Ddާ=JGrSH(afIZǹ6wD:OQdOM#<Fvɜ^zqKvcb싸9SiEkݲ܊w½୘obCnm?3e[ ⓤx_] ɕ=QӀH봆i[lw؉wպ]a-`r8dI]^c1SM[+_ȦE,nm[96QqQ_2uH*{ |x*jْ\YRRt?q?ŤVSF=:Y m}`dK4JߑSjO߽"*kQwJ6?~ʻ8dg^5ۚҵ/>:/@rK]%e`,p wG[I`rx?EsoJip't5Oю䌀Ru1*t%L8_ ?8uZpDJbv,k)ÑҶXĽ?.>WY쁧 ,ύi-U`G"}(ِ1gI)edzѥi5 !s*fF&.MWC6CI`v8A[ ޕx+BWFMWr~SXy) OevF^%Uol|/5~p@?E;23oBOi|X^kۖhX2/8)eQzJ5V7FwJĠ.S~/XJۍMkn6L9,_6CoRyNvG6[ylniŷl {\nsY3!ɢPѱc*%na ˈ{N0"n!7" ̺ar!7›\8 aToxc\En LF=% EF9DkNS&uFzbuf. .usE>?)Ch2eT ~I4}/;gyS]` o6e?*:Xq=_coa'7 eLJAl8plu,}!%T[o\AREL:,=B\w#j$O J$|11ҮI0:4- J)[/-}wfljǯkx*e-6.UY _m֖wh}Ho`%p]N=ެd񒘫hf^RqTIkqQ;λ cmYs`JʵZ`_& gxQ4k~i@Xl=q;l"ʼnc[b3"#hhL]i+cq՛3͹o⍧?ndTN̊کEպIx*2LOv,/9ov)Jp2JJ}UWr8QqWln"aG'p 4;x ?)X:~NP +$-mSgL㴿S(E.¸xbe_FVߤ 4\ a'|p^ L@;Nk,hZؿJ"Ĭ;r]|-?oXS}lC%u:\G C)=m]O˿G7q$+&pTrs)R*? TQvn ;ic _݂;7fIP7u_ԏc}HmIQrdl&OrI! CJ$D O|ǴS?{Ty+;^$ ?#9 endstream endobj 109 0 obj << /Length1 1377 /Length2 6085 /Length3 0 /Length 7036 /Filter /FlateDecode >> stream xڍvT6)%2@FJw`&lmAENETix{=;g~s_TTriXQ0$P7@@H u5SZ8 )hAx> r%`iy<Djo8蠐0 *bepdD~04 C0`rðPtb=|||BA@?)xfp)Ax; #P/0zz"wN7W"8w0 qp jX cPx7q~wh( qB= kD_i𷬎՟ s_;Nfݐ(߃3 u5C iM) :Jov{<!`pgh/XvDp',GR'; ss/ ؀@>~t{b憖f&OE I*.3 B(ܟf_6e“mAR 'ConH[pCpw_^X ]0zYW鄂4FCp <ĥ`0D(,>1BSZ@ ǸIN^h4^gyoQ`0'iB轺жZe6DH),߻W=, Ohա Oǧ؄vrQY]C}ej-q+8F c t^MfH9_"v,>T?0dHaQMBj4~hq2I̗D|kzJv΋DŽ<L* VǚK]B>uZLcK@<xnxrٞZ֡yؔ i-k)i6u' kwi#ڟHh/)huVg0lhlWR [ ]/~-%iū ,ۂ"RϾ|DXL7D!j"$Y&Rֹ㾱F l:K2)&*R\t4 z1zRïS!g tk+>+ 0};EH09%&/(ӡ5;&Hh^f.7ZdNj˦%p*]awUy\e';, 5SG6 l]. 49gڡ2aV["[B= t`S%vN 骧+v[2{=ߖCms&[j~ơyO:#G~)q3p/R!%3iVcET-7?|6;ZP.Рvf#K*'#VEKH+|8'qBKEpQp+d*WQx&";>a֗ot3yz5t[s\-bVhxBri=tfEtmDxoGDJ'+1YuҊLE1Bַ 8ˇ(*p[ mjE|kYVxa6%:OK]'#DCb GQ36OU#C鯡m썾7חWe?\f_߯-_ʧ[hQ ?5QO ,JBY{1C~lNB@tA3SW[Ꝉ ezn%LXQ(!}dBTN͠ށTMƏzKjnjh &5M%}Yjl۴liW-kcfx7?̧K {Px"G'E =Vӥn,~`LvWy@kT}Zp7Wo<@(AwVe@p̤*8Xyc~RH{βdLNpi`IA7YʴiW o8|iGZ |QD>5&áܽ 嫇P\}my3} sglbhpNH-V3]*Ejkۥ, 0k3Q}L$5pu|x1 :fYA@1>$&=RhgO7FM. *\]қl:8뵸fq&WQ)Nശn?={̲}铿5 =4(&uîє[!M%#O9u+ 䎵|\)_ dJ`/K~+ܝ8<%^oBV3o }(뼾H|8ГeUPtDHk" `.QbE,7_G ,GjF2ϣPQn;Ie@ϊ@-"{DsՎE@̏ku48v=x{(^s w|pަjv`L3~WTsztzNe s.L֋ :"8ԤV]Wy7[N8kJϼfi&4@.(#'d0ȝa[TX-IjA5Uk?`%;ߑC n }x_Ͳ&$ZR24q{2=^Ƭ[jzZpJOn^Uqx{ JHҍ9HYk/ zӭ*u)ޢ&%<3jMjA+DW9ڌ)x׵. R[Oqf|9A7Nq1UDEP'-L['=5Ԩ~\ۈ OHB6O NMkS+΁Aҳ@愱c4AJzs* R&GXo]-,֚/p'r%XAs& ;H,펥-\R^fqԘr?&l*Ȃ!dLgε8/C{B_2ҝW MDJ⼯mk/ujyoTOt{k/.tE aؒR.JNz?[DbS\YH/ ]7aKI(?˞8ⷛI.}dc!z|s[~w'2mv:7v/ͽt!ӾTx1VHt{*ԓi:Yjwb[L}溦IS+K0}Gf3+!?@P󯛸lںo!{;Oi:uۖ) ?Oz .}(-ܓ?ERqVݟqU'Jh_qѝ63뭜zjH۫T` d^=5[ű(sW{}Z},Io`b+xд&evhVFj% #MnhС#\f@SA"/ ڣj  s?LGU(/?„K1 Q mt;ʇKZ[W}i)I )-G &!{eviZYZ\~Lyk;'UQD]{Jo 8:!%voy=Ѯݠ37y(?g37,S[9!I |l1'@m4j4 aţoH Y߈YU20OdNT(Ny62>s^'oe)Bȴkg=<%VȐ7 [ԂMx)Vv2O`$B/HB+yo] -_ w+$Y]T|J<~*lrx\y t/m`ϡ\1ʿkQ#P(귥?bxL& TX~-:!֘:&4y&AvMGtJ82+@itUXzSm;)#L 'USPg&I36Pm >|=;ӝ}0:2eD[7,L1X> WR7Ēg#Ji_hM?i OBijs_%P}vij~bk=vOF>p3{GF61u$idqG;?vպ8)0; 3<&4D1z_dyK$JkvX4ī?X+2zVcH'0{s/-^ #:L1);e_ .wSC7UZCo^c F6`u"?{[̖p4G$J?tt$,OnZ6LD@-ۣpk1͸Pщ%m23?3ζE|Rpyvǫ$c-zKEc#>ĵ9u'/$ ztQ@W%6)"Зr5 : j.&b[ cV(>z<9sJN,[MTKقJsL}@:Ƙ>0L`)Xfj+1۾lt`i曔/䛘@&4ΰhrDaiL+W i=2b[m/:z;|9K{9U,Tb-O%qwAN[:[]V^认#(yj}fFS:.' LL{zU.?.;v8wS!5{1.Ȗ`f+mKˬn<|?V8ʲF4MIU&G˦gtmQ=%t%Ο4ù,_ܐrc[aUM|Ttm}ka!,I/7Ƴm3rsyi-Jԟ9,2];o8we%ϩolĹQܭ 1 6©!zo M{t%l`{cMIIˏ*&Ql4uH}mk3_Ȃަ^h30hgR;uiQs 7nC]NR> TqڧttHjYx>(Ճ Lm >|h QPZ),dp9q-%$ 9q-6ZV d>QfK 1\2VL()ЪK?$ |Rj_mN44G&K ޯ$"UJbD?<n5 endstream endobj 111 0 obj << /Length1 1433 /Length2 6348 /Length3 0 /Length 7329 /Filter /FlateDecode >> stream xڍuTm.R( !: 0) ҥtH7HH(Ht~9kykǽ6&]> J $"66C  `30$B9( Sa~HP ($ J*`6?PlJHgO?@N0PHJJw8PE P±;AN@$x+=,- (;9.^; cԇ(7(a#3~ m1 ``(pE@( vsPǁNWD0`;0!Q~A?8 0`? Ealٰ;b4MP| ҙ8B<X: c-$@~ b{"Q_c ؞ahGN_Bp7 * pFg W]`W >آ}@P0`v qi:Tw:D%2ެ;B >^z긋Hٝݙⰱ)zade]v;=nD"%rl]'M.B%:DW/[kR@8)T!e7ڌ3潙%i,9"Ph7{C{l~~/;Ed/WB,K){ YF=]QH8)<}9k!жf^aC&|yzq >nw @rpgWy@xOv~l13^%":  vy>eb3":< I*)¢B *r?SJg[i o{?:{Ml%g8ǬwB=Dvl1!X ,;cw脂 Kz֛_~)6*qz`{f\IbW)>6vX-%?59s3ʫbsc,q «n+y襏¼Fo:<: [9 3aV?+<z} UbcdXEd/-'+-[&|8}nj55a_ # 'BY20dTq*W9=Q{ \)Lb04<UUY 8Mpm9>͏{g]\>@=ZG'=mn%K Vhwd4l1Z!Ȍy9(A9?Edk!OOb^ätҟiȎ$Fvś&#h/fe]>3FqS|W8Ix ڱ| Q3?u'fKPt7Õeedp Y{:"g5z]"vTvx{?[K~P2fWZ4GqP@:)H"=OҔFHl=!ЉQkcmc*\bX9mϾm~Zr5\dUk?Rh| wtYYa6yx9zY%ωrKg֜_h E:YA-4Oq Q7?E\lzv0Ɇs{R[)8,2ׄj2t˜ > +,͏\vC- ];=2|!#3uԈpkWL@1[Nw͹Cuxjêt~@.܀V2-%Gu1k^,eDW8(*I8f"O8/ e&v=u_UKѭ xY٥B/jGҼ0tۼד(9pgdOz3c'pV Ư;9 *NFRv" oy;[02-KAЊKytiMt}ifAKZmlw(ZR^~+|ˠ0|;лxڞg682ffn5@_yNOx`r;Y1(h_[YX||%γV:;t)(bpI:k[E4 B=oj@*iՔ67м`0]:4R^ {W$9Gю.z=S@3"& e#>wi75MG!C*'^&,_2%i:rY]ƚxLDeN]fo HqΣ#|1fL#4 Ҵ)4Pn~|YKj<KZ.I):$3+J2˥9;(-1 ࠸îMcbrQ^sD}TH`)ׯŏȴU58f>o;iZ+$: O<&: MTr[rM w$S1gfYi 8.ՑzMf爯4w_Ŏ^_.96TtD=%h5u$ٶ-mz֛>vן@o2F'{PgL{ڋyTWpSj$<f#x2fi\Z ڊ,x f^Kí UuS^4 5T_Lg<%WVTmjaK7Ve.C™EqQ:K/ݟaIPSei/"?Er*NnWX{H"=xˌĭ kGY5RS0Qz}>sE*s`|Ö4"rU{@ v xc V2rMկʷ_=1'Q{$ם8Im#:*QKmc6X%6:{'P 2s=yGHGP[:;:J+mbgE"x*=ɕM~W6/rf}$Eui~Bzz^XXb qNt.(aw)5AWњ,*m"jl^zve?8*2ys&~#2+Ȃ[>u#kɷ;> 5; hcD 5 #ng1V9^_w>ER##Zn࿦wi!s6~si@ g2:p FYw+L,]Z2Dt:_OEkaqf〔m_ M:*so,M:QZwِV-罵1X-2I'p,z^%i:[I\$ʫ\Ƽ~>szMPfEzpXԠ4?q\47Dd)"6AL Sț.#|BWL󦏬o?D+6K&nj FOM_Ȅ{Nbm3c !qGs]` |qxjb`KZʖwM>DZn.)f(SlRgӤ҂fU]ri[Mt=W$Z*EvO|7Y?`cU)S3d5g[11Yl^N[N q+?#Rx_ċ=:7[Ģt@>Wdw Իv rhy-_VXtQ&߰1pOkU\WW."Ψ 䌮WtX. L롷i+9:<ܭHi(foV,⚗o)(<Dc}$JK,,TaEqi7#. ci@Af:lTUwcӽkjr+=Îf{6޳I-[׭pAC{lX0Ixw7ps9'Vh `V#k* DEgZVj06WJUI)DqhNf|=/]r^4 Z {kLT i"6G\6qdJ)fn4bR rE d`@Nк4`#'(!/Ok9.awԵ\UKw$x(?f$xm7i޿"vO;qFi'|i33һG@diPءcbI!$fv͂;?;[2d&UFa{ۤ:Z37fl4oBю!As?HZ}mJ/\#+z9q웗us:?~w{Z}=ԛw;UHPʓSEyV)!o@=1*BVv ":WnO_)^ݱݫoɨ͍_j2G\[=:bVy E\؂g!.'`buڅ\E 4B.25xv.pU&sv8x/nğ[!Դ}-H\_Xe\xqA"+Tɹ<<>f?1 )h>_w4UU,ꪄ{"h8꾺8.LP. BNBz*ݙR~ěm KzkeΦp5J~pV}[8!z` (>r( %ko4OAmijF~ lWRANTC8TJprVUfՍmW?=AZ'NQR -x}w<2DjȪxb-=M ٗ$<k4W;Z.} !򬐶Jsu5^PZۮpw2뵍( nAG Yk+CX<Ҟ>嬚Fx`2'z){64uַ"y4knevAr3\t99 endstream endobj 113 0 obj << /Length1 1765 /Length2 12347 /Length3 0 /Length 13462 /Filter /FlateDecode >> stream xڍP[wk]584%hpw'kpB#3sfޫjo{MK*afosfdHh+pr8888(`gп(: 'NRN cW󫡊@98eh$6vTv  5Ͽ> N>? '@deo 9{WaKggAvv7776c[(# l A@N 3-TmAƆB жCRhٛ;;)bgrfh)(@v+eplv::y,`@MVݙ`lg lcljgY k1u;8C `?zd#1ؙIڂ!(' vߗkmgf/2ۙц[; HAoWd g?rM-HS/{k 9pvrxS߄ 0:L@`;Dws'㏿Nbv5MU I[RR`p89n *ؙ*U30; <?ߔ:[͟z ?zc[*`VWdv_6HYN4+'7_r0D2S;Z55o6`;= ?%3~}E CWe=P^x^[irslvί.}N(\,/]_`إM|\v]k^-M1M\1m^6LM?&3f6& ?5?5?|M؝]_pnM]^? ;eyT(Ȫ.Fčuwȍ>xq#C产 %|w$=3nXlam)on=#rQvT73?ive$`q<۝ܗk΋~ݱȏra (ٵhTưZ)%ńy{M>m[^DtɥSfPW `٧mұPza0BSԗ`>ц,^ac'bZ]ueW4Iz*:(t/:bP뿐P\e.%cF>8u.uP?+Svj oˑϢ5;GDOr, `AשF~9nb78D 4zLQCue*dKBąl|zC3<0^*i{][WVEbd[(ʖUE >Xdi7t{,MWU=*[S{̱"4ܩLW6|U-+#h9NVB+w7CcVЄϮsJ2UBՀNzu"~R10cx%i-ɽ/s\"U5 :"1,6]&>}DLW䒕=Ήؼ1c)7ȶ*Nh7EnYrnMsA| |4^qZ_]ӾDN~v3~[*մqKcN%uN25IdD34EWM'USOir- V>S4w_vQчJt Jߕ2G%pOdY ZhX#:n PRBK3 g (P*Ґpd?.,~Mχjr6_AA#c0_uWEm.< ي~X="jZV |f]jϢ++fH`3E>2ghj#xv$vPbڊ-.Wj`Dti]g/W7ibC* 2R{H9TD:йQvѴ0Xs~1gM˵Cmv>ථ(GyFJR݊ڤMbP]@xd,Ma AaxG/UgC]e Ao<^v{ *yN1Y|hﶕΚH!7.PoOuj^bgHofl_CM%wINrɭy>KhӬ_ ƍeUDi Q*h5\_6Z6C-}4SX\Sy›JJGg@G~GÅk0ːgKf;9_׮g{TztD;ݺj|_n^"Q1i3nipe\U0d4 1 ; s/&V9 'xHc2R )Js/ҟ*?ThrݛR[9hS ӨCHfי7ߪFZe~[% T8; X#UrȒ*Ƶdj-&9YPֺD Gl]l#LSQۢXp S@İa㱖A"Xvtp9κtWI0`uہSe1F"Όi lybM۴voEO>ю<1Lwk}c{n̩ 46 ._YC-jd!BLXeΈX'#JPpyh/&Kb:˓(m{@pBy{M9Szה4ߚ樺;v-]>n ew3[;wb_qS0?y+*ޛu .Na?ȄO~ZI(,#MIZZ)Di@G~thbŒnLv90 ) Om*f< 8AyQ{{PJpT:Ic?Yto e 8pJZ+ez쬧D Lu0VR8 9 3noyz_i"0NU) Cxdm= v^W:ˑ*-J`'ηؗJoV=[K,mAKdnrtQB"iaX̫).X׹ـsTQTsB9-*gη\#q MriU8S[Gu 1߰q:kn{XIbE#_fŇ^Dc]l~},j4%Avt~4@婅s.ˤ]HgL(vty.Os-[:̡%6J2s<]#^5uxc Dyggy4]*'܊/\ŭZD&^6?*'ޔδ Ȯ !ƏFE"iIa)vxEs9h~Lqh9mFtzث ٻX̓24/A7Rh1xr=D%09n 0jʆsFՆ$\"Sr6a[u!"6&'aG>t|:)$U@˼нк>g^MI@kz1W01ncEf]75)&c+3Cr=sn}]AQ ;?{m:Uq`!r9/5eś$uSϡ+;yy#k~{LMe9Lvzg$ݧǽ R&XDBG# ts>+YLHk( |!"{RzL1]nJ7$#*ZAUD孢b.*P@%ƭ.d4s#KGZ<")A#K,j>V-h^ dg&~x+o&,`aeK'HH%3IJ#xC1lq lOy8z˴Hy:Z4A^[ !X]){5SZI$D8hT[ wjļooK%I7Y.}]0۰0 5'D[`OfhZjU [5d9,[ 㗽3uOM'ev,~ УYJz@{Xg7%@_n]xm+!,.< ?> bxȿMg_b$qnA8a+/g'yyH]IxGNuVb5 n'Z$&d(jqw|Q4h\%MI#d~0[Jcr_{@u)WjSʳL<+e9cΚ_1z-1Eb7q F0u[U{su80&MwS\nF㴞rgL3#_xg~kϬLm]MV:S .aQ#[-)gk u$@x<4 t2KqS v Y~0RלmVBu_yrIݴYQbF"#i:4,FXoݒ^ Yn#_=t`w|,:#a*|X9$IU {ԬX@BEZ0=j%7{NsҰ!C֭@PB4c{w{ A2tN&5jZBsԷE妦D_:͔ L8Sƺ#ӿ[/iQ,2ɕ.m{ IуlLl,Ky it?dlS/4_Iʂ id(JBӀ*tQX;!4tToWisB7KC>&/\y0#!n54{d&'ap ej467t {π&,󔷂IWLnXO{; o~jvyh*&ՀB桑TLF bqY!RRAm2+Xk3'ZZPj&eEؗ.!WMbREcklG) RK&=WH2VG-zOt83岿va9s@jy?Ѡ]~7-$eD<8O#jjn#M|dx_%Dh8 -!?{ iڿ*'u}LI>jJ& MJRW$Is˞˹(FBF v@jNhK'aFy#i,dOIze.ks*]!vDԏ`Ԑ!b-G#*ڕA3.ݟݚp29&#?1e#gO;J Iv">ZQQI+&_ i?QB- }1Xa}jp!ٸ_ L;)Ȋ+{TM|-0Yz(O 9iWt`̙A;Qd⤭3vRvIO4V?ioDG92 Л0_^&q"4|YcP/?x5BC;)NVf$ͶRd0lPj vjO&3+Кf(/:7?)ޏ^`zHFt7}\x!O LxRUp@&(*!1^"q/LD+8MB\Yc1R bC Q Bܔ;qb4928PK_~Q<_כLv0yE+NwGҗa±oc.lŋ0Ĭ.9HQf0嗺*>Էks!e'\ceV׊9I;y\! xP4\9%C1msfR(h}mJëgh1j}O]Eh?: ZüX{bDuҥ3:='WLɭ^AMa_"eaGw؅/œP`7uݺQ*yu e -Jtn\Ce|0 5(T^*l7uiuLZ:bYVLK>}jp&]s<% INI)/P:GK FȂZ.l S/Uf(ƍU4 Z8 )lTA 5S\3TDcR4oLfrH2Ӏңz.>+ߘՉ"ȟ -q΅N )qdm€WEٵg4H%B0ʂX΀P" "$Ctk?ҵ(uܯߪKq͵Cxj[ >eҸ@i'*YH&bK;OZͰi3^Vv$~(+KN6b8؜u;}dasWQu4\7M&,s{ 뱬MmAJ5xКE+ nDRw67fomSurT:G=!ʎM{kpA`zf:*Z2V%\HݖVYޤʍgZi()¸u~O^1 *b\ٖ-α&)/n%kTԙcnX`j{ҹRـ}VMeXAϷU:$6hp 8" 7nA+B85r{}B$3<h:I`]8@Z.px[3`gvS?jٙf{C A@:ǘٻ~o|9*V-,p$d־ܯD}J+4_M. QS}!^,Kjq nᡏ37ӌ$.LOftqu2+.6! oOfm{ IOzLL2 <g331v[s:qƖ9v rT3b&%+ߐ(Q)6o'+@IBjKHxT]_M:-}%ݵvlΓLjƱt,koz[2dzr7i^oהU]~Ggl/E5U )"' tT]oӏab۫O_`؁s*԰̬'ɛs4wd%bmtT~Nz.X J҉M;.3gxXE煊}!Q 1k oVQ-H)CY0Ɀ#l2X IqR~1!_1Zc5$SapnH%zORiX `I!ps<"^)dt&4ƤV~׬"\BmaWSF(=9Jik09۴@N˚:#mQ:gDH;.YY(W%wDz&$ͦ4rvNl|20Q`ze>jAE,_rvdʸĪ8!5l5 #i>WB Ak<4 nXf6LHMn}KpKg]jᎩi$#aO~RXcu:I'WVL5}b.DWIم~w*ł2:5u@K=jK;&oɰvA.t޷2҈xi'/ʷ|EN ")H5'#SJק+` P~'=<)l )# b/xTpSOкnѨf0l9_R:oORuJaӺ#a6}y~0VВ'L;۽K򱇠˾4\{4),3+ygHCԬSv+#(F&u4GuͲ[ "w10J_QMef8QŒyT5o71k Q\@RQ̛UaK=)`!5C"[Al+n!.ק};e~=%!PSDK(ɿud_^"Q) OGN냛^ӆŶDcB؍Ҍ9=ȔHbS>hytTnT~˜bqUNtT2}qU{jP2! '^lB@nG$? {# .0`~} s}Ǔ.;GyYX{e˃YAeV|zgmuq8*m+KhB?ϸ_j]>P )Eb1@uxT[- &9)%u(v Q)СO7&c >ڕc U#Q&: @Æ"'<4Z&߬ Ͽ,$ ŢvAV6aTLxx/4i\p̌OkK T0^`weutį偌]Zϳ} v Z>IL $N0Tٙ4ve@\C(m:}F8hdDe3;uuēwz w*t[}?W#qFԔg?ϱ`Pg"xa87q:bVqx&1i=7CN4JGV'y$ t :+Tp\ܑB9݄N<=zNQij [nq-*[hDEVqso|9L gor{{OAT^CvOpDU',U/k9CKOI\t=4"2sǼ+*o ް o&W0״Dtce:FHቍRߗB,0YPà`o=t0=Z Foono/LU}qiEju+~> ψx3Ux,*Sss]x>A{ҸGPJdB|9%o,&n1;da '1m vo Wl]p,c5":, >]Fz͑PɺD̋6‰`Y4 k;JչwJS)9@z&kA4%7 lgjX 2MCY2TΪGnj4V|wsCQ `d/(BT݆0i3h5C&j م1clCzWlu[h% 4coVln< C9o.4:t[8}62UYs'4L gV>z$fot*+ڽo+?=|j3-Imh&NS"qD-T4|)%zsύ;ep0]"UpM. Y!][!HwV#؇49bkvf0+Kf=FT#BJcz,md3fwjٽ[йj/0ڟ<ڰ"= DdBmRgⱷx, ePgx9ʀuLd"'s(&9@CL-c j)ߧTw?ƒCj#¢YsŠb[g 'W$&xjeI#< t6(IK?ЦFF{eSYɡtѐA3{/sޭFA%R!:/SvL|(/PdF%`=Z a0=16{ޫ|E)zSUWBW}^L@ٕq8ȝĔf5;6^Wuw|@`'|Ğk㳰w wKlu/9n;DT<\hNɜg0S6bpn@AwYqOm?Hc%d hYI⦻]z6&~΋?^S> stream xڍP Mp65`!8r9jffuݽ&#W21X;13rDd,ddfTAf6b؃/@w5@`bffd032rhc t63$mAd"6nf&/Ґ Ag8@ dofMAV'-J6f GIAkhBr7᧢9A {g@+߭ÓMr(;Aw!=dx?$! YE@ rLLMw̬ X̬Mf 4#-hmh`tY  )ݟ=2EDl@֎d~n ?m92X9$y7c399Y ;ДlA:0akc 0~oef zp:N /;31  3kA7sh1ˏ tfdcm'fRWU:m\t:f YfWH kc_ž v[sڼGڌl_Lg?U"1'K?@+3Kur|IT5_+22s^ G,YX"\AFfj/sfif q0c} -޷û$tgO61cȘ@{{<㻒LhrSzk{w^c{? /`qd8 *E59X`0Zש?vt`//~{AV?gfka0XG_C`OwmWd}_K|/+;:.{ͿN}:E GHN;9*su@ CEC@!\I9}T*:NOȰITՙ[wBI#D)oW {6%(?{)/OcN ) xTl$˱sDC{pZ?P6pP.R6KW- Q$֒GIQ7F*zBϱ.ZX+\_I2mlOi]\ľɵ ݇8ʺy@jJr2ޅXo; ]怳۳<֣|vU`2=5Ckf}ZSeo4Vx5 rC1qE' &s$zY"$60nժ$~0QL* Uo~SQw[5חSC:9ף6:\YR;FE+n,qm =Hѫ3noxhN{2*guLq Ja%fdNyժe@*}l~"؃K'`aq Cu4CH|̻` яb]^ƏX| %tB2{Z긣 /斮D$\=u>]PRx,ԍ!*(2(8]3OMvx܋U /EDӅ I9,ʆA8]yH FK d =?Lmd[ .ogb`*#g;Ó9ӹWT()ҭfEr#sF`Hp}D0R2Uxk"}rnp/@aZ,ȒCO>NW+O(3` Is0ViORv(Q2Eeie<•X2+" kgo ].bGQaۙAkf_?[J\WdTl'++oveja~K w8*&U~4V#1uiO;*(6ՅETV(YhC>}ߗq{(! B*`j=+Q隩(a8{V''?Ė93rCs}guc#ݏYi{ O什VlkFa0faG,~GK9؁z k4ArlyTKnݫRY)X{7kxchqe/qcZַ`/>FvMQ 4"\Vwv5j BfC U(,ma!eسwYfH?OzLơrfx3[F b"q:m)2HmsdMu4U m#+J׏3[[H%~Hĕ6rzx͚Bۂ|k>@!?$FFwy"Vرrp%JojbT-[^UQI垜`NߩN`z'nۧ\7q[(n,.۽1]tIEIEJpv-:e꟬DQ3n`2)!*?TA+"4U&6Ƌ$ݧ+v"0KC!^ Rqc0?%'a16^:~jTgwδENƻdo~^P8,ާuUvR8i޸om+S`O誎fڤB0zƌ 5*3+}S5(M6xX #+n@8{jres}Է͍ m6qDxCЭjWBI&"mO$}ۘd3I&J] -lX`t˔*"9SЇ3@v[wXA83 }5TrC<$dV=~~HLJ'JF7`AT3K]I(::bU&>Sr^gGNCucTҮzOgT57oV8'(Z$Lp>4 H#zw7URo#Qʞ03De ӋپzO,|N#Pt )jB ei4!؜$ *C19K4v1[Ц<^j>v<<}6%r؏W,ZĹ4NQ^yaڍ E%ԃ3J,W& 0csW[ k |_feڞ[#;spNYD]KCVJq s^(BQ~VŒ^M|? iT?qR.4^~0r?վu)aAѨ,'й - XِO ͡|M=5}~*7}GZ_'SܳR)6@r;U|0PX>1m0|_rĎ~p *8"b l) f S9W:]>a1o]>z^GȔL%UpgTW^.O0VoDMxh)k9|$廓@1$66K^U$іMn,T^yUhi\ͷ\!ԡiRvrDE+{h>:__ɸC%_x7)M7{WJn`lk*S ,@ ENj#[%duH-_ھ/ByD:Q㍃s$gGXh 3HET ;8Oӧxcn! υr ( 毾C4t5ĕc\qDJ~MzwzR5*@e+9cG Sx{%:"-fS3Ts&o~ǵ7QŋD$^P# H I{hٗsks #q1qOJdDʈrs¼5 1NْԳ;+،͞Bh}a@%(t5FdhTjp&PJQ t @ޙo Je%OuȘT:uE|֚%+b"aNܔAA\H8c 1"D:'O "L Do5R ӔTbYxM)j8C6W: Xil+ɮ5 et"6SNE꞉ň('Zdj>0TA13dɓ%V'HО}oA)PC$" L.L,LCP_ROzxgzjKZb0à+HF 'a`#!q`=hӂ`߳i/rYNT\iFbQUvMlQd8"JKoKQ<*5BL(,(s$|(q d\ENgJ1Z vru}qQJlmfOYz$74=NYXk2l\#=S|l~n|]xΦܕ64/c)7fof4L9\/$5@zko#>v*.d]Vߦ 28)!u+e:oY1yQ˛|v޲9x0v<<5nGiؔ6Jv<]zQK]crC(_ ߬F)22.Dw?X6tOa~s'EB*ƃi5X(Q:X)FE)`b8аnhd[]P ^poBQynt&:)Eﲢ`9QVCn>fBLf+Zl8Mֱ òsA$>Yx1Gz;T·62edsPm%24d&Ws~7y#, f}+naϋD>rg,GC%՗r'{E6|@QP)ņCR.2nj~>E(u'Ube?dsFddfXH k'A\ 7\%kS"T)8[ K[~M<#](iԭr`[%BTI]-Oڗ%}OWX #`g aq+)-j"C F^IC׈lmONIʊ:.nDQ \Do`qHDޭcDo!C:#<% Ok,(SVi  JwoK:Z&v wn h*"zc8{K4 gɵ,qJ%eVdD<#,~QtM0;>"(+"l >~JpK@u+[r(ϪWLt 'Z59+K[*+Irmk=LՕf.i ?¤i2X6$l@9,L!}MhtV̕i38Kc Z1!RVÇFPhQ9v\JE1Hn :6~D\[*C#6pǝ@*my$յg9e ,7WLmzA+ɓq_/"!KF6u}הsup+A zPX+9g1 0CO%Rҥ!d# ~Ӆf>?ʁiy@ّW{A {r,j>^[ Hx@wȖoGwFgo&=g6| ^dDT=ip"GJIu@sl#}q&SZ>Οd*H=>(k2DzU:y[j/,NNeAڦK3-k^a12"KI ^*U}pw'7w(3.ܻdI0Po˧=g,g.k'a;ȩk/ }0M$pD2CJ21 6}۔e~Ø6먝׾9Ҝyg H!}QIGoZN$y3G? &e7*8F"eS85DRr'J2s 4{'Vڜgi!S<_Ad,rp{R] E){W@^ɓUma^i?9Pp$|0{s>%qܨ=ӴP"8/ca|i]2:}3 m|=.ޫųVn2JcE:\c/ۍa\Lgcbj}Hn6z)+:uJ?ƫkӐ/dVZ*'$Fc䥣qX+c^YIKV/? ql@MU$,݄Qol^Ɋţ(N |sEGm7}?B7`.ڝxSҔn\ZTF* lSEgP~CFkGG05I$̤q̥Ra٣׵̏2M1 ۠>Nb-}s[j]ehx5 \S3?X%s`&O=Lkoy|I.6.^LeHqoiӎ+5aM vv_ MYܓp;LH Re@M,uQUQEU?F3A'(Zqr-o$N`ҕG7&6ajIaM&DL3q!.BHB{\:#8׬'V{d9?ܤpvnwFi׋b-gY'ˤw.(06u5ڭy^D=t}xe51%Dѻdj)Y%45 Stuˏv*,ŐMGӖ.Ӆ[y5Å^"ٓZ|R>:??[Ogd:P4.zhx"oUxJbMIY0BTx8j:_(q]4G省St8b#5u54 Gfmj˄S #0 }G>|Lm2Y+Mh:iwp(Z)ስGKq/SN^xfcI+.Ww_GQjN!~ow0sY=OѝgyV|Iuw] ۰rď)$ xMS녳I _;/u|8/8"pB '?8KKKy]\?_B3H6òdquDz4*)=l(hKXnl{8&;ԄU&ĥƫ s 3X2Z1~t7+0'5WɎKT_d&RAa:pfX*![rGQ#lg5EM@ͺ]Vsܭgo{2 ;\Ue!dNu<;,#[ן9GfSŋgJӿ:=} 5Gj90 70jDc2ϲ&ݡIDHD]H=ᒵbnI6ȂmP LtՑT-᫥ѢG1$ډz(1+ڟ􍧖:0_y/֘ȁaReGQuf e_t;L}CUK@H1LmXYBǃW_|s?שh.o,TIhRf]IakzN(&e܍ykL5uL8M}'m3đ%2OĒơ(b6I Ҭ563UЯr.:; Bۦ&lA)_zeTMx,F9/ $;^<s)*XK7RWD^*vC?[KP!{ɍ(DWB#"e'8(]q4Fo,_j ik1DwC؄Ra:FS-tk#)z#G˂IzGaZUSWfhd<ΒhWRxH.m)ꭕFR*C3,9COOVSL<|t՘ż!≠Fg/|CioFYo! '-Z'9Mzv#+HA؊ږ'_Vf%+mӂ{]|c=8']GO"Qd@HlYxm ]y5k!-*82>1DMGJ@C>WUdd6ٵO&Xw`e'\h1HZK$7fWVfWS7X-hMHq -jԐW!_^/r=> stream xڍT 8kV.aR:HmV{؉Ȗ2f 7!K)S(: s,8-"(:\am:X1v\80i6LaL bE++4Dꑁ (D?ōadv)o8lN9{hgmB1BM$"bio?e!!3u,?P8$bV z0n04ٴ״B`rCy$5\`a)Aw_aiQ ˥GH( ψ Z.P.nJ8Y~}@ `a|闈~C`}lfQ?:)oc@ qgG|dž!r1K:ϼ1pZP]*?Tz}ڑ_DR[*uogm61J=s)fsסW(})YN 2*gݨGxJ7|wRf :ȲIk.gqvڊAK9$dlL]0]Udu\7bY|]D׵uY2썢 ok U6|4*}<'-Way+r+/qxxh!t3K$ȶ:[IK):ꆯ4۪g(*诱 <\H~oyE&*?fN H$n|5ymd(f#7~|o -5\3ivIYRx3_•Wepյ3]wR쾌b!a+k*FkDGd+kP?mq6iV\4{J#IcctoV ,iUtͩW:qP\Yl2u bՄJmҜ] X 6u$-%u,mu]-6hl$-DZ~,䭬غ5xLe7ߝS&~hB$n^XQihN,"5 hO9|ZĶNsB3@nf^[pNmI3rp' gFLh"58Q˾:7N=*W\g}ilvWxIu8y{{1;7z$r<,}eB'QEowQOϲo?8IsNQ>կ x`Zv Gzǁ5QlUXnSn 6o?uWqp~Uj֟SUϮ)-/i2! N`RTTWIz*ťZNwSW%Ze/EH֠5b';_ O9t˥V,9҃S\Qyf5nSp$9QSG>R[52ubi_Ի?z)!U\`f2a'ZMMe{C3塞U)}Ikͧ} ׹]ݜVu,v:|bɃ_gVg)xyKG-Wq7J>=}+s< AMS.7Vk}d,aoXW坛j Wh8 -FOղZc8:%ηo4WVgK? ȩUvu5vZx:ŮnTJkշ>[e0&m`E{YyYɡ v]1RW0Y?dUb-7<tBZW5ZٴTiG̽:k/;)M"K'rV 9^O՜^iD\N>XgyX}"Vr{?_tfD@DBsDz Ƕ9 O@I#PlranF͑nmN7\ꯪ`+uX&0TRN7 4x߇c{n$ydf\%^M=+.ٲ˟_;,~E|}.ӑKICxj>UI <47 iqZuDQ(Իf^ߖtUrvd|mL!Fs/ݱ?u7V\4Uc\b_lr}J9lsV^1YrϷOZѠQxE%gw^TCQ.rdQڰ<„/m!Ϻ:E*+S]piE-eRH8;]{[P>'}IyG$^bw͉Nq endstream endobj 119 0 obj << /Length1 843 /Length2 1160 /Length3 0 /Length 1754 /Filter /FlateDecode >> stream x}R Tg>" Ry ! e Bڀ]S[;ߺn]jΜL9o2Jsc2[_iۍWB:EnZF4f#sj,j=7caAk9Bi-c0VeGިJN=f`؊6}/[fYمul;YӪ}=Qbw2˜aE<ʸi"',>qrb{bdT:VfX VŧYf;?A]~ayj*\l;lxb1UOC Á@k 懟ou ? U`bwc4e?[vmŧ{~Kg!ej$=1-״x^v˯o y6h4($jm3B2yV_t+2Kb} ^ʈU)VbG~m8++#*iG$6(6vHX]m`Gdhi^i<5"Vq/0:Ȭ~KL솩i9;DRUm͗w]x3J$e(+Jl cwcڎu5'n(TidydДr]Ӓ+j5'>);;~f9uD&2>߇> endobj 11 0 obj << /Type /ObjStm /N 89 /First 746 /Length 4435 /Filter /FlateDecode >> stream x\[sF~㺶̹NJW˱-;b;v&aTұן,=jLȌg" .:fBeJLL;љq*!s.>ZfJe L2ZBh֙@A"@8L{MN22ȁ*X؆LZ3]f`636ĭ3akRd5 ,n-̺LY2 ,uu`kJ[ 7x98`e|R6`z2ꍂȼBu4--U %l?x<83,ęx T@BHAIU7b@1`5CZIv)iljȐv$_he 3Q0;P2FyX+cJ@'8x5 P-(Ɛ2{ ;Ќ 9YFaоy0qv`‚7ԃ~oE^Wŀgb,3.z^|% (Ɠp5aT?(>|,G8 @4駌5ށ.hQ0 6RYuQb>(i.VL=dҝkTZJu_UpTz5Gmľ@Տ mC$R4ⵥNq]{ 7F@K-` 8C $%I˾`.J賌X@- ImH$ )0IXhE R,Egv?CYcD{]NS:{o'2{ZޮHjT,!TУX}ZGv=9`yYY1R,'|Nfx2,VVӣ#\1 ?&#z5{;Isxs@}zLf#j,%+l<Pr®ղ`b<-d:.M>ZgӢ9$@l<d|9.>f#04W|%_gl#6 Ir WA5em^~g14@Fc'ol {Bc +-5N! P5l7,/6>}v?8lAk3ć Zk `_.s6@kl0b\!>*CCI 8S(1T[i,OhٮEIyﴖǬ0=w,zq?T GelB:7eu Y;[,ýj~EAcB}N,V0r'N 6$"վ";NPH١='՘qz7zi!D>׌$ϩ[Jg=@mAJTK&\h"``NK)Uxc&iB5P֒5XDL#.aPQ&0iدtҖx.6ƶdZcй\@_ҁ;I{RCsh 79KŀRxwX20iޒ{S".qcZR$cND M |RȂhdI%7i*нȂ ɖv: ^Q|0d+QX/N{ JX <"8{?! k%_djѷd? NLRIr}wҠQw<Н@U8I ㈷' b@X6cenS K3@Q1dVm a$j,IE%ڢeh;uWހY#O {%C֞+,PEA9%X28Ur*fُѶ[`M.4(ܴG|GQvqpXŃq:*-qf@IT}h`VQ:đ@H6ݰW>܋>E*7Ӳ3cR0Z5uZJ?.)*vȦ饳`c2%78|b[RF*b؁yU0JDNuvo"kf]6v{ DFOG-ʆF Ӟg]ܭ,ml9G`*Ūl0vb6¦B=mБJ *hUL0ٱjcJ#Z]-Ƒ($TD.p,Fh32P)iI-x2RD1gFBg;I+Ѩ/kmTǖz$ZYώ34յPKIFbZ1"7*o8Xhx -"3RXEsiOHF+^ Tia %zV.PT~}syf E^7tX RSeh#x'tL'S ∃'kS4эz[-&"羽<8G/ 7U8^x<66{,1 }_0(=+&WC6xOt2:]M _,7Ų{W-\4;`=e v^|:A{s1+gy®5ٔݰMf9 Vr-zQl眭؟+(Jw:=yv~|~K!XW^"P@M|L"cvAWII _4MFg\K`Q""k+WyOiX_l5knw >܈kPwYcY\@sł6EYGmדy`rӄAc"#D⁀T v!t ?}@QJw'oɽS{rrukp~DmB\q >Kނ`{ĸ/2Hn!欸5+f*bF@r^Dw(Z T_P/nfU_Ҭ8>.kq3{//|3}U,-;)ԟ8zJvГ90x0fͧ0ס_cC0@ؖ|;ׇ'??#\|*y&s:[>#Q|{{v痗uU+mM~RvSG~QGޢUк+wc:&Qdh;ʙnbjyz)d>?;x9^@R̀=Өtꂁ_{T {C6+nŨeb__|F)H5$$=X{LQ֖jgTA^G7E.Ī5z-Qn(eȬӌT-[G݈USJY~g$6I.1|k[h~sLYǸ? |CiV|0n*$&7Q<0c.;7oG{ O,%2Pz;/K ̻:m9>fμlo0 {}.xEzO87)sa;i:7\λ{lnXYwNx r_|wޝs7&ܷ ׬ݙ]ƦS}D{>uvY;&.PƉ~T;pɦ}.H)Aذ7V{N,:16w+. sS/e2i-{n 徙Juu˲waoO[R ğ^M~Y]d\fᢎB2 l`?qG\ǟ ޫ_uVPkίqi/| endstream endobj 124 0 obj << /Type /XRef /Index [0 125] /Size 125 /W [1 3 1] /Root 122 0 R /Info 123 0 R /ID [<2D9D03073E76592A7132D2674FC04139> <2D9D03073E76592A7132D2674FC04139>] /Length 342 /Filter /FlateDecode >> stream x%I/Ca󼷆PX<ϪR3Uj  b%"J,j {.l$V"9O{3"9 Y$dDHmHfTgduJ Y#)ks$dB:: ;Ɇxҏ!H#:+"ȽCd|$rO=r%)DMRBJI)'3T*Ս]Ԓ:&4&LZH+i#t.Mz I}G/5\a ҿdiy/0L黖ٛ99yj$|0Z/ZoZ~X Ә!.+,6 endstream endobj startxref 235703 %%EOF Iso/inst/doc/algorithm.R0000644000176000001440000000467113475566552014721 0ustar ripleyusers### R code from vignette source 'algorithm.Rnw' ################################################### ### code chunk number 1: algorithm.Rnw:27-28 ################################################### options(SweaveHooks=list(fig=function() par(mar=c(1,1,1,1)))) ################################################### ### code chunk number 2: algorithm.Rnw:33-39 ################################################### library(Iso) sdate <- read.dcf(file = system.file("DESCRIPTION", package = "Iso"), fields = "Date") sversion <- read.dcf(file = system.file("DESCRIPTION", package = "Iso"), fields = "Version") options(useFancyQuotes=FALSE) ################################################### ### code chunk number 3: algorithm.Rnw:474-482 ################################################### getOption("SweaveHooks")[["fig"]]() require(Iso) OP <- par(mfrow=c(3,2),mar=c(4,4,3,1)) for(i in 2:6) { plot(ufit(vigour[,i],x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main=paste("stand",i-1),cex.main=1.5) points(vigour[,1],vigour[,i],pch="+",col="red") } par(OP) ################################################### ### code chunk number 4: algorithm.Rnw:500-506 (eval = FALSE) ################################################### ## par(mfrow=c(3,2),mar=c(4,4,3,1)) ## for(i in 2:6) { ## plot(ufit(vigour[,i],x=vigour[,1]),type="l",ylim=c(0,0.3), ## xlab="year",ylab="vigour",main=paste("stand",i-1),cex.main=1.5) ## points(vigour[,1],vigour[,i],pch="+",col="red") ## } ################################################### ### code chunk number 5: algorithm.Rnw:519-525 (eval = FALSE) ################################################### ## xm <- apply(vigour[,2:6],1,mean) ## par(mar=c(4,4,3,1)) ## plot(ufit(xm,x=vigour[,1]),type="l",ylim=c(0,0.3), ## xlab="year",ylab="vigour",main="Mean over stands",cex.main=1.5) ## points(vigour[,1],xm,pch=22,col="red") ## for(i in 2:6) points(vigour[,1],vigour[,i],pch="+",col="blue") ################################################### ### code chunk number 6: algorithm.Rnw:530-536 ################################################### getOption("SweaveHooks")[["fig"]]() xm <- apply(vigour[,2:6],1,mean) par(mar=c(4,4,3,1)) plot(ufit(xm,x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main="Mean over stands",cex.main=1.5) points(vigour[,1],xm,pch=22,col="red") for(i in 2:6) points(vigour[,1],vigour[,i],pch="+",col="blue") Iso/inst/doc/algorithm.Rnw0000644000176000001440000005334412535262153015251 0ustar ripleyusers\documentclass[11pt]{article} %\VignetteIndexEntry{Algorithm} \usepackage{graphicx,float} \usepackage{Sweave} \usepackage{bm} \usepackage{anysize} \usepackage{wasysym} %\marginsize{2cm}{2cm}{2cm}{2cm} \newcommand{\pkg}[1]{\texttt{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\R}{{\sf R}} \newcommand{\Iso}{\pkg{Iso}} \newcommand{\fol}{\mbox{$\prec \prec$}} \newcommand{\iuc}{\mbox{${\cal I}^c$}} \newcommand{\ilc}{\mbox{${\cal I}_c$}} \newcommand{\qued}{\rule{2mm}{3.5mm}} \parindent 0 cm \begin{document} \thispagestyle{empty} <>= options(SweaveHooks=list(fig=function() par(mar=c(1,1,1,1)))) @ \SweaveOpts{eps=TRUE} \setkeys{Gin}{width=0.6\textwidth} <>= library(Iso) sdate <- read.dcf(file = system.file("DESCRIPTION", package = "Iso"), fields = "Date") sversion <- read.dcf(file = system.file("DESCRIPTION", package = "Iso"), fields = "Version") options(useFancyQuotes=FALSE) @ \title{The algorithm for calculating unimodal isotonic regression in \texttt{Iso}} \author{Rolf Turner} \date{For \Iso\ version \texttt{\Sexpr{sversion}}} \maketitle \begin{abstract} The \Iso\ package provides an algorithm for applying isotonic regression to data having an underlying unimodal structure. This algorithm consists essentially of ``divide and conquer'' approach to this class of isotonic regression problems. Repeated application of the algorithm permits the estimation of the location of the maximum of a data set assumed to have an underlying unimodal structure. This estimation procedure is ``easily'' (for some value of the word ``easily'') shown to be consistent. The performance of the resulting procedure for locating a maximum has been assessed through a simulation study described in one of the references. This document supplies some of the background on the algorithm used calculating unimodal isotonic regression and gives a theoretical justification of why this algorithm works. \end{abstract} \tableofcontents \newpage \section{Introduction} \label{S:intro} Algorithms for implementing isotonic regression under orderings other than the simple linear order are difficult to construct. The best known of such algorithms is the Maximum Lower Sets algorithm \cite[p. 24]{RobertsonEtAl1988}. This algorithm is complicated and hard to program. It is also reputed to run rather slowly, and indeed the number of operations required grows exponentially in certain cases. The motivation for developing an improved algorithm for performing such regressions came in part from a data set being studied by members of the Faculty of Forestry at the University of New Brunswick. These data consisted of observations which had been made of the ``vigour'' of growth of five stands of black spruce. The stands each had different initial tree densities. It was expected that vigour would initially increase (as the trees increased in size) and then level off and start to decrease as the growing trees encroached upon each others' space and competed more strongly for resources such as moisture, nutrients, and light. It was further expected that the position of the mode of the vigour observations would depend upon the initial densities. Plots of the data did not make it completely clear as to where the leveling-off point or mode occurred; the Forestry researchers requested a procedure for determining the location of this mode. A procedure which comes immediately to mind is to fit unimodal isotonic regressions with mode at each of the possible locations in turn. The location yielding minimal error sum of squares is then chosen as the location of the mode. It is thus desirable to be able to perform a large number of unimodal isotonic regressions quickly and efficiently. Formally the unimodal isotonic regression problem may be stated as follows: Suppose that $Y_{ij}$, $i=1, \ldots, p$, $j = 1, \ldots, n_i$, are independent random variables such that $Y_{ij} = \mu_i + E_{ij}$ for all $i$ and $j$, where the $E_{ij}$ have mean 0 and variance $\sigma^2$. Further suppose that the $\mu_i$ have a {\em unimodal ordering}, i.e. that \begin{equation} \label{unimod1} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k_0} \geq \mu_{k_0 + 1} \geq \ldots \geq \mu_p \end{equation} for some $k_0$, $1 \leq k_0 \leq p$. Of course if $k_0 = p$ then we have the usual linear isotonic regression problem and if $k_0 = 1$ we the linear \emph{decreasing} order isotonic regression problem. The problem is to estimate the values of $\mu_1, \ldots, \mu_p$. The (weighted) least squares estimates of the $\mu_i$ are given by minimizing \[ SS = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i)^2 w_i \] subject to the constraint (\ref{unimod1}), where $w_1, \ldots, w_p$ are a (given) set of positive weights. This problem may initially be subdivided into three sub-problems involving only {\em linear} orderings: (a) estimating $\mu_1, \ldots , \mu_{k-1}$; (b) estimating $\mu_k$; and (c) estimating $\mu_{k+1}, \ldots , \mu_n$. Sub-problem (b) is of course trivial as it stands, and sub-problems (a) and (c) can be solved by standard and well-known techniques. The question is how to combine the solutions of the three subproblems appropriately. The answer is essentially to ``interleaf'' the estimates resulting from solving sub-problems (a) and (c) in {\em numerical} order, tack on $\hat{\mu}_k = \bar{Y}_{k.}$ at the upper end, solve the corresponding isotonic regression with respect to the resulting linear ordering, and then put the estimates back in their original order. In the next section we make this answer slightly more precise and demonstrate that it is indeed correct. The idea may be generalised to other partial orderings and to other ``tree-like'' structures as well as to unimodal ones but we will not elaborate on the details. \section{Notation and Terminology, and the Main Result} \label{mainres} Let $k_0 \in S = \{1, \ldots, p\}$ be given (to avoid trivialitie assume $1 < k_0 < p$ and let $\prec$ be the partial order on given by $x \prec y$ if either $x \leq y \leq k_0$ or $x \geq y \geq k_0$. If $x < k_0$ and $y > k_0$ or vice versa then $x$ and $y$ are not comparable under $\prec$. Recall that an isotonic function (with respect to the partial order $\prec$) is a (real-valued) function $f$ such that $x \prec y$ implies $f(x) \leq f(y)$. If $g$ is an arbitrary function on $S$, and $w$ is a non-negative (weight) function on $S$, then the {\em isotonic regression} of $g$, with respect to $\prec$ and $w$, (denoted $g_*$) is that value of $\hat{g}$ which minimizes \[ \sum_{s \in S} [g(s) - \hat{g}(s)]^2w(s) \] over all \emph{isotonic} functions $\hat{g}$. Let $S_1$ and $S_2$ be two subsets of $S$. We say that $S_2$ {\em follows} $S_1$, (in symbols $S_1 \fol S_2$) if $x \prec y$ for every $x$ in $S_1$ and every $y$ in $S_2$. Let $S_1 = \{k \in S \mid k \neq k_0\}$ and $S_2 = \{k_0\}.$ Let $g_1$ be the restriction of $g$ to $S_1$, and let $g_{1*}$ be the isotonic regression of $g_1$r. The weight function used to form $g_{1*}$ is of course the restriction of the overall weight function $w$ to $S_1$. An elementary but important fact about isotonic regression is that $g_*$ takes the form \[ g_*(s) = c_i \mbox{ on } L_i, \; i = 1, \ldots, r \] where $L_1, \ldots, L_r$ form a disjoint and exhaustive collection of subsets of $S$, and $c_1 < c_2 < \ldots < c_r$. Moreover $c_i$ is the weighted mean over $L_i$ of the values of $g(s)$; i.e. \[ c_i = \frac{\sum_{s \in L_i} w(s)g(s)}{\sum_{s \in L_i} w(s)}\;\;. \] (See \cite[p. 18, Theorem 1.3.5]{RobertsonEtAl1988}.) We call the sets $L_i$ the {\em level} sets and the values $c_i$ the {\em level} values of the isotonic regression. Let the level sets and level values for $g_{1*}$ be $L_1, \ldots, L_{r}$ and $c_1 < \ldots < c_{r}$, and let $L_{r+1} = \{k_0\}$ and let $c_{r+1} = g(k_0)$. Define a function $f$ on $\{1, \ldots, r + 1 \}$, by $f(t) = c_t$ for $t = 1, \ldots r+1$, and a weight function $u$ by \[ u(t) = \sum_{x \in L_t} w(x) \;\;. \] {\bf Theorem 1:} Let $f$ and $u$ be as given above. Let $f_*$ be the isotonic regression of $f$ with respect to the usual order on $\{1, \ldots, r+1 \}$ and the weight function $u$. Then the isotonic regression of $g$ with respect to $\prec$ and $w$ is given by \[ g_*(s) = f_*(t) \mbox{ for } s \in L_t \;\;. \] \textbf{Remark:} Note that $S_1$ consists of the two disjoint sets $\{1, \ldots, k-1 \}$ and $\{k+1, \ldots, n \}$ which are unrelated with respect to $\prec$. It is easy to see (and well-known; see, e.g. \cite[p. 57]{RobertsonEtAl1988}) that an isotonic regression on their union is simply the amalgamation of separate isotonic regressions on each component. That is $g_1*$ is obtained by doing an ``ordinary'' isotonic regression of the restriction of $g$ to $\{1, \ldots, k-1 \}$ and an isotonic regression of the restriction of $g$ to $\{k+1, \ldots, p \}$ with respect to decreasing order on this set. To prove Theorem 1 we require the following definitions and a couple of preliminary lemmas. {\bf Definition:} For any constant $c$ we define \[ \iuc = \{g | g \mbox{ is isotonic and~} g(s) \leq c \mbox{~for all~} s \in S \} \] and \[ \ilc = \{g | g \mbox{ is isotonic and~} g(s) \geq c \mbox{~for all~} s \in S \} \;\;. \] Let $g_*(s)$ be the isotonic regression of $g$ and define \[ g_{cu}(s) = \left \{ \begin{array}{cl} g_*(s) & \mbox{ if } g_*(s) \leq c\\ c & \mbox{ if } g_*(s) > c \;\;.\end{array} \right. \] {\bf Lemma 1:} The function $g_{cu}$ uniquely minimizes \begin{equation} \sum_{s \in S} [g(s) - \hat{g}(s)]^2 w(s) \label{eq:trunciso} \end{equation} subject to $\hat{g} \in \iuc$. {\bf Proof:} For any $\hat{g}$ in $\iuc$, \begin{eqnarray*} \sum_{s \in S} [g(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s)]w(s) & = & \sum_{s \in S} [g(s) - g_*(s)][g_{cu}(s) - g_*(s)]w(s)\\ & & + \sum_{s \in S} [g_*(s) - g_{cu}(s)] [g_{cu}(s) - \hat{g}(s)]w(s)\\ & & + \sum_{s \in S} [g(s) - g_*(s)] [g_*(s) - \hat{g}(s)]w(s)\\ & = & \Sigma_1 + \Sigma_2 + \Sigma_3 \end{eqnarray*} Now $ \Sigma_1 = 0 $ by \cite[Theorem 1.3.6, p. 23]{RobertsonEtAl1988} since $g_{cu}(s) - g_*(s)$ is a function of $g_*(s)$. It is also true that $ \Sigma_3 \geq 0 $ since $g_*$ is the isotonic regression of $g$ (applying \cite[Theorem 1.3.1, p. 15]{RobertsonEtAl1988}). Finally \begin{eqnarray*} \Sigma_2 & = & \sum_{g_*(s) > c} [g_*(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s)]w(s)\\ & = & \sum_{g_*(s) > c} [g_*(s) - c][c - \hat{g}(s)]w(s) \geq 0 \;\;. \end{eqnarray*} Since $\iuc$ is a convex lattice we may apply the converse part of \cite[Theorem 1.3.1, p. 15]{RobertsonEtAl1988} and the result follows. \qued Exactly analogous to Lemma 1 is {\bf Lemma 2:} The function \[ g_{cl}(s) = \left \{ \begin{array}{cl} g_*(s) & \mbox{ if } g_*(s) \geq c\\ c & \mbox{ if } g_*(s) < c \;\;. \end{array} \right. \] uniquely minimizes (\ref{eq:trunciso}) for $\hat{g} \in \ilc$. Lemma 3, given below, is an immediate consequence of Lemma 1 and 2: {\bf Lemma 3:} Let $c_{k_1}, \ldots, c_{k_m}$ be a subset of the level values of $g_*$, and let \[ S' = S \setminus \bigcup_{l=1}^m \{s | g_*(s) = c_{k_l} \} \neq \phi \;\; \] The isotonic regression of $g$ restricted to $S'$ is $g_*$ restricted to $S'$. We can now prove the main result: {\bf Proof of Theorem 1:} Since $x \prec k_0$ for all $x \in S_1$ it is easy to see that there is a constant $c$ such that: \begin{eqnarray*} g_*(s) & < & c \mbox{~implies~} s \in S_1 {\rm and}\\ g_*(s) & > & c \mbox{~implies~} s = k_0 \;\;. \end{eqnarray*} The set $\{s | g(s) = c \}$ may contain elements from $S_1$ and may contain $k_0$ as well. For this $c$ \[ g_*(s) = \left \{ \begin{array}{cl} g_{cu}(s) & \mbox{ if } s \in S_1 \\ g_{cl}(s) & \mbox{ if } s = k_0 \end{array} \right. \] otherwise we would contradict the definition of $g_*$. Applying Lemmas 1 and 2, it follows that \[ g_{cu}(s) = \left \{ \begin{array}{cl} g_{1*}(s) & \mbox{ if } g_{1*}(s) < c \\ c & \mbox{ if } g_{1*}(s) \geq c \end{array} \right. \] for $s \in S_1$ and \[ g_{lu}(s) = \left \{ \begin{array}{cl} c & \mbox{ if } g_{2*}(s) \leq c \\ g_{2*}(s) & \mbox{ if } g_{2*}(s) > c \end{array} \right. \] for $s \in S_2$. Therefore $g_*(s)$ is a function of $g_{1*}(s)$ on $S_1$. In other words, $g_*(s)$ is constant on all of the level sets $L_i$ of $g_{1*}$. (Since $L_{r+1}$ consists of the single point $k_0$, $g_*(s)$ is trivially constant on $L_{r+1}$.) Let $g_*(s) = d_i$ on $L_i$ for $i = 1, \ldots, r+1$. Now \begin{eqnarray*} \sum_S [g(s) - g_*(s)]^2w(s) & = & \sum_{S_1} [g(s) - g_{1*}(s) + g_{1*}(s) - g_*(s)]^2w(s)\\ & & + \sum_{S_2} [g(s) - g_{2*}(s) + g_{2*}(s) - g_*(s)]^2w(s)\\ & = & \sum_{S_1} [g(s) -g_{1*}(s)]^2w(s) + \sum_{S_2} [g(s) -g_{2*}(s)]^2w(s)\\ & & + \sum_{S_1} [g_{1*}(s) -g_*(s)]^2w(s) + \sum_{S_2} [g_{2*}(s) -g_*(s)]^2w(s)\\ & & + 2 \sum_{S_1} [g(s) - g_{1*}(s)] [g_{1*}(s) - g_*(s)]w(s)\\ & & + 2 \sum_{S_2} [g(s) - g_{2*}(s)][g_{2*}(s) - g_*(s)]w(s) \end{eqnarray*} % Check. Pete had written Theorem 1.31. The last two terms are zero by \cite[Theorem 1.3.1, p. 15]{RobertsonEtAl1988} since $g_{1*}(s) - g_*(s)$ is a function of $g_{1*}(s)$, and $g_{2*}(s) - g_*(s)$ is a function of $g_{2*}(s)$. The first two terms do not involve $g_*(s)$. Hence $g_*(s)$ minimizes \begin{equation} \sum_{S_1} [g_{1*}(s) - g_*(s)]^2w(s) + \sum_{S_2} [g_{2*}(s) - g_*(s)]^2w(s) \label{eq:minim} \end{equation} and hence is the isotonic regression of \[ h(s) = \left \{ \begin{array}{cl} g_{1*}(s) & \mbox{~if~} s \in S_1 \\ g(s) & \mbox{~if~} s = k_0 \end{array} \right . \] It follows readily that the values of $g_*(s)$ on $L_i$, i.e. $d_i$, are in increasing order. Since $g_*(s)$ minimizes (\ref{eq:minim}), equal to \[ \sum_{t=1}^{r} [ c_t - d_t ]^2 u(t) \] under the assumption that $g_*$ is isotonic, it follows that $d_1, d_2, \ldots, d_r$ minimize this expression under simple linear order on $1, 2, \ldots, r$, and hence $d_t = f_*(t)$ for all $t$. \qued \section{Estimating the Location of a Maximum} \label{locmax} \subsection{Consistency} Let $Y_{ij}$ and $w_i$, $i=1, \ldots, p$, $j = 1, \ldots, n_i$, be as described in Section \ref{S:intro}. Suppose that the value of $k_0$ is unknown and one wishes to estimate it in some rational manner. The (weighted) least squares estimate of $k_0$ may be determined by assuming that $k_0 = k$ for each $k = 1, \ldots , p$ and finding the (weighted) least squares estimates of the $\mu_i$, say $\hat{\mu}_i(k)$ under this assumption. Let $SS(k)$ be the corresponding error sum of squares, i.e. \[ SS(k) = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i(k))^2 w_i \] The estimated value of $k_0$ is then that value of k which minimizes $SS(k)$. If we assume that the mode is a strict one, i.e. that \begin{equation} \label{unimod2} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k_0 - 1} < \mu_{k_0} > \mu_{k_0 + 1} \geq \ldots \geq \mu_p \;, \end{equation} then it is not hard to demonstrate that this procedure yields a consistent estimate of $k_0$. We will not go into the details here. There are other ``obvious'' ways of estimating the location of the maximum of a theoretical function underlying an observed data set. These include using the maximum of a fitted quadratic function or the single knot of a fitted ``broken stick'' (piecewise linear) model. The performance of unimodal isotonic regression is compared with these and other methods in \cite{turnerWollan1997}. \subsection{Estimating a maximum in \Iso} For a given data set, the \Iso\ function \texttt{ufit} (``unimodal fit'') calculates the best (least squares) unimodal fit with mode at a specified location given by the argument \texttt{lmode} (``location of mode''). If \texttt{lmode} is unspecified (i.e. left with its default value of \texttt{NULL}) then \texttt{ufit} searches over all possible modal locations and chooses that which yields the minimal error sum of squares. The search is feasible since there are a finite and limited number of possibilities for the modal location. If the largely notional ``predictor'' vector is \texttt{x} then the possible modal locations are \texttt{x[i]}, with \texttt{i} running from \texttt{1} to \texttt{n} $=$ \texttt{length(x)} and \texttt{(x[i] + x[i+1])/2} with \texttt{i} running from \texttt{1} to \texttt{n-1}. Note that all possible modal locations that are strictly between \texttt{x[i]} and \texttt{x[i+1]} are equivalent, so we restrict attention to the midpoints. The possibilities are even more limited than that, however. Suppose that the optimal mode is at \texttt{x[i]} with \texttt{i} $>$ \texttt{1}. This says that the correponding isotoniation of \texttt{y}, \texttt{y*} say, is increasing on \texttt{x[1]} to \texttt{x[i]} and decreasing on \texttt{x[i]} to \texttt{x[n]}. Let the corresponding error sum of squares be SSE$_i$. Now consider the isotonisation of \texttt{y} with respect to the unimodal structure with mode at \texttt{(x[i-1]+x[i])/2}, say \texttt{y**} and let the corresponding error sum of squares be SSE$_{i-0.5}$. Note that \texttt{y*} satisfies the unimodal constraint that \texttt{y**} has to satisfy and hence SSE$_{i-0.5}$ $\leq$ SSE$_i$. But SSE$_i$ is minimal over all possible modal locations, whence SSE$_i$ $\leq$ SSE$_{i-0.5}$ and so SSE$_i$ is equal to SSE$_{i-0.5}$. If the optimal mode is at \texttt{x[1]} then similar reasoning shows that SSE$_1$ is equal to SSE$_{1.5}$. Thus to find the optimal mode we need only search over the ``half-points'' \texttt{(x[i] + x[i+1])/2}, \texttt{i} running from \texttt{1} to \texttt{n-1} If values of \texttt{y} are only meaningful at \texttt{x[1]}, \dots, \texttt{x[n]}, e.g. if the values of \texttt{y} are some sort of annual amount or annual maximum, then the ``half-points'' only constitute a computational device and the optimal mode would be said to occur at the ``whole-point'' \texttt{x[i]} having the co-minimal value of SSE. Note that if in searching over the ``half-points'' we find the minimal sum of squares to be at \texttt{(x[i] + x[i+1])/2}, then either \texttt{x[i]} or \texttt{x[i+1]} will give rise to a co-minimal value of SSE. Letting \texttt{y*} be the isotonisation of \texttt{y} corresponding to a mode at \texttt{(x[i] + x[i+1])/2}, we see that if \texttt{y*[i]} $\geq$ \texttt{y*[i+1]} then \texttt{y*} is also the isotonisation of \texttt{y} corresponding to a mode at \texttt{x[i]}. In this case \texttt{x[i]} will be an optimal modal location. Likewise if \texttt{y*[i]} $\leq$ \texttt{y*[i+1]} then \texttt{y*} is also the isotonisation of \texttt{y} corresponding to a mode at \texttt{x[i+1]}. In this case \texttt{x[i+1]} will be an optimal modal location. If \texttt{y} consists of response values which can be observed over a continuum of \texttt{x} values but which \emph{was} observed only at \texttt{x[1]}, \dots, \texttt{x[n]}, then it is meaningful for the response in question to have a mode at a ``half-point''. In this case there is ambiguity --- there are always (at least) two ``optimal'' modal locations. \begin{figure}[H] \centering <>= require(Iso) OP <- par(mfrow=c(3,2),mar=c(4,4,3,1)) for(i in 2:6) { plot(ufit(vigour[,i],x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main=paste("stand",i-1),cex.main=1.5) points(vigour[,1],vigour[,i],pch="+",col="red") } par(OP) @ \caption{Unimodal isotonisation of growth vigour for each of five stands of spruce trees over the years 1965 to 1987. The black line represents the optimal unimodal isotonic fit. The red $+$ symbols represent the raw data. } \label{fig:isoByStand} \end{figure} \subsection{Examples} Consider the data set \texttt{vigour} which is included in the \Iso package. We can find the optimal location of maximum vigour over the years 1965 to 1987 for each stand. The code to fit the isotonic models and plot the graphs of the fits follows. The resulting plots are shown in Figure~\ref{fig:isoByStand}. <>= par(mfrow=c(3,2),mar=c(4,4,3,1)) for(i in 2:6) { plot(ufit(vigour[,i],x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main=paste("stand",i-1),cex.main=1.5) points(vigour[,1],vigour[,i],pch="+",col="red") } @ Note that in this setting the ``vigour'' values are determined in terms of an annual growth cycle whence they make sense only for integrer values of ``year''. Hence ``half=point'' modes are not meaningful. It may also be of interest to look for the optimal unimodal fit to the mean, over stands. A plot of the resulting fit is shown in Figure~\ref{fig:isoMean}. <>= xm <- apply(vigour[,2:6],1,mean) par(mar=c(4,4,3,1)) plot(ufit(xm,x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main="Mean over stands",cex.main=1.5) points(vigour[,1],xm,pch=22,col="red") for(i in 2:6) points(vigour[,1],vigour[,i],pch="+",col="blue") @ \begin{figure}[H] \centering <>= xm <- apply(vigour[,2:6],1,mean) par(mar=c(4,4,3,1)) plot(ufit(xm,x=vigour[,1]),type="l",ylim=c(0,0.3), xlab="year",ylab="vigour",main="Mean over stands",cex.main=1.5) points(vigour[,1],xm,pch=22,col="red") for(i in 2:6) points(vigour[,1],vigour[,i],pch="+",col="blue") @ \caption{Unimodal isotonisation of the mean growth vigour over five stands of spruce trees for the years 1965 to 1987. The black line represents the optimal unimodal isotonic fit. The blue $\Square$ symbols represent the raw means. The red $+$ symbols represent the data for all of the individual stands. } \label{fig:isoMean} \end{figure} {\bf Acknowledgement:} The author would like to thank Kirk Schmidt, a graduate student in the Department of Forest Engineering, U.N.B., and his advisor Professor Ted Needham, for drawing the problem on tree growth vigour to his attention. \newpage \addcontentsline{toc}{section}{References} \bibliographystyle{plain} \bibliography{algorithm} \end{document} Iso/inst/draft0.tex0000644000176000001440000007552012533475777013750 0ustar ripleyusers\documentstyle[11pt]{article} \setlength{\parindent}{0cm} \setlength{\parskip}{0.2cm} \textwidth 6in \textheight 8.5in \topmargin -0.375in \oddsidemargin 0.375in \newcommand{\fol}{\mbox{$\prec \prec$}} \newcommand{\iuc}{\mbox{${\cal I}^c$}} \newcommand{\ilc}{\mbox{${\cal I}_c$}} %\newcommand{\qued}{\rule{2mm}{3.5mm}} \input{extras} \begin{document} \mbox{} \hfill {\sf Draft: \today}\\[0.2cm] % Draft 0. (???) \begin{centre} {\Large \bf An Algorithm for Unimodal Isotonic Regression, with Application to Locating a Maximum}\\[0.2cm] by\\[0.2cm] R. A. Mureika and T.R. Turner\\[0.2cm] {\em Department of Mathematics and Statistics,\\[0.2cm] University of New Brunswick}\\[0.2cm] and\\[0.2cm] P. C. Wollan\\[0.2cm] {\em Division of Biostatistics,\\[0.2cm] Mayo Clinic}\\[0.5cm] {\bf Abstract}\\ \end{centre} A new algorithm is proposed for applying isotonic regression to data having an underlying unimodal structure. This algorithm is actually a special case of a more general procedure which permits a ``divide and conquer'' approach to a broad class of isotonic regression problems. It is noted that repeated application of the algorithm permits the estimation of the location of the maximum of a data set having underlying unimodal means, and that this location estimate is consistent. The performance of the resulting procedure for locating a maximum is assessed through a simulation study. {\small Key words: {\em unimodal ordering, level sets, level values, divide and conquer approach, tree-like orderings}.}\\[0.2cm] \section{Introduction} \label{intro} Algorithms for implementing isotonic regression under orderings other than the simple linear order are difficult to construct. The best known of such algorithms is the Maximum Lower Sets algorithm (Robertson, Wright, and Dykstra, 1988, p.24); this is complicated and hard to program. It is also reputed to run rather slowly, and indeed the number of operations required grows exponentially in certain cases. The motivation for developing an improved algorithm for performing such regressions came in part from a data set being studied by members of the Faculty of Forestry at the University of New Brunswick. These data consisted of observations which had been made of the ``vigour'' of growth of five stands of black spruce. The stands each had different initial tree densities. It was expected that vigour would initially increase (as the trees increased in size) and then level off and start to decrease as the growing trees encroached upon each others' space and competed more strongly for resources such as moisture, nutrients, and light. It was further expected that the position of the mode of the vigour observations would depend upon the initial densities. Plots of the data did not make it completely clear as to where the leveling-off point or mode occurred; the Forestry researchers requested a procedure for determining the location of this mode. A procedure which comes immediately to mind is to fit unimodal isotonic regressions with mode at each of the possible locations in turn. The location yielding minimal error sum of squares is then chosen as the location of the mode. It is thus desirable to be able to perform a large number of unimodal isotonic regressions quickly and efficiently. Formally the unimodal isotonic regression problem may be stated as follows: Suppose that $Y_{ij}$, $i=1, \ldots, p$, $j = 1, \ldots, n_i$, are independent random variables such that $Y_{ij} = \mu_i + E_{ij}$ for all $i$ and $j$, where the $E_{ij}$ have mean 0 and variance $\sigma^2$. Further suppose that the $\mu_i$ have a {\em unimodal ordering}, i.e. that \begin{equation} \label{unimod1} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k_0} \geq \mu_{k_0 + 1} \geq \ldots \geq \mu_p \;. \end{equation} It is desired to estimate the values of $\mu_1, \ldots, \mu_p$. The (weighted) least squares estimates of the $\mu_i$ are given by minimizing \[ SS = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i)^2 w_i \] subject to the constraint (\ref{unimod1}), where $w_1, \ldots, w_p$ are a (given) set of positive weights. This is of course a particular case of isotonic regression under a partial ordering. It may initially be subdivided into three sub-problems involving only {\em linear} orderings: (a) estimating $\mu_1, \ldots , \mu_{k-1}$; (b) estimating $\mu_k$; and (c) estimating $\mu_{k+1}, \ldots , \mu_n$. Sub-problem (b) is totally trivial and sub-problems (a) and (c) can be solved by standard and well-known techniques. The question is how to combine the solutions of the three subproblems appropriately. The answer is essentially to ``interleaf'' the estimates resulting from solving sub-problems (a) and (c) in {\em numerical} order, tack on $\hat{\mu}_k = \bar{Y}_{k.}$ at the upper end, solve the corresponding isotonic regression with respect to the resulting linear ordering, and then put the estimates back in their original order. In the next section some notation and terminology are established, and the main result, which validates the proposed algorithm, is stated. In the following section, \ref{generalize}, it is indicated how this result may be applied to other ``tree-like'' orderings as well as to unimodal ones. In section \ref{locmax} the problem of estimating the location of a maximum is discussed in more detail. The procedure of performing unimodal isotonic regressions for all possible mode locations is shown to yield a consistent estimate of the true mode location. Simulation studies assessing the procedure are then discussed. Section \ref{concl} consists of concluding remarks. Some technical lemmas, upon which the proof of the main result depends, their proofs, and the proof of the main result itself, are given in an appendix. \section{Notation and Terminology, and the Main Result} \label{mainres} Let $S$ be a set and let $\prec$ be a partial order on $S$. Recall that an isotonic function (with respect to the partial order $\prec$) is a (real-valued) function $f$ such that $x \prec y$ implies $f(x) \leq f(y)$. If $g$ is an arbitrary function on $S$, and $w$ is a non-negative (weight) function on $S$, then the {\em isotonic regression} of $g$, with respect to $\prec$ and $w$, (denoted $g_*$) is that value of $\hat{g}$ which minimizes \begin{displaymath} \sum_{s \in S} [g(s) - \hat{g}(s)]^2w(s) \end{displaymath} over all {\em isotonic} functions $\hat{g}$. Let $S_1$ and $S_2$ be two subsets of $S$. We say that $S_2$ {\em follows} $S_1$, (in symbols $S_1 \fol S_2$) if $x \prec y$ for every $x$ in $S_1$ and every $y$ in $S_2$. Now let $S = S_1 \cup S_2$ where $S_1$ and $S_2$ are disjoint, and $S_1 \fol S_2$. Let $g_j$ be the restriction of $g$ to $S_j$, and suppose that $g_{j*}$ is the isotonic regression of $g_j$, $j = 1,2$. The weight functions used to form $g_{j*}$ above are of course the restrictions of the overall weight function $w$. An elementary but important fact about isotonic regression is that $g_*$ takes the form \begin{displaymath} g_*(s) = c_i \mbox{ on } L_i, \; i = 1, \ldots, r \end{displaymath} where $L_1, \ldots, L_r$ form a disjoint and exhaustive collection of subsets of $S$, and $c_1 < c_2 < \ldots < c_r$. Moreover $c_i$ is the weighted mean over $L_i$ of the values of $g(s)$; i.e. \begin{displaymath} c_i = \frac{\sum_{s \in L_i} w(s)g(s)}{\sum_{s \in L_i} w(s)}\;\;. \end{displaymath} (See Robertson, Wright, and Dykstra, 1988, p. 18, Theorem 1.3.5.) We call the sets $L_i$ the {\em level} sets and the values $c_i$ the {\em level} values of the isotonic regression. Let the level sets and level values for $g_{1*}$ be $L_1, \ldots, L_{r_1}$ and $c_1 < \ldots < c_{r_1}$, and those for $g_{2*}$ be $L_{r_1+1}, \ldots, L_r$ and $c_{r_1+1} < \ldots < c_r$. (Note: It may well occur that $c_{r_1} \geq c_{r_1+1}$.) Define a function $f$ on $\{1, \ldots, r\}$, by $f(t) = c_t$ for $t = 1, \ldots r$, and a weight function $u$ by \begin{displaymath} u(t) = \sum_{x \in L_t} w(x) \;\;. \end{displaymath} We are now ready to state: {\bf Theorem 1:} Let $S_1$, $S_2$, $f$, and $u$ be as in the foregoing discussion. Let $f_*$ be the isotonic regression of $f$ with respect to the usual order on $\{1, \ldots, r\}$ and the weight function $u$. Then the isotonic regression of $g$ with respect to $\prec$ and $w$ is given by \begin{displaymath} g_*(s) = f_*(t) \mbox{ for } s \in L_t \;\;. \end{displaymath} Remark: In the case of the unimodal structure, the r\^{o}le of $S_2$ is played by the singleton $\{k\}$, and that of $S_1$ by $\{1, \ldots, k-1, k+1, \ldots, n \}$. For the partial order determining the structure of interest, the two sets $\{1, \ldots, k-1 \}$ and $\{k+1, \ldots, n \}$ are unrelated. It is therefore easy to see, (and well-known; see, e.g., Robertson, Wright, and Dykstra, 1988, p.57), that an isotonic regression on their union is simply the amalgamation of separate isotonic regressions on each component. \section{Generalization} \label{generalize} Theorem 1 permits a ``divide and conquer'' approach to isotonic regression problems. If the set $S$ decomposes into two disjoint subsets $S_1 \fol S_2$, and if the restricted isotonic regression problem can be solved for each $S_i$, then the overall problem can be solved. Applying this notion inductively we immediately obtain the generalization of Theorem 1 to sequences of more than two sets: {\bf Corollary 1:} If $S = \cup_{k=1}^n S_k$ and $S_1 \fol S_2 \fol \ldots \fol S_n$, and the $S_i$ are pairwise disjoint, then the isotonic regression on $S$ can be calculated by first calculating the isotonic regression separately on each of $S_1, S_2, \ldots , S_n$, placing the resulting level values in order and carrying out the weighted isotonic regression of these level values with respect to simple linear order. The weights in question are \[ \sum_{s \in L_i} w(s) \] where $L_i$ is the level set corresponding to a level value $c_i$. The ``divide and conquer'' approach may also be applied to more complicated arrangements amongst the set $S_i$, called ``tree-like'' structures.\\ {\bf Definition:} Suppose that $S = \bigcup_{k=1}^n S_k.$ We say that $S_1, S_2, \ldots, S_n$ have a tree-like structure with respect to $\fol$ if \begin{list}{}{} \item[(i)] the $S_i$ are pairwise disjoint, \item[(ii)] no element of $S_i$ is comparable with any element of $S_j$ for $i \neq j$ unless $S_i \fol S_j$ or $S_j \fol S_i$, and \item[(iii)] for any $S_j$ there is at most one $S_i$ with the property that (1) $S_j \fol S_i$ and (2) there is {\em no} $S_k$ for which $S_j \fol S_k \fol S_i$. \end{list} Now suppose that $S_1, S_2, \ldots, S_n$ have a tree-like structure, and that the restricted isotonic regression problem can be solved for each $S_i$. Then the isotonic regression on $S$ can be carried out thusly: Group those $S_j$ which follow {\em no sets} into collections having a common set by which they are all followed. Denote any one such collection by $S_{i_1}, S_{i_2}, \ldots, S_{i_r}$ with predecessor $S_i$. Let $S_1' = S_{i_1} \cup \ldots \cup S_{i_r}$, and let $S_2' = S_i$. Since there is no order relation amongst the elements of the sets $S_{i_j}$, the isotonic regression on their union is the simple amalgamation of the individual isotonic regressions. Thus the restricted isotonic problem can be solved on $S_1'$; by assumption it can be solved on $S_2'$. Therefore, by Theorem 1 it can be solved on $S_1' \cup S_2'$. We now remove $S_i$ and $S_{i_1}, \ldots, S_{i_r}$ from the collection $S_1, \ldots, S_n$ and replace them by their union $=S_1' \cup S_2'$. This yields a new, smaller, tree-like structure on each component of which the restricted isotonic problem can be solved. We now repeat the procedure until the complete problem is solved, i.e. until the resulting tree-like structure consists of the single set $S$. \section{Estimating the Location of a Maximum} \label{locmax} Let $Y_{ij}$ and $w_i$, $i=1, \ldots, p$, $j = 1, \ldots, n_i$, be as described in section \ref{intro}. Suppose that the value of $k_0$ is unknown and one wishes to estimate it in some rational manner. The (weighted) least squares estimate of $k_0$ may be determined by assuming that $k_0 = k$ for each $k = 1, \ldots , p$ and finding the (weighted) least squares estimates of the $\mu_i$, say $\hat{\mu}_i(k)$ under this assumption. Let $SS(k)$ be the corresponding error sum of squares, i.e. \[ SS(k) = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i(k))^2 w_i \] The estimated value of $k_0$ is then that value of k which minimizes $SS(k)$. If we assume that the mode is a strict one, i.e. that \begin{equation} \label{unimod2} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k_0 - 1} < \mu_{k_0} > \mu_{k_0 + 1} \geq \ldots \geq \mu_p \;, \end{equation} then it is not hard to demonstrate that this procedure yields a consistent estimate of $k_0$: Note that \[ SS(k) = \sum_i \sum_j (Y_{ij} - \hat{\mu}_i(k))^2 w_i = \sum_i \sum_j (Y_{ij} - \bar{Y}_{i.})^2 w_i + \sum_i (\bar{Y}_{i.} - \hat{\mu}_i(k))^2 n_i w_i\;. \] The vector $[ \hat{\mu}_i(k) ]_{i=1}^p$ is the weighted least squares projection % \hat{\mu}_i(k) (with weights $n_i w_i$) of the data onto the cone determined by the hypothesis \begin{equation} \label{cone} \mu_1 \leq \mu_2 \leq \ldots \leq \mu_{k} \geq \ldots \geq \mu_p \;. \end{equation} As each $n_i \rightarrow \infty$, $\bar{Y}_{i.} \rightarrow \mu_i$, and $\hat{\mu}_i(k)$ converges to $\tilde{\mu}_i$ where $[\tilde{\mu}_i]_{i=1}^p$ is the isotonization of $[\mu_i]_{i=1}^p$, that is % $[\mu_i]$ the weighted least squares projection of $[\mu_i]_{i=1}^p$ onto the cone (\ref{cone}), with weights \[ u_i = \lim_{\mbox{ all } n_i \rightarrow \infty} \frac{n_i w_i}{\sum_j n_j w_j} \] If $k \neq k_0$, then $\mu_i \neq \tilde{\mu}_i$ for at least one $i$, and so $SS(k) \geq (\bar{Y}_{i.} - \hat{\mu}_i(k))^2 n_i w_i \sim$ \linebreak $(\mu_i - \tilde{\mu}_i)^2 n_i w_i \rightarrow \infty$. If $k$ does equal $k_0$, then the distribution of $SS(k)$ is asymptotically $\sigma^2 \bar{\chi}^2$ (Shapiro, 1985) and so $P[SS(k_0) \geq SS(k)] \rightarrow 0$ for $k \neq k_0$. Hence if $\hat{k}$ is the value that minimizes $SS(k)$, then $P[\hat{k} \neq k_0] \rightarrow 0$. The isotonic approach thus gives a consistent estimator of the location of the mode of a unimodal set of means. The algorithm described in sections \ref{intro} and \ref{mainres} provides an effective procedure for calculating this estimator. The sequence of means (\ref{unimod2}) could be thought of as values along a regression curve. The classical approach to locating a maximum, dating back at least to Hotelling (1941) is to fit a parametric model, often a low-degree polynomial, and to find the maximum value of the fitted curve. More recently, nonparametric regression methods have been applied. Silverman (1985) proposed the use of smoothing splines. Kernel estimators have been used more for the related problem of estimating the mode of a probability density (Parzen, 1962, and, for example, Romano, 1988) but have also been used for locating maxima (M\"{u}ller, 1989) Both the parametric and nonparametric approaches have serious drawbacks: the parametric approach requires careful choice of the form of the function, while nonparametric regression requires choice of a smoothing parameter. The method proposed above requires neither. In some ways, it is more similar to ranking and selection methods (see, for example Gibbons, 1977) than to regression, in that the maximum is chosen to be one of the observed values. However, the isotonic approach exploits the unimodal structure of the means to yield additional power. To investigate the efficacy of the isotonic approach, and to compare this approach with three other possible methods, a set of simulations was undertaken. The three other methods considered were \begin{list}{}{} \item[(i)] Fitting (by least squares) a (concave downward) quadratic and choosing the largest fitted value. \item[(ii)] Fitting (by least squares) a (concave downward) ``two-stick'' model, with the bend constrained to come in turn at each of the possible modal values. The modal value giving the minimal sum of squares is then chosen as the maximum point. \item[(iii)] Simply picking the largest data value. \end{list} Data to test all four methods were generated from three underlying models: \begin{list}{}{} \item[(a)] A (concave downward) quadratic, with maximum at $x = k$ and height 1 above the $x$-axis, and $x$-intercepts a distance $n-1$ apart (data being generated at points $1, 2, \ldots, n$). \item[(b)] A (concave downward) ``two-stick'' model, with maximum at $x = k$ and height 1 above the $x$-axis and intercepts at $0$ and $n$. \item[(c)] A delta function equal to 1 at $x = k$ and equal to 0 elsewhere on $[1,n]$. \end{list} To each model was added pseudo-random independent Gaussian noise, with zero mean and constant standard deviation $\sigma$. Six different choices of the triple $(n,k,\sigma)$ were investigated, giving a total of 18 simulations, which are tabulated as follows in Table 1. \begin{table}[htb] \begin{centre} {\bf Table 1: Structure of Simulations}\\[0.5cm] \begin{tabular} {| r | r | r | r | r |} \hline sim. no. & model & $n$ & $k$ & $\sigma$ \\ \hline 1 & 2-stick & 19 & 10 & 0.5 \\ \hline 2 & quad. & 19 & 10 & 0.5 \\ \hline 3 & delta fn. & 19 & 10 & 0.5 \\ \hline 4 & 2-stick & 19 & 5 & 0.5 \\ \hline 5 & quad. & 19 & 5 & 0.5 \\ \hline 6 & delta fn. & 19 & 5 & 0.5 \\ \hline 7 & 2-stick & 50 & 12 & 0.5 \\ \hline 8 & quad. & 50 & 12 & 0.5 \\ \hline 9 & delta fn. & 50 & 12 & 0.5 \\ \hline 10 & 2-stick & 19 & 10 & 1 \\ \hline 11 & quad. & 19 & 10 & 1 \\ \hline 12 & delta fn. & 19 & 10 & 1 \\ \hline 13 & 2-stick & 19 & 5 & 1 \\ \hline 14 & quad. & 19 & 5 & 1 \\ \hline 15 & delta fn. & 19 & 5 & 1 \\ \hline 16 & 2-stick & 50 & 12 & 1 \\ \hline 17 & quad. & 50 & 12 & 1 \\ \hline 18 & delta fn. & 50 & 12 & 1 \\ \hline \end{tabular} \end{centre} \end{table} Five hundred replications were generated from each model, with each of the foregoing parameter combinations. For each replication, the location of the mode was estimated using each of the four possible techniques. To summarize the results, the percentage of correct answers and the mean-squared error of the estimates, over the five hundred replications, was calculated for each estimation method. The results are given in Tables 2 and 3. \begin{table}[htb] \begin{centre} {\bf Table 2: Percentage Correct}\\[0.5cm] \begin{tabular} {| r | r | r | r | r |} \hline & \multicolumn{4}{c|}{ estimation method } \\ \hline sim. no. & ``pick max.'' & quad. fit & ``2-stick'' fit & isotonic \\ \hline 1 & (4) 18.6 & (1) 42.2 & (3) 19.8 & (2) 21.0 \\ \hline 2 & (3) 11.8 & (1) 42.2 & (4) 9.4 & (2) 13.2 \\ \hline 3 & (2) 57.2 & (4) 10.4 & (3) 21.2 & (1) 58.4 \\ \hline 4 & (3) 19.0 & (4) 2.8 & (1) 25.8 & (2) 19.8 \\ \hline 5 & (3) 14.4 & (2) 19.8 & (4) 7.2 & (2) 14.6 \\ \hline 6 & (1) 54.4 & (4) 3.2 & (3) 23.0 & (1) 54.4 \\ \hline 7 & (3) 9.8 & (4) 0.4 & (1) 14.8 & (2) 11.2 \\ \hline 8 & (3) 4.4 & (1) 12.2 & (4) 2.0 & (2) 5.2 \\ \hline 9 & (1) 41.0 & (4) 0.2 & (3) 9.6 & (2) 40.2 \\ \hline 10 & (3) 12.6 & (1) 21.0 & (4) 9.6 & (2) 13.0 \\ \hline 11 & (3) 10.6 & (1) 19.4 & (4) 6.0 & (2) 11.0 \\ \hline 12 & (1) 26.6 & (4) 10.4 & (3) 11.0 & (2) 26.0 \\ \hline 13 & (2) 11.6 & (4) 3.4 & (3) 11.2 & (1) 12.0 \\ \hline 14 & (4) 7.4 & (2) 8.0 & (1) 8.2 & (2) 8.0 \\ \hline 15 & (2) 23.2 & (4) 1.0 & (3) 12.8 & (1) 24.2 \\ \hline 16 & (1) 6.4 & (4) 1.4 & (4) 6.2 & (1) 6.4 \\ \hline 17 & (3) 3.2 & (2) 3.6 & (4) 3.0 & (1) 3.8 \\ \hline 18 & (1) 11.2 & (4) 1.8 & (3) 5.0 & (2) 10.8 \\ \hline \end{tabular} \end{centre} \mbox{}\\ {\footnotesize Remark: Numbers in parentheses indicate the rank of the method among the four methods, according to the ``percentage correct'' criterion.} \end{table} \begin{table}[htb] \begin{centre} {\bf Table 3: Mean Square Error}\\[0.5cm] \begin{tabular} {| r | r | r | r | r | r | r | r |} \hline & \multicolumn{4}{c|}{ estimation method } \\ \hline sim. no. & ``pick max.'' & quad. fit & ``2-stick'' fit & isotonic \\ \hline 1 & (3) 8.4 & (1) 1.8 & (4) 10.5 & (2) 5.8 \\ \hline 2 & (3) 9.9 & (1) 2.3 & (4) 16.2 & (2) 9.1 \\ \hline 3 & (2) 13.7 & (3) 14.4 & (4) 34.1 & (1) 11.9 \\ \hline 4 & (4) 16.6 & (3) 13.8 & (1) 10.9 & (2) 12.6 \\ \hline 5 & (3) 9.0 & (1) 4.5 & (4) 13.9 & (2) 8.4 \\ \hline 6 & (2) 25.9 & (3) 31.1 & (4) 31.9 & (1) 23.9 \\ \hline 7 & (4) 82.3 & (3) 78.9 & (1) 30.2 & (2) 52.8 \\ \hline 7 & (3) 50.6 & (1) 16.9 & (4) 98.3 & (2) 39.7 \\ \hline 9 & (2) 246.5 & (3) 275.9 & (4) 346.0 & (1) 231.6 \\ \hline 10 & (3) 16.0 & (1) 7.6 & (4) 25.2 & (2) 13.7 \\ \hline 11 & (3) 16.9 & (1) 8.9 & (4) 28.0 & (2) 15.5 \\ \hline 12 & (3) 24.4 & (1) 18.6 & (4) 40.4 & (2) 23.0 \\ \hline 13 & (3) 28.4 & (1) 22.7 & (4) 28.7 & (2) 26.0 \\ \hline 14 & (3) 13.2 & (1) 7.8 & (4) 19.3 & (2) 11.4 \\ \hline 15 & (4) 41.4 & (3) 38.0 & (1) 37.8 & (1) 37.8 \\ \hline 16 & (4) 186.7 & (1) 108.9 & (3) 124.4 & (2) 117.6 \\ \hline 17 & (3) 96.0 & (1) 35.2 & (4) 113.3 & (2) 69.4 \\ \hline 18 & (3) 339.8 & (2) 324.7 & (4) 362.0 & (1) 299.3 \\ \hline \end{tabular} \end{centre} \mbox{}\\ {\footnotesize Remark: Numbers in parentheses indicate the rank of the method among the four methods, according to the ``mean square error'' criterion.} \end{table} Histograms of the estimation errors were plotted for each experiment. An illustrative example of these (for simulation 13) is given in Figure 1. \begin{centre} (Figure 1 about here.) \end{centre} The bias of the quadratic method, toward the centre of the set of means when the location of the maximum is off-centre, is readily apparent in this illustration. The isotonic technique performed consistently well. It was either best or second best of all four methods in all cases, according to both of the above criteria. It was outperformed by the quadratic estimation method when the underlying model was quadratic and the noise level was low. With the higher noise level, the isotonic method beat or tied quadratic estimation in two of the three cases. The quadratic estimation procedure also did well when the underlying model was the ``two-stick'' one, particularly when the maximum was at the centre of the sequence of means. When the underlying model was the delta function, the ``pick the max'' procedure was always the nearest competitor for the isotonic method. In fact, the isotonic method and the ``pick the max'' method tended to give the same answer a large percentage of the time: Between 72.0\% (simulation 18) and 94.2\% (simulation 5). The ``two-stick'' estimation procedure performed well essentially only when the underlying model was the ``two-stick'' one. For simulation number 14, with an underlying quadratic model, it came first according to the percentage correct criterion, but last according to the mean square error criterion. \section{Concluding Remarks} \label{concl} The proposed algorithm for performing unimodal isotonic regression is simple to understand and to program, and performs satisfactorily in practice. It makes feasible the procedure for estimating the location of a maximum by performing unimodal isotonic regressions for all possible locations. Our simulation studies indicate that this technique for estimating the position of a maximum is a sound procedure, over-all. It works effectively irrespective of the nature of the underlying unimodal structure of the means. The results established in section 3 have of course much more general application than to the problem of estimating the location of a maximum. The software to implement all of the relevant computations, including the simulations, was written in the S programming language. This software is available from the second author upon request. {\bf Acknowledgement:} The authors would like to thank Kirk Schmidt, a graduate student in the Department of Forest Engineering, U.N.B., and his advisor Professor Ted Needham, for drawing the problem on tree growth vigour to their attention. \section{Appendix: Proof of the Main Result} {\bf Definition:} For any constant $c$ we define \begin{displaymath} \iuc = \{g | g \mbox{ is isotonic and } g(s) \leq c \mbox{ for all } s \in S \} \end{displaymath} and \begin{displaymath} \ilc = \{g | g \mbox{ is isotonic and } g(s) \geq c \mbox{ for all } s \in S \} \end{displaymath} Let $g_*(s)$ be the isotonic regression of $g$ and define \begin{displaymath} g_{cu}(s) = \left \{ \begin{array}{cl} g_*(s) & \mbox{ if } g_*(s) \leq c\\ c & \mbox{ if } g_*(s) > c \;\;.\end{array} \right. \end{displaymath} {\bf Lemma 1:} The function $g_{cu}$ uniquely minimizes \begin{equation} \sum_{s \in S} [g(s) - \hat{g}(s)]^2 w(s) \label{eq:trunciso} \end{equation} subject to $\hat{g} \in \iuc$. {\bf Proof:} For any $\hat{g}$ in $\iuc$, \begin{eqnarray*} \sum_{s \in S} [g(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s) ]w(s) & = & \sum_{s \in S} [g(s) - g_*(s)][g_{cu}(s) - g_*(s)]w(s)\\ & & + \sum_{s \in S} [g_*(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s)]w(s)\\ & & + \sum_{s \in S} [g(s) - g_*(s)][g_*(s) - \hat{g}(s)]w(s)\\ & = & \Sigma_1 + \Sigma_2 + \Sigma_3 \end{eqnarray*} Now $ \Sigma_1 = 0 $ by Theorem 1.3.6 of Robertson, Wright, and Dykstra, (1988, p.21), since $g_{cu}(s) - g_*(s)$ is a function of $g_*(s)$; $ \Sigma_3 \geq 0 $ since $g_*$ is the isotonic regression of $g$ (applying Theorem 1.3.1 of Robertson, Wright, and Dykstra, (1988, p.15); and finally \begin{eqnarray*} \Sigma_2 & = & \sum_{g_*(s) > c} [g_*(s) - g_{cu}(s)][g_{cu}(s) - \hat{g}(s)]w(s)\\ & = & \sum_{g_*(s) > c} [g_*(s) - c][c - \hat{g}(s)]w(s) \geq 0 \;\;. \end{eqnarray*} Since $\iuc$ is a convex lattice we may apply the converse part of Theorem 1.3.1 of Robertson, Wright, and Dykstra (1988), and the result follows. \qued Exactly analogous to Lemma 1 is {\bf Lemma 2:} The function \begin{displaymath} g_{cl}(s) = \left \{ \begin{array}{cl} g_*(s) & \mbox{ if } g_*(s) \geq c\\ c & \mbox{ if } g_*(s) < c \;\;. \end{array} \right. \end{displaymath} uniquely minimizes (\ref{eq:trunciso}) for $\hat{g} \in \ilc$. The following is an immediate consequence of Lemma 1 and 2: {\bf Lemma 3:} Let $c_{k_1}, \ldots, c_{k_m}$ be a subset of the level values of $g_*$, and let \linebreak $S' = S \setminus \bigcup_{l=1}^m \{s | g_*(s) = c_{k_l} \} \neq \phi$. The isotonic regression of $g$ restricted to $S'$ is $g_*$ restricted to $S'$. We can now prove the main result: {\bf Proof of Theorem 1:} Since $S_1 \fol S_2$ it is easy to see that there is a constant $c$ such that: \begin{eqnarray*} g_*(s) & < & c \mbox{ implies } s \in S_1 {\rm and}\\ g_*(s) & > & c \mbox{ implies } s \in S_2 \;\;. \end{eqnarray*} The set $\{s | g(s) = c \}$ may contain elements from both $S_1$ and $S_2$. For this $c$ \begin{displaymath} g_*(s) = \left \{ \begin{array}{cl} g_{cu}(s) & \mbox{ if } s \in S_1 \\ g_{cl}(s) & \mbox{ if } s \in S_2 \end{array} \right. \end{displaymath} otherwise we would contradict the definition of $g_*$. Applying lemmas 1 and 2, it follows that \begin{displaymath} g_{cu}(s) = \left \{ \begin{array}{cl} g_{1*}(s) & \mbox{ if } g_{1*}(s) < c \\ c & \mbox{ if } g_{1*}(s) \geq c \end{array} \right. \end{displaymath} for $s \in S_1$ and \begin{displaymath} g_{lu}(s) = \left \{ \begin{array}{cl} c & \mbox{ if } g_{2*}(s) \leq c \\ g_{2*}(s) & \mbox{ if } g_{2*}(s) > c \end{array} \right. \end{displaymath} for $s \in S_2$. Therefore $g_*(s)$ is a function of $g_{1*}(s)$ on $S_1$, and is a function of $g_{2*}(s)$ on $S_2$. In other words, $g_*(s)$ is constant on all of the level sets $L_i$ of $g_{1*}$ and $g_{2*}$. Let $g_*(s) = d_i$ on $L_i$. Now \begin{eqnarray*} \sum_S [g(s) - g_*(s)]^2w(s) & = & \sum_{S_1} [g(s) - g_{1*}(s) + g_{1*}(s) - g_*(s)]^2w(s)\\ & & + \sum_{S_2} [g(s) - g_{2*}(s) + g_{2*}(s) - g_*(s)]^2w(s)\\ & = & \sum_{S_1} [g(s) -g_{1*}(s)]^2w(s) + \sum_{S_2} [g(s) -g_{2*}(s)]^2w(s)\\ & & + \sum_{S_1} [g_{1*}(s) -g_*(s)]^2w(s) + \sum_{S_2} [g_{2*}(s) -g_*(s)]^2w(s)\\ & & + 2 \sum_{S_1} [g(s) - g_{1*}(s)][g_{1*}(s) - g_*(s)]w(s)\\ & & + 2 \sum_{S_2} [g(s) - g_{2*}(s)][g_{2*}(s) - g_*(s)]w(s) \end{eqnarray*} The last two terms are zero by Theorem 1.31 of Robertson, Wright, and Dykstra, (1988) since $g_{1*}(s) - g_*(s)$ is a function of $g_{1*}(s)$, and $g_{2*}(s) - g_*(s)$ is a function of $g_{2*}(s)$. The first two terms do not involve $g_*(s)$. Hence $g_*(s)$ minimizes \begin{equation} \sum_{S_1} [g_{1*}(s) - g_*(s)]^2w(s) + \sum_{S_2} [g_{2*}(s) - g_*(s)]^2w(s) \label{eq:minim} \end{equation} and hence is the isotonic regression of \begin{displaymath} h(s) = \left \{ \begin{array}{cl} g_{1*}(s) & \mbox{ if $s \in S_1$}\\ g_{2*}(s) & \mbox{ if $s \in S_2$}\\ \end{array} \right . \end{displaymath} It follows readily that the values of $g_*(s)$ on $L_i$, i.e. $d_i$, are in increasing order. Since $g_*(s)$ minimizes (\ref{eq:minim}), equal to \begin{displaymath} \sum_{t=1}^{r} [ c_t - d_t ]^2u(t) \end{displaymath} under the assumption that $g_*$ is isotonic, it follows that $d_1, d_2, \ldots, d_r$ minimize this expression under simple linear order on $1, 2, \ldots, r$, and hence $d_t = f_*(t)$ for all $t$. \qued \begin{thebibliography}{99} \bibitem{Gib} Gibbons, J. D., Olkin, I., and Sobel, M. (1977). {\em Selecting and Ordering Populations: A New Statistical Methodology.} Wiley, New York. \bibitem{Hot} Hotelling, H. (1941). Experimental determination of the maximum of a function. {\em Ann. Math. Statist.} {\bf 12}, 20-45. \bibitem{Muk} Mukerjee, H. (1988). Monotone nonparametric regression. {\em Ann. Statist.} {\bf 16}, 741-750. \bibitem{Mul} M\"{u}ller, H.-G. (1989). Adaptive nonparametric peak estimation. {\em Ann. Statist.} {\bf 17}, 1053-1069. \bibitem{Par} Parzen, E. (1962). On estimation of a probability density function and mode. {\em Ann. Math. Statist.} {\bf 33}, 1065-1076. \bibitem{Rob} Robertson, Tim. (1978). Testing for and against an order restriction on multinomial parameters. {\em J. Amer. Statist. Assoc.} {\bf 73}, 197-202. \bibitem{RWD} Robertson, T., Wright, F. T., and Dykstra, R. L. (1988). {\em Order Restricted Statistical Inference.} Wiley, New York. \bibitem{Rom} Romano, J. (1988). On weak convergence and optimality of kernel density estimates of the mode. {\em Ann. Statist.} {\bf 16} 629-647. \bibitem{Sha} Shapiro, M. (1985). Asymptotic distribution of test statistics in the analysis of moment structures under inequality constraints. {\em Biometrika,} {\bf 72} 133-144. \bibitem{Sil} Silverman, B. W. (1985). Some aspects of the spline smoothing approach to nonparametric regression curve fitting (with discussion). {\em J. Roy. Statist. Soc. Ser. B} {\bf 47}, 1-52. \end{thebibliography} \end{document} Iso/inst/smooth.f.orig0000644000176000001440000001373612073704670014450 0ustar ripleyusersC C This is the original version of the code before C I revised it to remove the "hard wiring" of dimension 20 C in subroutine PAV(). C SUBROUTINE SMOOTH(NROW, NCOL, NDIM, X, W, A, B, NCYCLE, ICYCLE, G, * EPS, IFAULT) C C ALGORITHM AS 206 APPL. STATIST. (1984) VOL.33, NO.3 C C Subroutine to order a two-dimensional array using an algorithm of C Dykstra & Robertson (1982). The ordering is done so that the C regression function is increasing in each independent variable. C C Incorporates corrections from Applied Statistics vol.35(3), C vol.36(1) and vol.40(1). C IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION X(NROW,NCOL), W(NROW,NCOL), A(NROW,NCOL,4) DIMENSION B(NDIM,5), G(NROW,NCOL) DATA ZERO/0.0d0/, DELTA/0.00001d0/, FRACT/0.5d0/ C IFAULT = 0 C Rprintf("epsilon =%f12.6",EPS) C Rprintf("zero =%f12.6",ZERO) C Rprintf("delta =%f12.6",DELTA) C Rprintf("fract =%f12.6",FRACT) C C Check that there are at least 2 rows and columns C IF (NROW .LT. 2 .OR. NCOL .LT. 2) GO TO 120 C C Check that weights are positive or zero C WSUM = ZERO WXSUM = ZERO WMIN = 1.0d+08 DO 3 I = 1, NROW DO 3 J = 1, NCOL WW = W(I,J) IF (WW .LT. ZERO) GO TO 110 IF (WW .LT. DELTA) GO TO 3 WSUM = WSUM + WW WXSUM = WXSUM + WW * X(I,J) IF (WW .LT. WMIN) WMIN = WW 3 CONTINUE IF (WSUM .LT. DELTA) GO TO 130 WMEAN = WXSUM / WSUM C DO 5 I = 1, NROW DO 5 J = 1, NCOL WW = W(I,J) A(I,J,3) = WW A(I,J,4) = X(I,J) IF (WW .GE. DELTA) GO TO 5 A(I,J,3) = FRACT * WMIN A(I,J,4) = WMEAN ICT = ICT + 1 IFAULT = 4 5 CONTINUE C C Initialize R and C to zero, and set up workspace C IFLAG = 0 DELR = ZERO DELC = ZERO ITIC = 0 8 ITIC = ITIC + 1 DO 10 I = 1, NROW DO 10 J = 1, NCOL G(I,J) = A(I,J,4) A(I,J,2) = ZERO A(I,J,1) = ZERO 10 CONTINUE C C Initialize counter for number of cycles C ICOUNT = 0 IF (IFLAG .EQ. 1) GO TO 55 IF (ITIC .EQ. 3 .AND. DELC .GT. DELR) GO TO 55 C C Smooth over rows C 25 JCOUNT = 0 DO 50 I = 1, NROW DO 30 J = 1, NCOL B(J,1) = G(I,J) - A(I,J,1) B(J,2) = A(I,J,3) 30 CONTINUE C CALL PAV(NCOL, B, 1, B(1,2), B(1,3)) C KCOUNT = 0 DO 40 J = 1, NCOL ORD = B(J,3) A(I,J,1) = ORD - B(J,1) IF (ABS(ORD - G(I,J)) .LT. EPS) KCOUNT = KCOUNT + 1 G(I,J) = ORD 40 CONTINUE C C Determine if there is no change in the Ith row from the previous C iteration C IF (KCOUNT .EQ. NCOL) JCOUNT = JCOUNT + 1 50 CONTINUE C ICOUNT = ICOUNT + 1 IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 1) * CALL DIST(A(1,1,1), NROW, NCOL, DELR, IFLAG) IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 2 .AND. ITIC .EQ. 2) GO TO 8 IF (ICOUNT .EQ. 1) GO TO 55 IF (NCYCLE .EQ. ICOUNT) GO TO 100 C C Determine if there has been no change in all rows from the C previous iteration C IF (JCOUNT .EQ. NROW) GO TO 90 C C Smooth over columns C 55 LCOUNT = 0 DO 80 J = 1, NCOL DO 60 I = 1, NROW 60 A(I,J,2) = G(I,J) - A(I,J,2) C CALL PAV(NROW, A(1,J,2), 1, A(1,J,3), B(1,3)) C MCOUNT = 0 DO 70 I = 1, NROW ORD = B(I,3) A(I,J,2) = ORD - A(I,J,2) IF (ABS(ORD - G(I,J)) .LT. EPS) MCOUNT = MCOUNT + 1 G(I,J) = ORD 70 CONTINUE C C Determine if there is no change in the Jth column from the C previous iteration C IF (MCOUNT .EQ. NROW) LCOUNT = LCOUNT + 1 80 CONTINUE C ICOUNT = ICOUNT + 1 IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 0) * CALL DIST(A(1,1,2), NROW, NCOL, DELC, IFLAG) IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 1) GO TO 8 IF (ICOUNT .EQ. 1) GO TO 25 C C Determine if there is has been no change in any column from the C previous iteration C IF (LCOUNT .EQ. NCOL) GO TO 90 C C Check if number of cycles has been reached C IF (NCYCLE .EQ. ICOUNT) GO TO 100 GO TO 25 90 ICYCLE = ICOUNT RETURN C 100 ICYCLE = ICOUNT IFAULT = IFAULT + 1 RETURN 110 IFAULT = 2 RETURN 120 IFAULT = 3 RETURN 130 IFAULT = 6 RETURN END SUBROUTINE PAV(K, X, IORDER, W, FINALX) C C ALGORITHM AS 206.1 APPL. STATIST. (1984) VOL.33, NO.3 C C Apply pool adjacent violators theorem C IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER NW(20) dimension X(20), W(20), FINALX(20), FX(20), PW(20), W1(20), WT(20) C DATA EPS/1.0d-06/ C C Set up workspace C NWC = K DO 10 I = 1, K NW(I) = 1 FX(I) = X(I) IF (IORDER .EQ. 0) FX(I) = -FX(I) WT(I) = W(I) PW(I) = WT(I) * FX(I) W1(I) = W(I) 10 CONTINUE IBEL = K - 1 20 I = 0 30 I = I + 1 35 IF (I .GT. IBEL) GO TO 50 I1 = I + 1 C C Determine if pooling is required C IF (FX(I) - FX(I1) .LE. EPS) GO TO 30 C C Pool the adjacent values C PW(I) = PW(I) + PW(I1) W1(I) = W1(I) + W1(I1) FX(I) = PW(I) / W1(I) NW(I) = NW(I) + NW(I1) NWC = NWC - 1 IF (I1 .GT. IBEL) GO TO 45 DO 40 J = I1, IBEL J1 = J + 1 PW(J) = PW(J1) W1(J) = W1(J1) FX(J) = FX(J1) NW(J) = NW(J1) 40 CONTINUE 45 IBEL = IBEL - 1 GO TO 35 50 ICOUNT = 0 IF (IBEL .LE. 0) GO TO 70 C C Determine if all values are ordered C DO 60 L = 1, IBEL 60 IF (FX(L) - FX(L+1) .LE. EPS) ICOUNT = ICOUNT + 1 IF (ICOUNT .NE. IBEL) GO TO 20 C C Recover final ordered values C 70 J = 1 JL = 1 JU = NW(1) 80 DO 90 L = JL,JU 90 FINALX(L) = FX(J) J = J + 1 IF (J .GT. NWC) GO TO 100 JL = JU + 1 JU = JU + NW(J) GO TO 80 100 IF (IORDER .EQ. 1) RETURN DO 110 I = 1, K 110 FINALX(I) = -FINALX(I) RETURN END SUBROUTINE DIST(A1, NROW, NCOL, DEL, IFLAG) C C ALGORITHM AS 206.2 APPL. STATIST. (1984) VOL.33, NO.3 C IMPLICIT DOUBLE PRECISION (A-H,O-Z) dimension A1(NROW,NCOL) C DATA ZERO/0.0d0/ C DEL = ZERO DO 20 I = 1, NROW DO 20 J = 1, NCOL DEL = DEL + A1(I,J) * A1(I,J) 20 CONTINUE IFLAG = IFLAG + 1 RETURN END Iso/inst/makefor0000744000176000001440000000016112532722761013366 0ustar ripleyusers#! /bin/csh foreach file (*.r) set stem = `basename $file .r` ratfor $file > $stem.f /bin/mv $stem.f ../src end Iso/inst/pava.r0000644000176000001440000000103412133653247013127 0ustar ripleyuserssubroutine pava(y,w,kt,n) implicit double precision(a-h,o-z) logical same dimension y(n), w(n), kt(n) # Note: `kt' <--> `keep track' (of the level sets). do i = 1,n { kt(i) = i } if(n==1) return repeat{ same = .true. do i = 2,n { if(y(i-1) > y(i)) { k1 = kt(i) k2 = kt(i-1) do j = 1,n { if(kt(j)==k1) kt(j) = k2 } wnew = w(i-1) + w(i) ynew = (w(i-1)*y(i-1)+w(i)*y(i))/wnew do j = 1,n { if(kt(j)==k2) { y(j) = ynew w(j) = wnew } } same = .false. } } if(same) break } return end Iso/inst/Isotonic.for0000644000176000001440000001457211512506443014322 0ustar ripleyusersc c Program from fitting isotonic regression in two independent variables real X(20,10),weight(20,10),A(20,10,3),B(20,10,5),G(20,10) open(24,file="Output.txt",status="old") nrows = 20 ncolumns = 10 c Imp: The subroutine SMOOTH assumes that the regression function is c increasing in each independent variable do 101 i=1,nrows do 101 j=1,ncolumns c Generate artificial data X(i,j) = i+j+0.5*i*j weight(i,j) = 1.0 101 continue write(24,3499) ((X(i,j),j=1,ncolumns),i=1,nrows) 3499 format(2x,10f9.2) c Input variables for SMOOTH ncycle = 1000 ndim = max(nrows,ncolumns) EPS = 0.0001 call SMOOTH(nrows,ncolumns,ndim,X,weight,A,B,ncycle,icycle,G, * EPS, IFAULT) write(24,*) IFAULT write(24,3499) ((G(i,j),j=1,ncolumns),i=1,nrows) stop end SUBROUTINE SMOOTH(NROW, NCOL, NDIM, X, W, A, B, NCYCLE, ICYCLE, G, * EPS, IFAULT) C C ALGORITHM AS 206 APPL. STATIST. (1984) VOL.33, NO.3 C C Subroutine to order a two-dimensional array using an algorithm of C Dykstra & Robertson (1982). The ordering is done so that the C regression function is increasing in each independent variable. C C Incorporates corrections from Applied Statistics vol.35(3), C vol.36(1) and vol.40(1). C REAL X(NROW,NCOL), W(NROW,NCOL), A(NROW,NCOL,4), B(NDIM,5), * G(NROW,NCOL), EPS, ZERO, DELTA, DELC, DELR, ORD, WW, FRACT DATA ZERO/0.0/, DELTA/0.00001/, FRACT/0.5/ C IFAULT = 0 C C Check that there are at least 2 rows and columns C IF (NROW .LT. 2 .OR. NCOL .LT. 2) GO TO 120 C C Check that weights are positive or zero C WSUM = ZERO WXSUM = ZERO WMIN = 1.0E+08 DO 3 I = 1, NROW DO 3 J = 1, NCOL WW = W(I,J) IF (WW .LT. ZERO) GO TO 110 IF (WW .LT. DELTA) GO TO 3 WSUM = WSUM + WW WXSUM = WXSUM + WW * X(I,J) IF (WW .LT. WMIN) WMIN = WW 3 CONTINUE IF (WSUM .LT. DELTA) GO TO 130 WMEAN = WXSUM / WSUM C DO 5 I = 1, NROW DO 5 J = 1, NCOL WW = W(I,J) A(I,J,3) = WW A(I,J,4) = X(I,J) IF (WW .GE. DELTA) GO TO 5 A(I,J,3) = FRACT * WMIN A(I,J,4) = WMEAN ICT = ICT + 1 IFAULT = 4 5 CONTINUE C C Initialize R and C to zero, and set up workspace C IFLAG = 0 DELR = ZERO DELC = ZERO ITIC = 0 8 ITIC = ITIC + 1 DO 10 I = 1, NROW DO 10 J = 1, NCOL G(I,J) = A(I,J,4) A(I,J,2) = ZERO A(I,J,1) = ZERO 10 CONTINUE C C Initialize counter for number of cycles C ICOUNT = 0 IF (IFLAG .EQ. 1) GO TO 55 IF (ITIC .EQ. 3 .AND. DELC .GT. DELR) GO TO 55 C C Smooth over rows C 25 JCOUNT = 0 DO 50 I = 1, NROW DO 30 J = 1, NCOL B(J,1) = G(I,J) - A(I,J,1) B(J,2) = A(I,J,3) 30 CONTINUE C CALL PAV(NCOL, B, 1, B(1,2), B(1,3)) C KCOUNT = 0 DO 40 J = 1, NCOL ORD = B(J,3) A(I,J,1) = ORD - B(J,1) IF (ABS(ORD - G(I,J)) .LT. EPS) KCOUNT = KCOUNT + 1 G(I,J) = ORD 40 CONTINUE C C Determine if there is no change in the Ith row from the previous C iteration C IF (KCOUNT .EQ. NCOL) JCOUNT = JCOUNT + 1 50 CONTINUE C ICOUNT = ICOUNT + 1 IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 1) * CALL DIST(A(1,1,1), NROW, NCOL, DELR, IFLAG) IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 2 .AND. ITIC .EQ. 2) GO TO 8 IF (ICOUNT .EQ. 1) GO TO 55 IF (NCYCLE .EQ. ICOUNT) GO TO 100 C C Determine if there has been no change in all rows from the C previous iteration C IF (JCOUNT .EQ. NROW) GO TO 90 C C Smooth over columns C 55 LCOUNT = 0 DO 80 J = 1, NCOL DO 60 I = 1, NROW 60 A(I,J,2) = G(I,J) - A(I,J,2) C CALL PAV(NROW, A(1,J,2), 1, A(1,J,3), B(1,3)) C MCOUNT = 0 DO 70 I = 1, NROW ORD = B(I,3) A(I,J,2) = ORD - A(I,J,2) IF (ABS(ORD - G(I,J)) .LT. EPS) MCOUNT = MCOUNT + 1 G(I,J) = ORD 70 CONTINUE C C Determine if there is no change in the Jth column from the C previous iteration C IF (MCOUNT .EQ. NROW) LCOUNT = LCOUNT + 1 80 CONTINUE C ICOUNT = ICOUNT + 1 IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 0) * CALL DIST(A(1,1,2), NROW, NCOL, DELC, IFLAG) IF (ICOUNT .EQ. 2 .AND. IFLAG .EQ. 1) GO TO 8 IF (ICOUNT .EQ. 1) GO TO 25 C C Determine if there is has been no change in any column from the C previous iteration C IF (LCOUNT .EQ. NCOL) GO TO 90 C C Check if number of cycles has been reached C IF (NCYCLE .EQ. ICOUNT) GO TO 100 GO TO 25 90 ICYCLE = ICOUNT RETURN C 100 ICYCLE = ICOUNT IFAULT = IFAULT + 1 RETURN 110 IFAULT = 2 RETURN 120 IFAULT = 3 RETURN 130 IFAULT = 6 RETURN END SUBROUTINE PAV(K, X, IORDER, W, FINALX) C C ALGORITHM AS 206.1 APPL. STATIST. (1984) VOL.33, NO.3 C C Apply pool adjacent violators theorem C INTEGER NW(20) REAL X(20), W(20), FINALX(20), FX(20), PW(20), W1(20), WT(20), EPS C DATA EPS/1.0E-06/ C C Set up workspace C NWC = K DO 10 I = 1, K NW(I) = 1 FX(I) = X(I) IF (IORDER .EQ. 0) FX(I) = -FX(I) WT(I) = W(I) PW(I) = WT(I) * FX(I) W1(I) = W(I) 10 CONTINUE IBEL = K - 1 20 I = 0 30 I = I + 1 35 IF (I .GT. IBEL) GO TO 50 I1 = I + 1 C C Determine if pooling is required C IF (FX(I) - FX(I1) .LE. EPS) GO TO 30 C C Pool the adjacent values C PW(I) = PW(I) + PW(I1) W1(I) = W1(I) + W1(I1) FX(I) = PW(I) / W1(I) NW(I) = NW(I) + NW(I1) NWC = NWC - 1 IF (I1 .GT. IBEL) GO TO 45 DO 40 J = I1, IBEL J1 = J + 1 PW(J) = PW(J1) W1(J) = W1(J1) FX(J) = FX(J1) NW(J) = NW(J1) 40 CONTINUE 45 IBEL = IBEL - 1 GO TO 35 50 ICOUNT = 0 IF (IBEL .LE. 0) GO TO 70 C C Determine if all values are ordered C DO 60 L = 1, IBEL 60 IF (FX(L) - FX(L+1) .LE. EPS) ICOUNT = ICOUNT + 1 IF (ICOUNT .NE. IBEL) GO TO 20 C C Recover final ordered values C 70 J = 1 JL = 1 JU = NW(1) 80 DO 90 L = JL,JU 90 FINALX(L) = FX(J) J = J + 1 IF (J .GT. NWC) GO TO 100 JL = JU + 1 JU = JU + NW(J) GO TO 80 100 IF (IORDER .EQ. 1) RETURN DO 110 I = 1, K 110 FINALX(I) = -FINALX(I) RETURN END SUBROUTINE DIST(A1, NROW, NCOL, DEL, IFLAG) C C ALGORITHM AS 206.2 APPL. STATIST. (1984) VOL.33, NO.3 C REAL A1(NROW,NCOL), ZERO, DEL C DATA ZERO/0.0/ C DEL = ZERO DO 20 I = 1, NROW DO 20 J = 1, NCOL DEL = DEL + A1(I,J) * A1(I,J) 20 CONTINUE IFLAG = IFLAG + 1 RETURN END Iso/inst/ufit.r0000644000176000001440000000350013077250234013144 0ustar ripleyuserssubroutine ufit(xk,wk,xmode,x,w,mse,x1,w1,x2,w2,ind,kt,n,goof) implicit double precision(a-h,o-z) integer goof double precision mse dimension xk(n), wk(n), x(n), w(n),x1(n), w1(n), x2(n), w2(n), ind(n), kt(n) # Nude virgin of ufit --- 18/8/95. # The changes are based upon Pete's observation that when we are # seeking the OPTIMIUM mode (in terms of SSE) we need only search # over the ``half-points'' --- 1.5, 2.5, ..., n-0.5. If the optimum # is at k, then the half-points k-0.5 and k+05 give SSEs that are # at least as small as and hence are equal to the SSE at k. This is # because if a function is increasing on 1,...,k and decreasing on # k,...n, then it is increasing on 1,...,(k-1)) and decresing on # k,...,n !!! (And likewise for 1,...,k and (k+1),...n.) Thus if # there is an optimum at k then there are optima at k-0.5 and k+0.5. # Of course if k=1 then k-0.5 is not considered and likewise if k=n # then k+0.5 is not considered. # # Note also that if there is an optimum at the half-point k-0.5, then # there is also a whole-point optimum either at k-1 or k. # # Explanation revised (corrected) 31/05/2015. if(xmode < 0) { m = n-1 x0 = 1.5d0 xmax = -1.d0 ssemin = 1.d200 do i = 1,m { do j = 1,n { x(j) = xk(j) w(j) = wk(j) } call unimode(x,w,x1,w1,x2,w2,ind,kt,x0,n,goof) if(goof > 0) return sse = 0.d0 do j = 1,n { sse = sse + (x(j)-xk(j))**2 } if(sse < ssemin) { ssemin = sse xmax = x0 } x0 = x0+1.d0 } k1 = int(xmax-0.5d0) k2 = int(xmax+0.5d0) } else xmax = xmode do j = 1,n { x(j) = xk(j) w(j) = wk(j) } call unimode(x,w,x1,w1,x2,w2,ind,kt,xmax,n,goof) if(goof > 0) return if(xmode < 0) { mse = ssemin/dble(n) if(x(k1)>=x(k2)) xmode=dble(k1) else xmode=dble(k2) } else { sse = 0.d0 do j = 1,n { sse = sse + (x(j)-xk(j))**2 } mse = sse/dble(n) } return end