self.mevent() and
self.mtime() to not send event objects back to
mrgsolve when the requested object time is in the past; this preserves
previous functionality while respecting change in 1.6.0
that generates an error for events (or event sequences) that happen or
begin in the past (#1297).evt::tgrid() was added to the evtools
plugin, allowing users to insert internal-only (non-output) records into
the simulation for monitoring the system at a regular grid of times
(#1291).
evt::evid() was added to the evtools
plugin allowing users to reset the event ID attribute of event objects
created inside a model (#1291).
EVID behavior was changed so that event IDs greater
than or equal to 100 do not trigger a reset of the ODE solver,
functioning like observation records with EVID=0; for
EVID < 100, a discontinuity will continue to happen
through ODE solver reset (#1291).
Event objects created in the model (typically through the
evtools plugin) will now trigger an error when the event or
event sequence starts before the current simulation time; these events
were previously ignored silently (#1291).
Absolute (atol) and relative (rtol)
tolerances can now be customized for each compartment in an ODE-based
model (#1264)
custom_rtol(), custom_atol(), and
custom_tol() to set tolerances on a
compartment-by-compartment basis.reset_rtol(), reset_atol(), or
reset_tol() to reset custom tolerances.use_custom_tol() and use_scalar_tol()
to toggle the model to use either the customized (vector) values or the
scalar values.get_tol() or get_tol_list() to extract
both custom and scalar tolerance values.Fixed a bug where incorrectly spelled block names were inadvertently aliased resulting in a misleading error message (#1294).
Fixed a bug where no OMEGA or SIGMA
matrices were imported into the model via multiple $NMEXT
or $NMXML blocks when the matrix from one block was ignored
(#1276).
D_CMT, ALAG_CMT, and
simeta() are now available to use in $TABLE
($ERROR), $EVENT, and $PRED code
blocks (#1290).
Added END_OF_INFUSION syntax, which is
true on the internal record that stops an infusion
(#1288).
mwrite_yaml() and mwrite_cpp() now
render block names in upper case, even for blocks coded with lower case
in the original model file (#1282).
When creating an evt::regimen object (via
evtools plugin), the default start time is now the
time when the object was created; before this change, the
default time was always 0 (#1266).
Added methods for evt::regimen objects (via
evtools plugin) under the name time_next();
this either gets or sets the time of the next dose in the regimen
(#1266).
Fixed an issue where time values in the simulated
output data frame were off by a very small amount, due to issues with
floating point mathematical operations (#1287).
Fixed a problem writing a model to file with
mwrite_yaml() and mwrite_cpp() when lower case
block naming was used (#1282).
Fixed a bug where invalid item passed through the
$SET block caused an error when reading / building a model
(#1271).
Fixed a bug where mrgsolve was not matching NONMEM behavior when
an EVID=4 record was included in the data set with
SS=1; mrgsolve will now match NONMEM behavior in this case,
with the output being identical to EVID=1 with
SS=1 (#1262).
Add $EVENT block for writing code related to dosing
or other events that are implemented through model code rather than the
data set (#1230).
Add evt::reset() and evt::reset(self)
functions under the evtools plugin; these reset the
compartments in a model; overloaded functions are also provided to reset
and dose with bolus or infusion (#1222).
Completed dosing functionality in evtools plugin;
use evt::addl() to schedule additional doses through an
evt::ev object; use evt::ii() to set the
dosing interval; use evt::ss() to advance the
pharmacokinetic system to steady state just prior to dosing;
evt::cmt() sets the compartment number;
evt::amt() sets the dose amount; evt::rate()
sets the infusion rate; see the user guide for the specific signatures
that are available (#1227).
Add evtools model to modlib(),
illustrating how to implement dosing regimens from inside the model a
few different ways (#1230).
Added more comprehensive checking for duplicate blocks in a model file; duplicate blocks are always handled when allowed; an error message is always issued when duplicates are not allowed (#1238).
Code to audit $ODE (or $DES) code,
looking for an equation for every model compartment was refactored to
use a common approach for both traditional models and models written
with the nm-vars plugin; regardless of approach, the user
will be warned if mrgsolve does not detect code relevant to every model
compartment; the audit system can be bypassed by including the
@!audit block option to $ODE (#1235).
The autodec plugin was lightly refactored to avoid
false positive detection of variables declared as double;
plans are in place to narrow the scope of what is detected for
declaration in future releases (#1234).
R help files (.Rd) reviewed and revised for
consistency and formatting (#1246).
yaml_to_cpp() example code to prevent saving the
file to the working directory (#1220).New functions mwrite_yaml() and
mwrite_cpp() can write a model object back to a file,
accounting for all updates since the model was read from native mrgsolve
format using mread() (#1190, #1213).
New function mread_yaml() for reading back models
written out with mwrite_yaml() (#1190, #1213).
New functions in evtools plugin:
evt::replace() works like evt::bolus(), but
will replace the amount in a given compartment rather than add to it
(#1203).
The nm-vars plugin now exposes DEXP(),
LOG10(), COS() and SIN() for use
in the mrgsolve C++ code blocks (#1199).
An error is now generated when KA is equal to
CL/VC while simulating from the one-compartment model with
analytical solution invoked through $PKMODEL (#1179,
#1197).
as_data_set() (#1115, #1196).An error will now be issued at simulation time when simulation
data sets (data and idata) contain non-numeric data in columns sharing
names with parameters; non-numeric data in columns with certain reserved
names (like AMT, RATE, II,
ADDL, etc.) will also result in an error (#1193).
Internal refactoring to improve performance when simulating infusions or doses with lag times when those doses are coded explicitly in the data set (#1186, #1187).
evt::regimen.ii(double) where timing of next
dose was not as expected (#1170).evtools is a new plugin providing API for dynamic
dosing from within the model; functions and classes are in the
evt namespace (#1149).
regimen is a new class located in the
evt namespace via the evtools plugin;
regimen objects can execute doses in a regular regimen
(#1156).
mread() and mcode() no longer print a
message before the required waiting period on model recompile
(#1145).
ev_rep() output rownames are cleaned up before
returning (#1158).
C++ model code blocks (GLOBAL, PREAMBLE, MAIN/PK, ODE/DES,
TABLE/ERROR) are now checked for
<object>.<attribute> syntax; if found, symbols
on both sides of the dot become reserved words when loading and
compiling that model; specifically, an error will be generated if either
side of the dot (<object> or
<attribute>) is found in parameter names, compartment
names, ETA labels, or EPS labels (#1159).
ETA values are always simulated from OMEGA, even when the user
requests they get scraped from data or idata
via etasrc argument to mrgsim(); this ensures
EPS are reproducible for model runs where
etasrc = "omega" (default, ETA are simulated) or, for
example, where etaasrc = "data.all" (scrape ETA from the
data set) (#1163).
Fixed a bug where modeled doses scheduled to happen
now were ignored if the time attribute was set
to a value prior to the current simulation time (#1152).
Fixed a bug in how doses were computed using the
until argument to ev() (#1154).
The evdata object for modeled events now contains a
check_unique member; when set to false, the
event will be processed without checking for a matching record in the
modeled event log (#1119).
The amt attribute in evdata modeled
event objects is now considered when looking for duplicate records in
the modeled event log (#1119).
Fixed a bug where multiple lagged doses given at the same time but with different bioavailability were all given the bioavailability of the last dosing record (#1129, #1130).
Fixed a bug where modeled infusions given now were
never turned off (#1131).
Fixed a bug where the self object (type:
databox) could not be passed into functions written into
header files that were included through $INCLUDE; these
header files are now included immediately preceding any user code
written into $GLOBAL (#1125, #1126).
Fixed a bug where modeled event log was not getting reset after simulating the first individual; this resulted in events not getting executed in subsequent individuals when matching events were executed in the first individual; this affects modeled events only, not events coming from the data set (#1117, #1118).
Fixed a bug in detecting which compartments are receiving doses (#1112, #1113).
EPS draws; this is a change from previous
behavior where records with the same time received the same value for
EPS (#1110)..x from matlist documentation
object per new NOTE output from rdevel (#1103, #1104).Add new functionality for assessing consistency between names on input data set and parameter names (#1078).
check_data_names() executes the
check.$INPUT for marking
parameters as “inputs” and expecting them to be present in the data when
check_data_names() is called.$PARAM block attributes @input and
@tag for adding tags to parameters which will be checked
when check_data_names() is called.param_tags() to list parameters and tags
for a given model.Now checking TIME and time when
assessing upper / lower case name consistency of input data sets
(#1099).
ETAs can now be passed into the problem via idata by
passing eta_src as either idata or
idata.all to mrgsim() (#1092).
Internal refactor of mechanics checking for user interrupt during simulation (#1088).
Minor re-factor of mrgsim_nid() and documentation
update to be in line with original intent; no meaningful change in
functionality (#1086).
parameter_list objects can now be passed to
param() (#1076).
ev_rx() syntax gains & operator
allowing specification of multiple events at a single time
(#1072).
Kyle Meyer added as contributor (#1096).
modlib() model 1005 re-coded to reflect
the “traditional” model specification syntax (#1069).
The model object update() method will again issue a
warning when unrecognized arguments are passed (#1068).
data was not
recognized when using eta_src = "data" or
eta_src = "data.all" (#1095).compiled.mrgmod() and
as_tibble.mrgsims() based on new R-devel check findings
(#1065).SIGMA() is a new model macro which allows users to
access on-diagonal elements of SIGMA in the model
(e.g. SIGMA(2) in $ERROR) (#1051,
#1052).
mrgsim() and mrgsim_q() gain an
etasrc argument, allowing ETAs to be either
simulated from OMEGA (new default and previously the only
behavior) or taken from the input data set (new option), similar to the
way parameters can be scraped from the data set (#1037).
@etas is a new option for use with the
$CAPTURE block to let users name ETAs to be
captured into the simulated output; for example, use
@etas 1:last to capture all model ETAs in the
simulated output (#1055).
Drop CXX_STD statement from Makevars file and
DESCRIPTION to be consistent with current changes in R-devel; mrgsolve
continues to require compiler capable of implementing C++11 standard,
but this should be selected automatically by R (#1060).
mrgsolve now depends on R >= 3.6.2
(#1060).
Fix bug when the path argument is used in the
$NMXML or $NMEXT blocks; this bug was
introduced through the @cppstem feature in version
1.0.7 (#1046, #1048).
Fix bug in mread_cache() where the
project directory wasn’t getting rendered properly when
passing the complete path to the model specification file
(#1056).
$NMXML and $NMEXT now accept the
run argument set to "@cppstem" (i.e
run = "@cppstem"); in this case, the stem of the NONMEM run
will be assumed to be the same as the stem of the mrgsolve model file
(#1025).
Missing values (NA) in input data sets will be
replaced with 0 for the following columns: AMT,
CMT, EVID, II, ADDL,
RATE, SS as well as their lower case
counterparts (#1030).
Refactored include order when building a model; this is an internal update and not expected to be visible to the user (#1038).
nm-vars plugin; the bug would have resulted in a warning
from the pre-processor and did not affect function of the model
(#1039).TOUCH_FUNS where parameter and compartment
lists were not getting generated properly when mrgsolve was
not loaded; bug was detected and fixed prior to upload to CRAN or MPN
(#1013).Changed behavior for dosing records where EVID = 4 and SS != 0 to match what is done by NONMEM: the system will be advanced to steady-state but will not be reset; behavior prior to 1.0.5 release was to advance to steady-state and then reset (#1011).
Any column in an input data set that has a class attribute will
now be dropped in addition to non-numeric columns; this includes columns
that are integer64 which can be present in data frames
derived from data.table::fread() or other .csv
readers (#1008).
The $MAIN and $TABLE blocks will no
longer get called for actual dose administration records with
lag times; this could change time after dose calculations or other
calculations that could be happening in those blocks when the
actual administration is taking place (#992).
Code to update the parameter list was re-factored to be much more efficient (#978).
Fix bug where apparent dosing events for additional doses with lag times were not getting scheduled (only records for the actual administration); this doesn’t change the simulated output but could change time after dose calculation (#992).
Fix bug where special nm-vars variables were not
getting recognized as valid capture items during dynamic capture
(#987).
Fix bug when updating the parameter list with a data frame that included non-numeric columns that were not parameters (#978).
Fix bug where as_data_frame() was not properly
working when leading event object was evd type (#948,
#955).
Add uctran() to convert nmtran data names to upper
case (#955).
Both lctran() and uctran() are generic
and work on data.frame or event (ev) objects
(#949, #955).
Fix bug where data records with EVID = 3 were
getting shifted in time by ALAG (#964, #969).
Small negative eigenvalues from OMEGA or
SIGMA are set to zero in multivariate normal simulation of
ETA and EPS, following the pattern seen in
MASS::mvrnorm() (#956, #957).
Fixed bug where template parameters (T) were getting
modified when nm-vars plugin was used in conjunction with
mrgx plugin (#965, #968).
assert() statement in LSODA code found by CRAN
check (#943).inherits() not class()
from CRAN check (#943).Add LOG(), EXP(), SQRT()
macros when nm-vars plugin is invoked (#931,
#936).
Use evd() to create an event object which renders
nmtran names in upper case (e.g. TIME rather than
time) (#935, #919).
Fixed bug where rate was not getting set for modeled
events (#934).
Fixed bug where self.stop_id() and
self.stop_id_cf() had reversed behavior as documented
(#927, #928).
Refactored EVID=3 behavior to leave NEWIND as-is
(#934).
New model syntax: THETA(n) is interpreted as
THETAn in the model code; THETA is now a
reserved word (#837, #891, #892).
New functions collapse_omega(),
collapse_sigma() and collapse_matrix() added
which help to reshape OMEGA and SIGMA matrix objects with multiple
blocks (#897, #900).
New plugin nm-vars which implements NONMEM-like
syntax for referring to compartments, differential equations,
bioavailability factor, infusion duration and rate, and lag time (#904,
#891).
New plugin autodec which will find user-defined
variables in the model code and automatically declare them as type
double (#905, #893).
Use ii as spacer for setting the between-dose
interval when putting event objects in a sequence (c.f.
wait) (#906, #901).
Start deprecatingsimeta(n) and
simeps(n), calls to simeta() or
simeps() with an integer argument thus limiting the update
to just a single ETA(n) or EPS(n); use in
model code will generate warning when loading the model that contains
the n integer value (#908, #909).
In pk2iv, change scaling volume for
CENT from V2 (incorrect) to V1
(#831, #832, #833)
Fix bug collating multiple $OMEGA or
$SIGMA matrices when parsing a model (#863)
Refactor how debugging information is processed when using the
recover argument to mread() (#853)
Fix typo in documentation for as_cmat(); the
off-diagonals are assumed to contain correlations (#856)
Wrote a as.data.frame.matrix() function in Rcpp; all
simulation results return from the C++ simulation code as a data frame
(#857)
Fix bug where dynamic capture (via mread()) was not
allowed for variables declared in $GLOBAL (#868)
mrgsim() will now periodically check for user interrupt
signal so that long-running simulations can be stopped using
Esc and / or Control-C; the check interval can
be modified through the interrupt argument to
mrgsim(), but for most applications, this shouldn’t need to
be changed (#823)mrgsim() will issue a warning if duplicate columns are
found in simulated output and rename duplicates using
make.names(); thanks @FelicienLL for the report (#827,
#828)OFF when they have
active infusions running; this was previously an error (#822)root.xml or
root.ext) are now saved in the model object when nonmem
results are imported via $NMEXT or $NMXML;
paths are accessible by coercing the model object with
as.list() and looking at the nm_import item
(#802)root argument to $NMEXT and
$NMXML so that the nonmem output files are located relative
to the working directory (default, previous behavior) or
the directory where the cppfile is stored;
cppfile will eventually replace working as the
default (#803)$PRED now respect the
obsonly option (#811)simeta() and simeps() now accept an
(optional) integer argument to limit re-simulation to single ETA or EPS
values (#789)as.list(mod) output now includes a data frame of
C++ variables and pre-processor definitions in the
cpp_variables slot. (#780)$PARAM, $THETA, $CMT,
$INIT, $OMEGA and $SIGMA blocks
all include the directives @object and
@as_object so that block contents can be specified
programmatically. @object names an object that was coded
into $ENV and @as_object indicates that the
block contains code to realize the object. See ?BLOCK_PARSE
help topic for more information on how this all works. (#783)$NMEXT now lets the user select between multiple tables
for scraping parameter estimates. (#782)$ERROR as an alias for $TABLE in the
model file (#710)rtol and atol rather than
ss_rtol and ss_atol (#703)loadso issues a proper error when the model dll doesn’t
exist (#724)addl or ss are
negative (#733)tad plugin to calculate time after dose in a
specific compartment (#702)carry_out to respect default
nocb behavior (#759; see also #744)capture argument to mread to add to
$CAPTURE when compiling the model (#704)recover mechanism to join items in input data
sets to the output (#646)ss_rtol and
ss_atol) to control advance to steady state (#652)realize_addl when addl is zero
by ii is not (#653)tname to add custom
names to imported THETAs (#687)run.ext file (#509)select_sims method for selecting columns in
mrgsims object (#585)CXX_FLAGS in $ENV block
(#603)N_CMT plugin so that the number (index) of every
compartment is available by name (e.g. N_CENT for the
number index of the central compartment) (#606)blocks() failed when the model was
defined in Rmd file (#608)within method for mrgmod (#616)$ operator for mrgmod (#620)c("mrgsims", "character"); pass in a character vector of
outputs to plot (#630)mrgsolve:::house() is now an exported function (#625)qsim and all associated functionsqsim as a simpler,
quicker simulation routine (#490)mrgsim() and
variants) recognizes evid 4 in addition to evid 1 (#502)$NMXML fails when nm
namespace not found in xml file (#510)ev constructor are now evaluated; for
example, ev(amt = 100, rate = amt/2) (#512)$ and [[ operators for event objects
(#513)mrgsim_e and mrgsim_ei will try to accept
data frame and validated data setsoutvars argument to update method; this will
replace Reqss_n and
ss_fixed to control advance to steady state; a warning will
be issued when ss_fixed is FALSE and the
system doesn’t reach steady state within ss_n iterations
(#533)xpath is added to nmxml() to
handle cases where the nm namespace is not found in the xml
file (#510)istate (#457)ss=1 in a dosing record with
bioavailability is zero (#497)rate/tinf,
addl/total, addl/until (#513)tinf is used to create event object, that item is
retained and used to set the infusion rate (along with dose) until it is
removed; it is an error to try to set rate when
tinf is in the event object (#513)expand_observations (#563)expand_observations to
allow control record sort order (#565)DLSODA code to avoid CRAN LTO warningmrgsolve_q to call the standard mrgsolve
simulation rather than the streamlined function; a decision will have to
be made about whether or not the streamlined function will be
retainedvalid_data_set now retain the matrix
attribute (#448)simcall to 0 in mrgsim_q@as_object option to the following blocks: PARAM,
INIT, CMT, OMEGA, SIGMA; experimentalODE blocksmtime function to self object for
simpler mtime implementation@param block option for ODE blocks; use
comma-separated name=value pairs to add to the parameter list from
within ODElogy and logbr arguments to
plot.mrgsims so results y-axis outputs can easily be
plotted on log scalenumerics_only function to drop non-numeric
columns from the input data set after optionally converting logical
columns to integerev_rx function to write dosing interventions in
notation similar to a prescription ‘sig’$PRED block for models that don’t utilize any
compartmentspred1 to the internal model library
(modlib())mrgsim_q function for simulation from a model
object with quicker turnaround timemread will take soloc and
project arguments from options() as
mrgsolve.soloc and mrgsolve.project,
respectivelyoutput argument to mrgsim so that
e.g. data.frame can be returned, without creating the usual
mrgsims objectsoloc argument of
mread (or mcode or cache versions of both)
will be created if it doesn’t existpk2iv model as convenience optiontinf argument to ev() constructor
functiontime/TIME is no longer required in a data set when
$PRED is in usecmt/CMT is no longer required in a data set; a default
value of 0 will be assigned in case it is missing and an error will
continue to be generated when dosing into an invalid compartment (0 is
always an invalid index for dosing compartment)NA) are
detected in an input data set with the following names: ID,
time/TIME, or any column that shares a name with an item in
the parameter listindex argument was added to the $NMXML
block to allow results selection when multiple estimation blocks were
used. The new default is to use the last result.modlib is now able to function as a wrapper to
mread for models in the model library so that, for example,
modlib("pk1") is equivalent to
mread("pk1", modlib()).drop.re and drop_re; use
zero_re insteadreport was previously
available to use in model code. This function has been moved to a
namespace and is now available as mrg::report. This feature
continues to be undocumented.s and replaced with
s_; this was not a problem created by mrgsolve but rather
by ggplot2, which calls mgcv::s via
geom_smooth under certain circumstancesas.list.mrgmod so that the names match the names that you
would pass to update.mrgmod; also added some items so that
all updatable slots in the model object are exported by calling
as.list (#354)as.list.mrgmod output
under the names omat and smat, respectivelydplyr::filter_ for filter_.evfilter.ev methodmutate_sims and filter_sims that
work on mrgsims (output) objects, modifying the
data slot and returning a modified mrgsims
object rather than data.frameplot_sims function that takes a data frame of
simulated output and generates a plot using the mrgsims
methodid argument to ID in
ev_rep and ev_seq; a warning is issued if
id is useddata_qsim for creating input data sets to use
with qsimread_nmext to read in nonmem model output from
the .ext filemread("mymodel.txt") will read from the file
mymodel.txt if it exists. However, the default behavior
remains unchanged so that mread("mymodel") will expect to
find the model in the file mymodel.cpp.project path formulations
#315The realize_addl function was re-factored to better
account for time-varying data items; more option are provided for seeing
where rows were inserted into the data set and whether to make
assumptions about other data in those rows or not
mrgsolve no longer utilizes any functions from the XML package. All previous functionality that depended on XML now depends on xml2. As such, xml2 is listed under the Suggests dependency.
When using $NMXML, the $OMEGA and
$SIGMA matrices are now loaded by default; see new default
arguments to mrgsolve:::nmxml
solversettings help topic that identifies some of
the DLSODA inputs you can tweakupdate method as well as
mrgmod-classBioavailability specified in $MAIN is accounted for
when simulating with qsim; there is still no
bioavailability adjustment for infusions or lag times adjustments to
doses
Added capability to rename data items in $CAPTURE;
also, names are partially sanitized, removing parens and brackets.
For example $CAPTURE WT = WGT ETA(1) TVCL = THETA1
Added qsim_df function, returning data frame rather
than matrix
Added as.list method for mrgsims
objects
Added deep argument for as.list method
for mrgmod object; it was taking a lot of time to return
the function set, so now you only get it if
deep = TRUE
Added mrgsim variant functions with explicit input
requirements written into the function name. For example, call
mrgsim_e to simulate from an event object,
mrgsim_d to simulate from a data frame. All of these
functions are called by mrgsim.
Added method so that event objects can be passed to
data_set; also, coercing event objects to
data_set when passed in as data
Added all.equal.mrgmod function to compare two model
objects. The function returns logical (only)
Added env_get_env that always just returns the model
environment; it has identical result as
env_get(mod, tolist = FALSE)
Change mread_cache and mcode_cache so
that the cache is invalidated when preclean argument is
TRUE
qsim with no
eventmrgsolve_example and mrgsolve_template;
these had been deprecated previously with warning; use
modlib() models insteadmrgsim_df function to return data frame rather
than mrgsims object_env
when mrgx plugin is invokedAdded file argument to mread to allow
coding model specification files with any extension. The current
behavior continues to be assuming that the model is in a
.cpp file, but using the file argument allows
any file name for model specification.
Added nocb argument to mrgsim. If
nobc is TRUE (default), mrgsim
continues to use next observation carried forward to advance the system
when there are time-varying parameters (including covariates). If
nocb is FALSE, mrgsim will use
last observation carried forward (locf) to advance the
system when there are time-varying parameters.
self object was not correctly updated
for the first record for an individual (#273)ev_assign is changed so that the unique
values of evgroup are sorted prior to making event
assignments. Details about the new behavior are now included in the R
help topic.addl. The previous behavior had
bioavailability parameter locked at the value at the time the initiating
dose was implementedRcpp >= 0.12.12 and
dplyr >= 0.7.1ss=2 are recognized, allowing
combining of steady-state dosing regimens under linear kinetics (e.g. 10
mg QAM and 20 mg QPM) (#221)inventory) that reconciles model
parameters with names in an object (e.g. a simulation data set) verify
that required parameters can be found in the data object.dplyrdeslist implementation (#222)tad) in the simulated output. Use
mrgsim(tad=TRUE).$PLUGIN mrgx, including
mrgx::get<T> for getting objects out of
$ENV or a package namespace and mrgx::mt_fun()
that is just a function that you can assign when declaring
Rcpp::Function.object argument to idata_set and
data_set to get a data.frame (or function to
call that returns data.frame) out of $ENV to
use for simulation.cmt argument to $PKMODEL. When
cmt is set to a character vector or a comma-separated
string, $PKMODEL infers the number of compartments and
declares them in the model. This means a separate $CMT
block is not required when using $PKMODEL.cols argument to as_bmat and
as_dmat so that a character vector of names can be
specified (rather than regular expression) to select data for creating
matrix.preclean argument now causes unlink to
be called on the model build directory.$ENV:
ls_env, get_env, re_eval_env,
update_env.table() macro in $TABLE is now
deprecated (#129). To get derived values into the simulated output,
users should assign to type double and list that variable
name in $CAPTURE. See also the capture typedef
introduced below.mrgx plugin was completely removed.param method with signature
missing will check names of input parameters against names
of existing parameters. An error is generated if a user attempts to
update a parameter that doesn’t exist. Note that this does not apply for
the param method with signature list
(#144).@ macros for indicating block options in model
specification file.qsim function for quick(er) simulation runs with
just one parameter set.recmatrix that creates matrix simulation template
for qsim.mrgsolve:::render to create a document with
overview of model contents. Methods for both mrgmod objects
and character strings pointing to a model file.mrgsolve:::details to extract model
annotation.capture typedef in the model specification file.
Variables that are type capture are doubles and are
automatically appended to $CAPTURE.capture typedef is not allowed in $ODE and
probably should be reserved for $TABLE.simeta is available in $MAIN and
simeps is available in $TABLE by default, no
$PLUGIN is required.R objects in the model via
$ENV (#158).assign_ev function to help build simulation data
sets from event objects (#164).as_data_frame method from the tibble
package (#166).$ operator for mrgmod objects to
return the value of a parameter.mread_cache and mcode_cache
functions to build and cache a model (#143).PKMODEL. The volumes for
two-compartment model with no depot should be
V1/V2.knobs where output column names are
malformed when a user $CAPTUREs a parameter that is also
being tweaked as a knob.double/int/bool in $MAIN,
$ODE, $TABLE are kept in unnamed namespace and
are local to the file..R files.mrgsolve:::details returns a data frame of information
regardless of whether the model was annotated or not (#165).mrgsolve::details has additional arguments to help
control output.pkevent class; all records are
datarecord.$PARAM,
$FIXED, $THETA, $CMT,
$INIT, and $VCMT. (#107)mrgsolve:::house() model re-coded as an annotated
model.$ENV to allow users to create
R objects that can be used at certain points when parsing
the model. (#115)>> signifier to code blocks that allow
options; >> at the beginning of the line indicates
that the name=value statements that follow are to be parsed
as block options.object argument for the following blocks:
$PARAM, $OMEGA, $SIGMA,
$FIXED, $CMT. When object is set
to a character string naming an object in $ENV, that object
will be used to form the output from the block.valid.numericlist wasn’t returning
FALSE for improperly-formed objects.environment to collect objects when
parsing the model specification file.C++ code that calculates
compartment amounts for closed form one- and two-compartment models
resulting in faster simulation runs.modmrg package was discontinued. All of the
pre-coded models are now available in mrgsolve. Simply call
mread with the model stem (e.g. pk1cmt,
irm3, etc …) and call modlib() as the
project argument.mod <- mread("emax", modlib()) will compile
the emax model and return the model object.data_setand obsaug=TRUE (#102)idata_set wasn’t handled properly
when it was passed in as tbl (#100)Windows
systems failed when certain symbol names were used in the model (#97).
In this release, a dllname-win.def file is created in
soloc to export only the functions that mrgsolve needs to
use. This is only relevant to Windows
platform.project argument to
mread: if newline(s) are found, an error is generated and
the user is prompted to use mcode instead.cwd to
soloc is not required to build the model. This was only
required on Windows systems where there was a space in the
file name. Correctly rendering the path for the build directory
now.as_data_set to convert one or more event objects
into a data frame that can be passed to data_set. Does
something similar to expand.ev, but more control.time, amt,
rate, evid, ii, addl
,ss, cmt) either lower case or upper case
names are recognized. The determination is made on the time
/ TIME column (always required when using a data set). If
time mrgsolve will continue looking for lower case names;
if TIME it will look for upper case names. A warning is
issued in case both upper and lower case names are included.$PLUGIN to let users extend their model
specification file. Valid plugins include simeta,
Rcpp, RcppArmadillo, and BH. When
a plugin is used, mrgsolve will link back the the appropriate package
and possibly include appropriate header files when compiling the model.
For example, simeta will link back to mrgsolve and
RcppArmadillo and allow the modeler to simulate a new set
of ETAs. Use Rcpp plugin to simulate random
variates from common distributions in
R(e.g. rnorm, rexp etc … ).ev where no rows were returned if
amt wasn’t supplied (#44)..cpp.cpp file when compiling.touch_funs when large number
(> 25) of ETAs in the model (#68).$PKMODEL with ncmt=2 and
depot=FALSE, the default PK parameters are CL,
V1 (central volume), Q, V2
(peripheral volume).V2
(central) and V3 (peripheral).$CAPTURE now saves output items to slots in
std::vector<double>, rather than
std::map<std::string,double>. We’ve known for a while
that the std::map wasn’t very efficient especially with
large simulations.$TABLE are still saved into
std::map with table() macro. The plan going
forward is to eliminate that table map and
force output variables into $CAPTURE.dplyr, now requiring
dplyr >= 0.5.0 (#69)data slot in mrgsims objects is now
data.frameknobs function and plot method has
been re-written. Overall behavior for most applications should be the
same.C++ symbols for model functions are now stored in the
model object (funs slot)mrgsolve:::funset(mod)funs can be found with is.loadedsoloc
directory (by default tempdir()), but mrgsolve will create
a subdirectory structure to organize compilation artifacts. The outer
directory is keyed based on the current mrgsolve version number and the
computer platform. Inner directories are based on the model name
(model(mod)).model name and
the shared object is created based on that name. If the compilation is
successful, the shared object (.so on mac/unix,
.dll on Windows) is copied to a .so or
.dll file with a unique stem
(e.g. model2lj239wsfo.so). This unique shared object is
loaded into the R process for use with the model.getLoadedDLLs()), are attempted to be
dyn.unloaded.mread or mcode),
if there are no changes to the source .cpp file, the source
is not overwritten. In that case, make will not re-build
the shared object. Using the preclean argument will force
re-compilation (see R CMD SHLIB).modelheader.h and
mrgsolv.h are no longer copied into the project directory.
But CLINK_CPPFLAGS environment variable is modified to
include <path-to-mrgsolve-package>/inst/base so that
these may be linked.R CMD SHLIB build process always uses
intern=TRUE so that output is suppressed on both
Windows and mac/unix. The user may still
request to view build output with the ignore.stdout
argument.project directory to
look for C++ header files. When including a header file
that may change from build to build, always run with
preclean=TRUE.mread.complog system, including:
comp_forget a message is issuedcomplog no message is issuedtrequest argument to mrgsimrate > 0 and amt==0.amt (#43).evid 4
were not properly implemented. While investigating that issue, also
found similar issue with evid 4 infusions getting scheduled
with addl (#31).ev to
avoid unintended issues in evaluation (#29).mcode function as alternative to using
mread when your model is written in an R
string. Note the order of the arguments: first model, then
code, then project. project
defaults to tempdir.mod <- mcode("mymodel", code). The
equivalent mread call is:
mod <- mread("mymodel", tempdir(),code).carry.out() and Req() now take
newname = oldname as input. Use this syntax in
carry.out when you want to copy a column from the input
data set into the simulated data set, changing the column to
newname from oldname.Req when you want to change the names of
compartments or output variables specified in $TABLE /
$CAPTURE.pkmodel function for easy loading and simulating
from 1- and 2-compartment models (#39).$PKMODEL for simulating PK model
with analytical solutions. The main option for this block is
ncmt, which picks the number of compartments for the pk
model. See ?PKMODEL for more information and other options
(#34).code attribute to mrgmod objects.
The actual source code stays with the model object. see was
modified to look at x@code first when showing the model
code.get_tokens), a wrapper for
the boost tokenizer) to help checking the model specification file.$FIXED are now implemented as C++
preprocessor directives by default rather than const double
variables. Use $SET fixed_type = "define" or
$SET fixed_type = "const" to select between the
approaches.mindt attribute to mrgmod objects
with default value of .Machine$double.eps*10. When the
problem includes an infusion, the calculated end of the infusion may
come too close to another record. Usually the solver will fail with the
message
DLSODA- TOUT(=R1) too close to T(=R2) to start integration..
To fix this, set mindt to be greater than zero but small …
maybe 1E-12. When mindt is greater than zero and
tto - tfrom (the times of two adjacent records) is less
than mindt, mrgsolve will set tto equal to
tfrom (#9).zero.re didn’t properly update the $SIGMA
list when one matrix was named and another was unnamed. This has been
fixed. (#16)ss=1 caused
mrgsolve/R to crash when the infusion duration was equal to
or some multiple of the dosing interval. (#19)F_CENT to zero gave undefined
behavior.F_CMT is set to zero and
the ss flag is set to 1. (#22)evid=4 (reset the
system and dose)addl > 0 reset the system for all subsequent doses.
Additional doses coming from records with evid=4 will not
do system reset. (#23)$NMXML (see ?nmxml) that
are easier to understand and consistent with new prefixes and labels for
ETA and EPS. name argument is
removed. Use tname (to provide a prefix for
THETAs), oname (to name the OMEGA
matrix), and sname (to name the SIGMA matrix)
instead. In general, set theta to be TRUE to
import THETAs, set omega to be
TRUE to import OMEGA, and set
sigma to be TRUE to import
SIGMA.tname, oname, and
sname will imply theta=TRUE,
omega=TRUE, and sigma=TRUE, respectively.DEPOT
use: F_DEPOT (bioavailability), ALAG_DEPOT
(dosing lag time), D_DEPOT (infusion duration), and / or
R_DEPOT (infusion rate). (#13)DLSODA fails, including clear identification if the value
of istate, which is 2 when the solver succeeds and negative
when the solver fails.labels and prefix options to
$OMEGA and $SIGMA. These allow descriptive
aliases for ETAs … e.g. using ETA_CL rather than
ETA(1).dplyr::slice method for mrgsims
objects (#11)mread: quiet. Setting
quiet to TRUE will prevent printing messages
when mread is called. The default is
getOptions("mrgsolve_mread_quiet",FALSE) … so you can call
options(mrgsolve_mread_quiet = TRUE) to globally turn off
messages from mread.project) and shared object
(soloc) so that “short” paths are used when compiling the
model on Windows platforms (#4).$MAIN with
rate=-2(#3).mrgsolve_example prints a message telling the user to
use mrgmod to read and compile the model. The user should
use mread. The message has been updated (#5).recsort options were selected
(#6).$ADVAN2 and $ADVAN4 for implementing
one- and two-compartment PK models with analytical solutions rather than
ODEs (thanks to contributions by Bill Gillespie and Charles
Margossian)soloc attribute added to mrgmod and
argument added to mread, giving user control over where the
shared object is stored; by default it is in tempdir().
soloc needs to be set to local directory when using
qapplydplyr_ functions so that
mrgsims objects can be piped to mutate,
group_by, filter, summarise,
do, select, and summarise.each
(it’s a dot not an underscore). So:
mod %>% mrgsim %>% mutate(group=1)idata; for
compartment CMT, include a column in idata
called CMT_0$OMEGA and
$SIGMA: if all incoming matrices are unnamed and the
signature matches the model object, the update will happenmcRNG function as alias to
base::RNGkind("L'Ecuyer-CMRG")recsort: 1 and 2 will put explicit doses
after observations at the same time, 3 and 4 will put explicit doses
before observations at the same time. 2 and 4 will put doses scheduled
through addl after observations at the same time; 1 and 3
put doses scheduled through addl before observations at the
same tile.R dependency to >= 3.1.2Ops involving mrgmod objects are now
deprecatedloadso now returns the model object (invisibly)init method with signature
mrgmod,ANY, with ANY getting
coerced to list