[Pomp-commits] r604 - in pkg: . R inst inst/doc man tests
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Thu Jan 19 22:15:00 CET 2012
Author: kingaa
Date: 2012-01-19 22:14:59 +0100 (Thu, 19 Jan 2012)
New Revision: 604
Added:
pkg/man/sannbox.Rd
Modified:
pkg/DESCRIPTION
pkg/NAMESPACE
pkg/R/probe-match.R
pkg/R/sannbox.R
pkg/R/traj-match.R
pkg/inst/NEWS
pkg/inst/doc/manual.pdf
pkg/man/probe.Rd
pkg/man/traj-match.Rd
pkg/tests/ou2-trajmatch.R
pkg/tests/ou2-trajmatch.Rout.save
pkg/tests/ricker-probe.Rout.save
Log:
- add new 'traj.match.objfun' and 'probe.match.objfun' functions
- rearrange existing 'traj.match' and 'probe.match' codes to make use of these
- an improved 'sannbox' algorithm is now exported
Modified: pkg/DESCRIPTION
===================================================================
--- pkg/DESCRIPTION 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/DESCRIPTION 2012-01-19 21:14:59 UTC (rev 604)
@@ -1,13 +1,13 @@
Package: pomp
Type: Package
Title: Statistical inference for partially observed Markov processes
-Version: 0.40-3
-Date: 2012-01-19
+Version: 0.40-4
+Date: 2012-01-20
Author: Aaron A. King, Edward L. Ionides, Carles Breto, Steve Ellner, Bruce Kendall, Helen Wearing, Matthew J. Ferrari, Michael Lavine, Daniel C. Reuman
Maintainer: Aaron A. King <kingaa at umich.edu>
URL: http://pomp.r-forge.r-project.org
Description: Inference methods for partially-observed Markov processes
-Depends: R(>= 2.10.1), stats, methods, graphics, mvtnorm, subplex, deSolve
+Depends: R(>= 2.13.1), stats, methods, graphics, mvtnorm, subplex, deSolve
License: GPL(>= 2)
LazyLoad: true
LazyData: false
Modified: pkg/NAMESPACE
===================================================================
--- pkg/NAMESPACE 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/NAMESPACE 2012-01-19 21:14:59 UTC (rev 604)
@@ -85,5 +85,7 @@
probe.ccf,
probe.nlar,
probe.marginal,
- spect.match
+ sannbox,
+ spect.match,
+ traj.match.objfun
)
Modified: pkg/R/probe-match.R
===================================================================
--- pkg/R/probe-match.R 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/R/probe-match.R 2012-01-19 21:14:59 UTC (rev 604)
@@ -20,7 +20,6 @@
summary(as(object,"probed.pomp")),
list(
est=object at est,
- weights=object at weights,
value=object at value,
eval=object at evals,
convergence=object at convergence
@@ -30,180 +29,113 @@
}
)
-probe.mismatch <- function (par, est, object, probes, params,
- nsim = 1, seed = NULL,
- weights, datval,
- fail.value = NA) {
- if (missing(par)) par <- numeric(0)
- if (missing(est)) est <- integer(0)
+probe.match.objfun <- function (object, params, est, probes,
+ nsim = 1, seed = NULL, fail.value = NA, ...) {
+
+ if (missing(est)) est <- character(0)
+ if (!is.character(est)) stop(sQuote("est")," must be a vector of parameter names")
if (missing(params)) params <- coef(object)
+ if ((!is.numeric(params))||(is.null(names(params))))
+ stop(sQuote("params")," must be a named numeric vector")
+ par.est.idx <- match(est,names(params))
+ if (any(is.na(par.est.idx)))
+ stop("parameter(s): ",sQuote(est[is.na(par.est.idx)])," not found in ",sQuote("params"))
- params[est] <- par
+ if (!is.list(probes)) probes <- list(probes)
+ if (!all(sapply(probes,is.function)))
+ stop(sQuote("probes")," must be a function or a list of functions")
+ if (!all(sapply(probes,function(f)length(formals(f))==1)))
+ stop("each probe must be a function of a single argument")
+
+ datval <- .Call(apply_probe_data,object,probes) # apply probes to data
+
+ obj.fun <- function (par) {
+ params[par.est.idx] <- par
- ## apply probes to model simulations
- simval <- .Call(
- apply_probe_sim,
- object=object,
- nsim=nsim,
- params=params,
- seed=seed,
- probes=probes,
- datval=datval
- )
-
- ## compute a measure of the discrepancies between simulations and data
- sim.means <- colMeans(simval)
- simval <- sweep(simval,2,sim.means)
- discrep <- ((datval-sim.means)^2)/colMeans(simval^2)
- if ((length(weights)>1) && (length(weights)!=length(discrep)))
- stop(length(discrep)," probes have been computed, but ",length(weights)," have been supplied")
- if (!all(is.finite(discrep))) {
- mismatch <- fail.value
- } else if (length(weights)>1) {
- mismatch <- sum(discrep*weights)/sum(weights)
- } else {
- mismatch <- sum(discrep)
+ ## apply probes to model simulations
+ simval <- .Call(
+ apply_probe_sim,
+ object=object,
+ nsim=nsim,
+ params=params,
+ seed=seed,
+ probes=probes,
+ datval=datval
+ )
+
+ ll <- .Call(synth_loglik,simval,datval)
+ if (is.finite(ll)||is.na(fail.value)) -ll else fail.value
}
- mismatch
+ obj.fun
}
-neg.synth.loglik <- function (par, est, object, probes, params,
- nsim = 1, seed = NULL,
- weights, datval,
- fail.value = NA) {
- if (missing(par)) par <- numeric(0)
- if (missing(est)) est <- integer(0)
- if (missing(params)) params <- coef(object)
-
- params[est] <- par
-
- ## apply probes to model simulations
- simval <- .Call(
- apply_probe_sim,
- object=object,
- nsim=nsim,
- params=params,
- seed=seed,
- probes=probes,
- datval=datval
- )
-
- ll <- .Call(synth_loglik,simval,datval)
- -ll
-}
-
probe.match.internal <- function(object, start, est,
probes, weights,
nsim, seed,
method, verbose,
eval.only, fail.value, ...) {
- obj.fn <- neg.synth.loglik
+ if (eval.only) {
+ est <- character(0)
+ guess <- numeric(0)
+ } else {
+ if (!is.character(est)) stop(sQuote("est")," must be a vector of parameter names")
+ if (length(start)<1)
+ stop(sQuote("start")," must be supplied if ",sQuote("object")," contains no parameters")
+ if (is.null(names(start))||(!all(est%in%names(start))))
+ stop(sQuote("est")," must refer to parameters named in ",sQuote("start"))
+ guess <- start[est]
+ }
- if (!is.list(probes)) probes <- list(probes)
+ obj <- as(object,"pomp")
+ coef(obj) <- start
- if (!eval.only&&(length(est)<1))
- stop("parameters to be estimated must be specified in ",sQuote("est"))
- if (!is.character(est)|!all(est%in%names(start)))
- stop(sQuote("est")," must refer to parameters named in ",sQuote("start"))
- par.index <- which(names(start)%in%est)
-
- if (!all(sapply(probes,is.function)))
- stop(sQuote("probes")," must be a function or a list of functions")
- if (!all(sapply(probes,function(f)length(formals(f))==1)))
- stop("each probe must be a function of a single argument")
-
- params <- start
- guess <- params[par.index]
+ obj.fn <- probe.match.objfun(
+ obj,
+ est=est,
+ probes=probes,
+ nsim=nsim,
+ seed=seed,
+ fail.value=fail.value
+ )
- datval <- .Call(apply_probe_data,object,probes) # apply probes to data
if (eval.only) {
- val <- obj.fn(
- par=guess,
- est=par.index,
- object=object,
- probes=probes,
- params=params,
- nsim=nsim,
- seed=seed,
- weights=weights,
- datval=datval,
- fail.value=fail.value
- )
+
+ val <- obj.fn(guess)
conv <- NA
evals <- as.integer(c(1,0))
msg <- paste("no optimization performed")
+
} else {
- if (method == 'subplex') {
- opt <- subplex::subplex(
- par=guess,
- fn=obj.fn,
- est=par.index,
- object=object,
- probes=probes,
- params=params,
- nsim=nsim,
- seed=seed,
- weights=weights,
- datval=datval,
- fail.value=fail.value,
- control=list(...)
- )
+ if (method == 'subplex') {
+ opt <- subplex::subplex(par=guess,fn=obj.fn,control=list(...))
} else if (method=="sannbox") {
- opt <- sannbox(
- par=guess,
- fn=obj.fn,
- est=par.index,
- object=object,
- probes=probes,
- params=params,
- nsim=nsim,
- seed=seed,
- weights=weights,
- datval=datval,
- fail.value=fail.value,
- control=list(...)
- )
-
+ opt <- sannbox(par=guess,fn=obj.fn,control=list(...))
} else {
- opt <- optim(
- par=guess,
- fn=obj.fn,
- est=par.index,
- object=object,
- probes=probes,
- params=params,
- nsim=nsim,
- seed=seed,
- weights=weights,
- datval=datval,
- fail.value=fail.value,
- method=method,
- control=list(...)
- )
+ opt <- optim(par=guess,fn=obj.fn,method=method,control=list(...))
}
- val <- opt$value
- params[par.index] <- opt$par
+
+ if (!is.null(names(opt$par)) && !all(est==names(opt$par)))
+ stop("mismatch between parameter names returned by optimizer and ",sQuote("est"))
+ coef(obj,est) <- unname(opt$par)
+ msg <- if (is.null(opt$message)) character(0) else opt$message
conv <- opt$convergence
+ val <- opt$value
evals <- opt$counts
- msg <- opt$message
}
new(
"probe.matched.pomp",
probe(
- as(object,"pomp"),
+ obj,
probes=probes,
- params=params,
nsim=nsim,
seed=seed
),
est=as.character(est),
- weights=weights,
- fail.value=as.numeric(fail.value),
value=val,
convergence=as.integer(conv),
evals=as.integer(evals),
@@ -333,3 +265,66 @@
)
}
)
+
+probe.mismatch <- function (par, est, object, probes, params,
+ nsim = 1, seed = NULL,
+ weights, datval,
+ fail.value = NA) {
+ if (missing(par)) par <- numeric(0)
+ if (missing(est)) est <- integer(0)
+ if (missing(params)) params <- coef(object)
+
+ params[est] <- par
+
+ ## apply probes to model simulations
+ simval <- .Call(
+ apply_probe_sim,
+ object=object,
+ nsim=nsim,
+ params=params,
+ seed=seed,
+ probes=probes,
+ datval=datval
+ )
+
+ ## compute a measure of the discrepancies between simulations and data
+ sim.means <- colMeans(simval)
+ simval <- sweep(simval,2,sim.means)
+ discrep <- ((datval-sim.means)^2)/colMeans(simval^2)
+ if ((length(weights)>1) && (length(weights)!=length(discrep)))
+ stop(length(discrep)," probes have been computed, but ",length(weights)," have been supplied")
+ if (!all(is.finite(discrep))) {
+ mismatch <- fail.value
+ } else if (length(weights)>1) {
+ mismatch <- sum(discrep*weights)/sum(weights)
+ } else {
+ mismatch <- sum(discrep)
+ }
+
+ mismatch
+}
+
+neg.synth.loglik <- function (par, est, object, probes, params,
+ nsim = 1, seed = NULL,
+ weights, datval,
+ fail.value = NA) {
+ if (missing(par)) par <- numeric(0)
+ if (missing(est)) est <- integer(0)
+ if (missing(params)) params <- coef(object)
+
+ params[est] <- par
+
+ ## apply probes to model simulations
+ simval <- .Call(
+ apply_probe_sim,
+ object=object,
+ nsim=nsim,
+ params=params,
+ seed=seed,
+ probes=probes,
+ datval=datval
+ )
+
+ ll <- .Call(synth_loglik,simval,datval)
+ if (is.finite(ll)||is.na(fail.value)) -ll else fail.value
+}
Modified: pkg/R/sannbox.R
===================================================================
--- pkg/R/sannbox.R 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/R/sannbox.R 2012-01-19 21:14:59 UTC (rev 604)
@@ -22,6 +22,7 @@
tmax=10,
sched=NULL,
candidate.dist=NULL,
+ fnscale=1,
parscale=1,
lower=-Inf,
upper=Inf,
@@ -31,15 +32,24 @@
control <- control.default
if (is.null(control$sched)) # default cooling schedule
- control$sched <- function (k) control$temp/log(((k-1)%/%control$tmax)*control$tmax+exp(1))
+ control$sched <- function (k, temp, tmax) temp/log(((k-1)%/%tmax)*tmax+exp(1))
if (is.function(control$sched))
- temps <- vapply(seq_len(control$maxit),control$sched,numeric(1))
- else if (is.numeric(control$sched))
+ temps <- vapply(
+ seq_len(control$maxit),
+ FUN=control$sched,
+ FUN.VALUE=numeric(1),
+ temp=control$temp,
+ tmax=control$tmax
+ )
+ else if (is.numeric(control$sched)) {
temps <- control$sched
+ if (length(temps)<control$maxit)
+ stop("insufficiently many temperatures supplied in ",sQuote("control$sched"))
+ }
if (is.null(control$candidate.dist))
- candidate.dist <- function (temp) rnorm(n=npar,mean=0,sd=control$parscale*temp)
+ candidate.dist <- function (par, temp, scale) rnorm(n=npar,mean=par,sd=scale*temp)
if (length(control$lower)<npar)
control$lower <- rep(control$lower,npar)
@@ -49,7 +59,7 @@
## initialization for the algorithm
laststep <- 0
thetabest <- thetacurrent <- par
- ycurrent <- fn(thetacurrent,...)
+ ycurrent <- fn(thetacurrent,...)/control$fnscale
if (!is.finite(ycurrent)) ycurrent <- big
ybest <- ycurrent
neval <- 1
@@ -62,7 +72,7 @@
## main loop
for (k in seq_len(control$maxit)) {
## get a candidate thetacand
- thetacand <- thetacurrent+candidate.dist(temps[k])
+ thetacand <- candidate.dist(thetacurrent,temps[k],control$parscale)
## enforce box constraints
thetacand <- ifelse(
thetacand<control$lower,
@@ -74,7 +84,7 @@
control$upper,
thetacand
)
- ycand <- fn(thetacand,...)
+ ycand <- fn(thetacand,...)/control$fnscale
if (!is.finite(ycand)) ycand <- big
neval <- neval+1
@@ -102,6 +112,8 @@
if (control$trace>0)
cat("best val=",ybest,"\n")
+ names(thetacurrent) <- names(thetabest) <- names(par)
+
list(
counts=c(neval,NA),
convergence=0,
Modified: pkg/R/traj-match.R
===================================================================
--- pkg/R/traj-match.R 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/R/traj-match.R 2012-01-19 21:14:59 UTC (rev 604)
@@ -30,41 +30,58 @@
}
)
+traj.match.objfun <- function (object, params, est) {
+
+ if (missing(est)) est <- character(0)
+ if (!is.character(est)) stop(sQuote("est")," must be a vector of parameter names")
+ if (missing(params)) params <- coef(object)
+ if ((!is.numeric(params))||(is.null(names(params))))
+ stop(sQuote("params")," must be a named numeric vector")
+ par.est.idx <- match(est,names(params))
+ if (any(is.na(par.est.idx)))
+ stop("parameter(s): ",sQuote(est[is.na(par.est.idx)])," not found in ",sQuote("params"))
+ params <- as.matrix(params)
+
+ obj.fn <- function (par) {
+ params[par.est.idx,] <- par
+ X <- trajectory(object,params=params)
+ d <- dmeasure(
+ object,
+ y=object at data,
+ x=X,
+ times=time(object),
+ params=params,
+ log=TRUE
+ )
+ -sum(d)
+ }
+
+ obj.fn
+}
+
traj.match.internal <- function (object, start, est, method, gr, eval.only, ...) {
if (eval.only) {
- par.est <- integer(0)
+ est <- character(0)
+ guess <- numeric(0)
} else {
if (!is.character(est)) stop(sQuote("est")," must be a vector of parameter names")
+ if (length(start)<1)
+ stop(sQuote("start")," must be supplied if ",sQuote("object")," contains no parameters")
if (!all(est%in%names(start)))
stop(sQuote("traj.match")," error: parameters named in ",sQuote("est"),
" must exist in ",sQuote("start"),call.=FALSE)
- par.est <- which(names(start)%in%est)
- guess <- start[par.est]
+ guess <- start[est]
}
- t0 <- timezero(object)
obj <- as(object,"pomp")
coef(obj) <- start
- pmat <- as.matrix(start)
- obj.fn <- function (x, object, params, t0, ind) {
- params[ind,] <- x
- X <- trajectory(object,params=params,t0=t0)
- d <- dmeasure(
- object,
- y=object at data,
- x=X,
- times=time(object),
- params=params,
- log=TRUE
- )
- -sum(d)
- }
+ obj.fn <- traj.match.objfun(obj,est=est)
if (eval.only) {
- val <- obj.fn(numeric(0),object=obj,params=pmat,t0=t0,ind=par.est)
+ val <- obj.fn(guess)
conv <- NA
evals <- c(1,0)
msg <- "no optimization performed"
@@ -72,46 +89,16 @@
} else {
if (method=="subplex") {
-
- opt <- subplex::subplex(
- par=guess,
- fn=obj.fn,
- control=list(...),
- object=obj,
- params=pmat,
- t0=t0,
- ind=par.est
- )
-
+ opt <- subplex::subplex(par=guess,fn=obj.fn,control=list(...))
} else if (method=="sannbox") {
-
- opt <- sannbox(
- par=guess,
- fn=obj.fn,
- control=list(...),
- object=obj,
- params=pmat,
- t0=t0,
- ind=par.est
- )
-
+ opt <- sannbox(par=guess,fn=obj.fn,control=list(...))
} else {
-
- opt <- optim(
- par=guess,
- fn=obj.fn,
- gr=gr,
- method=method,
- control=list(...),
- object=obj,
- params=pmat,
- t0=t0,
- ind=par.est
- )
-
+ opt <- optim(par=guess,fn=obj.fn,gr=gr,method=method,control=list(...))
}
- coef(obj,names(opt$par)) <- unname(opt$par)
+ if (!is.null(names(opt$par)) && !all(est==names(opt$par)))
+ stop("mismatch between parameter names returned by optimizer and ",sQuote("est"))
+ coef(obj,est) <- unname(opt$par)
msg <- if (is.null(opt$message)) character(0) else opt$message
conv <- opt$convergence
evals <- opt$counts
@@ -120,7 +107,7 @@
}
## fill 'states' slot of returned object with the trajectory
- x <- trajectory(obj,t0=t0)
+ x <- trajectory(obj)
obj at states <- array(data=x,dim=dim(x)[c(1,3)])
rownames(obj at states) <- rownames(x)
@@ -144,7 +131,7 @@
"traj.match",
signature=signature(object="pomp"),
function (object, start, est,
- method = c("Nelder-Mead","sannbox","subplex"),
+ method = c("Nelder-Mead","subplex","SANN","BFGS","sannbox"),
gr = NULL, eval.only = FALSE, ...) {
if (missing(start)) start <- coef(object)
if (!eval.only && missing(est))
@@ -167,7 +154,7 @@
"traj.match",
signature=signature(object="traj.matched.pomp"),
function (object, start, est,
- method = c("Nelder-Mead","sannbox","subplex"),
+ method = c("Nelder-Mead","subplex","SANN","BFGS","sannbox"),
gr = NULL, eval.only = FALSE, ...) {
if (missing(start)) start <- coef(object)
if (missing(est)) est <- object at est
Modified: pkg/inst/NEWS
===================================================================
--- pkg/inst/NEWS 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/inst/NEWS 2012-01-19 21:14:59 UTC (rev 604)
@@ -1,4 +1,12 @@
NEWS
+0.40-4
+ o New functions 'traj.match.objfun' and 'probe.match.objfun' have been added.
+ These functions construct functions of one argument suitable for use as objective functions in 'optim'-like optimizers (iincluding 'subplex' and 'sannbox').
+ Minimizing these functions solves the trajectory-matching problem and probe-matching problem, respectively.
+ This allows the user much greater flexibility in choice of optimization algorithm than is afforded by 'traj.match' and 'probe.match'.
+
+ o The 'sannbox' optimizer, which performs simulated annealing with box constraints, is now exported and available for general use.
+
0.40-3
o The 'bsmc' method has been improved, due to the contributions of Pierre Jacob.
Specifically, 'bsmc' no longer reports a log-likelihood (which it never really computed anyway) but a log-evidence.
@@ -15,8 +23,6 @@
Specifically, dw=rgammwn(sigma,dt) is Gamma distributed with mean dt and variance sigma^2*dt.
In this case, mu*dw/dt is suitable for use as a random rate in an Euler-multinomial process.
- o The "Brent" method for trajectory, probe, and spectrum matching has been added.
-
0.40-2
o A bug to do with computation of the number of steps needed in discrete-time simulation and trajectory computations has been fixed.
This bug was introduced in version 0.40-1.
Modified: pkg/inst/doc/manual.pdf
===================================================================
--- pkg/inst/doc/manual.pdf 2012-01-19 17:06:54 UTC (rev 603)
+++ pkg/inst/doc/manual.pdf 2012-01-19 21:14:59 UTC (rev 604)
@@ -157,410 +157,425 @@
(rw2)
endobj
105 0 obj
-<< /S /GoTo /D (Rfn.simulate.Rdash.pomp.1) >>
+<< /S /GoTo /D (Rfn.sannbox.1) >>
endobj
108 0 obj
-(simulate-pomp)
+(sannbox)
endobj
109 0 obj
-<< /S /GoTo /D (Rfn.sir.1) >>
+<< /S /GoTo /D (Rfn.simulate.Rdash.pomp.1) >>
endobj
112 0 obj
-(sir)
+(simulate-pomp)
endobj
113 0 obj
-<< /S /GoTo /D (Rfn.sliceDesign.1) >>
+<< /S /GoTo /D (Rfn.sir.1) >>
endobj
116 0 obj
-(sliceDesign)
+(sir)
endobj
117 0 obj
-<< /S /GoTo /D (Rfn.sobol.1) >>
+<< /S /GoTo /D (Rfn.sliceDesign.1) >>
endobj
120 0 obj
-(sobol)
+(sliceDesign)
endobj
121 0 obj
-<< /S /GoTo /D (Rfn.spect.1) >>
+<< /S /GoTo /D (Rfn.sobol.1) >>
endobj
124 0 obj
-(spect)
+(sobol)
endobj
125 0 obj
-<< /S /GoTo /D (Rfn.traj.match.1) >>
+<< /S /GoTo /D (Rfn.spect.1) >>
endobj
128 0 obj
-(traj.match)
+(spect)
endobj
129 0 obj
-<< /S /GoTo /D (Rfn.trajectory.1) >>
+<< /S /GoTo /D (Rfn.traj.match.1) >>
endobj
132 0 obj
-(trajectory)
+(traj.match)
endobj
133 0 obj
-<< /S /GoTo /D (Rfn.verhulst.1) >>
+<< /S /GoTo /D (Rfn.trajectory.1) >>
endobj
136 0 obj
-(verhulst)
+(trajectory)
endobj
137 0 obj
-<< /S /GoTo /D (index.0) >>
+<< /S /GoTo /D (Rfn.verhulst.1) >>
endobj
140 0 obj
-(Index)
+(verhulst)
endobj
141 0 obj
-<< /S /GoTo /D [142 0 R /Fit ] >>
+<< /S /GoTo /D (index.0) >>
endobj
-152 0 obj <<
-/Length 1221
+144 0 obj
+(Index)
+endobj
+145 0 obj
+<< /S /GoTo /D [146 0 R /Fit ] >>
+endobj
+156 0 obj <<
+/Length 1218
/Filter /FlateDecode
>>
stream
-xÚíXÝoÛ6Ï_¡·Ù@Å(KÅV,I?ÖÔÄÛÚ£eÚa«/PTÚì¯ßQ¤ÉµeèÛ y¼ãÝýîK2övöÞá#ÏËÕÙùëy£(¢Ì[m=(^-b%·ÚxfïçÏxúïÄܧÏþ®Ê¼úiþ×êä#0F| &p¡Vü
-WV4~fj.èi-IPÑÈ\ähbÂUæ,YÍáì±ûÑ@TÇA 'í¬³}Jò.:m$IM«Ñ.:uwkYkòÌú)P¢HrÛRÙEÅ<Ë,åºêÁØ*6rÃÕg{iNH©¨kQO»b-¹ò\
gBÕ²,¦¼ $3
Ø'º,ÿHÕK®O'=`&|L|òÉ]ÌFߤS1.zu\ -È>ßÉbçòÕæKêÊÅ`éXÞ
ÜÚq]qAÚõ¥ºtô;ðX(º³¬êYÇÛtiðÎ0b àpý9!T\Í)ùÆ5(xoÍzòdõ
-×ú¾UýŮٯ
R\ÉM¦÷\¸´\rsû,;}ÉÙ^9ù[Ñä¼8ïÅåËBÿ ȸØCé@.âùógàâü×&ïØ4/¦
-aàxlïï·ËFæzì)غå¹jd&}¹×ºz~~nÚ"RþÜ·¾Ý
-÷H5ÚXÕ1Xííãºuªd¥OT03ìí¸ýäÊeSëEþ÷lCÎ=*ÈúzÊþ FÂÎþÛῸ±C(Ä%m
-ݶ«JçÛí¯îeÚ>è¢Ty'Ö¬+hêàÐWGÙ»2s
;å3ÎúY2E-NtU÷¹þæýräqèT5â#$üÇeÉ7PÆíätjµjN8gÙ¿Q
-OªP÷·m;hVÐeeFº®Ê,;1;L3'}ñsÎÑÑÆ®oI4PyiYyG¬²f'¶}_%ã¾
-ÅsÝñ×D×Þ/wýÅþ1¦Ù>½.×eÖmÖuA¬ûC^ëò«SNB¦oøÛæIé#µï»£©\ðºQÂ2*W#¢,¤öMô¼CõÎåÍ¡ë6®«Û^ £JÅø@Ò--Q+nº^©Gä*+µÈS±ÂØìâ> FaÐ㧽ÍåÖO3^÷ÂmûKa¤ûpÔÇË}})XÊ0ËuÈ<mõ[fsìgmM¤õ°kôh_®?
-r(GLPåZrv-öâµLýöà)K+3¥^ƾì' QFt4ýá£G.;N6ä$JBÖw¢²ÖìÒ¬L\Zl÷ß)rí¤(ÅRu# fÈÌXüIò´¿dÀÛ÷·÷ïO ÆÏÁ6(ÉdA¿ô]?û ¥??
-üÆ?ÆZüÛbE¶XAã"ùýwÀľb4hïTñ«Ú«ÕÙ¿4'ø
+xÚíXKoÛ8¾çWè¶6P1$õ°Uì¤ÏÔÄ»{hXZ¢6z¤ÒfýEJ\G¾ä¶EQÎpf¾yQÁÞÎÃÞ»üÄïùúäômy£8¦·Þz4ÑrA¼h±DqxëÌû<û4'xÆÒ;¶ãsFxöO]õ/ó¿× { $¨0
+Bâ£À_²²aòÁä
]PL¨¹¡·¦5%AILcsOb0%á.HäLYÏáì¡æûñ@t/ N:ã£Îø)uNÊ0h¸è´åLè|Z]tÑ©»ÑL¥EÊrë§(·\ò2uÐm+i5Z°<w¸TÅå½±grÅä¾2Ä{'$«+ÅÕ´+Ö¢+ÂUxÆ¥U9åM°@$!7
Ø'9²×LlôLð1yeFÎæ J£oÔ)".zugL-gÈþ~åÎ¥åì[íÒEaåX>T¥È¸r\Læv}.¹®ýü¦&Z&îÂ</¹|Ññ6]"|4¼Ì Üá{sgØ_ó%É9Å3߸åQÞÛZ³<Z}Å´¾mU³Kgö[.%¢cé-ã.1WÌÜ~/JîN_³RtNþ7+Å%Á{q¹b¢ÔðOÆ%
+ ȸØ.Cé@.ãùëp1ö{SwgÍ«é¶B"Dðrlï׫FæzìIغ嵹jd&}¹Õº~yzj:#þÜ·µ¾ãÝJ÷+O5ÚXÕS°ÚÛÇuÅU*EÔp"
+gØq*8K¦êFþs6"gÈ5d½²?$("agÿõáW¿¹©PKZý¶«JçÛí$«oEÚÞë²E'ÖljhëàÐwGÉøM»ÂòÉg}+òRñ#}/û\÷i5òÊ8t¬Ëñ+öïêbÙ$Ëvv:µZ6G³ì?¨Î&ÕÄ(\ö·m;h®è²2#]U¦¾øcèÚhc׸Äˢɵ(«¢#Öy³¥mßWɸ¯B1Lwü*èúÐûÅ®¿ÒÿÆ4ߧ«jSåÝf£êZ êYYnªïN1v:]
+¾áoG
+¦Ö¾Kî&ÎT#¹?d®,GDQ
+í2éyêËÙ¡ë²Cש¶À¨ÒU9>ô@KKÔ®WɹÎ+í²cÄÔB¬aDÑìâ> FaÐã_¤½-ÄÖOs¦zá¶ý¥0Ò}8êãå¾¾,e å:äJ¶ú³yêgoM¤jHØ5z´¯6_¹'LÕrvÃ÷bJ¤~{ð¥µRÃM/cßûGBxäÇt4ýá»Ç.;ÎhÈ }; £¾U5´ffUÚ¼Ô<{ÙR¦,ȵs¢0KÝ}$!3cñÿý'LÇÝøÿв}ϸ%¼g¼Ï> ?$m2QÉ~î»~6÷J"þ|øÓøS[¬È+¨Z$?Aì£Ø÷1 q"´ïTñSíÍúä?±w(
endstream
endobj
-142 0 obj <<
+146 0 obj <<
/Type /Page
-/Contents 152 0 R
-/Resources 151 0 R
+/Contents 156 0 R
+/Resources 155 0 R
/MediaBox [0 0 612 792]
-/Parent 161 0 R
-/Annots [ 143 0 R 144 0 R 145 0 R 146 0 R ]
+/Parent 165 0 R
+/Annots [ 147 0 R 148 0 R 149 0 R 150 0 R ]
>> endobj
-143 0 obj <<
+147 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [125.362 394.721 292.735 405.311]
/Subtype/Link/A<</Type/Action/S/URI/URI(http://pomp.r-forge.r-project.org)>>
>> endobj
-144 0 obj <<
+148 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [506.111 134.785 513.085 143.532]
/A << /S /GoTo /D (page.2) >>
>> endobj
-145 0 obj <<
+149 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [506.111 122.634 513.085 131.48]
/A << /S /GoTo /D (page.3) >>
>> endobj
-146 0 obj <<
+150 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [506.111 110.582 513.085 119.429]
/A << /S /GoTo /D (page.5) >>
>> endobj
-153 0 obj <<
-/D [142 0 R /XYZ 99.346 724.594 null]
+157 0 obj <<
+/D [146 0 R /XYZ 99.346 724.594 null]
>> endobj
-154 0 obj <<
-/D [142 0 R /XYZ 100.346 693.639 null]
+158 0 obj <<
+/D [146 0 R /XYZ 100.346 693.639 null]
>> endobj
-155 0 obj <<
-/D [142 0 R /XYZ 100.346 594.012 null]
+159 0 obj <<
+/D [146 0 R /XYZ 100.346 594.012 null]
>> endobj
-160 0 obj <<
-/D [142 0 R /XYZ 100.346 144.921 null]
+164 0 obj <<
+/D [146 0 R /XYZ 100.346 144.921 null]
>> endobj
-151 0 obj <<
-/Font << /F35 156 0 R /F36 157 0 R /F22 158 0 R /F39 159 0 R >>
+155 0 obj <<
+/Font << /F35 160 0 R /F36 161 0 R /F22 162 0 R /F39 163 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-206 0 obj <<
-/Length 1545
+211 0 obj <<
+/Length 1554
/Filter /FlateDecode
>>
stream
-xÚí[KsÛ6¾ëWðr¦ñäãNLÓvúò¥dRd$$¡÷×wP²¤ØcƵCyáX »ûí. £U£oÏg/X¨Ìh/#1b<rBPÆÊè¼^Ç4y{þêìç{L0KÝxµi×éZVäJ9ê8ê?eD ÊDÒ
-Yh}Ñøú
-ÆL«!I.b¤ãùvÇåíÛ¾¶1\1*¢Þ½Çß_.¢×)aÇùm¸Ã%%±`m°rVö×Å<jYU2IKÊgm
-rg¨M£úvÓXÝ\Yë*ÖP:ÁìSêí?Îجé'1z¯~:Éè2]mº?Bplú ÜTædVþ)?Ú~«sù¨°I.¨¤²¦æDé©TMr®Å¬ò/J1 ³¡0;Y×'âIñi-ûVZdÎNäë7Óƪ>Iyÿjhc4(o§ðBÌóÉ£VpOsf³Ò(
-1+úT. ¦¹@[¹í=*²YÛ§BbZÒä¸
-B´÷÷ØĤȴk·
Dg-ÈîÙÄÈ}*Úý¼jx¬¶ifß5o >Ñî5:2ÿÿ.Ù9jâ>¯Wß©A¯º$Íçäæ¿é}Ú^\¯«ð9À-nóùýÉâË´ïöý5Êy
õá½cÐí¦V¥câ9ç9FÓòACÊgí~)'(§9A£«Ûiy^á>
Ci¿MæÂ4n[aNüOìbÚæó°VMR6ÏÐ'dÚ϶ïQ+mu¤Y>»É¨i{Ñ ð Óß@âÍ'`ZzË·ËM3 at dÊùìOîN_Ï^0qð[|
-QD)¥(£E@ç®VÇÖwÀ1Ay±ý_¦dß/þ^OOv¿õÓ#YTµ×oqTCå+èEtíIÛè»ûèÅop÷ÏPºv`qQ#Êè¸8hLQY0¿&eoµlÔ\ª¿Rµûn
ãeø
-ѸËU([÷ ±©Ô0¨Ás·üL ¬}üá¸ãÅåC[õzmµéîüà`MJÄÍÏ/U8dq8R¦ûg,F¢ý®üArG4ª:eu;cÎïtíUd,^:ÉJ7Ú@µ4}xÐÝRõª«T I|±ÕíØ ·=ÕÒÊPºt·<ÌÇÚ1¥`8' 6AåVì=(
Àô£}~þãóð2X·¢@HRÛÖÔª)îÞ®Ñý¶©.å`uÞëN¶ºÍX}3XÕ0qNNHüK§BU%=>jî1½îÄJ Qa¡,϶DÖÀ8Ån÷ÒºGºÇ;Çñ7®,seéK¹
-üø£¡ÉNP±íÑAnÑrD-äÎÕpoj»aûÁPÂ:êq 맦"óQ'ÙC¶Ý!!íLÏ%ùÀÔ÷Pf:õ,"I¼PJvu(-®Dwsñ>äÖPg¡¬jä0¢¥%âT< x^yKäÂ~AaxN÷Í^n
ºÒrd*Ô5;qïâGÜ¥4ÏÁçÙ¡Åm¼78nwfå̦ÈâëKí2[N_Ü
J
-êiS:»ÈK¿(ÑËïÀîÝzã&£R{h6½jUgYt)ö]ùØO¹Ò=zÃ:Óuà°>2ìÜÞQñ"tÉs§W÷zåNI°l{³__Ä×>´ÝÞÌKÈVjïÐÖ
2GàrOrÛýJ»Rº@wÔ#MmªYúðîi|ÐÜMQhIï>\!`·gì®Ú2PxL¼ög(+ø¡úç£l×GZàQ`x8Xr÷ 0<ü¥;ÛwÖ¼s,>
WzÕ)kºsùö_¹ý8a
+xÚí[KsÛ6¾ëWðr¦dðäãNLÓvúò¥dRd$$¡÷×wP²äØ5ãXigH`÷ûv
+(ZE(z±øúlñô9Í£*«rGgË#QGÆYN«è¬^Å$ysöòésÆ)§ª(4ãDÖº[§kQ¿+i¥hêâFû)Å<#G)) úÚçN/_#D¢2Î#.·\XU]?¢àee4ØGûëEô*Å¢¸¸!ë¯ðbaVNd]
+Ð*ýà£u-´", }*&ªYLÈM+nÓÕëBãúÇàÏB½Ð1úgÔú
+9¿lÐô£8½Ìrútßèþ÷cëá}¤àøtøZ<óYasYI;i.t3ÒcA?o2Ô·¼!VÊY¬è
+ѬOLÁ³èX¡: ó¥×ÖÈ!IË0
+òl_á%ãÉVpϽݬT@ÎЧ
+\tµÝÞ#<hr>×IaïAIâYÛHö
ÝB"åù=9ÛOE{·«¢=oÏz=ès¶NOÉ#óh²îÿ¿âå3;ãsuózùÕªOÒ"Ln>÷|îªýç »¸-Âûåy[£Ã%ª°Â:5ó¦÷£èûsý!Is\¼y³QuVN³ÿ0Ù|ØÀÑL¸a((º_(ø¼çتúzn¶% ȬMQëÖîíÕשcaÞ*Ƶ¬MÒ0M:9!óþKañ.ë©/`¦T0yÄUÌ& bBW°zÈÃ*î 7GÝ&ÃúbÓ
+bàÑsQ~û'§Ï)?:Pd%/£ìÎ>|×7òÃTûÖÂYQîÎAäÇóoÏ.°Çû³$'+ª¨î¯Þ ¨/¡9ZÑ¥í"¡QfOW´Ño_>Òà äð FYÎpDÏ"÷Î`ü¨2ɪïù9)Q,£DÛ^¥ú|ÃV6öã!þ¿ Úþl}ÙzHu-ÇQ®Ûí§4#~ýþ
+¿å
+Aj2¯0LrëAÒý]v®q s_ýìBú.Ç=U ºLBM¹Ó,Õ^h:¥9±Û6·ªq'[r/-f¢V2þ´H-õàoT¿ìkéeÁWlT7µ,¨]K0ÂnFÕ¯¦oPæòKcRVd¨À`6Î*>}@%wTÂht¯GϾæFcWÔ#)ýÔ¶Ól'Ik½öºoU/Å°«£ë1Uûç檪E;½¾ìFèÛ Ç8þ©þU-.k(½oåg¼*ïã*Ïò"ß
+ýPÛ-dcoÉîÅ_ٲܥ/Äfèã*L&ø*{àÅ®EKYºcË
+Y¶2{¸9WÛw;Æ? k/ª¦N<2ÈQ0ÉïóÍïOj)ë:;-)Ø®ºû2ÝË' çñ$âòR¢o|ÙäqPdU´%bºêów~n
+ïôÒÕG¯ÒQ"¤Êá÷W]Ù´_ïNí¢ z3;£¶JLJù7à`íÞÜ»ø
+íRRóôØãvJÞM¬¶{·²nSæñå
²3[R/fS%xZÖ/Ê-JÔòÊ°}6Î9 Ê
¾ÔQ`o:)ÆÍ ;Ù/Vf@]o&I¾-Ú©vDÚ[çXðN÷Ó;X&õLîô`¥Xéd
ÅÕ>níq=m®ßñ¥KmW£só
+²ÊÅÔµ©ÌÊxºìØ5¿R¶AJï¥Õ^zit½±6ÞK;¡ÙôR3RáÎw¯Ä0ûðYnúz§@é8qèQF³¼dÇðIkÏÑ[Ç4GÁpsÓ`îãÉ^½ÁpóêÍ ßýÖªøÄnÕªÆÈìÖÆÛ¿¬
endstream
endobj
-205 0 obj <<
+210 0 obj <<
/Type /Page
-/Contents 206 0 R
-/Resources 204 0 R
+/Contents 211 0 R
+/Resources 209 0 R
/MediaBox [0 0 612 792]
-/Parent 161 0 R
-/Annots [ 147 0 R 148 0 R 149 0 R 150 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R ]
+/Parent 165 0 R
+/Annots [ 151 0 R 152 0 R 153 0 R 154 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R ]
>> endobj
-147 0 obj <<
+151 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [506.111 682.58 513.085 691.158]
/A << /S /GoTo /D (page.7) >>
>> endobj
-148 0 obj <<
+152 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [506.111 670.199 513.085 678.776]
+/Rect [506.111 670.432 513.085 679.01]
/A << /S /GoTo /D (page.7) >>
>> endobj
-149 0 obj <<
+153 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [506.111 657.698 513.085 666.664]
+/Rect [506.111 658.165 513.085 667.131]
/A << /S /GoTo /D (page.9) >>
>> endobj
-150 0 obj <<
+154 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [501.13 645.436 513.085 654.282]
+/Rect [501.13 646.137 513.085 654.983]
/A << /S /GoTo /D (page.10) >>
>> endobj
-165 0 obj <<
+169 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [501.13 633.154 513.085 641.901]
+/Rect [501.13 634.088 513.085 642.835]
/A << /S /GoTo /D (page.12) >>
>> endobj
-166 0 obj <<
+170 0 obj <<
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [501.13 620.772 513.085 629.519]
-/A << /S /GoTo /D (page.12) >>
->> endobj
-167 0 obj <<
-/Type /Annot
-/Subtype /Link
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [501.13 608.291 513.085 617.138]
+/Rect [501.13 621.841 513.085 630.687]
/A << /S /GoTo /D (page.13) >>
>> endobj
[TRUNCATED]
To get the complete diff run:
svnlook diff /svnroot/pomp -r 604
More information about the pomp-commits
mailing list