Skip to content

Releases: metrumresearchgroup/mrgsolve

mrgsolve 2.0.0

22 Apr 21:09
0872434

Choose a tag to compare

Breaking Changes

  • data_set() and idata_set() no longer accept .subset, .select,
    object, or need arguments. These arguments allowed filtering and
    column selection inside the call; that processing should now be done on the
    data frame before passing it to data_set() or idata_set(). (#1374)

  • The n argument to simeta() and simeps() has been discouraged for a
    while and is now removed. Calling simeta(n) or simeps(n) to resimulate
    a single ETA or EPS value is no longer supported. Use simeta() or simeps()
    (no argument) to resimulate all values. (#1373)

  • knobs(), wf_sweep(), and render() have been removed. These
    functions were previously deprecated. (#1369)

  • The default value of root in $NMXML and $NMEXT has changed from
    "working" to "cppfile". The root directory for locating NONMEM
    output files now defaults to the directory containing the model .cpp file
    rather than the R working directory. Pass root = "working" to restore the
    previous behavior; but users are highly encouraged to use the new default.
    (#1368)

  • summarise.each() is removed; it has not been practically reachable by the
    user for several years (#1352).

  • Several modlib model library models have had parameter and compartment
    names standardized (#1361):

    • The first extravascular compartment is now named EV (was EV1) in
      pk1cmt, pk2cmt, irm1-irm4, and emax.
    • The first absorption rate constant is now named KA (was KA1) in
      models that previously used numbered names.
    • Code that references these compartments or parameters by name (e.g.,
      init(mod, EV1 = 0) or param(mod, KA1 = 1)) will need to be updated.
    • We continue to discourage users from using these models in production
      code.

New Features

  • Models can now use a ** b syntax to represent pow(a, b); this syntax is
    always available, without need to invoke a plugin (#1360).

  • With the nm-vars plugin, mrgsolve now recognizes NONMEM / Fortran
    IF / ELSE / THEN statements; this code can be left in your model and
    mrgsolve will convert to appropriate C++ under the hood (#1360).

  • ERR(n) is now recognized as an alias for EPS(n) when using the nm-vars
    plugin (#1367).

  • New DSL preprocessing functions convert NONMEM/Fortran model code to
    mrgsolve / C++ syntax (#1360, #1362, #1366):

    • convert_pow() converts Fortran ** exponentiation to pow().
    • convert_fort_if() converts Fortran IF/THEN/ELSE/END IF blocks to C++
      if/else syntax.
    • convert_semicolons() inserts missing trailing semicolons on assignment
      statements.
    • RStudio addins are provided to allow conversion of certain NONMEM source
      code blocks to mrgsolve format in the RStudio editor window.
  • Closed-form three-compartment linear models with or without depot compartments
    can now be implemented via $PKMODEL (#1345).

  • $PKMODEL gains an advan input for selecting 1, 2, or 3 compartment
    models with analytical solutions; for example, setting advan to 2, 4,
    or 12 will give you 1, 2, or 3 compartment model in closed form with a
    depot compartment. When advan is specified, compartments with standard
    names are automatically registered if neither $INIT nor $CMT are
    found in the model file and no compartments are registered at the time
    that $PKMODEL is processed (#1345).

  • Two new modlib models, pk3 and pk3iv, provide the corresponding
    pre-coded model files (#1345).

  • mrgx::assign() is now available in the mrgx plugin; this is a convenience
    function to help you get R objects from your model code back to R when the
    simulation finishes (#1353).

  • The plot() method for mrgsims objects gains a fixy argument to fix the
    y-axis limits across panels in the plot (#1349).

  • Users can now find plot() method documentation through ?plot (#1349).

  • env_get() refactored to allow access of R objects inside the model
    environment similar to base::get(); env_get_obj() is an alias to env_get(),
    analogous to env_get_env() (#1355).

Bugs Fixed

  • Fixed a bug where the model row counter was not correct when a simulation
    was performed with only an idata set (#1351).

mrgsolve 1.8.0

12 Mar 15:56
4f6f984

Choose a tag to compare

  • mrgsolve now requires R >= 4.1 (#1333).

  • FINAL_ROW and FINAL_IROW macros are now available to indicate when the
    simulation is processing the final output record for the whole problem or for
    the current individual, respectively; both macros are reserved words
    (#1328, #1327).

Bugs Fixed

  • Fixed S3 registration of the all.equal method (#1337).

  • custom_rtol() and custom_atol() now return without error when called with
    no tolerance inputs (#1321, #1336).

  • Row counters (self.rown, self.nrow, self.irown, self.inrow) now only
    update when the system advances to an output record; previously, non-output
    records between output records could cause the counters to misrepresent the
    current position in the output (#1323).

Internal

  • Model parameter and compartment aliases in generated C++ code now use scoped
    reference variables rather than preprocessor #define directives (#1332).

    • During this refactor, it was noted that model parameters were mutable
      in $TABLE (and $EVENT), against the intention for the parameter
      vector. This vector continues to be mutable in these blocks, but plans will
      be made to fix this behavior in the future.
  • Initialze Self to null pointer in evt::regimen objects (#1329).

  • Refactor mat2df() (C++) for efficiency, avoiding Rcpp sugar (#1316).

mrgsolve 1.7.2

16 Jan 14:42
926007e

Choose a tag to compare

  • An individual record counter has been added. Use self.inrow to get the number of
    output rows for the current individual; use self.irown to get the zero-indexed row
    number for the current individual; these are similar to self.nrow and self.rown,
    which count records for the entire output data set (#1313).

Bugs Fixed

  • The code argument to mcode() now accepts a character vector with length
    greater than 1; passing multiple lines previously caused a compile error (#1310).

mrgsolve 1.7.1

24 Nov 20:56
3645d76

Choose a tag to compare

  • The 1.7.0 release added safety checks to help users avoid an unintentional
    mismatch between model code and data set. These checks now signal a warning
    instead of an error to give downstream tools that use mrgsolve more
    flexibility in how they adjust to the checks (#1307).

mrgsolve 1.7.0

19 Nov 03:30
ec03af7

Choose a tag to compare

  • Safety checks added to avoid unintentional mismatch between model code and
    data set when infusion duration (Dn) or rate (Rn) are modeled in
    $PK (#1304).
    • If there is a positive infusion duration in the model (e.g., D1
      in $PK) and data set rate is not -2 on a dosing record, an error will be
      issued. If there is a positive infusion rate in the model (e.g., R1
      in $PK) and data set rate is not -1 on a dosing record, a similar error
      will be issued (check direction: model to data set).
    • These checks are in addition to existing behavior that issued an error
      when rate was -1 or -2 in the data and R1 or D1 were not set to a
      positive value in the model (the opposite check direction: data set to
      model).
    • Original behavior can be restored by turning off these checks either by a
      block option (@!check_modeled_infusions) on $PK or through the
      CHECK_MODELED_INFUSIONS macro available in $PREAMBLE only.

mrgsolve 1.6.1

31 Jul 15:22
88b72cc

Choose a tag to compare

  • Internal refactor of 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).

mrgsolve 1.6.0

31 Jul 11:09
7ac0ffa

Choose a tag to compare

  • 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)

    • Usecustom_rtol(), custom_atol(), and custom_tol() to set tolerances
      on a compartment-by-compartment basis.
    • Use reset_rtol(), reset_atol(), or reset_tol() to reset custom
      tolerances.
    • Use use_custom_tol() and use_scalar_tol() to toggle the model to use
      either the customized (vector) values or the scalar values.
    • Use get_tol() or get_tol_list() to extract both custom and scalar
      tolerance values.
    • The model print method has been updated to reflect whether the model is
      currently set to use the scalar or customized (vector) values.

Bugs Fixed

  • 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).

mrgsolve 1.5.3

11 Jul 13:17
c750bcb

Choose a tag to compare

  • 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).

Bugs Fixed

  • 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).

mrgsolve 1.5.2

18 Oct 12:22
b298a46

Choose a tag to compare

  • 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).

mrgsolve 1.5.1

26 Jul 12:16
1027a93

Choose a tag to compare

  • Fixed yaml_to_cpp() example code to prevent saving the file to the working
    directory (#1220).