Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fill out evtools function set for dosing #1227

Merged
merged 14 commits into from
Sep 7, 2024
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Type: Package
Package: mrgsolve
Title: Simulate from ODE-Based Models
Version: 1.5.1
Version: 1.5.1.9000
Authors@R:
c(person(given = "Kyle T", family = "Baron",
role = c("aut", "cre"),
Expand Down
2 changes: 2 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# mrgsolve (development version)

# mrgsolve 1.5.1

- Fixed `yaml_to_cpp()` example code to prevent saving the file to the working
Expand Down
6 changes: 6 additions & 0 deletions inst/base/mrgsolv.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ struct evdata {
cmt = 1;
amt = 0.0;
rate = 0.0;
ii = 0.0;
ss = 0;
addl = 0;
now = false;
check_unique = false;
}
Expand All @@ -61,6 +64,9 @@ struct evdata {
int cmt;
double amt;
double rate;
double ii;
int ss;
int addl;
bool now;
bool check_unique;
};
Expand Down
30 changes: 30 additions & 0 deletions inst/base/mrgsolve-evtools.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,36 @@ void retime(mrgsolve::evdata& ev, const double time) {
return;
}

void addl(mrgsolve::evdata& ev, const int addl) {
ev.addl = addl;
return;
}

void ii(mrgsolve::evdata& ev, const double ii) {
ev.ii = ii;
return;
}

void ss(mrgsolve::evdata& ev, const int ss) {
ev.ss = ss;
return;
}

void amt(mrgsolve::evdata& ev, const double amt) {
ev.amt = amt;
return;
}

void rate(mrgsolve::evdata& ev, const double rate) {
ev.rate = rate;
return;
}

void cmt(mrgsolve::evdata& ev, const int cmt) {
ev.cmt = cmt;
return;
}

void now(mrgsolve::evdata& ev) {
ev.now = true;
return;
Expand Down
5 changes: 4 additions & 1 deletion inst/maintenance/tests.R
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ a$result <- NULL
message("\ninst/maintenance/unit")
b <- test_dir("inst/maintenance/unit/")
b$result <- NULL
results <- dplyr::bind_rows(as_tibble(a),as_tibble(b))
c <- test_dir("inst/maintenance/unit-cpp/")
c$result <- NULL

results <- dplyr::bind_rows(as_tibble(a),as_tibble(b),as_tibble(c))
results$user <- NULL
results$system <- NULL
results$real <- NULL
Expand Down
271 changes: 271 additions & 0 deletions inst/maintenance/unit-cpp/test-evtools-dosing.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
library(testthat)
library(mrgsolve)
library(dplyr)

Sys.setenv(R_TESTS="")
options("mrgsolve_mread_quiet"=TRUE)

local_edition(3)

code <- '
$PLUGIN evtools

$PARAM Mdose = 0

$PARAM
Lag = 0
Ii = 24
Ss = 0
Addl = 0
Rate = 0
Dur = 0
Amt = 100
Cmt2 = -1
Amt2 = -1
Rate2 = -1
Time2 = -1

$CMT B D

$MAIN
ALAG_B = Lag;
D_B = Dur;

$ODE
dxdt_D = -0.3 * D;
dxdt_B = 0.3 * D - 0.1*B;

$ERROR

if(TIME==0 && Mdose > 0) {
evt::ev dose = evt::infuse(Amt, 1, Rate);
evt::ss(dose, Ss);
evt::ii(dose, Ii);
evt::addl(dose, Addl);
if(Rate2 > 0) evt::rate(dose, Rate2);
if(Cmt2 > 0) evt::cmt(dose, Cmt2);
if(Amt2 > 0) evt::amt(dose, Amt2);
if(Time2 > 0) evt::retime(dose, Time2);
self.push(dose);
}
'

mod1 <- mcode("reset", code, delta = 0.1, end = 96)
mod2 <- update(mod1, param = list(Mdose = 1))

test_that("Bolus - ss and addl via evt", {
d <- ev(amt = 100, ii = 24, addl = 3)
p <- list(Amt = 100, Ii = 24, Addl = 3)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 3)
p$Time2 <- 3
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Bolus, lag - ss and addl via evt", {
d <- ev(amt = 100, ii = 24, addl = 3, Lag = 5)
p <- list(Amt = 100, Ii = 24, Addl = 3, Lag = 5)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 2.5)
p$Time2 <- 2.5
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Bolus, ss - ss and addl via evt", {
d <- ev(amt = 100, ii = 24, addl = 3, ss = 1)
p <- list(Amt = 100, Ii = 24, Addl = 3, Ss = 1)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 3.5)
p$Time2 <- 3.5
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Bolus, ss, lag - ss and addl via evt", {
d <- ev(amt = 100, ii = 24, addl = 3, ss = 1, Lag = 3)
p <- list(Amt = 100, Ii = 24, Addl = 3, Ss = 1, Lag = 3)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 3.1)
p$Time2 <- 3.1
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Infusion - ss and addl via evt", {
d <- ev(amt = 100, ii = 12, addl = 3, Dur = 7, rate = -2)
p <- list(Amt = 100, Ii = 12, Addl = 3, Dur = 7, Rate = -2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 2)
p$Time2 <- 2
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Infusion, lag - ss and addl via evt", {
d <- ev(amt = 100, ii = 8, addl = 3, Lag = 5, Dur = 5, rate = -2)
p <- list(Amt = 100, Ii = 8, Addl = 3, Lag = 5, Dur = 5, Rate = -2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 4)
p$Time2 <- 4
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Infusion, ss - ss and addl via evt", {
d <- ev(amt = 100, ii = 24, addl = 2, ss = 1, Dur = 8, rate = -2)
p <- list(Amt = 100, Ii = 24, Addl = 2, Ss = 1, Dur = 8, Rate = -2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 1.5)
p$Time2 <- 1.5
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Infusion, ss, lag - ss and addl via evt", {
d <- ev(amt = 100, ii = 16, addl = 3, ss = 1, Lag = 3, Dur = 9, rate = -2)
p <- list(Amt = 100, Ii = 16, Addl = 3, Ss = 1, Lag = 3, Dur = 9, Rate = -2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# same dose, but "later"
d <- mutate(d, time = 2.1)
p$Time2 <- 2.1
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Alternate infusion - dosing via evt", {
# data event passes the rate directly rather than modeled duration
d <- ev(amt = 100, ii = 24, addl = 1, tinf = 4)
p <- list(Amt = 100, Ii = 24, Addl = 1, Dur = 4, Rate = -2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

# Both use direct rate rather than modeled duration
d <- ev(amt = 100, ii = 24, addl = 1, rate = 20)
p <- list(Amt = 100, Ii = 24, Addl = 1, Rate = 20)
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Steady state continuous infusion - dosing via evt", {
d <- ev(amt = 0, ii = 24, rate = 20, ss = 1)
p <- list(Amt = 0, Ii = 24, Rate = 20, Ss = 1)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)
expect_equal(out2$B[1], 20/0.1)

# same dose at a later time
d <- mutate(d, time = 10)
p$Time2 <- 10
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
expect_equal(out3$B[out3$time==10], 20/0.1)
})

test_that("Single dose - dosing via evt", {
d <- ev(amt = 100, ii = 24, tinf = 3)
p <- list(Amt = 100, Ii = 24, Addl = 0, Dur = 3, Rate = -2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)

d <- mutate(d, time = 3.3)
p$Time2 <- 3.3
out3 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out4 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out3$B, out4$B)
})

test_that("Switch compartment - dosing via evt", {
d <- ev(amt = 100, ii = 24, addl = 2, cmt = 2)
p <- list(Amt = 100, Ii = 24, Addl = 2, Cmt2 = 2)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)
expect_identical(out1$D, out2$D)
})

test_that("Switch dose amount - dosing via evt", {
d <- ev(amt = 200, ii = 24, addl = 2)
p <- list(Amt = 100, Ii = 24, Addl = 2, Amt2 = 200)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)
})

test_that("Switch infusion rate - dosing via evt", {
d <- ev(amt = 100, ii = 24, addl = 2, tinf = 5)
p <- list(Amt = 100, Ii = 24, Addl = 2, Rate2 = 100/5, Rate = -2, Dur = 10)
out1 <- mrgsim(mod1, d, recsort = 3, obsonly = TRUE)
out2 <- mrgsim(mod2, param = p, obsonly = TRUE, recsort = 3)

expect_identical(out1$B, out2$B)
})
2 changes: 1 addition & 1 deletion inst/maintenance/unit-cpp/test-evtools-regimen.R
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ capture ccmt = reg.cmt();
'

mod1 <- mcode("test-evtools-regimen", code, quiet = TRUE)
mod2 <- modlib("pk1", quiet = TRUE)
mod2 <- modlib("pk1", quiet = TRUE, preclean = TRUE)
mod2 <- param(mod2, as.list(param(mod1)))

test_that("Identical results with pk1", {
Expand Down
Loading
Loading