From d5ff53448c61134c46cc4df9ea88fd86fa376d66 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Fri, 17 Feb 2023 14:44:29 +0100 Subject: Finish adapting to upcoming deSolve --- .Rbuildignore | 7 +- DESCRIPTION | 2 +- R/mkinfit.R | 4 +- R/mkinpredict.R | 5 +- R/nlme.mmkin.R | 22 ++-- R/saem.R | 12 +- log/build.log | 3 +- log/check.log | 30 +---- log/test.log | 26 ++-- man/mkinpredict.Rd | 12 +- man/mmkin.Rd | 7 +- vignettes/FOCUS_D.html | 12 +- vignettes/FOCUS_L.html | 64 +++++----- vignettes/dmta_pathway_2022_prebuilt.rnw | 2 +- vignettes/web_only/benchmarks.html | 92 +++++---------- vignettes/web_only/mkin_benchmarks.rda | Bin 1777 -> 1780 bytes vignettes/web_only/saem_benchmarks.html | 196 ++++++++++++++++++++++++------- vignettes/web_only/saem_benchmarks.rda | Bin 592 -> 673 bytes 18 files changed, 267 insertions(+), 229 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index 7e13343b..2f638ecb 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -28,10 +28,7 @@ ^vignettes/.*.synctex.gz ^vignettes/.*.toc$ ^vignettes/figure -^vignettes/prebuilt/*_dlls -^vignettes/prebuilt/*.pdf +^vignettes/prebuilt/.*_dlls ^vignettes/FOCUS_Z.tex$ ^vignettes/mkin.tex$ -^vignettes/mkin_benchmarks.rda$ -^vignettes/web_only/.build.timestamp$ -^vignettes/web_only/mkin_benchmarks.rda$ +^vignettes/web_only/.*$ diff --git a/DESCRIPTION b/DESCRIPTION index 83a1a1c9..cc5e4a93 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: mkin Type: Package Title: Kinetic Evaluation of Chemical Degradation Data Version: 1.3.0 -Date: 2023-02-13 +Date: 2023-02-17 Authors@R: c( person("Johannes", "Ranke", role = c("aut", "cre", "cph"), email = "johannes.ranke@jrwb.de", diff --git a/R/mkinfit.R b/R/mkinfit.R index 6cca5616..b97bc7e2 100644 --- a/R/mkinfit.R +++ b/R/mkinfit.R @@ -617,8 +617,8 @@ mkinfit <- function(mkinmod, observed, solution_type = solution_type, use_compiled = use_compiled, method.ode = method.ode, - atol = atol, rtol = rtol, - call_lsoda = call_lsoda, ...) + atol = atol, rtol = rtol, + ...) observed_index <- cbind(as.character(observed$time), as.character(observed$name)) observed$predicted <- out[observed_index] diff --git a/R/mkinpredict.R b/R/mkinpredict.R index f0d00319..957d5793 100644 --- a/R/mkinpredict.R +++ b/R/mkinpredict.R @@ -117,7 +117,6 @@ mkinpredict.mkinmod <- function(x, method.ode = "lsoda", atol = 1e-8, rtol = 1e-10, maxsteps = 20000L, map_output = TRUE, na_stop = TRUE, - call_lsoda = NULL, ...) { @@ -170,12 +169,12 @@ mkinpredict.mkinmod <- function(x, } if (solution_type == "deSolve") { - if (!is.null(x$cf) & use_compiled[1] != FALSE) { + if (!is.null(x$cf) & !is.null(x$symbols) & use_compiled[1] != FALSE) { out <- deSolve::lsoda( y = odeini, times = outtimes, - func = mkinmod[["symbols"]], + func = x$symbols, initfunc = "initpar", dllname = x$dll_info[["name"]], parms = odeparms[x$parms], # Order matters when using compiled models diff --git a/R/nlme.mmkin.R b/R/nlme.mmkin.R index e193e5e3..6af94455 100644 --- a/R/nlme.mmkin.R +++ b/R/nlme.mmkin.R @@ -149,6 +149,15 @@ nlme.mmkin <- function(model, data = "auto", warning("'nlme.mmkin' will redefine 'data'") } + # Get native symbol info for speed + if (model[[1]]$solution_type == "deSolve" & !is.null(model[[1]]$mkinmod$cf)) { + # The mkinmod stored in the first fit will be used by nlme + model[[1]]$mkinmod$symbols <- deSolve::checkDLL( + dllname = model[[1]]$mkinmod$dll_info[["name"]], + func = "diffs", initfunc = "initpar", + jacfunc = NULL, nout = 0, outnames = NULL) + } + deg_func <- nlme_function(model) assign("deg_func", deg_func, getFromNamespace(".nlme_env", "mkin")) @@ -186,23 +195,12 @@ nlme.mmkin <- function(model, data = "auto", thisCall[["control"]] <- control } - # Provide the address of call_lsoda to the fitting function - call_lsoda <- getNativeSymbolInfo("call_lsoda", PACKAGE = "deSolve") - if (model[[1]]$solution_type == "deSolve" & !is.null(model[[1]]$mkinmod$cf)) { - # The mkinmod stored in the first fit will be used by nlme - model[[1]]$mkinmod$diffs_address <- getNativeSymbolInfo("diffs", - PACKAGE = model[[1]]$mkinmod$dll_info[["name"]])$address - model[[1]]$mkinmod$initpar_address <- getNativeSymbolInfo("initpar", - PACKAGE = model[[1]]$mkinmod$dll_info[["name"]])$address - } - fit_time <- system.time(val <- do.call("nlme.formula", thisCall)) val$time <- fit_time val$mkinmod <- model[[1]]$mkinmod # Don't return addresses that will become invalid - val$mkinmod$diffs_address <- NULL - val$mkinmod$initpar_address <- NULL + val$mkinmod$symbols <- NULL val$data <- thisCall[["data"]] val$mmkin <- model diff --git a/R/saem.R b/R/saem.R index b29cf8a9..7eeec2bb 100644 --- a/R/saem.R +++ b/R/saem.R @@ -581,12 +581,11 @@ saemix_model <- function(object, solution_type = "auto", transform_fractions <- object[[1]]$transform_fractions # Get native symbol info for speed - call_lsoda <- getNativeSymbolInfo("call_lsoda", PACKAGE = "deSolve") if (solution_type == "deSolve" & !is.null(mkin_model$cf)) { - mkin_model$diffs_address <- getNativeSymbolInfo("diffs", - PACKAGE = mkin_model$dll_info[["name"]])$address - mkin_model$initpar_address <- getNativeSymbolInfo("initpar", - PACKAGE = mkin_model$dll_info[["name"]])$address + mkin_model$symbols <- deSolve::checkDLL( + dllname = mkin_model$dll_info[["name"]], + func = "diffs", initfunc = "initpar", + jacfunc = NULL, nout = 0, outnames = NULL) } # Define the model function @@ -622,8 +621,7 @@ saemix_model <- function(object, solution_type = "auto", odeparms = odeparms, odeini = odeini, solution_type = solution_type, outtimes = sort(unique(i_time)), - na_stop = FALSE, - call_lsoda = call_lsoda + na_stop = FALSE ) out_index <- cbind(as.character(i_time), as.character(i_name)) diff --git a/log/build.log b/log/build.log index dbe0cd5b..db5fac76 100644 --- a/log/build.log +++ b/log/build.log @@ -5,5 +5,6 @@ * creating vignettes ... OK * checking for LF line-endings in source and make files and shell scripts * checking for empty or unneeded directories -* building ‘mkin_1.2.2.tar.gz’ +Removed empty directory ‘mkin/vignettes/web_only’ +* building ‘mkin_1.3.0.tar.gz’ diff --git a/log/check.log b/log/check.log index a81475d9..967b51d0 100644 --- a/log/check.log +++ b/log/check.log @@ -5,30 +5,13 @@ * using options ‘--no-tests --as-cran’ * checking for file ‘mkin/DESCRIPTION’ ... OK * checking extension type ... Package -* this is package ‘mkin’ version ‘1.2.2’ +* this is package ‘mkin’ version ‘1.3.0’ * package encoding: UTF-8 -* checking CRAN incoming feasibility ... NOTE +* checking CRAN incoming feasibility ... Note_to_CRAN_maintainers Maintainer: ‘Johannes Ranke ’ - -Size of tarball: 6636884 bytes * checking package namespace information ... OK * checking package dependencies ... OK -* checking if this is a source package ... NOTE -Found the following apparent object files/libraries: - vignettes/2022_wp_1/cyan_dlls/dfop_path_1.so - vignettes/2022_wp_1/cyan_dlls/dfop_path_2.so - vignettes/2022_wp_1/cyan_dlls/fomc_path_1.so - vignettes/2022_wp_1/cyan_dlls/fomc_path_2.so - vignettes/2022_wp_1/cyan_dlls/hs_path_1.so - vignettes/2022_wp_1/cyan_dlls/sfo_path_1.so - vignettes/2022_wp_1/cyan_dlls/sforb_path_1.so - vignettes/2022_wp_1/cyan_dlls/sforb_path_2.so - vignettes/2022_wp_1/dmta_dlls/m_dfop_path.so - vignettes/2022_wp_1/dmta_dlls/m_fomc_path.so - vignettes/2022_wp_1/dmta_dlls/m_hs_path.so - vignettes/2022_wp_1/dmta_dlls/m_sfo_path.so - vignettes/2022_wp_1/dmta_dlls/m_sforb_path.so -Object files/libraries should not be included in a source package. +* checking if this is a source package ... OK * checking if there is a namespace ... OK * checking for executable files ... OK * checking for hidden files and directories ... OK @@ -72,6 +55,7 @@ Object files/libraries should not be included in a source package. * checking data for non-ASCII characters ... OK * checking LazyData ... OK * checking data for ASCII and uncompressed saves ... OK +* checking sizes of PDF files under ‘inst/doc’ ... OK * checking installed files from ‘inst/doc’ ... OK * checking files in ‘vignettes’ ... OK * checking examples ... [10s/10s] OK @@ -86,9 +70,5 @@ Object files/libraries should not be included in a source package. * checking for detritus in the temp directory ... OK * DONE -Status: 2 NOTEs -See - ‘/home/jranke/git/mkin/mkin.Rcheck/00check.log’ -for details. - +Status: OK diff --git a/log/test.log b/log/test.log index dc1b6c74..42ed75e4 100644 --- a/log/test.log +++ b/log/test.log @@ -1,13 +1,13 @@ ℹ Testing mkin ✔ | F W S OK | Context ✔ | 5 | AIC calculation -✔ | 5 | Analytical solutions for coupled models [1.6s] +✔ | 5 | Analytical solutions for coupled models [1.4s] ✔ | 5 | Calculation of Akaike weights ✔ | 3 | Export dataset for reading into CAKE ✔ | 12 | Confidence intervals and p-values [0.4s] -✔ | 1 12 | Dimethenamid data from 2018 [12.4s] +✔ | 1 12 | Dimethenamid data from 2018 [11.6s] ──────────────────────────────────────────────────────────────────────────────── -Skip ('test_dmta.R:98'): Different backends get consistent results for SFO-SFO3+, dimethenamid data +Skip ('test_dmta.R:99'): Different backends get consistent results for SFO-SFO3+, dimethenamid data Reason: Fitting this ODE model with saemix takes about 15 minutes on my system ──────────────────────────────────────────────────────────────────────────────── ✔ | 14 | Error model fitting [2.3s] @@ -16,7 +16,7 @@ Reason: Fitting this ODE model with saemix takes about 15 minutes on my system ✔ | 14 | Results for FOCUS D established in expertise for UBA (Ranke 2014) [0.4s] ✔ | 4 | Test fitting the decline of metabolites from their maximum [0.2s] ✔ | 1 | Fitting the logistic model [0.1s] -✔ | 10 | Batch fitting and diagnosing hierarchical kinetic models [19.1s] +✔ | 10 | Batch fitting and diagnosing hierarchical kinetic models [18.5s] ✔ | 1 11 | Nonlinear mixed-effects models [5.9s] ──────────────────────────────────────────────────────────────────────────────── Skip ('test_mixed.R:78'): saemix results are reproducible for biphasic fits @@ -27,27 +27,27 @@ Reason: Fitting with saemix takes around 10 minutes when using deSolve ✔ | 3 | mkinfit features [0.5s] ✔ | 8 | mkinmod model generation and printing ✔ | 3 | Model predictions with mkinpredict [0.1s] -✔ | 12 | Multistart method for saem.mmkin models [21.6s] +✔ | 12 | Multistart method for saem.mmkin models [21.1s] ✔ | 16 | Evaluations according to 2015 NAFTA guidance [1.5s] -✔ | 9 | Nonlinear mixed-effects models with nlme [3.7s] -✔ | 15 | Plotting [4.6s] +✔ | 9 | Nonlinear mixed-effects models with nlme [3.4s] +✔ | 15 | Plotting [4.4s] ✔ | 4 | Residuals extracted from mkinfit models -✔ | 1 36 | saemix parent models [30.9s] +✔ | 1 36 | saemix parent models [29.4s] ──────────────────────────────────────────────────────────────────────────────── Skip ('test_saemix_parent.R:143'): We can also use mkin solution methods for saem Reason: This still takes almost 2.5 minutes although we do not solve ODEs ──────────────────────────────────────────────────────────────────────────────── -✔ | 2 | Complex test case from Schaefer et al. (2007) Piacenza paper [0.6s] +✔ | 2 | Complex test case from Schaefer et al. (2007) Piacenza paper [0.5s] ✔ | 11 | Processing of residue series -✔ | 10 | Fitting the SFORB model [1.7s] +✔ | 10 | Fitting the SFORB model [1.6s] ✔ | 1 | Summaries of old mkinfit objects ✔ | 5 | Summary -✔ | 4 | Results for synthetic data established in expertise for UBA (Ranke 2014) [0.9s] -✔ | 9 | Hypothesis tests [3.3s] +✔ | 4 | Results for synthetic data established in expertise for UBA (Ranke 2014) [0.8s] +✔ | 9 | Hypothesis tests [2.9s] ✔ | 4 | Calculation of maximum time weighted average concentrations (TWAs) [0.7s] ══ Results ═════════════════════════════════════════════════════════════════════ -Duration: 113.6 s +Duration: 108.9 s ── Skipped tests ────────────────────────────────────────────────────────────── • Fitting this ODE model with saemix takes about 15 minutes on my system (1) diff --git a/man/mkinpredict.Rd b/man/mkinpredict.Rd index d93c0753..ad749fa4 100644 --- a/man/mkinpredict.Rd +++ b/man/mkinpredict.Rd @@ -21,7 +21,6 @@ mkinpredict(x, odeparms, odeini, outtimes, ...) maxsteps = 20000L, map_output = TRUE, na_stop = TRUE, - call_lsoda = NULL, ... ) @@ -69,7 +68,8 @@ parent compound.} \link{mkinmod} model is used, even if is present.} \item{method.ode}{The solution method passed via \link{mkinpredict} to \link{ode}] in -case the solution type is "deSolve" and we are not using compiled code.} +case the solution type is "deSolve" and we are not using compiled code. +When using compiled code, only lsoda is supported.} \item{atol}{Absolute error tolerance, passed to the ode solver.} @@ -83,8 +83,6 @@ FALSE). Setting this to FALSE has no effect for analytical solutions, as these always return mapped output.} \item{na_stop}{Should it be an error if \link{ode} returns NaN values} - -\item{call_lsoda}{The address of the compiled function "call_lsoda"} } \value{ A matrix with the numeric solution in wide format @@ -111,11 +109,11 @@ mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = "analytical")[21,] mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - method = "lsoda")[21,] + method = "lsoda", use_compiled = FALSE)[21,] mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - method = "ode45")[21,] + method = "ode45", use_compiled = FALSE)[21,] mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - method = "rk4")[21,] + method = "rk4", use_compiled = FALSE)[21,] # rk4 is not as precise here # The number of output times used to make a lot of difference until the diff --git a/man/mmkin.Rd b/man/mmkin.Rd index 309761dd..438a237b 100644 --- a/man/mmkin.Rd +++ b/man/mmkin.Rd @@ -83,16 +83,15 @@ plot_sep(fits.0[[1, 1]]) # allow to plot the observed variables separately plot(fits.0[1, 1]) -# On Windows, we can use multiple cores by making a cluster using the parallel -# package, which gets loaded with mkin, and passing it to mmkin, e.g. -cl <- makePSOCKcluster(12) +# On Windows, we can use multiple cores by making a cluster first +cl <- parallel::makePSOCKcluster(12) f <- mmkin(c("SFO", "FOMC", "DFOP"), list(A = FOCUS_2006_A, B = FOCUS_2006_B, C = FOCUS_2006_C, D = FOCUS_2006_D), cluster = cl, quiet = TRUE) print(f) # We get false convergence for the FOMC fit to FOCUS_2006_A because this # dataset is really SFO, and the FOMC fit is overparameterised -stopCluster(cl) +parallel::stopCluster(cl) } } diff --git a/vignettes/FOCUS_D.html b/vignettes/FOCUS_D.html index c729e3c2..d1d51ddb 100644 --- a/vignettes/FOCUS_D.html +++ b/vignettes/FOCUS_D.html @@ -358,7 +358,7 @@ pre code {

Example evaluation of FOCUS Example Dataset D

Johannes Ranke

-

Last change 31 January 2019 (rebuilt 2023-01-05)

+

Last change 31 January 2019 (rebuilt 2023-02-17)

@@ -441,7 +441,7 @@ variables is obtained using the plot_sep method for mkinfit objects, which shows separate graphs for all compounds and their residuals.

plot_sep(fit, lpos = c("topright", "bottomright"))
-

+

Confidence intervals for the parameter estimates are obtained using the mkinparplot function.

mkinparplot(fit)
@@ -449,10 +449,10 @@ the mkinparplot function.

A comprehensive report of the results is obtained using the summary method for mkinfit objects.

summary(fit)
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:13 2023 
-## Date of summary: Thu Jan  5 14:50:14 2023 
+## Date of fit:     Fri Feb 17 10:41:52 2023 
+## Date of summary: Fri Feb 17 10:41:52 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - k_parent * parent
@@ -460,7 +460,7 @@ the mkinparplot function.

## ## Model predictions using solution type analytical ## -## Fitted using 401 model solutions performed in 0.049 s +## Fitted using 401 model solutions performed in 0.048 s ## ## Error model: Constant variance ## diff --git a/vignettes/FOCUS_L.html b/vignettes/FOCUS_L.html index 98fe86c1..190ab65b 100644 --- a/vignettes/FOCUS_L.html +++ b/vignettes/FOCUS_L.html @@ -1534,7 +1534,7 @@ div.tocify {

Example evaluation of FOCUS Laboratory Data L1 to L3

Johannes Ranke

-

Last change 18 May 2022 (rebuilt 2023-01-05)

+

Last change 18 May 2022 (rebuilt 2023-02-17)

@@ -1561,10 +1561,10 @@ model fit. This covers the numerical analysis given in the FOCUS report.

m.L1.SFO <- mkinfit("SFO", FOCUS_2006_L1_mkin, quiet = TRUE)
 summary(m.L1.SFO)
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:14 2023 
-## Date of summary: Thu Jan  5 14:50:14 2023 
+## Date of fit:     Fri Feb 17 10:41:53 2023 
+## Date of summary: Fri Feb 17 10:41:53 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - k_parent * parent
@@ -1648,7 +1648,7 @@ summary(m.L1.SFO)

A plot of the fit is obtained with the plot function for mkinfit objects.

plot(m.L1.SFO, show_errmin = TRUE, main = "FOCUS L1 - SFO")
-

+

The residual plot can be easily obtained by

mkinresplot(m.L1.SFO, ylab = "Observed", xlab = "Time")

@@ -1658,23 +1658,23 @@ checked.

## Warning in mkinfit("FOMC", FOCUS_2006_L1_mkin, quiet = TRUE): Optimisation did not converge:
 ## false convergence (8)
plot(m.L1.FOMC, show_errmin = TRUE, main = "FOCUS L1 - FOMC")
-

+

summary(m.L1.FOMC, data = FALSE)
## Warning in sqrt(diag(covar)): NaNs produced
## Warning in sqrt(1/diag(V)): NaNs produced
## Warning in cov2cor(ans$covar): diag(.) had 0 or NA entries; non-finite result is
 ## doubtful
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:15 2023 
-## Date of summary: Thu Jan  5 14:50:15 2023 
+## Date of fit:     Fri Feb 17 10:41:53 2023 
+## Date of summary: Fri Feb 17 10:41:53 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
 ## 
 ## Model predictions using solution type analytical 
 ## 
-## Fitted using 369 model solutions performed in 0.025 s
+## Fitted using 369 model solutions performed in 0.026 s
 ## 
 ## Error model: Constant variance 
 ## 
@@ -1785,7 +1785,7 @@ residual plot can be obtained simply by adding the argument
 
m.L2.SFO <- mkinfit("SFO", FOCUS_2006_L2_mkin, quiet=TRUE)
 plot(m.L2.SFO, show_residuals = TRUE, show_errmin = TRUE,
      main = "FOCUS L2 - SFO")
-

+

The χ2 error level of 14% suggests that the model does not fit very well. This is also obvious from the plots of the fit, in which we have included the @@ -1810,10 +1810,10 @@ plot(m.L2.FOMC, show_residuals = TRUE, main = "FOCUS L2 - FOMC")

summary(m.L2.FOMC, data = FALSE)
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:15 2023 
-## Date of summary: Thu Jan  5 14:50:15 2023 
+## Date of fit:     Fri Feb 17 10:41:54 2023 
+## Date of summary: Fri Feb 17 10:41:54 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
@@ -1889,12 +1889,12 @@ order to explain the data.

m.L2.DFOP <- mkinfit("DFOP", FOCUS_2006_L2_mkin, quiet = TRUE)
 plot(m.L2.DFOP, show_residuals = TRUE, show_errmin = TRUE,
      main = "FOCUS L2 - DFOP")
-

+

summary(m.L2.DFOP, data = FALSE)
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:15 2023 
-## Date of summary: Thu Jan  5 14:50:15 2023 
+## Date of fit:     Fri Feb 17 10:41:54 2023 
+## Date of summary: Fri Feb 17 10:41:54 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
@@ -1988,7 +1988,7 @@ only the L3 dataset prepared above.

mm.L3 <- mmkin(c("SFO", "FOMC", "DFOP"), cores = 1, list("FOCUS L3" = FOCUS_2006_L3_mkin), quiet = TRUE) plot(mm.L3)
-

+

The χ2 error level of 21% as well as the plot suggest that the SFO model does not fit very well. The FOMC model performs better, with an error level at which @@ -2004,10 +2004,10 @@ as a row index and datasets as a column index.

using square brackets for indexing which will result in the use of the summary and plot functions working on mkinfit objects.

summary(mm.L3[["DFOP", 1]])
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:15 2023 
-## Date of summary: Thu Jan  5 14:50:15 2023 
+## Date of fit:     Fri Feb 17 10:41:54 2023 
+## Date of summary: Fri Feb 17 10:41:54 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
@@ -2016,7 +2016,7 @@ summary and plot functions working on mkinfit objects.

## ## Model predictions using solution type analytical ## -## Fitted using 376 model solutions performed in 0.024 s +## Fitted using 376 model solutions performed in 0.023 s ## ## Error model: Constant variance ## @@ -2091,7 +2091,7 @@ summary and plot functions working on mkinfit objects.

## 91 parent 15.0 15.18 -0.18181 ## 120 parent 12.0 10.19 1.81395
plot(mm.L3[["DFOP", 1]], show_errmin = TRUE)
-

+

Here, a look to the model plot, the confidence intervals of the parameters and the correlation matrix suggest that the parameter estimates are reliable, and the DFOP model can be used as the best-fit @@ -2119,24 +2119,24 @@ mm.L4 <- mmkin(c("SFO", "FOMC"), cores = 1, list("FOCUS L4" = FOCUS_2006_L4_mkin), quiet = TRUE) plot(mm.L4)

-

+

The χ2 error level of 3.3% as well as the plot suggest that the SFO model fits very well. The error level at which the χ2 test passes is slightly lower for the FOMC model. However, the difference appears negligible.

summary(mm.L4[["SFO", 1]], data = FALSE)
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:16 2023 
-## Date of summary: Thu Jan  5 14:50:16 2023 
+## Date of fit:     Fri Feb 17 10:41:54 2023 
+## Date of summary: Fri Feb 17 10:41:54 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - k_parent * parent
 ## 
 ## Model predictions using solution type analytical 
 ## 
-## Fitted using 142 model solutions performed in 0.01 s
+## Fitted using 142 model solutions performed in 0.009 s
 ## 
 ## Error model: Constant variance 
 ## 
@@ -2190,10 +2190,10 @@ negligible.

## DT50 DT90 ## parent 106 352
summary(mm.L4[["FOMC", 1]], data = FALSE)
-
## mkin version used for fitting:    1.2.2 
+
## mkin version used for fitting:    1.3.0 
 ## R version used for fitting:       4.2.2 
-## Date of fit:     Thu Jan  5 14:50:16 2023 
-## Date of summary: Thu Jan  5 14:50:16 2023 
+## Date of fit:     Fri Feb 17 10:41:54 2023 
+## Date of summary: Fri Feb 17 10:41:54 2023 
 ## 
 ## Equations:
 ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
diff --git a/vignettes/dmta_pathway_2022_prebuilt.rnw b/vignettes/dmta_pathway_2022_prebuilt.rnw
index 0a3aaaa8..a310633b 100644
--- a/vignettes/dmta_pathway_2022_prebuilt.rnw
+++ b/vignettes/dmta_pathway_2022_prebuilt.rnw
@@ -3,5 +3,5 @@
 %\VignetteIndexEntry{Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P}
 
 \begin{document}
-\includepdf[pages=-, fitpaper=true]{2022_wp_1/2022_dmta_pathway.pdf}
+\includepdf[pages=-, fitpaper=true]{prebuilt/2022_dmta_pathway.pdf}
 \end{document}
diff --git a/vignettes/web_only/benchmarks.html b/vignettes/web_only/benchmarks.html
index fb799462..6cce41e6 100644
--- a/vignettes/web_only/benchmarks.html
+++ b/vignettes/web_only/benchmarks.html
@@ -1592,7 +1592,7 @@ div.tocify {
 
 

Benchmark timings for mkin

Johannes Ranke

-

Last change 14 July 2022 (rebuilt 2023-02-13)

+

Last change 14 July 2022 (rebuilt 2023-02-17)

@@ -1636,31 +1636,11 @@ FOMC_SFO <- mkinmod( DFOP_SFO <- mkinmod( parent = mkinsub("FOMC", "m1"), # erroneously used FOMC twice, not fixed for consistency m1 = mkinsub("SFO")) -t3 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D)))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t4 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D),
-    error_model = "tc"))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t5 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D),
+t3 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D)))[["elapsed"]]
+t4 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D),
+    error_model = "tc"))[["elapsed"]]
+t5 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D),
     error_model = "obs"))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable

Two metabolites, synthetic data:

m_synth_SFO_lin <- mkinmod(parent = mkinsub("SFO", "M1"),
                            M1 = mkinsub("SFO", "M2"),
@@ -1676,36 +1656,18 @@ SFO_lin_a <- synthetic_data_for_UBA_2014[[1]]$data
 
 DFOP_par_c <- synthetic_data_for_UBA_2014[[12]]$data
 
-t6 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a)))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t7 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c)))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t8 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a),
-    error_model = "tc"))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t9 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c),
-    error_model = "tc"))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t10 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a),
-    error_model = "obs"))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-
t11 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c),
+t6 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a)))[["elapsed"]]
+t7 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c)))[["elapsed"]]
+
+t8 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a),
+    error_model = "tc"))[["elapsed"]]
+t9 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c),
+    error_model = "tc"))[["elapsed"]]
+
+t10 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a),
+    error_model = "obs"))[["elapsed"]]
+t11 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c),
     error_model = "obs"))[["elapsed"]]
-
## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable
-## Error in mkinmod[["symbols"]] : 
-##   object of type 'closure' is not subsettable

Results

@@ -1901,8 +1863,8 @@ models fitted to two datasets, i.e. eight fits for each test.

Ryzen 9 7950X 16-Core Processor 4.2.2 1.3.0 -1.271 -1.787 +1.287 +1.805 @@ -2119,9 +2081,9 @@ for each test.

Ryzen 9 7950X 16-Core Processor 4.2.2 1.3.0 -0.526 -0.623 -0.631 +0.731 +1.984 +1.100 @@ -2404,12 +2366,12 @@ dataset, i.e. one fit for each test.

Ryzen 9 7950X 16-Core Processor 4.2.2 1.3.0 -0.242 -0.237 -0.238 -0.239 -0.237 -0.237 +0.400 +0.518 +0.580 +0.990 +0.701 +0.935 diff --git a/vignettes/web_only/mkin_benchmarks.rda b/vignettes/web_only/mkin_benchmarks.rda index 93138541..389e2738 100644 Binary files a/vignettes/web_only/mkin_benchmarks.rda and b/vignettes/web_only/mkin_benchmarks.rda differ diff --git a/vignettes/web_only/saem_benchmarks.html b/vignettes/web_only/saem_benchmarks.html index 714dc1ff..a3bbafef 100644 --- a/vignettes/web_only/saem_benchmarks.html +++ b/vignettes/web_only/saem_benchmarks.html @@ -31,7 +31,7 @@ document.addEventListener('DOMContentLoaded', function(e) { !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 -