Change random number generation to always return doublesinternally as well as no longer take a rxode2 individual structure, thisis inferred by the thread number.
Change string representation of model variables to internalbinary C code (to avoid macOS M1 sanitizer issues withstrings).
Allow user to change the internal serialization type withoptions("rxode2.serialize.type"); Currently can be one of“qs2”, “qdata”, “base”, “bzip2” and “xz”. This option must be set beforerxode2 is loaded, once loaded it keeps the option initiallyset. This is set toxz which is from base R, but could besped up with either"qs2" (more future proof) or"qdata" (a bit faster).
Removed lsodaCDIR$ IVDEP directive, as requested byCRAN.
Better error fortad(depot) whenlinCmt() doesn’t include a depot compartment.
Removeqs dependency; For rxode2 ui objects, uselists instead of serialized objects. The internal C++ code stillgeneratesqs2 sterilization objects (#950)
Fixed translation for censoring/limit to account for a possibleCMT variable before theCENS /LIMIT column (#951, #952)
Addeddmexpit() for getting the diagonalJacobian.
Added special handling ofmixest andmixunif.
Stacking for multiple-endpointipredSim now matchesmultiple-endpointsim; Issue #929
Fix occasional$props that threw an error with emptyproperties (when using properties liketad0()); Issue#924
Allow mixture modelsmix() to be loaded withrxS() as a step to support mixtures in nlmixr2’s focei;Issue #933.
Identify the correct transformation type foriovvariables (#936)
Fix multiple compartment simulation edge cases where simulationswere not being performed (#939)
When referencingcmt in models, the variable isforced to beCMT (related to #939)
Added ability to usemixest ormixunifto preserve the selected mixture estimates when performing a table stepfor a nlmixr2 mixture model (#942)
Change rxui$ evaluation when completing in rstudio,fixes strange calculations popping up inrstudio(#909)
Add orphanrxode2 model unloading when usingrxUnloadAll(), and change the return type to always be aboolean.
AddassertRxUiIovNoCor to assert IOVs have nocorrelations in them.
Handle the levels for inter-occasion variability in the ui better(#614)
Create a new functionmix() that will allow mixturemodels to be simulated in preparation of mixture support innlmixr2. This allows mixture models to be specified as:v = mix(v1, p1, v2, p2, v3) where the probability ofhavingv=v1 is modeled byp1,v=v2 is modeled byp2, andv=v3is modeled by probability1-p1-p2.
Created new functionsmlogit() andmexpit() to convert probabilities used in mixture models tolog-scaled values.mlogit() converts the probabilities tolog-scaled values (using root-finding) andmexpit()converts the log values into probabilities. The equation for theconversion of log to probabilities is\(p_i =\frac{exp(x_i)}{1+\sum_{j=1}^{N-1}exp(x_j)}\)
Added new assertionassertRxUiNoMix which throws anerror when a mixture model is present (iemix())
Fix for label processing when callingrxode2(uiModel)
nlmixr2est to not have issueswith Mac m1 san checks.At the request of CRAN, be a bit more careful so that names arenot duplicated. Now include the md5 hash, a global counter and random 4digit and number combination. In addition add the name of the originalfunction so it will be easier to debug in the future.
Fall back to data.framerbind whenrbind.rxSolve() fails
Add the ability to userbind for solvedrxode2 frames.
FixLTO issue for_rxode2_calcDerived
Add more information errors aboutNAs duringsolving.
FixrxDerived() for mixed vector and non-vectorinput.
Fix model variables foralag(cmt) when they aredefined befored/dt() orlinCmt()
Just in time use ofstate.ignore in the modelvariables, fixes negative length error observed in #857.
Fix steady state bug with time-varying covariates. Now thecovariates are inferred at the time of the steady state (instead ofsearching through the subject based on the projected time).
Rework the linear solved systems to use the wnl solutions, andthreaded linear systems solve (for non-gradient solutions). This newmethod closes a variety of linear compartment model bugs (#261, #272,#441, #504, #564, #717, #728, #827, and #855)
Added new types of bounds for event tables:
3 point boundset(list(c(low, mid, high))) whenspecified this way, they will not change. Perfect for use withbabelmixr2’sPopED (#862, #863, #854)
Intervals simulated by normal values instead of uniform. In thiscase the first seen interval will be 3 elements with NA at the endet(list(c(mean, sd, NA), c(mean, sd))), and the otherelements can simply be 2 declaring thec(mean, sd)
Of course the uniform windows ofet(list(c(low, high))) still work
Currently these different types of windows cannot bemixed.
Add ability to pipe a list or named numeric as an eta with%>% ini(~eta)
Added a fix for event tables where expanding IDs innon-sequential order. In particular if the first ID is not the minimumID when expanding the first event table, the smallest ID was not in theoutput table. Now the smallest ID is in the event table. (Fixes #878,#869, #870)
Added ability to pipeini() orlotri(),or any other expression that can be converted to an ini withas.ini(). Also allowsini() expressions to beconverted to lotri withas.lotri(). Fixes #871
Added new type of variability expression for simulation andestimation with focei and likelihood related methods:+var(). This changes standard deviation parameters tovariance parameters.
Added new type of endpoint expression for focei estimation+dv(). This only transforms the data and not thepredictions. I can only see it being useful in modellinearization.
Bug fix for parameters that are in both input($params) and output ($lhs) that respects theorder of the$lhs declaration (Fixes #876)
AddrxFixRes to literally fix the residual estimatesin a model (#889)
Now modeled duration of 0 is treated as a bolus dose(#892)
Add stable hashes for rxUi objects (#838, #689)
Fix for iov simulation (#842)
Fix forrxnbinom() called directly from R (#847) andexpand it to match more close with R’srnbinom() includingallowing namedmu= calls. In rxode2 ui, these are also nowallowed.
Addlogit/expit named expressions, thatislogit(x, high=20) becomeslogit(x, 0, 20)in ui models.
Updated random ui models likerxnorm(sd=10) toaccept complex numeric expressions likerxnorm(sd=10+1).
Updated random ui models to accept complex non-numericexpressions likerxnorm(sd=a+b)
Rework thetad() and related functions so they usethe same interface as compartments (this way they do not depend on theorder of compartments); See #815. For mu-referencing, Also allow dummyvariables to ignore state requirements (iepodo(depot) in asingle line will not error when parsing mu-referencedequations).
AddgetRxNpars to api. This allows the developmentversion ofbabelmixr2 to better check what model is loadedand unload/reload as necessary.
AddrxUdfUiControl() to rxode2 user function to getcontrol information from something likenlmixr2
Bug fix for tracking time after dose when dosing to 2compartments occur at the exact same time (#804, #819)
Changetransit() model so that it usestad0(),podo0() and related functions for abit more stable simulation and estimation
Fix compile flags to work with BH 1.87 (#826)
Bug fix forapi, the censoring function pointer hasbeen updated (#801).
Queryrxode2.verbose.pipe at run time instead ofrequiring it to be set before loadingrxode2.
Have correct values at boundaries forlogit,expit,probit, andprobitInv(instead ofNA). For most cases this does not breakanything.
Add a new style of user function that modifies theui while parsing or just before using the function (in thepresence ofdata).
Used the new user function interface to allow all randomfunctions inrxode2 ui functions to be named. For example,you can userxnorm(sd=3) instead of having to userxnorm(0, 3), althoughrxnorm() stillworks.
The model properties was moved from$params to$props so it does not conflict with the low levelrxode2 model$params
Error when specifyingwd withoutmodName
With Linear and midpoint of a time between two points, howrxode2 handles missing values has changed. When the missingvalue is lower than the requested time, it will look backward until itfinds the first non-missing value (or if all are missing start lookingforward). When the missing value is higher than the requested time, thealgorithm will look forward until it finds the first non-missing value(or if all are missing, start looking backward).
The order of ODEs is now only determined by the order ofcmt() andd/dt(). Compartment properties,tad() and other compartment related variables no no longeraffect compartment sorting. The optionrxode2.syntax.require.ode.first no longer doesanything.
The handling of zeros “safely” has changed (see #775)
whensafeZero=TRUE and the denominator of a divisionexpression is zero, use the Machine’s small number/eps (youcan see this value with.Machine$double.eps)
whensaveLog=TRUE and the x in thelog(x) is less than or equal to zero, change this tolog(eps)
whensafePow=TRUE and the expressionx^y has a zero forx and a negative number fory replacex witheps.
Since the protection for divide by zero has changed, the results willalso change. This is a more conservative protection mechanism than wasapplied previously.
Random numbers fromrxode2 are different when usingdop853,lsoda orindLin methods.These now seed the random numbers in the same way asliblsoda, so the random number provided will be the samewith different solving methods.
The arguments saved in therxSolve for items likethetaMat will be the reduced matrices used in solving, notthe full matrices (this will likely not break very many items)
iCov is no longer merged to the event dataset. Thismakes solving withiCov slightly faster (#743)You can remove covariances for every omega by piping with%>% ini(diag()) you can be a bit more granular byremoving all covariances that have eithereta.ka oreta.cl by:%>% ini(diag(eta.ka, eta.cl))or anything with correlations witheta.cl with%>% ini(diag(eta.cl))
You can also remove individual covariances by%>% ini(-cov(a, b)) or%>% ini(-cor(a,b)).
You can specify the type of interpolation applied for addeddosing records (or other added records) for columns that are kept withthekeep= option inrxSolve(). This new optioniskeepInterpolation and can belocf for lastobservation carried forward,nocb which is the nextobservation carried backward, as well asNA which puts aNA in all imputed data rows. See #756.
Note: when interpolation is linear/midpoint forfactors/characters it changes to locf with a warning (#759)
Also note, that the default keep interpolation isna
Now you can specify the interpolation method per covariate in themodel:
linear(var1, var2) says bothvar1 andvar2 would use linear interpolation when they are atime-varying covariate. You could also uselinear(var1)
locf() declares variables using last observationcarried forward
nocb() declares variables using next observationcarried backward
midpoint() declares variables using midpointinterpolation
linear(),locf(),locb(),midpoint(),params(),cmt() anddvid() declarations are now ignored when loading arxode2 model withrxS()
Strings can be assigned to variables inrxode2.
Strings can now be enclosed with a single quote as well as adouble quote. This limitation was only in the rxode2 using string sincethe R-parser changes single quotes to double quotes. (This has no impactwithrxode2({}) and ui/function form).
More robust string encoding for symengine (adapted fromutils::URLencode() andutils::URLdecode())
Empty arguments torxRename() give a warning(#688)
Promoting from covariates to parameters with model piping (viaini()) now allows setting bounds (#692)
AddedassertCompartmentName(),assertCompartmentExists(),assertCompartmentNew(),testCompartmentExists(),assertVariableExists()testVariableExists(),assertVariableNew(),assertVariableName(), andassertParameterValue() to verify that a value is a validnlmixr2 compartment name, nlmixr2 compartment/variable exists in themodel, variable name, or parameter value (#726; #733)
AddedassertRxUnbounded(),testRxUnbounded(),warnRxBounded() to allownlmixr2 warn about methods that ignore boundaries#760
Added functionstad0(),tafd0(),tlast0() andtfirst0() that will give0 instead ofNA when the dose has not beenadministered yet. This is useful for use in ODEs sinceNAswill break the solving (so can be used a bit more robustly with modelslike Weibull absorption).
rxode2 is has no more binary link tolotri, which means that changes in thelotripackage will not requirerxode2 to be recompiled (in mostcases) and will not crash the system.
rxode2 also has no more binary linkage toPreciseSums
The binary linkage fordparser is reduced to Cstructures only, making changes in dparser less likely to causesegmentation faults inrxode2 if it wasn’trecompiled.
A new model property has been added to$props$cmtProp and$statePropDf. Both aredata-frames showing which compartment has properties (currentlyini,f,alag,rateanddur) in therxode2 ui model. This comesfrom the lower level model variable$stateProp which hasthis information encoded in integers for each state.
A new generic methodrxUiDeparse can be used todeparse meta information into more readable expressions; This currentlyby default supports lower triangular matrices by lotri, but can beextended to support other types of objects like ’nlmixr2’sfoceiControl() for instance.
Fixui$props$endpoint when the ui endpoint isdefined in terms of the ode instead of lhs. See #754
Fixui$props when the ui is a linear compartmentmodel withoutka defined.
Model extractionmodelExtract() will now extractmodel properties. Note that the model property ofalag(cmt)andlag(cmt) will give the same value. See #745
When assigning reserved variables, the parser will error. See#744
Linear interpolation will now adjust the times as well as thevalues whenNA values are observed.
Fix when keeping data hasNA values that it will notcrash R; Also fixed some incorrectNA interpolations. See#756
When usingcmt() sometimes the next statement wouldbe corrupted in the normalized syntax (like for instancelocf); This bug was fixed (#763)
keep will now error when trying to keep items thatare in the rxode2 output data-frame and will be calculated(#764)
rxode2parse,rxode2random, andrxode2et into this package;The changes in each of the packages are now placed here:Make the stacking more flexible to help rxode2 have more types ofplots
AddtoTrialDuration by Omar Elashkar to convertevent data to trial duration data
Fix Issue #23 and prefer variable values over NSE values
Fix dollar sign accessing of objects (like data frames), aspointed out by@frbrz(issue #16)
Userxode2parse functions for internal event tablecreation (where they were moved to).
Dropped C++14 and let the system decide.
Split offet(),eventTable() andrelated functions.
Also split offrxStack() andrxCbindStudyIndividual() in this package.
Added aNEWS.md file to track changes to thepackage.
<random> toboost::random.Since this is not dependent on the compiler, it makes the random numbersgenerated from Mac, Windows and Linux the same for every distribution.Unfortunately with a new random number transformation, the simulationresults will likely be different than they were before. The exception tothis is the uniform number, which was always the same betweenplatforms.m1mac)Added functiondfWishart which gives (by simulation)an approximation of the degrees of freedom of a Wishart to match arse value.
Added functionswapMatListWithCube which swapsomegaList with omegaCube values
Ensure that the outputs are integers (instead of long integers)as requested by CRAN for some checking functions.
rxode2parse to allowetTrans to be moved thereInitial release ofrxode2random, which separates theparallel safe, random number generation from ‘rxode2’ into a separatepackage to reduce ‘rxode2’ compilation time. This should make CRANmaintenance a bit easier.
Added aNEWS.md file to track changes to thepackage.
SET_TYPEOF whichis no longer part of the C R API.Added a evid suffix of 60 for cases where evid=2 adds an on event(fixes tad() calculation in certain edge cases)
Initialize all variables toNA
Removed linear compartment solutions with gradients fromrxode2parse (and rxode2) when compiled with intel c++ compiler (since itcrashes while compiling).
Fixedm1mac string issues as requested byCRAN
Added ability to query R user functions in a rxode2 model (willforce single threaded solve)
Moved corerxFunParse andrxRmFunParsehere so that C and R user function clashes can be handled
Model variables now tracks which compartments have a lag-timedefined
For compartment with steady state doses (NONMEM equivalent SS=1,SS=2), an additional tracking time-point is added at to track the timewhen the lagged dose is given. As an upshot, the lagged dose will startat the steady state concentration shifted by + ii - lag inrxode2 (currently for ode systems only)
This release calculates non bio-availability adjusted durationfor all rates instead of trying to figure the rate duration duringsolving.
Make double assignment an error, iea <- b <-
NA times are ignored (with warning)
Steady state bolus doses withaddl are treated asnon steady state events (like what is observed inNONMEM)
Timsort was upgraded; drop radix support in rxode2structure
etTrans now supports keeping logical vectors (withthe appropriate version ofrxode2).
Security fixes were applied as requested by CRAN
data.table explicitly in the R code (before wasimported only in C/C++ code)‘linCmt()’ translations of ‘alpha’, ‘beta’, ‘gamma’, ‘k21’,‘k31’, ‘vc’ now error instead of ignoring ‘gamma’ and ‘k31’ to give 2cmt solution
transit compartment internal code now changes dose to 0.0 when nodose has been administered to the depot compartment. This way dosing tothe central compartment (without dosing to the transit compartment) willnot give aNA for the depot compartment (and consequentlyfor the central compartment)
MovedrxDerived here and added tests for it here aswell.
MovedetTransParse here and added tests for it hereas well (makes up most ofetTrans). In addition thefollowing changes were made toetTransParse()/etTrans():
The internal translation (etTrans()) will not droptimes when infusions stop. Before, if the infusion stopped after thelast observation the time when the infusion stopped would be dropped.This interferes withlinCmt() models.
Breaking change/bug fixevid=2 are consideredobservations when translating data to internalrxode2 eventstructure
Fix edge case to find infusion duration when it is the first itemof the dosing record at time 0.
Fixed a bug for certain infusions where therate,ii and/orss data items were dropped from theoutput whenaddDosing=TRUE
Also have internal functions to convert between classic NONMEMevents and rxode2 events
Have an internal function that gives information on the linearcompartmental model translation type, which could be useful forbabelmixr2
‘time’ in model is now case insensitive
Use function declaration inrxode2parseGetTranslation() to determine thread safety offunctions available to rxode2
Add check for correct number of function arguments toparser.
Like R, known functions can be assigned as a variable and thefunction can still be called (while not changing the variable value).For example you can have a variablegamma as well as afunctiongamma().
Fix garbled error messages that occur with certainmessages.
Fixed errors that occurred when using capitalized AMT variablesin the model.
Bug fix for strict prototypes
Removedsprintf as noted by CRAN
Maderxode2parse dll binary independent ofrxode2()
Make sure that the object is a uncompressed rxode2 ui for solvingwithrxSolve (See #661)
Fix #670 by using the last simulated observation residual whenthere are trailing doses.
Create a function to see if a rxode2 solve is loaded in memory(rxode2::rxSolveSetup())
Create a new function that fixes the rxode2 population values inthe model (and drops them in the initial estimates);rxFixPop()
Pendantic no-remap (as requested by CRAN)
gcc USBAN fix (as requested by CRAN)
rxUi compression now defaults to fastcompression
Fixes String literal formatting issues as identified by CRAN(#643)
Removes linear compartment solutions with gradients for intel c++compiler (since they crash the compiler).
Steady state with lag times are no longer shifted by the lag timeand then solved to steady state by default. In addition the steady stateat the original time of dosing is also back-calculated. If you want theold behavior you can bring back the option withssAtDoseTime=FALSE.
“dop853” now uses thehmax/h0 valuesfrom therxControl() orrxSolve(). This maychange some ODE solving using “dop853”
When not specified (and xgxr is available), the x axis is nolonger assumed to be in hours
User defined functions can now be R functions. For many of theseR functions they can be converted to C withrxFun() (youcan see the C code afterwards withrxC("funName"))
Parallel solving of models that require sorting (like modeled lagtimes, modeled duration etc) now solve in parallel instead ofdowngrading to single threaded solving
Steady state infusions with a duration of infusions greater thanthe inter-dose interval are now supported.
Added$symengineModelNoPrune and$symengineModelPrune for loading models into rxode2 withrxS()
When plotting and creating confidence intervals for multipleendpoint models simulated from a rxode2 ui model, you can plot/summarizeeach endpoint withsim. (ie.confint(model, "sim") orplot(model, sim)).
If you only want to summarize a subset of endpoints, you can focus onthe endpoint by pre-pending the endpoint withsim. Forexample if you wanted to plot/summarize only the endpointeff you would usesim.eff. (ieconfint(model, "sim.eff") orplot(model, sim.eff))
Addedmodel$simulationIniModel which prepend theinitial conditions in theini({}) block to the classicrxode2({}) model.
Nowmodel$simulationModel andmodel$simulationIniModel will save and use theinitialization values from the compiled model, and will solve as if itwas the original ui model.
Allowini(model) <- NULL to drop ini block andas.ini(NULL) givesini({}) (Issue#523)
Add a functionmodelExtract() to extract model linesto allow modifying them and then changing the model by piping or simplyassigning the modified lines withmodel(ui) <- newModifiedLines
Add Algebraic mu-referencing detection (mu2) that allows you toexpress mu-referenced covariates as:
cl<-exp(tcl+ eta.cl+ wt_cl*log(WT/70.5))Instead of the
cl<-exp(tcl+ eta.cl+ wt_cl* log.WT.div.70.5)That was previously required (wherelog.WT.div.70.5 wascalculated in the data) for mu expressions. Theui now hasmore information to allow transformation of data internally andtransformation to the old mu-referencing style to run theoptimization.
Allow steady state infusions with a duration of infusion greaterthan the inter-dose interval to be solved.
Solves will now possibly print more information when issuing a“could not solve the system” error
The functionrxSetPipingAuto() is now exported tochange the way you affect piping in your individual setup
Allow covariates to be specified in the model piping, that ismod %>% model(a=var+3, cov="var") will add"var" as a covariate.
When calculating confidence intervals forrxode2simulated objects you can now useby to stratify thesimulation summary. For example you can now stratify by gender and raceby:confint(sim, "sim", by=c("race", "gender"))
When calculating the intervals forrxode2 simulatedobjects you can now useci=FALSE so that it only calculatesthe default intervals without bands on each of the percentiles; You canalso choose not to match the secondary bands limits withlevels but use your ownci=0.99 forinstance
A new function was introducedmeanProbs() whichcalculates the mean and expected confidence bands under either thenormal or t distribution
A related new function was introduced that calculates the meanand confidence bands under the Bernoulli/Binomial distribution(binomProbs())
When calculating the intervals forrxode2 simulatedobjects you can also usemean=TRUE to use the mean for thefirst level of confidence usingmeanProbs(). For thisconfidence interval you can override then used in theconfidence interval by usingn=#. You can also change thisto a prediction interval instead usingpred=TRUE.
Also when calculating the intervals forrxode2simulated object you can also usemean="binom" to use thebinomial distributional information (and ci) for the first level ofconfidence usingbinomProbs(). For this confidence intervalyou can override then used in the confidence interval byusingn=#. You can also change this to a predictioninterval instead usingpred=TRUE. Withpred=TRUE you can override the number of predicted sampleswithm=#
When plotting theconfint derived intervals from anrxode2 simulation, you can now subset based on a simulatedvalue likeplot(ci, Cc) which will only plot the variableCc that you summarized even if you also summarizedeff (for instance).
When the rxode2 ui is a compressed ui object, you can modify theini block with$ini <- or modify the model block with$model <-. These are equivalent toini(model) <- andmodel(model) <-,respectively. Otherwise, the object is added to the user definedcomponents in the function (ie$meta). When the object isuncompressed, it simply assigns it to the environment instead (just likebefore).
When printing meta information that happens to be alotri compatible matrix, uselotri to expressit instead of the default R expression.
Allow character vectors to be converted to expressions for piping(#552)
rxAppendModel() will now take an arbitrary number ofmodels and append them together; It also has better handling of modelswith duplicate parameters and models withoutini() blocks(#617 / #573 / #575).
keep will now also keep attributes of the input data(with special handling forlevels); This means a broadervariety of classes will be kept carrying more information with it (forexample ordered factors, data frame columns with unit information,etc)
Piping argumentsappend forini() andmodel() have been aligned to perform similarly. Thereforeini(append=) now can take expressions instead of simplystrings andmodel(append=) can also take strings. Alsomodel piping now can specify the integer line number to be modified justlike theini() could. Alsomodel(append=FALSE)has been changed tomodel(append=NULL). While the behavioris the same when you don’t specify the argument, the behavior haschanged to align withini() when piping. Hencemodel(append=TRUE) will append andmodel(append=FALSE) will now pre-pend to the model.model(append=NULL) will modify lines like the behavior ofini(append=NULL). The default ofmodel(line)modifying a line in-place still applies. While this is a breakingchange, most code will perform the same.
Labels can now be dropped byini(param=label(NULL)).Also parameters can be dropped with the idiommodel(param=NULL) orini(param=NULL) changesthe parameter to a covariate to align with this idiom of droppingparameters
rxRename has been refactored to run faster
Addas.model() for list expressions, which impliesmodel(ui) <- ui$lstExpr will assign model components.It will also more robustly work with character vectors
Simulated objects fromrxSolve now can access themodel variables with$rxModelVars
Simulation models from the UI now userxerr.endpointinstead oferr.endpoint for thesigma residualerror. This is to align with the convention that internally generatedvariables start withrx ornlmixr
Sorting only uses timsort now, and was upgraded to the latestversion from Morwenn
Simulating/solving from functions/ui now prefers params overomega andsigma in the model (#632)
Piping does not add constants to the initial estimates
When constants are specified in themodel({}) block(likek <- 1), they will not be to theiniblock
Bug fix forgeom_amt() when theaestransformation hasx
Bug fix for some covariate updates that may affect multiplecompartment models (like issue #581)
xgxrCRAN requested that FORTRANkind be changed as itwas not portable; This was commented code, and simply removed thecomment.
Bug-fix forgeom_amt(); also now useslinewidth and at leastggplot2 3.4.0
Some documentation was cleaned up fromrxode22.0.13
A bug was fixed so that thezeroRe() function workswith correlated omega values.
A bug was fixed so that therename() function workswith initial conditions for compartments (cmt(0))
A new functionzeroRe() allows simple setting ofomega and/or sigma values to zero for a model (#456)
Diagonal zeros in theomega andsigmamatrices are treated as zeros in the model. The correspondingomega andsigma matrices drop columns/rowswhere the diagonals are zero to create a newomega andsigma matrix for simulation. This is the same idiom thatNONMEM uses for simulation from these matrices.
Add the ability to pipe model estimates from another model byparentModel %>% ini(modelWithNewEsts)
Add the ability to append model statements with piping using%>% model(x=3, append=d/dt(depot)), still supportsappending withappend=TRUE and pre-pending withappend=NA (the default is to replace lines withappend=FALSE)
rxSolve’s keep argument will now maintain character and factorclasses from input data with the same class (#190)
Parameter labels may now be modified viaini(param = label("text")) (#351).
Parameter order may be modified via theappendargument toini() when piping a model. For example,ini(param = 1, append = 0) orini(param = label("text"), append = "param2")(#352).
If lower/upper bounds are outside the required bounds, theadjustment is displayed.
When initial values are piped that break the model’s boundarycondition reset the boundary to unbounded and message which boundary wasreset.
Addedas.rxUi() function to convert the followingobjects torxUi objects:rxode2,rxModelVars,function. Converting nlmixr2 fitstorxUi will be placed in thes3 method in thecorresponding package.
assertRxUi(x) now usesas.rxUi() sothat it can be extended outside ofrxode2/nlmixr2.
rxode2 now supportsaddl withss doses
MovedrxDerived torxode2parse (andre-exported it here).
Added test for transit compartment solving in absence of dosingto the transit compartment (fixed inrxode2parse butsolving tested here)
Usingini() without any arguments on arxode2 type function will return theini()block. Also added a methodini(mod) <- iniBlock tomodify theini block is you wish.iniBlockshould be an expression.
Usingmodel() without any arguments on arxode2 type function will return themodel()block. Also added a new methodmodel(mod) <- modelBlock
Added a new methodrxode2(mod) <- modFunctionwhich allows replacing the function with a new function whilemaintaining the meta information about the ui (like information thatcomes fromnonmem2rx models). ThemodFunctionshould be the body of the new function, the new function, or a newrxode2 ui.
rxode2 ui objects now have a$stickyitem inside the internal (compressed) environment. This$sticky tells what variables to keep if there is a“significant” change in the ui during piping or other sort of modelchange. This is respected during model piping, or modifying the modelwithini(mod)<-,model(mod)<-,rxode2(mod)<-. A significant change is a change in themodel block, a change in the number of estimates, or a change to thevalue of the estimates. Estimate bounds, weather an estimate is fixed orestimate label changes are not considered significant.
Addedas.ini() method to convert various formats toan ini expression. It is used internally withini(mod)<-. If you want to assign something new that youcan convert to an ini expression, add a method foras.ini().
Addedas.model() method to convert various formatsto a model expression. It is used internally withmodel(mod)<-. If you want to assign something new thatyou can convert to a model expression, add a method foras.model().
Give a more meaningful error for ‘rxode2’ ui models with onlyerror expressions
Break the ABI requirement betweenroxde2() andrxode2parse()
The newrxode2parse will fix thesprintf exclusion shown on CRAN.
Time invariant covariates can now contain ‘NA’ values.
When a column has ‘NA’ for the entire id, now ‘rxode2’ warnsabout both the id and column instead of just the id.
To fix some CRAN issues in ‘nlmixr2est’, make the versiondependency explicit.
Remove log likelihoods from ‘rxode2’ to reduce compilation timeand increase maintainability of ‘rxode2’. They were transferred to‘rxode2ll’ (requested by CRAN).
Remove the parsing from ‘rxode2’ and solved linear compartmentcode and move to ‘rxode2parse’ to reduce the compilation time (asrequested by CRAN).
Remove the random number generation from ‘rxode2’ and move to‘rxode2random’ to reduce the compilation time (as requested byCRAN).
Remove the event table translation and generation from ‘rxode2’and move to ‘rxode2et’ to reduce the compilation time (as requested byCRAN).
Change therxode2 ui object so it is a compressed,serialized object by default. This could reduce theC stack size problem that occurs with too many environmentsin R.
Warn when ignoring items during simulations
Export a method to change ‘rxode2’ solve methods into internalintegers
Bug fix for time invariant covariates identified as time variantcovariate when the individual’s time starts after0.
rxgamma now only allows arate input.This aligns with the internalrxode2 version ofrxgamma and clarifies how this will be used. It is alsoaligned with thellikGamma function used for generalizedlikelihood estimation.
uicauchy simulations now follow the ui fornormal andt distributions, which means youcan combine with transformations. This is because thecauchy is at distribution with one degree offreedom.
uidnorm() andnorm() are no longerequivalent toadd(). Now it allows you to use the loglikllikNorm() instead of the standardnlmixr2style focei likelihood. This is done by addingdnorm() atthe end of the line. It also meansdnorm() now doesn’t takeany arguments.
Vandercorput normal removed (non-random numbergenerator)
Allow models in thenlmixr2 form without anini({}) block
Allow model piping of an omega matrix byf %>% ini(omegaMatrix)
Standard models created withrxode2() can no bepiped into a model function
Families of log-likelihood were added torxode2 sothat mixed likelihood nonlinear mixed effects models may be specifiedand run.
The memory footprint of arxode2 solving has beenreduced
Piping now allow named strings (issue #249)
rxode2’s symengine would convertsqrt(2) toM_SQRT_2 when it should beM_SQRT2. This has been fixed; it was most noticeable innlmixr2 log-likelihood estimation methods
rxode2 treatsDV as a non-covariatewithetTran (last time it would duplicate if it is in themodel). This is most noticeable in the nlmixr2 log-likelihood estimationmethods.
A new flag (rxFlag) has been created to tell youwhere in therxode2 solving process you are. This is usefulfor debugging. If outputting this variable it will always be11 or calculating the left handed equations. If you areusing in conjunction with theprintf() methods, it is adouble variable and should be formatted with"%f".
An additional option offullPrint has been added torxode2() which allowsrprintf() to be used inalmost all ofrxode2() steps (inductive linearization andmatrix exponential are the exception here) instead of just theintegrationddt step. It defaults toFALSE.
Removed accidental^S from news as requested byCRAN.
Bug fix for more complicated mu-referencing.
Change rxode2 md5 to only depend on the C/C++/Fortran code andheaders not the R files. That way if there is binary compatibilitybetweennlmixr2est andrxode2, a new versionofnlmixr2est will not need to be submitted toCRAN.
The options forrxControl andrxSolveare more strict.camelCase is now always used. Old optionslikeadd.cov andtransit_abs are no longersupported, onlyaddCov is supported.
A new option,sigdig has been added torxControl(), which controls some of the more commonsignificant figure options likeatol,rtol,ssAtol,ssRtol, with a single option.
For simulations,$simulationSigma now assumes adiagonal matrix. The sigma values are assumed to be standard normal, anduncorrelated between endpoints. Simulation with uncertainty will stilldraw from this identity diagonal matrix
Parallel solving now seeds each simulation per each individualbased on the initial seed plus the simulation id. This makes thesimulation reproducible regardless of the number of cores running thesimulation.
Solved objects now access the underlying rxode model with$rxode2 instead of$rxode
Since this change names,rxode2,rxodeandRxODE all perform the same function.
Options were changed fromRxODE.syntax torxode2.syntax.
Assigning states withrxode2.syntax.assign.state(wasRxODE.syntax.assign.state) is no longersupported.
Enforcing “pure” assignment syntax with= syntax isno longer supported sorxode2.syntax.assign is no longersupported (wasRxODE.syntax.assign).
Since R supports** as an exponentiation operator,the pure syntax without** can no longer be enabled. Hencerxode2.syntax.star.pow (wasRxODE.syntax.star.pow) no longer has any effect.
The “pure” syntax that requires a semicolon can no longer beenabled. Thereforerxode2.syntax.require.semicolon (wasRxODE.syntax.require.semicolon) no longer has anyeffect.
The syntaxstate(0) can no longer be turned off.rxode2.syntax.allow.ini0 (wasRxODE.syntax.allow.ini0) has been removed.
Variable with dots in variable and state names likestate.name works in R. Therefore, “pure” syntax ofexcluding. values from variables cannot be enforced withrxode2.syntax.allow.dots (wasRxODE.syntax.allow.dots).
The mnemonicet(rate=model) andet(dur=model) mnemonics have been removed.rate needs to be set to-1 and-2manually instead.
The functionrxode2Test() has been removed in favorof using testthat directly.
Transit compartments need to use a newevid,evid=7. That being said, thetransitAbs optionis no longer supported.
ID columns in input parameter data frames are notsorted or merged with original dataset any more; The underlyingassumption of ID order should now be checked outside ofrxode2(). Note that the event data frame is stillsorted.
The UI functions ofnlmixr have been ported to workinrxode2 directly.
rxModelVars({}) is now supported.
You may now combine 2 models inrxode2 withrxAppendModel(). In fact, as long as the first value is arxode2 evaluated ui model, you can usec/rbindto bind 2 or more models together.
You may now append model lines with piping using%>% model(lines, append=TRUE) you can also pre-pendlines by%>% model(lines, append=NA)
You may now rename model variables, states and defined parameterswith%>% rxRename(new=old) or ifdplyr isloaded:%>% rename(new=old)
You can fix parameters with%>% ini(tcl=fix) or%>% ini(fix(tcl)) as well as unfix parameters with%>% ini(tcl=unfix) or%>% ini(unfix(tcl))
Strict R headers are enforced more places
Since there are many changes that could be incompatible, thisversion has been renamed torxode2
rxode2() printout no longer uses rules and centeredheadings to make it display better on a larger variety ofsystems.
tad() and related time features only reset at the startof an infusion (as opposed to starting at the beginning and end of aninfusion)Fix subject initialization offocei problem(#464)
Fix LHS offset to allow internal threading and more parallelprocessing in the future.
Remove warnings for duration and rate
Don’t export pillar methods any more (simply register at load ifpresent)
As requested by CRAN, change fortran and C binding for BLAS anLINPACK
Fix the LTO issue that CRAN identified.
Move the omp files so they come first to support clang13, asidentified by CRAN.
For now, be a little more conservative indur() andrate() warnings becauselinCmt() models innlmixr currently produce irrelevant warnings.
Always calculate “nolhs” for using numeric differences when theinner problem. This allows the inner problem to fallback to a finitedifference approximation to the focei objective function.
Updated the parser C code grammar using latest dparser CRANpackage
Added a new cbind function that is used to mix data frame inputwith simulated individual parameters and residual parameters,rxCbindStudyIndividual().
Now data frame input can be mixed with simulating from omega andsigma matrices (though not yet in nested simulations)
Race conditions when simulating random numbers is solved bychunking each simulation into groups that will always be performed pereach thread. This way the simulation is now reproducible regardless ofload. Because of the chunking, simulations with random numbers generatedinside of it are now threaded by default (though a warning is producedabout the simulation only be reproducible when run with the same numberof threads)
Simulations were double checked and made sure to use the enginereserved for each core run in parallel; Some of the random generatorswere not taking random numbers from the correct engine, which wascorrected. Therefore, simulations from this version are expected to bedifferent (in parallel) than previous versions.
Added functionrxSetSeed() to set the internal RxODEseed instead of grabbing it from a uniform random number tied to theoriginal R seed. This will avoid the possibility ofduplicateseeds and is the best practice.
Updating parameter pointers is done once per ID and locked basedon ID to remove the recursion in #399, but still have the correctbehavior see #430
Parsing updated to retain “param()” in normalized model,#432.
Handle edge case of interpolation at first index correctly, fixes#433
Instead of storing each dose information sequentially, store doseinformation at the same index of theevid defining thedose. This memory rewrite is to fix the issue #435.
Start using strict headers as it is required for the forthcomingrelease ofRcpp. Thanks to Dirk Eddelbuettel for some ofthe fixes and alerting us to this change.
Check arguments foradd.dosing() more strictly. SeeIssue #441
Issue a warning when eitherdur() orrate() is in the model but the modeled rate and duration isnot included in the event table.
When the data requires a modeled rate and modeled duration but itis not in the model, warn about the mismatch in data
Added a back-door for debugging. If you specifyoptions(RxODE.debug=TRUE) then each solve saves the solvinginformation to the file"last-rxode.qs" before actuallysolving the system.
Only will try to solve RxODE problems on compatible models; Ifthe model is not supported it will throw an error instead of crashing(See #449)
Turn off parallel ODE solving whenever the system needs to sorttimes based on model dosing. Currently this type of solving is notthread safe.
Update timsort headers to latest version.
At the request of CRAN, stripping the debugging symbols for theCRAN release is no longer performed. This means a larger binary size forRxODE in this release.
At the request of CRAN theliblsoda code has beenchanged so that the memory in C defined by_C() is nowdefined by_rxC(). This will be seen in some of the errormessages, which will no longer match the error messages of unmodifiedliblsoda.
iCov behavior has shifted to merge on the inputevent dataset. See Issue #409; This is more in line with expectations ofiCov behavior, and reduces the amount of code needed tomaintainiCov.
TheiCov in the pipeline is no longer supported becauseit simply is a merge with the event dataset.
This can be a breaking change depending on the code you use. Notethat clinical trial simulations, resampling is likely better than tryingto fill outiCov for every individual which was the prioruse.
Bug fix for crashes with string covariates or factor covariates,issue #410. Also factor column names are compared with caseinsensitivity just like the rest of the column names for event tables ordata sets inRxODE.
Change syntax vignette to use markdown optionscreenshot.force=FALSE. This should get rid of thewebshot error
Change to depend on dparser 1.3.0, which has some memoryfixes
RxODE imports but does not link tocheckmate anylonger. This change should make recompilation of RxODE to work withdifferent releases ofcheckmate unnecessary.
Default Solaris solver changed back to “lsoda”
Fix Bug #393, where in certain circumstancesrxSolve(...,theta=) did not solve for allsubjects.
Will not ignore NEWS and README when building the package so thatthey will show up on CRAN. You can also access the news bynews(package="RxODE")
ChangedODR model names from time id to_rx followed by themd5 hash id and aper-session counter id; For packages the id is_rxpfollowed by themd5 hash and a per-session counterid.
Changedqs to be more conservative in hash creation.Add a check hash as well as NOT using altrep stringfishrepresentation.
Maintenance release – usestd::floor and castvariables todouble for internal C functions. This shouldallow a successful compile on Solaris CRAN.
Changedunits from an Imports to a Suggests to allowtesting on Solaris rhub
ChangedODR model names from time id to_rx followed by themd5 hash id; For packagesthe id is_rxp followed by themd5hash.
Removed AD linear compartment solutions for Windows R 3.6, thoughthey still work for Windows R 4.0 (You can get them back for Windows R3.6 if you installBH 1.66.0-1 and then recompile fromsource).
nlmixr to fail with solved systems onWindows 3.6. Currently the Stan Headers do not compile on this system sothey are disabled at this time.RxODE imports but does not link toqs any longer;This change should make recompilation of RxODE to work with differentreleases ofqs unnecessary.
RxODE now checks for binary compatibility forRcpp,dparser,checkmate, andPreciseSums
RxODE can only use supported functions (could be breaking); Youmay add your own functions withrxFun and their derivativeswithrxD
RxODE now uses its own internal truncated multivariate normalsimulations based on the threefry sitmo library. Therefore randomnumbers generated withinRxODE like providingrxSolve(...,omega=) will have different results with thisnew random number generator. This was done to allow internal re-samplingof sigmas/etas with thread-safe random number generators (calling Rthroughmvnfast or R’s simulation engines are not threadsafe).
RxODE now moved the precise sum/product type optionsforsum() andprod() torxSolveorrxControl
cvPost now will returned a named list of matrices ifthe input matrix was named
rxSolve will now return an integeridinstead of a factorid whenid is integer orintegerish (as defined by checkmate). Otherwise a factor will bereturned.
When mixing ODEs andlinCmt() models, thelinCmt() compartments are 1 and possibly 2 instead of rightafter the last internal ODE. This is more aligned with how PK/PD modelsare typically defined.
EVID=3 andEVID=4 now (possibly) resettime as well. This occurs when the input dataset is sorted beforesolving.
WhenEVID=2 is present, anevid columnis output to distinguishevid=0 andevid=2
Add the ability to order input parameters with theparam() pseudo-function
Add the ability to resample covariates withresample=TRUE orresample=c("SEX", "CRCL").You can resample all the covariates byID withresampleID=TRUE or resample the covariates without respecttoID withresampleID=FALSE
Comparison of factors/strings is now supported inRxODE; Therefore ID==“Study-1” is now allowed.
Completion for elements ofrxSolve() objects, andet() objects have been added (accessed through$)
Completion ofrxSolve() arguments are now includedsince they are part of the main method
Allow simulation with zero matrices, that provide the simulationwithout variability. This affectsrxSolve as well asrxMvnrnd andcvPost (which will give a zeromatrix whenever one is specified)
et() can dose withlength(amt) > 1as long as the other arguments can create a event table.
Rstudio notebook output makes more sense
Printing upgraded to cli 2.0
Caching of internal C data setup is now supported increasingspeed ofoptim code when:
inits do not change (though you can specify them ascmt(0)=... in the model and change them by parameters)Allowwhile(logical) statements with ability tobreak out if them bybreak. The while has an escape valvecontrolled bymaxwhere which by default is 10000iterations. It can be change withrxSolve(..., maxwhere = NNN)
Allow accessing different time-varying components of an inputdataset for each individual with:
lag(var, #)lead(var, #)first(var)last(var)diff(var)Each of these are similar to the Rlag,lead,first,last anddiff. However when undefined, it returnsNA
Allow sticky left-handed side of the equation; This means for anobservation the left handed values are saved for the next observationsand then reassigned to the last calculated value.
This allows NONMEM-style of calculating parameters like tad:
mod1<-RxODE({ KA=2.94E-01; CL=1.86E+01; V2=4.02E+01; Q=1.05E+01; V3=2.97E+02; Kin=1; Kout=1; EC50=200; C2= centr/V2; C3= peri/V3; d/dt(depot)=-KA*depot; d/dt(centr)= KA*depot- CL*C2- Q*C2+ Q*C3; d/dt(peri)= Q*C2- Q*C3; d/dt(eff)= Kin- Kout*(1-C2/(EC50+C2))*eff;if (!is.na(amt)){ tdose<- time }else { tad<- time- tdose }})It is still simpler to use:
mod1<-RxODE({ KA=2.94E-01; CL=1.86E+01; V2=4.02E+01; Q=1.05E+01; V3=2.97E+02; Kin=1; Kout=1; EC50=200; C2= centr/V2; C3= peri/V3; d/dt(depot)=-KA*depot; d/dt(centr)= KA*depot- CL*C2- Q*C2+ Q*C3; d/dt(peri)= Q*C2- Q*C3; d/dt(eff)= Kin- Kout*(1-C2/(EC50+C2))*eff; tad<- time- tlast})If thelhs parameters haven’t been defined yet, they areNA
Now the NONMEM-stylenewind flag can be used toinitializelhs parameters.
Addedtad(),tad(cmt) functions fortime since last dose and time since last dose for a compartment; Alsoadded time after first dose and time after first dose for a compartmenttafd(),tafd(cmt); time of last dosetlast(),tlast(cmt) and dose numberdosenum() (currently not for each compartment)
Changed linear solved systems to use “advan” stylelinCmt() solutions, to allow correct solutions oftime-varying covariates values with solved systems; As such, thesolutions may be slightly different. Infusions to the depot compartmentare now supported.
Added sensitivity auto-differentiation oflinCmt()solutions. This allows sensitivities oflinCmt() solutionsand enablesnlmixr focei to support solved systems.
C++14When calculating the empirical Bayesian estimates for withrxInner (used for nlmixr’s ‘focei’) ignore any variablebeginning withrx_ andnlmixr_ to hideinternal variables from table output. This also addedtad=tad() anddosenum=dosenum() to theebe output allowing grouping by id, dose number and use TADfor individual plot stratification.
Added ability to prune branching withrxPrune. Thisconvertsif/else orifelse tosingle line statements without anyif/thenbranching within them.
Added ability to take more complex conditional expressions,including:
ifelse(expr, yes, no)x = (x==1)*1 + (!(x==1))*2if (logic){ expr} else if (logic) {expr} else {}. Thepreferred syntax is still onlyif/else and thecorresponding parsed code reflects this preference.ifelse is not allowed as an ODE compartment or avariable.Switched tosymengine instead of usingsympy
sympy, though some functions insympy are no longer accessible.Added new ODE solving method “indLin”, or inductivelinearization. When the full model is a linear ODE system this becomessimply the matrix exponential solution. Currently this requires adifferent setup.
Added arbitrary function definition to RxODE usingrxFun
rxD. When taking deviates without a derivative function,RxODE will use numerical differences.Will error if RxODE does not know of a function that you aretrying to use; This could be a breaking change. Currently:
math.h are supportedrxFun andrxDAddedNA,NaN,Inf and+Inf handling to a RxODE model. Can be useful to diagnoseproblems in models and provide alternate solutions. In addition, addedR-like functionsis.nan,is.na,is.finite andis.infinite which can be calledwithin the RxODE block.
Allowed the following data variables can be accessed (but notassigned or used as a state):
cmtdvidaddlssamtrateid which requires calling the id as factorID=="1" for instance.Keptevid andii as restricted itemssince they are not part of the covariate table and are restricted inuse.
Added the following random number generators; They are threadsafe (based onthreefrysitmo and c++11) andyour simulations with them will depend on the number of cores used inyour simulation (Be careful about reproducibility with large number ofthreads; Also use parallel-solve type of RxODE simulations to avoid thebirthdayproblem).
During ODE solving, the values of these are0, but whilecalculating the final output the variable is randomized at least forevery output. These are:
rxnorm() andrxnormV() (low discrepancynormal)rxcauchy()rxchisq()rxexp()rxf()rxgamma()rxbeta()rxgeom()rxpois()rxt()rxunif()rxweibull()In addition, while initializing the system, the following values aresimulated and retained for each individual:
rinorm() andrinormV() (low discrepancynormal)ricauchy()richisq()riexp()rif()rigamma()ribeta()rigeom()ripois()rit()riunif()riweibull()Addedsimeta() which simulates a neweta when called based on the possibly truncated normalomega specified by the original simulation. This simulationoccurs at the same time as the ODE is initialized or when an ODE ismissing, before calculating the final output values. Theomega will reflect whatever study is beingsimulated.
Addedsimeps() which simulates a neweps from the possibly truncated normalsigmaat the same time as calculating the final output values. Before thistime, thesigma variables are zero.
All these change the solving to single thread by default to make surethe simulation is reproducible. With high loads/difficult problems therandom number generator may be on a different thread and give adifferent number than another computer/try.
Also please note that theclang andgcccompiler use different methods to create the more complex randomnumbers. ThereforeMacOS random numbers will be differentthanLinux/Windows at this time (with theexception of uniform numbers).
These numbers are still non-correlated random numbers (based on thesitmo test) with the exception of the vandercorput distributions, so ifyou increase the number of threads (cores=…) the results should still bevalid, though maybe harder to reproduce. The faster the random numbergeneration, the more likely these results will be reproduced acrossplatforms.
Added the ability to integrate standard deviations/errors ofomega diagonals and sigma diagonals. This is done by specifying theomega diagonals in the theta matrix and having them represent thevariabilities or standard deviations. Then these standard deviations aresimulated along with the correlations using the IJK correlation matrix(omega dimension < 10) or a correlation matrix or InverseWishart-based correlation matrix (omega dimension > 10). Theinformation about how to simulate this is in the variability simulationvignette.
Now have a method to uselotri to simulate betweenoccasion variability and other levels of nesting.
Added lower gamma functions See Issue #185
Upgraded comparison sort to timsort 2.0.1
Changed in-place sort to a modified radix sort fromdata.table. The radix search was modified to:
Work directly withRxODE internal solvedstructures
Assume no infinite values orNA/NaNvalues of time
Always sort time in ascending order
Changed sorting to run in a single thread instead of taking overall the threads like data.table
Changed method for setting/getting number of threads based ondata.table’s method
Added functionrxDerived which will calculatederived parameters for 1, 2, and 3 compartment models
More descriptive errors when types of input are different thanexpected
Moved many C functions to C++. CRAN OpenMP support requires C++only when C and C++ are mixed. See:
https://stackoverflow.com/questions/54056594/cran-acceptable-way-of-linking-to-openmp-some-c-code-called-from-rcpp
No longer produces C code that create the model variables.Instead, useqs to serialize, compress and encode in base91and then write the string into the C file. Theqs packagethen decodes all of that into the model variables. This also increasesthe compilation speed for models in RxODE.
Pre-compile RxODE headers once (if cache is enabled), whichincreases compilation speed for models in RxODE
RxODE’s translation from the mini-language to C hasbeen refactored
Occasionally RxODE misidentified duallhs/param values. An additional check isperformed so that this does not happen.
For solved matrices with similar names (like “tadd” and “tad”)RxODE will now prefer exact matches instead of the first match foundwhen accessing the items with$tad.
A fix where all ID information is kept withkeep=c(""..."")
Transit compartment models using thetransit ODE orvariable are now allowed. Also check for more internally parsed items(see Issue #145).
Bug fix foretSeq andetRep wheregreater than 2 items were mis-calculated
ggplot2 3.3.0NAs in RxODE datasetNEWS.md file to track changes to thepackage