[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üš
-WV4~fŸj.èi-IPÑÈ\ä“hbÂUæ,YÍáì±û’Ñ@TÇA 'í¬³}J“ò.:m$žIM«Ñ‚.:uwškYk™òÌú)‹­P¢HrÛRÙEÅ•–<Ë,åºêÁØ*6–rÃÕgƒ{iˆNH•©¨kQO»b-¹ò\…gBÕ²,¦¼	ˆ$3…Ø'“º,ÿHÕK®O'=`&|L|Ÿòɍ]Ì’FߤS1.zu\ -˜È>ßÉbç’òÕæK›êÊÅ`éXÞ–…܈Úq]q•AÚõ¥ºtô;ð›šX™(º³¬êYÇÛtiðÎ0Šb	à™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¥OT0‚3ìí¸ýäÊeSëEþ÷lCΐ=*ÈúzÊþ FÂÎþۏ˜á¿¸™±C(Ä%m
-ݶ«JçšÛí¯îeÚ>è¢Ty'Ö¬+hêàÐWGÙˆ»2s…;å“3ÎúY—2E-NtU÷¹þæýrä•qèT“5â#$—üŸÇeÉ7“PÆíätjµjN8gÙ¿Q
-Oª‰P÷·m;hVŸÐeeFº®Ê,;1;L3'}ñsÎÑ­ÑÆ®oI4™Py“iY”yG¬²f'‹¶}_%ã¾
-ŐsÝñ×DׇÞ/wýŐþ1¦Ù>½.×eÖmÖu•A¬ûC^ëò«SŒN—B¦oøÛæIƒé#ƒµï’»£©\ðºQÂ2*W–#¢,¤öM™ô¼CõÎåÍ¡ë6‡®«Û^ £J—Åø@Ò--Q+nº^©Gä*+µÈŽS±†ÂØìâ> F“aƒÐ㟧‡½ÍåÖO3^÷ÂmûKa¤ûpÔÇË}})XÊ0ËuÈ•<mõ[fsìŠg‘mM¤õ°kôh_®?
-r(GLPåZrv-öâµ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±Dq’xëÌû<û4'xÆÒ;¶ãsŸFxöO]õ/ó¿×— {„ $Š¨‘0
+B⊣ÀŠ_²²aòÁŠ’ä…]PL¨¹¡·¦5%AILcs“Ob0%Žá.ŠHäLYÏáì¡æû’ñ@t/ƒ N:ã£Îø)uNÊ0h¸è´‘åLè|Z]ˆtÑ©»ÑL¥EÊrë§(·\ò2uÐm+i5“Z°<w¸TÅå½±•g–rÅ䝾2Ä{'$«”+ÅÕ´+Ö¢‘+ÂUxÆ¥U9åM°@$!7…Ø'•9‘²×Lƒl™ô™Lð1Žye„FŠÎæ 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_³Rt‡Nþš7+Å%Á{q¹b¢ÔðŸOÆ%
+	È‘¸Ø.Cé@.ãùëp1ö{S€wˆgÍ«é¶B"Dðrlï׫‘FæzìIغ嵹jd&}Ÿ¹Õº~yzj:#’þÜ·µ¾ãÝJ÷+O5ÚXÕS°ÚÛÇuÅU*E­Ôp"
+g؇q*8”K¦žêFþs6"gÈž5d½š²?$("agÿõáW¿¹©ƒPˆKZý¶«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:]
+™¾áo›G
+¦Ö¾KîŽ&ÎT#¹?d”®,GDQ
+í›2éy‡êËÙ¡ë²Cש¶À¨ÒU9>€ô@KKÔ’™®Wɇ¹Î+í²cÄÔB¬a†DÑìâ> F“aƒÐã_¤‡½-ÄÖOs¦zá¶ý¥0Ò}8êˆãå¾¾,e ˜å:äJ‘¶ú­³yêŠg™oM¤jHØ5z´¯6_¹”'LÕ†rvÃ÷bJ¤~{𘥵™RÃM/cßû‰GBxäÇt4ýá»Ç.—;ÎhÈ	};	£¾U5´f—fUÚ¼Ô<{Ù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¦„ñäã˜N›LÓvúò¥“dR˜„d$$¡’÷×wP²¤ØcƵ’CyáX »ûí. £U„£—‹oÏg/X•¨Ìh/#‚1b<‹rBPÆÊ輎^Ç4y{þêìç{„L0„KÝx’µi×éZVäJ9ê‡8ê?eD ÊD”Ò
-Yh}ј„Šøú
-ÆL«!I.b”¤ãùvǍ—åíÛ¾¶1\1*¢Þ½†Çß_.¢×)aÇùm¸Ã%%±‚Œ`m°rVö×Ń<jYU2IKÊgmŸ
-‰r’g¨M£úvÓXÝ™\„YëŸ*’ÖP:Á“ìS‹êí?Îجé'1z¯~:Éè2]mº?Bplú	ÜT’ædVþ)•?Ú~«—sœù‚¨°I.¨¤­²—¦æDé©TŸMrˆ®‡Ŭò/„J1	³¡0;‹Y×'†ƒâIñi-ûVZdΗN™äë7Óƪ>I‹yÿjhc4(Žo§ðBÌóÉ£Vp”Os‚f³Ò(š
-1+úT. ¦¹@[¹í=*²YÛ§BbZÒ䑸
-B´˜÷÷„ØĤȴk·…Dg-ŸÈîÙÄ”È}*Ú™ý¼jx¬¶‹ifß›5ož	>Ñî5:2ÿÿ.ŸÙ9Ÿjâ>¯Wß©A¯º$Íçäæ¿é}Ú^\¯«ð9À-nóùƒýÉâË´ïöý5Êy…õ•á½cÐí¦‘V¥câ9ç9FÓòœACÊgí~)'(§9A£«Ûiy^á>…Cˆi¿MæÂ4n[aNüOìbÚæó°V•MR6ÏÐ'dÚ϶—ïQ+mu™¤Y>»É†¨i{Ñ ð	Óß@âšÍˆ'`ZŽz•Ë·ËM3 at dÊùìO‹îN_Ï^0qð[|Ž
-QD)¥(£E@燮VÇÖwŽÀ1Ay±ý_¦dߟ/þ^OOv¿õÓŒ#YTµ‹×oqTCå+莕EtíIۈ蔻û›èÅoŸpŽ÷ÏPºv€`”qQž#Ê胸8hLQY­0¿&Žeoµlš›Ô\ª¿Rµûn…ãŸeø
-ѸËU([÷	±©Ô0¨Ás·üL ¬}†üጄ¸ãŒÅåC’[õzmµéîüàœ`MJÄ„ÍÏ/U8dq8R‰¦ûg,F¢ý®üAŠrG4ª:eu;cÎïtíUd,^:ÉJ7Ú†ƒ@µ4}xÐÝRõª«T I|±ÕíØ  ·=ÕÒÊPºt·<‚ÌÇ—Ú1¥`8' 6AåVì=(…‡–Àô£}ƒ~þãóð2X·¢@HRÛÖÔª)îÞ™®Ñ’ý¶©.å`uÞë›N¶º’ÍX}3XÕ0qNNHüK§BU%=–>jî1½îÄJ Qa•¡,϶DÖÀ8ŒÅn÷ÒºGºÇ;Çñ7®,seéK¹
-üø£¡ÉNP±íÑA–nÑrD-äÎÕpoj»aûÁ†PÂ:êq 맂¦œ"šóQ'ÙC¶™‹Ý!!íL‡Ï%ùÀÔ€÷Pf:õ,"I¼PJvu(-Š‹®DŽwsñ>äÖPg–¡¬jä0–¢¥%âT< x^yKäÂ~AƒaxNŒ÷Í^n…ºÒrd*Ô€5;qïâGÜ¥4ÏÁçÙ¡Åm™¼7š8nwfå̦ÈâëKí2[šN_Ü…J
-êi‚S:»ÈK¿(ÑËïÀîÝzã€&£†R{h•6½jUgYœt)ö]ùØO¹Ò=zÂ:Ӎuà°>2ŒìˆÜšÞQñ"tÉs§W÷zåNŠI°l{³__Ä×>´ÝÞÌKÈVjïÐÖ…2GàrOrÛýJ»ƒRº@­wÔ#Mmª“Yúðîi|ÐÜM†—Q‚hIŽï>\!`·gì–›®Ú2PxL¼ög(+ø¡ú”“ç£l׍GZàQ`x8Xr÷ 0<ü¥;Û›wÖ¼s,>…WzÕ)kºs‚ƒùö_¹ý8a
+xÚí[KsÛ6¾ëWðr¦dðäã˜N›LÓvúò¥“dR˜„d$$¡’÷×wP²äØ5ãXigŠ‹H‚`÷ûv
+(ZE(z±øúlñô9Í£*«r’GgË#”Q–GÆYN«è¬‰^Å$ysöòésÆ)§ª(4ãDÖº[§kQ¿+i¥hêâFû)Å<#”G)) úÚç­N/_#D•“”¢2Î’”#.·\XU]?¢àee4ØGûë‹Eô*Å”¢¸¸!ë¯ð“b’aVNdŒ]
+Ð*€ýŸà£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µÝÞ#<hŸŠ‰r>×Iˆ”aïAIˆâYÛHö…ÝB"åù=9ÛOE{·«†‡¢=oÏz=ès¶NOÉ#ó™h²îÿ¿âå3;ãsuózùÕªOÒ"Ln>÷|ýç »¸-Âû“å—y[£Ã%ª°Â:5ó¦÷£èûsý!Is\¼„y³ŸQu›V™N³ÿ0Ù|؈ÀÑL¸a((º_(ø¼‰çتúzn¶% ȬM‡QŸëÖîí„ÕשcaÞ*Ƶ¬M’Ò0M:9!óþKañ.ë„©/`¦T„0yÄUÌ& bBW°zÈÃ*î	˜7GÝ&˜ÃúbÓŽ™
+bàÑsQ~û'‚§Ï)?:›Pd%/£”ŒìÎ>|×7òÃTûÖÂYQîÎAäÇó‚oÏ.°“Çû³$'+ª¨î¯Þ ¨—/¡9Z•Ñ¥í"†¡QfOW´Ño‹_>Òà äð FYÎpDÏ"÷žÎ`ü¨2ɪïŒù9)Q,£DÛ^¥ú|”ÃV6öã!Šþ¿ Úþl}ÙzHu-ÇQŽ®ŸÛí§4#ˆ~Šýþ 
+¿å 
+Aj2¯0LrëA­Òý]„v®q	s_ýìBú“.Ç=U ºLB‡M¹Ó,Õ^h‚:¥9±Û“6·ªq'[r/-f¢V­2þ´H-õàoT¿”ƒìkéeÁWlT7µ,¨]K0—nFÕ¯¦oPæòKc•ŽRVd¨À`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ÈQ›0ÉïóÍ‚ï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:)ÆÍ ;Ù/Vƒf@]o&I‹¾-ŸÚ©vDÚ[çXðN÷Ó;X—&õLîô`¥Xé›d…ÅÕ>níq=žm®ß—ñ¥KmW£só
+²ÊÅÔµ©ÌÊxºìØ5¿R¶AJï¥Õ^z’it½±6—ޝŒKš;¡ÙôR‚3Rá›Î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