library(magrittr)
library(unittest)
library(gadget3)
prey_a <- g3_stock('prey_a', c(1)) %>% g3s_age(3, 5)
# NB: 1 per age, starting at 3
naturalmortality_prey_a <- c(0.6, 0.7, 0.1)
step0_prey_a__num <- g3_stock_instance(prey_a)
step0_prey_a__wgt <- g3_stock_instance(prey_a)
step1_prey_a__num <- g3_stock_instance(prey_a)
step1_prey_a__wgt <- g3_stock_instance(prey_a)
step2_prey_a__num <- g3_stock_instance(prey_a)
step2_prey_a__wgt <- g3_stock_instance(prey_a)
step3_prey_a__num <- g3_stock_instance(prey_a)
step3_prey_a__wgt <- g3_stock_instance(prey_a)
actions <- list(
g3a_time(2000, 2000, step_lengths = c(3, 3, 5, 1), project_years = 0),
g3a_initialconditions(
prey_a,
~10 * age + prey_a__midlen * 0,
~100 * age + prey_a__midlen * 0),
g3a_naturalmortality(
prey_a,
g3a_naturalmortality_exp(~naturalmortality_prey_a[[age - 3 + 1]]),
run_f = ~cur_time > 0), # NB: No mortality on the first step
g3a_naturalmortality(
prey_a,
# Spawning mortality, only for age 1, off by default
g3a_naturalmortality_exp(g3_parameterized('spawn_mortality', value = 0, optimise = TRUE)),
run_f = quote( age == 3 )), # NB: Only for first age
list(
'999' = ~{
if (cur_time == 0) {
step0_prey_a__num[] <- prey_a__num
step0_prey_a__wgt[] <- prey_a__wgt
REPORT(step0_prey_a__num)
REPORT(step0_prey_a__wgt)
} else if (cur_time == 1) {
step1_prey_a__num[] <- prey_a__num
step1_prey_a__wgt[] <- prey_a__wgt
REPORT(step1_prey_a__num)
REPORT(step1_prey_a__wgt)
} else if (cur_time == 2) {
step2_prey_a__num[] <- prey_a__num
step2_prey_a__wgt[] <- prey_a__wgt
REPORT(step2_prey_a__num)
REPORT(step2_prey_a__wgt)
} else if (cur_time == 3) {
step3_prey_a__num[] <- prey_a__num
step3_prey_a__wgt[] <- prey_a__wgt
REPORT(step3_prey_a__num)
REPORT(step3_prey_a__wgt)
}
REPORT(step3_prey_a__num)
REPORT(step3_prey_a__wgt)
nll <- nll + g3_param('x', value = 1.0)
}))
# Compile model
model_fn <- g3_to_r(actions)
# model_fn <- edit(model_fn)
if (nzchar(Sys.getenv('G3_TEST_TMB'))) {
model_cpp <- g3_to_tmb(actions, trace = FALSE)
# model_cpp <- edit(model_cpp)
model_tmb <- g3_tmb_adfun(model_cpp, compile_flags = c("-O0", "-g"))
} else {
writeLines("# skip: not compiling TMB model")
}
ok_group("natural mortality", {
params <- attr(model_fn, 'parameter_template')
result <- model_fn(params)
r <- attributes(result)
# str(result)
# str(as.list(r), vec.len = 10000)
# Step 0
ok(ut_cmp_identical(as.vector(r$step0_prey_a__num), c(30, 40, 50)), "step0_prey_a__num: Natural mortality disabled by run_f")
ok(ut_cmp_identical(as.vector(r$step0_prey_a__wgt), c(300, 400, 500)), "step0_prey_a__wgt: Weight unchanged")
# Step 1
ok(ut_cmp_identical(as.vector(r$step1_prey_a__num), c(
30 * exp(-0.6 * 3 * (1/12)),
40 * exp(-0.7 * 3 * (1/12)),
50 * exp(-0.1 * 3 * (1/12)))), "step1_prey_a__num: Natural mortality reduced using exp(vec)")
ok(ut_cmp_identical(as.vector(r$step1_prey_a__wgt), c(300, 400, 500)), "step1_prey_a__wgt: Weight unchanged")
# Step 2
ok(ut_cmp_identical(as.vector(r$step2_prey_a__num), c(
30 * exp(-0.6 * 3 * (1/12)) * exp(-0.6 * 5 * (1/12)),
40 * exp(-0.7 * 3 * (1/12)) * exp(-0.7 * 5 * (1/12)),
50 * exp(-0.1 * 3 * (1/12)) * exp(-0.1 * 5 * (1/12)))), "step2_prey_a__num: Reduced again, used different step size")
ok(ut_cmp_identical(as.vector(r$step2_prey_a__wgt), c(300, 400, 500)), "step2_prey_a__wgt: Weight unchanged")
# Step 3
ok(ut_cmp_identical(as.vector(r$step3_prey_a__num), c(
30 * exp(-0.6 * 3 * (1/12)) * exp(-0.6 * 5 * (1/12)) * exp(-0.6 * 1 * (1/12)),
40 * exp(-0.7 * 3 * (1/12)) * exp(-0.7 * 5 * (1/12)) * exp(-0.7 * 1 * (1/12)),
50 * exp(-0.1 * 3 * (1/12)) * exp(-0.1 * 5 * (1/12)) * exp(-0.1 * 1 * (1/12)))), "step3_prey_a__num: Reduced one more time, using another step size")
ok(ut_cmp_identical(as.vector(r$step3_prey_a__wgt), c(300, 400, 500)), "step3_prey_a__wgt: Weight unchanged")
if (nzchar(Sys.getenv('G3_TEST_TMB'))) {
param_template <- attr(model_cpp, "parameter_template")
param_template$value <- params[param_template$switch]
gadget3:::ut_tmb_r_compare(model_fn, model_tmb, param_template)
}
})
ok_group("Spawning natural mortality")
params <- attr(model_fn, 'parameter_template')
params['spawn_mortality'] <- 0.99
result <- model_fn(params)
r <- attributes(result)
# str(result)
# str(as.list(r), vec.len = 10000)
# Step 0
ok(ut_cmp_identical(as.vector(r$step0_prey_a__num), c(
30 * exp(-0.99 * 3 * (1/12)),
40,
50 )), "step0_prey_a__num: Natural mortality disabled by run_f, spawn natural mortality for first agegroup")
ok(ut_cmp_identical(as.vector(r$step0_prey_a__wgt), c(300, 400, 500)), "step0_prey_a__wgt: Weight unchanged")
# Step 1
ok(ut_cmp_identical(as.vector(r$step1_prey_a__num), c(
30 * exp(-0.99 * 3 * (1/12))^2
* exp(-0.6 * 3 * (1/12)),
40 * exp(-0.7 * 3 * (1/12)),
50 * exp(-0.1 * 3 * (1/12)))), "step1_prey_a__num: Natural mortality reduced using exp(vec) & spawn natural mortality")
ok(ut_cmp_identical(as.vector(r$step1_prey_a__wgt), c(300, 400, 500)), "step1_prey_a__wgt: Weight unchanged")
# Step 2
ok(ut_cmp_identical(as.vector(r$step2_prey_a__num), c(
30 * exp(-0.99 * 3 * (1/12))^2 * exp(-0.99 * 5 * (1/12))
* exp(-0.6 * 3 * (1/12)) * exp(-0.6 * 5 * (1/12)),
40 * exp(-0.7 * 3 * (1/12)) * exp(-0.7 * 5 * (1/12)),
50 * exp(-0.1 * 3 * (1/12)) * exp(-0.1 * 5 * (1/12)))), "step2_prey_a__num: Reduced again, used different step size")
ok(ut_cmp_identical(as.vector(r$step2_prey_a__wgt), c(300, 400, 500)), "step2_prey_a__wgt: Weight unchanged")
# Step 3
ok(ut_cmp_identical(as.vector(r$step3_prey_a__num), c(
30 * exp(-0.99 * 3 * (1/12))^2 * exp(-0.99 * 5 * (1/12)) * exp(-0.99 * 1 * (1/12))
* exp(-0.6 * 3 * (1/12)) * exp(-0.6 * 5 * (1/12)) * exp(-0.6 * 1 * (1/12)),
40 * exp(-0.7 * 3 * (1/12)) * exp(-0.7 * 5 * (1/12)) * exp(-0.7 * 1 * (1/12)),
50 * exp(-0.1 * 3 * (1/12)) * exp(-0.1 * 5 * (1/12)) * exp(-0.1 * 1 * (1/12)))), "step3_prey_a__num: Reduced one more time, using another step size")
ok(ut_cmp_identical(as.vector(r$step3_prey_a__wgt), c(300, 400, 500)), "step3_prey_a__wgt: Weight unchanged")
if (nzchar(Sys.getenv('G3_TEST_TMB'))) {
param_template <- attr(model_cpp, "parameter_template")
param_template$value <- params[param_template$switch]
gadget3:::ut_tmb_r_compare(model_fn, model_tmb, param_template)
}
#### ok_group("Spawning natural mortality")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.