Nothing
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")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.