R version 4.4.0 RC (2024-04-16 r86468 ucrt) -- "Puppy Cup" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## This file is part of SimInf, a framework for stochastic > ## disease spread simulations. > ## > ## Copyright (C) 2015 Pavol Bauer > ## Copyright (C) 2017 -- 2019 Robin Eriksson > ## Copyright (C) 2015 -- 2019 Stefan Engblom > ## Copyright (C) 2015 -- 2024 Stefan Widgren > ## > ## SimInf is free software: you can redistribute it and/or modify > ## it under the terms of the GNU General Public License as published by > ## the Free Software Foundation, either version 3 of the License, or > ## (at your option) any later version. > ## > ## SimInf is distributed in the hope that it will be useful, > ## but WITHOUT ANY WARRANTY; without even the implied warranty of > ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > ## GNU General Public License for more details. > ## > ## You should have received a copy of the GNU General Public License > ## along with this program. If not, see . > > library(SimInf) > library(Matrix) > library(tools) > source("util/check.R") > > ## Specify the number of threads to use. > set_num_threads(1) > > ## For debugging > sessionInfo() R version 4.4.0 RC (2024-04-16 r86468 ucrt) Platform: x86_64-w64-mingw32/x64 Running under: Windows Server 2022 x64 (build 20348) Matrix products: default locale: [1] LC_COLLATE=C LC_CTYPE=German_Germany.utf8 [3] LC_MONETARY=C LC_NUMERIC=C [5] LC_TIME=C time zone: Europe/Berlin tzcode source: internal attached base packages: [1] tools stats graphics grDevices utils datasets methods [8] base other attached packages: [1] Matrix_1.7-0 SimInf_9.7.0 loaded via a namespace (and not attached): [1] MASS_7.3-60.2 compiler_4.4.0 grid_4.4.0 digest_0.6.35 lattice_0.22-6 > > ## Initialize test data > S <- as(Matrix(c(-1, 0, 0, + 1, 0, 0, + 0, -1, 0, + 0, 1, 0, + 0, 0, -1, + 0, 0, 1), + nrow = 6, + ncol = 3, + byrow = TRUE, + dimnames = list(LETTERS[1:6], NULL)), + "dgCMatrix") > > Nn <- 6L > > G <- as(Matrix(c(1, 0, 0, + 0, 1, 0, + 0, 0, 1), + nrow = 3, + ncol = 3, + byrow = TRUE, + dimnames = list(c("A -> B", "C -> D", "E -> F"), NULL)), + "dgCMatrix") 'as(, "dgCMatrix")' is deprecated. Use 'as(as(., "generalMatrix"), "CsparseMatrix")' instead. See help("Deprecated") and help("Matrix-deprecated"). > > u0 <- structure(c(0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 2, 0, 2, 0, 2, + 0, 3, 0, 3, 0, 3, 0, 4, 0, 4, 0, 4, 0, 5, 0, 5, 0, 5, 0), + .Dim = c(6L, 6L)) > storage.mode(u0) <- "integer" > > U <- matrix(nrow = 0, ncol = 0) > storage.mode(U) <- "integer" > > ## Check valid_SimInf_model_object > m <- SISe(u0 = c(S = 10, I = 0), tspan = 1:10, phi = 0, + upsilon = 0.1, gamma = 0.1, alpha = 1.0, beta_t1 = 0.1, + beta_t2 = 0.1, beta_t3 = 0.1, beta_t4 = 0.1, end_t1 = 91, + end_t2 = 182, end_t3 = 273, end_t4 = 365, epsilon = 0.1) > stopifnot(isTRUE(SimInf:::valid_SimInf_model_object(m))) > > ## Check valid_SimInf_model_object with invalid tspan. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@tspan <- integer(0) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Input time-span must be a double vector.")) > m@tspan <- numeric(0) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Input time-span must be an increasing vector.")) > > ## Check valid_SimInf_model_object with invalid u0. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > storage.mode(m@u0) <- "double" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Initial state 'u0' must be an integer matrix.")) > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@u0[1, 1] <- -1L > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Initial state 'u0' has negative elements.")) > > ## Check valid_SimInf_model_object with invalid U. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > storage.mode(m@U) <- "double" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Output state 'U' must be an integer matrix.")) > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@U <- matrix(-1L) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Output state 'U' has negative elements.")) > > ## Check valid_SimInf_model_object with invalid v0. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@v0 <- matrix(1L) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Initial model state 'v0' must be a double matrix.")) > m@v0 <- matrix(1) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'v0' must have rownames.")) > m@v0 <- matrix(c(1, 1), ncol = 2) > rownames(m@v0) <- "test" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "The number of nodes in 'u0' and 'v0' must match.")) > > ## Check valid_SimInf_model_object with invalid V. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > storage.mode(m@V) <- "integer" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Output model state 'V' must be a double matrix.")) > > ## Check valid_SimInf_model_object with invalid S. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@S@x <- m@S@x * 0.5 > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'S' matrix must be an integer matrix.")) > > ## Check valid_SimInf_model_object with different rownames in S and E. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1, + events = data.frame(event = 1, node = 1, n = 1, time = 1, dest = 0, + proportion = 0, select = 1, shift = 0)) > rownames(m@events@E) <- NULL > stopifnot(identical( + SimInf:::valid_SimInf_model_object(m), + "'S' and 'E' must have rownames matching the compartments.")) > rownames(m@events@E) <- rownames(m@S) > rownames(m@events@E)[1] <- "Z" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'S' and 'E' must have identical compartments.")) > > ## Check valid_SimInf_model_object with invalid G. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@G <- m@G[1, 1:2, drop = FALSE] > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "Wrong size of dependency graph.")) > > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > rownames(m@G) <- NULL > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'G' must have rownames that specify transitions.")) > > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > rownames(m@G)[1] <- "" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'G' must have rownames that specify transitions.")) > > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > rownames(m@G)[1] <- "A" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'G' rownames have invalid transitions.")) > > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > rownames(m@G)[1] <- "Z -> beta*Z*I/(S+I+R) -> I" > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'G' and 'S' must have identical compartments.")) > > ## Check valid_SimInf_model_object with invalid ldata. > m <- SIR(u0 = data.frame(S = 10, I = 0, R = 0), + tspan = 1:10, beta = 0.1, gamma = 0.1) > m@ldata <- matrix(1L) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'ldata' matrix must be a double matrix.")) > m@ldata <- matrix(c(1, 2), ncol = 2) > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "The number of nodes in 'u0' and 'ldata' must match.")) > > ## Check valid_SimInf_model_object with invalid gdata. > m <- SISe(u0 = data.frame(S = 10, I = 0), tspan = 1:10, phi = 0, + upsilon = 0.1, gamma = 0.1, alpha = 1.0, beta_t1 = 0.1, + beta_t2 = 0.1, beta_t3 = 0.1, beta_t4 = 0.1, end_t1 = 91, + end_t2 = 182, end_t3 = 273, end_t4 = 365, epsilon = 0.1) > m@gdata <- as.integer(m@gdata) > names(m@gdata) <- c("upsilon", "gamma", "alpha", "beta_t1", + "beta_t2", "beta_t3", "beta_t4", "epsilon") > stopifnot(identical(SimInf:::valid_SimInf_model_object(m), + "'gdata' must be a double vector.")) > > ## Check v0 > res <- assertError(SimInf_model(G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = c(1, 2), + u0 = u0, + v0 = 1)) > check_error(res, "'v0' must be a double matrix.") > res <- SimInf_model(G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = c(1, 2), + u0 = u0, + v0 = matrix(rep(1L, Nn), nrow = 1, + dimnames = list("phi"))) > > ## Check tspan > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = numeric(0), + u0 = u0)) > check_error(res, "Input time-span must be an increasing vector.", FALSE) > > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(c(3, 2, 1)), + u0 = u0)) > check_error(res, "Input time-span must be an increasing vector.", FALSE) > > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = c(1, NA, 3), + u0 = u0)) > check_error(res, "Input time-span must be an increasing vector.", FALSE) > > ## Check that tspan can be a Date vector > res <- SimInf_model(G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.Date(c("2017-01-01", + "2017-01-02", + "2017-01-03")), + u0 = u0) > stopifnot(identical(res@tspan, + structure(c(1, 2, 3), + .Names = c("2017-01-01", + "2017-01-02", + "2017-01-03")))) > > ## Check u0 > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0 * -1L)) > check_error(res, "Initial state 'u0' has negative elements.", FALSE) > > ## Change storage mode of u0 to double. > ## Should not raise error > u0_double <- u0 > storage.mode(u0_double) <- "double" > SimInf_model(G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0_double) Model: SimInf_model Number of nodes: 6 Number of transitions: 3 Number of scheduled events: 0 Compartments ------------ - Empty, please run the model first > > ## Change storage mode of u0 to double and change to non-integer values. > ## Should raise error > u0_double <- u0 > storage.mode(u0_double) <- "double" > u0_double <- 1.2 * u0_double > res <- assertError(SimInf_model(G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0_double)) > check_error(res, "'u0' must be an integer matrix.") > > ## Change u0 to vector. Should raise an error. > res <- assertError(SimInf_model(G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = as.numeric(u0))) > check_error(res, "'u0' must be an integer matrix.") > > ## Check S > res <- assertError(new("SimInf_model", + G = G, + S = S * 1.1, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'S' matrix must be an integer matrix.", FALSE) > > ## Check G > ## Error: Wrong size of dependency graph > res <- assertError(new("SimInf_model", + G = G[-1, ], + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "Wrong size of dependency graph.", FALSE) > > ## Check specication of transition > rownames(G) <- NULL > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'G' must have rownames that specify transitions.", FALSE) > > rownames(G) <- c("", " ", "E -> F") > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'G' must have rownames that specify transitions.", FALSE) > > rownames(G) <- c("A -> B", "C -> D", "E ->") > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'G' rownames have invalid transitions.", FALSE) > > rownames(G) <- c("A -> B", "C -> D", "E ->") > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'G' rownames have invalid transitions.", FALSE) > > rownames(G) <- c("A -> B", "C -> D", "E -> G") > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'G' and 'S' must have identical compartments", FALSE) > rownames(G) <- c("A -> B", "C -> D", "E -> F") > > ## Check gdata > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = matrix(rep(0, Nn), nrow = 1), + gdata = 1L, + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'gdata' must be a double vector.", FALSE) > > ## Check ldata > ldata <- matrix(rep(0, Nn), nrow = 1) > ldata <- ldata[, 1:3, drop = FALSE] > > ## Wrong size of ldata matrix > res <- assertError(new("SimInf_model", + G = G, + S = S, + U = U, + ldata = ldata, + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "The number of nodes in 'u0' and 'ldata' must match.", FALSE) > > ## Check initial state > u0 <- data.frame(S_1 = c(0, 1, 2, 3, 4, 5), + I_1 = c(0, 0, 0, 0, 0, 0), + S_2 = c(0, 1, 2, 3, 4, 5), + I_2 = c(0, 0, 0, 0, 0, 0), + S_3 = c(0, 1, 2, 3, 4, 5), + I_3 = c(0, 0, 0, 0, 0, 0)) > > ## 'u0' is NULL > res <- assertError(SimInf_model()) > check_error(res, "'u0' must be an integer matrix.") > > ## Check first lines of show method without events > model <- SISe(u0 = data.frame(S = 99, I = 1), + tspan = seq_len(1000) - 1, + events = NULL, + phi = 1, + upsilon = 0.017, + gamma = 0.1, + alpha = 1, + beta_t1 = 0.19, + beta_t2 = 0.085, + beta_t3 = 0.075, + beta_t4 = 0.185, + end_t1 = 91, + end_t2 = 182, + end_t3 = 273, + end_t4 = 365, + epsilon = 0.000011) > > show_expected <- c("Model: SISe", + "Number of nodes: 1", + "Number of transitions: 2", + "Number of scheduled events: 0", + "") > > stopifnot(identical(show(model), model)) Model: SISe Number of nodes: 1 Number of transitions: 2 Number of scheduled events: 0 Global data ----------- Parameter Value upsilon 0.017000 gamma 0.100000 alpha 1.000000 beta_t1 0.190000 beta_t2 0.085000 beta_t3 0.075000 beta_t4 0.185000 epsilon 0.000011 Local data ---------- Parameter Value end_t1 91 end_t2 182 end_t3 273 end_t4 365 Continuous state variables -------------------------- - Empty, please run the model first Compartments ------------ - Empty, please run the model first > show_observed <- capture.output(show(model)) > > stopifnot(identical(show_observed[1:5], show_expected)) > > ## Check summary method without events > summary(run(model)) Model: SISe Number of nodes: 1 Transitions ----------- S -> upsilon*phi*S -> I I -> gamma*I -> S Global data ----------- Parameter Value upsilon 0.017000 gamma 0.100000 alpha 1.000000 beta_t1 0.190000 beta_t2 0.085000 beta_t3 0.075000 beta_t4 0.185000 epsilon 0.000011 Local data ---------- Parameter Value end_t1 91 end_t2 182 end_t3 273 end_t4 365 Scheduled events ---------------- - None Continuous state variables -------------------------- Min. 1st Qu. Median Mean 3rd Qu. Max. phi 0.00223 0.20781 0.47267 1.49720 1.95607 7.32418 Compartments ------------ Min. 1st Qu. Median Mean 3rd Qu. Max. S 39.0 72.0 93.0 84.3 98.0 100.0 I 0.0 2.0 7.0 15.7 28.0 61.0 > > ## Check first lines of show method with events > u0 <- data.frame(S_1 = c(0, 1, 2, 3, 4, 5), + I_1 = c(0, 0, 0, 0, 0, 0), + S_2 = c(0, 1, 2, 3, 4, 5), + I_2 = c(0, 0, 0, 0, 0, 0), + S_3 = c(0, 1, 2, 3, 4, 5), + I_3 = c(0, 0, 0, 0, 0, 0)) > > events <- data.frame( + event = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), + time = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), + node = c(2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6), + dest = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), + n = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5), + proportion = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), + select = c(4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6), + shift = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) > > model <- SISe3(u0 = u0, + tspan = 0:10, + events = events, + phi = rep(1, 6), + upsilon_1 = 1, + upsilon_2 = 1, + upsilon_3 = 1, + gamma_1 = 1, + gamma_2 = 1, + gamma_3 = 1, + alpha = 1, + beta_t1 = 1, + beta_t2 = 1, + beta_t3 = 1, + beta_t4 = 1, + end_t1 = 91, + end_t2 = 182, + end_t3 = 273, + end_t4 = 365, + epsilon = 1) > > show_observed <- capture.output(show(model)) > > stopifnot(identical( + show_observed[1:5], + c("Model: SISe3", + "Number of nodes: 6", + "Number of transitions: 6", + "Number of scheduled events: 15", + ""))) > > stopifnot(identical( + show_observed[22:28], + c("Local data", + "----------", + " Parameter Value", + " end_t1 91 ", + " end_t2 182 ", + " end_t3 273 ", + " end_t4 365 "))) > > ## Check summary method with events > summary(run(model)) Model: SISe3 Number of nodes: 6 Transitions ----------- S_1 -> upsilon_1*phi*S_1 -> I_1 I_1 -> gamma_1*I_1 -> S_1 S_2 -> upsilon_2*phi*S_2 -> I_2 I_2 -> gamma_2*I_2 -> S_2 S_3 -> upsilon_3*phi*S_3 -> I_3 I_3 -> gamma_3*I_3 -> S_3 Global data ----------- Parameter Value upsilon_1 1 upsilon_2 1 upsilon_3 1 gamma_1 1 gamma_2 1 gamma_3 1 alpha 1 beta_t1 1 beta_t2 1 beta_t3 1 beta_t4 1 epsilon 1 Local data ---------- Parameter Value end_t1 91 end_t2 182 end_t3 273 end_t4 365 Scheduled events ---------------- Exit: 0 Enter: 0 Internal transfer: 0 External transfer: 15 Network summary --------------- Min. 1st Qu. Median Mean 3rd Qu. Max. Indegree: 0.000 0.000 0.000 0.833 0.000 5.000 Outdegree: 0.000 1.000 1.000 0.833 1.000 1.000 Continuous state variables -------------------------- Min. 1st Qu. Median Mean 3rd Qu. Max. phi 1.00 1.00 1.00 1.14 1.00 2.00 Compartments ------------ Min. 1st Qu. Median Mean 3rd Qu. Max. S_1 0.000 0.000 0.000 0.955 0.000 11.000 I_1 0.000 0.000 0.000 1.545 0.000 12.000 S_2 0.000 0.000 0.000 0.955 0.000 10.000 I_2 0.000 0.000 0.000 1.545 0.000 12.000 S_3 0.000 0.000 0.000 1.061 0.000 9.000 I_3 0.000 0.000 0.000 1.439 0.000 12.000 > > ## Check U. Change storage mode of U to double. > ## Should not raise error > U <- structure(c( + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 2L, 0L, 1L, 1L, + 1L, 1L, 2L, 1L, 3L, 0L, 2L, 1L, 2L, 2L, 0L, 4L, 1L, 3L, 2L, 3L, + 3L, 2L, 1L, 4L, 6L, 9L, 7L, 8L, 4L, 11L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 7L, 8L, 7L, 8L, 5L, 10L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 8L, 7L, 6L, 9L, + 8L, 7L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 5L, 10L, 4L, 11L, 6L, 9L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 7L, 8L, 5L, 10L, 7L, 8L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 11L, 5L, 10L, 3L, 12L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 8L, 7L, 5L, + 10L, 4L, 11L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 6L, 9L, 2L, 13L, 4L, 11L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 5L, 10L, 2L, 13L, 7L, 8L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 9L, 6L, 2L, 13L, 6L, 9L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), + .Dim = c(36L, 11L)) > > U_double <- U > storage.mode(U_double) <- "double" > > SimInf_model(G = G, + S = S, + U = U_double, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0) Model: SimInf_model Number of nodes: 6 Number of transitions: 3 Number of scheduled events: 0 Compartments ------------ Min. 1st Qu. Median Mean 3rd Qu. Max. A 0.000 0.000 0.000 1.106 0.000 9.000 B 0.000 0.000 0.000 1.394 0.000 11.000 C 0.000 0.000 0.000 0.803 0.000 7.000 D 0.000 0.000 0.000 1.697 0.000 13.000 E 0.000 0.000 0.000 0.909 0.000 8.000 F 0.000 0.000 0.000 1.591 0.000 12.000 > > ## Check U. Change storage mode of U to double and change to non-integer values. > ## Should raise error > U_double <- U > storage.mode(U_double) <- "double" > U_double <- U_double * 1.2 > > res <- assertError(SimInf_model(G = G, + S = S, + U = U_double, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'U' must be an integer matrix.") > > ## Check U. Should not raise an error if U is an integer vector of length 0 > SimInf_model(G = G, + S = S, + U = integer(0), + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0) Model: SimInf_model Number of nodes: 6 Number of transitions: 3 Number of scheduled events: 0 Compartments ------------ - Empty, please run the model first > > ## Check U. Should raise error if U is an integer vector of length > 0 > res <- assertError(SimInf_model(G = G, + S = S, + U = c(1L), + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'U' must be equal to a 0 x 0 matrix.") > > ## Check V. Change storage mode of V to double. > ## Should not raise error > V <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1), + .Dim = c(6L, 10L)) > > V_integer <- V > storage.mode(V) <- "integer" > > SimInf_model(G = G, + S = S, + U = U, + V = V_integer, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0) Model: SimInf_model Number of nodes: 6 Number of transitions: 3 Number of scheduled events: 0 Compartments ------------ Min. 1st Qu. Median Mean 3rd Qu. Max. A 0.000 0.000 0.000 1.106 0.000 9.000 B 0.000 0.000 0.000 1.394 0.000 11.000 C 0.000 0.000 0.000 0.803 0.000 7.000 D 0.000 0.000 0.000 1.697 0.000 13.000 E 0.000 0.000 0.000 0.909 0.000 8.000 F 0.000 0.000 0.000 1.591 0.000 12.000 > > ## Check V. Change storage mode of V to character > ## Should raise error > V_character <- V > storage.mode(V_character) <- "character" > > res <- assertError(SimInf_model(G = G, + S = S, + U = U, + V = V_character, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'V' must be a double matrix.") > > ## Check V. Should raise error if V is a vector of length > 0 > res <- assertError(SimInf_model(G = G, + S = S, + U = U, + V = 1, + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0)) > check_error(res, "'V' must be equal to a 0 x 0 matrix.") > > ## Check V. Should not raise an error if V is an integer vector of length 0 > SimInf_model(G = G, + S = S, + U = U, + V = integer(0), + ldata = matrix(rep(0, Nn), nrow = 1), + tspan = as.numeric(1:10), + u0 = u0) Model: SimInf_model Number of nodes: 6 Number of transitions: 3 Number of scheduled events: 0 Compartments ------------ Min. 1st Qu. Median Mean 3rd Qu. Max. A 0.000 0.000 0.000 1.106 0.000 9.000 B 0.000 0.000 0.000 1.394 0.000 11.000 C 0.000 0.000 0.000 0.803 0.000 7.000 D 0.000 0.000 0.000 1.697 0.000 13.000 E 0.000 0.000 0.000 0.909 0.000 8.000 F 0.000 0.000 0.000 1.591 0.000 12.000 > > ## Check that plot raises an error if the model hasn't run > model <- SISe(u0 = data.frame(S = 99, I = 1), + tspan = seq_len(1000) - 1, + events = NULL, + phi = 1, + upsilon = 0.017, + gamma = 0.1, + alpha = 1, + beta_t1 = 0.19, + beta_t2 = 0.085, + beta_t3 = 0.075, + beta_t4 = 0.185, + end_t1 = 91, + end_t2 = 182, + end_t3 = 273, + end_t4 = 365, + epsilon = 0.000011) > res <- assertError(plot(model)) > check_error(res, "Please run the model first, the trajectory is empty.") > > ## Check that the SimInf_model initialisation fails if the events > ## argument is not either NULL or a data.frame > u0 <- data.frame(S_1 = c(0, 1, 2, 3, 4, 5), + I_1 = c(0, 0, 0, 0, 0, 0), + S_2 = c(0, 1, 2, 3, 4, 5), + I_2 = c(0, 0, 0, 0, 0, 0), + S_3 = c(0, 1, 2, 3, 4, 5), + I_3 = c(0, 0, 0, 0, 0, 0)) > > res <- assertError(model <- SISe3(u0 = u0, + tspan = 0:10, + events = "events", + phi = rep(1, 6), + upsilon_1 = 1, + upsilon_2 = 1, + upsilon_3 = 1, + gamma_1 = 1, + gamma_2 = 1, + gamma_3 = 1, + alpha = 1, + beta_t1 = 1, + beta_t2 = 1, + beta_t3 = 1, + beta_t4 = 1, + end_t1 = 91, + end_t2 = 182, + end_t3 = 273, + end_t4 = 365, + epsilon = 1)) > check_error(res, "'events' must be NULL or a data.frame.") > > ## Check arguments to 'trajectory' method > u0 <- data.frame(S = 100:105, I = 1:6, R = rep(0, 6)) > model <- SIR(u0 = u0, tspan = 1:10, beta = 0.16, gamma = 0.077) > result <- run(model) > res <- assertError(trajectory(result, compartments = c("A", "S"))) > check_error(res, "Non-existing compartment(s) in model: 'A'.") > res <- assertError(trajectory(result, index = c("A", "S"))) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > res <- assertError(trajectory(result, index = 3.4)) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > res <- assertError(trajectory(result, index = 0)) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > res <- assertError(trajectory(result, index = 10)) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > > ## Check arguments to 'prevalence' method > u0 <- data.frame(S = 100:105, I = 1:6, R = rep(0, 6)) > model <- SIR(u0 = u0, tspan = 1:10, beta = 0.16, gamma = 0.077) > result <- run(model) > res <- assertError(prevalence(result, A + S ~ S)) > check_error(res, "Non-existing compartment(s) in model: 'A'.") > res <- assertError(prevalence(result, S ~ A + S)) > check_error(res, "Non-existing compartment(s) in model: 'A'.") > res <- assertError(prevalence(result, I ~ S + I + R, i = c("A", "S"))) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > res <- assertError(prevalence(result, I ~ S + I + R, i = 3.4)) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > res <- assertError(prevalence(result, I ~ S + I + R, i = 0)) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > res <- assertError(prevalence(result, I ~ S + I + R, i = 10)) > check_error( + res, + "The node index must be an integer > 0 and <= number of nodes.") > > ## Check 'gdata' > model <- SISe(u0 = data.frame(S = 10, I = 0), tspan = 1:10, phi = 0, + upsilon = 1, gamma = 2, alpha = 3, beta_t1 = 4, + beta_t2 = 5, beta_t3 = 6, beta_t4 = 7, end_t1 = 91, + end_t2 = 182, end_t3 = 273, end_t4 = 365, epsilon = 8) > > stopifnot(identical(gdata(model), + c(upsilon = 1, gamma = 2, alpha = 3, beta_t1 = 4, + beta_t2 = 5, beta_t3 = 6, beta_t4 = 7, epsilon = 8))) > > gdata(model, "epsilon") <- 9 > > stopifnot(identical(gdata(model), + c(upsilon = 1, gamma = 2, alpha = 3, beta_t1 = 4, + beta_t2 = 5, beta_t3 = 6, beta_t4 = 7, epsilon = 9))) > > res <- assertError(gdata(model) <- 6) > check_error(res, "Missing 'parameter' argument.") > > res <- assertError(gdata(model, "epsilon") <- "6") > check_error(res, "'value' argument must be a numeric.") > > res <- assertError(gdata(model, 5) <- 6) > check_error(res, "'parameter' argument must be a character.") > > res <- assertError("gdata<-" (model, "epsilon")) > check_error(res, "Missing 'value' argument.") > > ## Check 'ldata' > model@ldata <- matrix(1, dimnames = list("test", NULL)) > res <- assertError(ldata(model)) > check_error(res, "Missing 'node' argument.") > > res <- assertError(ldata(model, "0")) > check_error(res, "Invalid 'node' argument.") > > res <- assertError(ldata(model, 0)) > check_error(res, "Invalid 'node' argument.") > > res <- assertError(ldata(model, c(0, 0))) > check_error(res, "Invalid 'node' argument.") > > ldata(model, 1) test 1 > > proc.time() user system elapsed 1.26 0.09 1.34