Release Notes for Pumas 2.9.0
Pumas
Several changes in this release can cause data or models that previously ran to now error early. This is intended and protects you from silently wrong results:
- Last-observation-carried-forward (LOCF) and next-observation-carried-backward (NOCB) covariate interpolation are no longer extrapolated past the observed covariate range. LOCF cannot produce a value before the first observed covariate time, and NOCB cannot produce a value after the last observed covariate time. A subject whose covariate is
missingat that boundary time now errors when constructed. A model that evaluates the covariate outside the observed range errors during simulation or fitting instead of silently extrapolating. eventsis now reserved as a model variable name. Models that define a variable calledeventsin any block will error at model definition time and need to rename that variable.read_pumasnow requires the dose-related columnsamt,rate,ss,ii, andaddlto be given on dose rows and to be missing or zero on all other rows. Data that fills a dose column on observation rows, or leaves it blank on a dose row, is rejected with an error that names the offending column.- The tabular output of simulations requires a vector-valued variable in
@vars,@derived, or@observedto provide exactly one value per observation time point. A vector whose length happened to match the number of doses was previously spread over the dose intervals, which could invent a time-stamping the user never chose.
Features and improvements
Experimental Features
- Add experimental support for finite mixture models, where a population is described as a mixture of submodels that share parameters by name and the mixture probabilities are estimated.
Pumas.Experimental.PumasMixtureModelsupportsfitwithFOCE,LaplaceI,FO, andNaivePooled,predictwith or without a fit,simobs, and the classification diagnosticsresponsibilities,subpopulation, andicl. A parameter shared by the submodels can be declared with a prior as well as with a domain, as long as every submodel declares it identically. The standard errors and confidence intervals of the mixture probabilities are on the probability scale and cover every component. Unsupported combinations are rejected with informative errors. - Add a new implementation of VPC, NPDE, and EWRES that computes the diagnostics from observed and pre-simulated
DataFrames, so the expensive simulations can be reused when the binning, bandwidth, stratification, or transform is changed. It supports continuous, discrete, and censored outcomes, binned and binless summaries with per-stratum settings, and prediction correction, and it requires an explicit choice of the axes, the number of replicates, and the bandwidth instead of guessing defaults. Nothing is exported from thePumas.Experimentalsubmodule, so the functions are called qualified, for examplePumas.Experimental.vpc,Pumas.Experimental.npde, andPumas.Experimental.vpc_setup; EWRES is returned as a column of thenpderesult. The existingvpcis unchanged. - Add
samplerselection for the experimentalMCEMestimation method, so the importance-sampling proposal can be chosen (for example a Laplace-approximation proposal with Student's t tails) rather than always sampling from the prior. - Support general error distributions in
MCEM. The M-step was restricted to additive Gaussian error with constant variance; it now handles the error distributions Pumas supports, with fast sufficient-statistic paths for the Normal families,ProportionalGamma, and the multivariate Gaussian error models. - Improve the handling of non-finite likelihoods encountered during
MCEMfits. - Parallelize the
MCEMM-step across independent parameter blocks and use load balancing in the multithreaded sampling step.
Features
- Add the
ProportionalGammaerror distribution, parameterized by a mean and a constant coefficient of variation, for use in@derived. It is supported underFOCE,LaplaceI,NaivePooled, andMCEM;FOrejects it with an informative error. - Add
OrderedVectorDomainfor parameters constrained to be ordered (monotonically increasing) vectors, such as the cut points (logits) in anOrderedLogitmodel. - Add
SimplexDomain(n)for parameters that are probability vectors of lengthn, with non-negative entries that sum to one, such as the mixture probabilities of aPumasMixtureModel. Its default initial value is the uniform vector.vcov,coeftableandstderrorreport allnentries, sovcovis singular, anddofcounts then - 1free ones. - Support
BernoulliLogitobservations underFOCE. Previously aFOCEfit of aBernoulliLogitdependent variable raised anArgumentErroreven thoughLaplaceI,NaivePooled, andSAEMsupported it. - Support an η-dependent shape parameter
αforGammaerror models underFOCE. Previously only the scale could depend on the random effects, and a Gamma model whose shape depended on η would error. - Add support for marginalizing
missingobservations with theMvLogNormal,MvTDist, andMvNormalCanonmultivariate error models. Previously onlyMvNormalwas supported and the others raised an error when any element of an observation was missing. - Accept Catalyst reaction syntax directly in
@dynamics, so reactions are written in the same block as ODE equations rather than in a separate@reactionsblock. - Store the full derived distributions in the output of
predict, not just their means, and emit per-category probability columns inDataFramerepresentation of predictions for categorical-type models (for exampleOrderedLogit,Categorical,Binomial, andFiniteMarkov). This makes the full predictive distribution available for diagnostics. - Add
dynamics_namesto obtain the names of a model's dynamic variables. The names match the dynamics columns of theDataFrames produced fromsimobs,predict, andinspectresults. - Add an
ss_statesoption to control which dynamical states must reach steady state during steady-state dosing. A state such as a cumulativeAUChas no steady state, so a model containing one could not be used with steady-state dosing at all. Excluded states are held at their pre-steady-state values. - Support a steady-state dose record at the same time as other dose records. Records at the same time take effect one after another in data set order, each acting on the state the previous one left, which matches NONMEM.
read_pumasandDosageRegimenaccepted such data before, but simulating or fitting it raised an error. - Add a
cseoption to@options, controlling whether common subexpressions in the generated@dynamicscode are eliminated. The defaulttruecan make models with repeated subexpressions in their dynamics faster to simulate. - Support stratified η-shrinkage through a
stratify_bykeyword onηshrinkage, computing shrinkage separately within each stratum defined by subject-constant covariates. - Add
CovariateSelection.Allto compare all possible covariate models incovariate_select. - Add
loglikelihoodanddofcolumns to theDataFrameofcovariate_selectoutput, and support constructing aDataFramedirectly fromcovariate_selectoutput. - Add
samples_tableto obtain a table of parameter samples fromBootstrap,SIR, andMarginalMCMCinference results. The per-sample log-likelihoods ofBootstrapandSIRresults are now retained, so diagnostics can use them without re-evaluating the likelihood. - Add a
descriptioncolumn tocoeftable, filled from the parameter descriptions declared in@metadata, with the parameter name as the fallback. - Base the SIR procedure on any inference result. The covariance matrix of the initial proposal distribution can now be taken from a
Bootstrap,MarginalMCMC, or previousSIRresult rather than only the asymptotic one, andinfer(fpm, sir; proposal_covariance = ...)accepts a parameter-labelled covariance matrix supplied by the user. - Fit SIR proposal distributions on an unconstrained parameter scale by default, selectable with
SIR(; proposal_scale = ...), so no draws are rejected against the parameter domains, and optionally reshape each marginal with a Yeo-Johnson transformation usingSIR(; proposal_shape = YeoJohnson()). Results of a multi-iteration SIR procedure can differ from earlier releases. - Support
EnsembleSplitThreadsin marginal likelihood calculations, allowing distributed computing where each worker further parallelizes its work across threads. - Support random effects input in
icoefanddosecontrol.
Improvements
- Select the quantities
gsaanalyzes with a post-processing function instead of a list of variable names, so the targets are no longer restricted to model variables. The function is the first argument, as ingsa((gen, obs) -> (; auc = ...), model, population, params, method, ...). Selecting the variables by name still works but is deprecated. - Run
gsamultithreaded by default instead of serially. elpd,p_eff, andpsis_icnow return the sum of the pointwise log predictive densities over the held-out splits where they previously returned the mean. A value obtained with 2.8 equals the corresponding 2.9 value divided by the number of held-out splits.PSISCrossvalidationalso no longer discards problematic splits by default, sincefilter_nansnow defaults tofalseandpareto_shape_thresholdtoInf.- Report the per-category probabilities of
probstablein columns namednameₖ_ipredinstead ofname_iprobK, and stop expandingBernoullivariables. - Report
missinginstead of0in the dose-related columnsamt,rate,duration,ss, andiion the non-dose rows of theDataFrames built from subjects, populations, simulations, predictions, and inspections. - Use Hager-Zhang (
Optim.HagerZhang) as the default line search infitinstead of backtracking (Optim.BackTracking). Both the optimization path and the parameter estimates at convergence can differ from earlier releases. - Bayesian MCMC now draws the full requested number of samples by default. The
ess_per_chaintarget that armed effective-sample-size–based early stopping now defaults to infinity, so sampling no longer stops short ofnsampleson near-deterministic models. Setess_per_chainto a finite value to opt back into early stopping. - Report Bayesian sampling progress as structured progress events, so it is displayed by VS Code instead of Pumas drawing its own terminal progress bar. With
verbose = true, five HMC diagnostics are shown during sampling: acceptance rate, tree depth, step size, whether the transition diverged, and the log posterior density. - Make the directional-derivative calculations and asymptotic
inferreproducible across different parallelizations by using a deterministic order of summation for the objective function and its gradients. - Make
BayesMCMCandMarginalMCMCdraw the same samples for a givenrngwhether the chains run serially or in parallel. The serial path drew a different random stream, so the samples depended on the number of threads of the machine. Samples drawn withEnsembleSerial()or on a single thread differ from earlier releases. - Extend directional-derivative support to
FO,NaivePooled, andMAP, improving the performance of gradient-based estimation for these methods. - Speed up the derivative calculations of
FOCEandLaplaceI. - Speed up fits of stiff models with many dynamical variables. The stiff solver of the default
AutoVern7(Rodas5P())now usesLUFactorizationinstead ofGenericLUFactorizationfor its linear solves. In a benchmark of a stiff model with 16 dynamical variables,FOandFOCEfits took 0.5 to 0.6 times as long. In the same benchmark,simobstook 1.05 to 1.2 times as long for 5 to 29 dynamical variables. Models with fewer than 5 dynamical variables are unaffected. Log-likelihoods can differ slightly from earlier releases because the solver takes different steps. - Make the
LaplaceIobjective of models defined with@emmodelindependent of the number of threads, so fits no longer depend on the machine they run on, and supportEnsembleDistributedandEnsembleSplitThreadsinfitandloglikelihoodfor such models. - Balance the load of parallel
simobsby splitting the simulations into more blocks than there are workers, so a worker that finishes early takes on further work instead of idling. - Multithread several diagnostics functions and avoid unnecessary empirical-Bayes-estimate calculations, speeding up post-fit diagnostics.
- Break ties between equally common candidate nodes of
vpcby value. They were ranked in dictionary iteration order, which is not stable across Julia versions. The default nodes, and a VPC computed on them, can differ from earlier releases. - Skip the η-shrinkage calculation for random effects with a covariate dependency instead of raising an error, so shrinkage can be reported for the remaining random effects.
- Ignore numerical errors raised during optimization of the empirical Bayes estimates rather than aborting, improving robustness during fitting.
- Keep the information matrices that were computed before a covariance calculation failed, so a failed
vcovorinferreports what was already available instead of discarding it. - Report every entry of a
ZeroSumDomainparameter, including the last one, which the others determine, invcov,coeftable,stderror, the displayed fit, and the columns ofChains.vcov(fpm)andvcov(infer(fpm))gain one row and column per such parameter and are singular, so code that inverts or factorizes them needs updating.dofcounts only the free entries.simobs(fpm, vcov),MvNormal(model, means, vcov), and theproposal_covariancekeyword ofinfer(fpm, SIR(...))take a covariance in the same layout.
Documentation and error messages
- Add docstrings for
FO,FOCE, andLaplaceI, and improve the docstrings ofNaivePooledandSAEM. - Improve the error message shown when the initial log-likelihood is non-finite, and report the problematic subject IDs when the initial gradient is non-finite.
- Report an
ArgumentErrorbefore any sampling when an SIR iteration keeps too few resamples to form a covariance matrix, or when a proposal covariance matrix is singular or non-finite. Previously this surfaced as aPosDefExceptionafter the iteration completed, or as a procedure that did not terminate. - Report a
PumasDataErrorfromsimobsandpredictfor an emptyobstimes. Depending on the model, such a call returned zero-length observations, reported a count mismatch against@derived, or threw aBoundsError. - Document the
ss_statesoption in the@optionsdocstring, show the actual default line search in thefitdocstring, and correct the LOCF and NOCB abbreviations in the covariate interpolation error messages. - Correct the
vpcdocstring, which said thatprediction_correctionuses the mean population prediction. It uses the median population prediction, from a quantile regression on the binning covariate. - Update the license text printed at load and the shipped
LICENSE.mdto the September 2026 revision of the Pumas EULA at https://pumas.ai/eula. Section 2(c)(j) prohibits using the Licensed Software and PumasAI Content to train, fine-tune, test or develop AI/ML systems, and Section 4(d) defines "Protected Software Materials". The other PumasAI packages of this release that carry the Pumas EULA ship the same revision. - Wire up
PumasEMModeldescriptions in the model display. - Consistently use "log-likelihood" rather than "log likelihood" throughout messages and documentation.
- Fix the docstring for the
OrderedLogitdistribution.
Bugs
- Fix
EWRES, which returned the mean of the decorrelated simulated residuals. That quantity has expectation zero and does not depend on the observations, soEWRESwas Monte Carlo noise rather than a diagnostic. It is now the decorrelated observed residual and is standard normal for a correctly specified model. Diagnostics based onEWRESproduced with earlier versions should be recomputed. - Fix
SAEMcontinuing from a non-finite proposal. The step limiting of the dispersion and covariance parameters discardedNaNand returned a finite value, so aNaNproposal was clamped to a plausible number and the fit carried on. Non-finite values now propagate and are handled as numerical errors. - Fix the Normal log-density used internally by
SAEM, which returnedNaNfor a standard deviation of exactly zero instead of the limiting values, and raise aDomainErroragain when sampling a constrained diagonalMvNormalwith a negative variance. - Allow dose events with
amt = 0.fitandsimobserrored on such records unless the bioavailability of the dose compartment happened to be zero.read_pumasstill warns about them, since a zero amount is often unintended. - Filter out
TimeToEventdistributions inpredict, which also fixesinspect. Previously an error was thrown for models with time-to-event dependent variables. - Fix
simobsttefailing for subjects that carry extra observations or none at all, and for models that define derived variables besides the time-to-event one. - Fix VPC with
EnsembleDistributed, and fix the error raised by time-to-event VPCs underEnsembleThreads. - Support
BernoulliLogitobservations in smooth discrete VPCs, which raised anArgumentErroreven though the equivalentBernoullimodel worked. - Fix several simulation paths that accepted an
ensemblealgbut did not act on it or failed when it was notEnsembleSerial(), including time-to-event VPC not forwardingensemblealgtosimobstte. - Fix the pointwise confidence intervals of the observed Kaplan-Meier curve in a time-to-event
vpc, which were computed at confidence level1 - levelwith Survival.jl versions before v0.3.3. The Pumas 2.8 system image ships Survival.jl v0.3.2, so the defaultlevel = 0.95gave 5% intervals there. The intervals are now computed at the requestedlevel. - Fix parallel
simobsfor models whose simulation return type is not concrete. Such simulations previously failed to deserialize underEnsembleDistributed. - Fix the
FOCEFisher-information matrix forBetaerror models when bothαandβdepend on the random effects. A missing cross-term previously biased standard errors and confidence intervals for such models. - Fix the reported count of fixed parameters in
fitandinferoutput. Multidimensional parameters were previously counted as one rather than by the number of elements estimated. - Add the prior to the observed information and score only for
MAPfits. A maximum likelihood fit of a model whose parameters carry priors reported standard errors that included prior terms its objective did not contain.vcov,stderror, andinferon aJointMAPfit now raise an informative error instead of aMethodError. - Exclude the priors of parameters held constant with
constantcoeffrom the log-likelihood reported forMAPandJointMAPfits, which was shifted by the prior log-density at the held value, together withaicandbic. - Check the values of parameters held fixed with
constantcoefagainst their declared domains infit. A fixed value outside its domain, such as a negative clearance or a covariance matrix that is not positive definite, was accepted and ran a whole fit. - Fix the parameter indexing of
JointMAPfor models with anMvLogitNormalprior, which was off by one. - Fix
inferandvcovfor models with anMvLogitNormalprior, which threw an error. Such a parameter is reported with allnof its entries invcov,coeftable, andstderror, anddofcountsn - 1of them, because the entries sum to one.vcovis therefore singular. AnMvLogitNormalparameter value or random effect that does not sum to one throws aDomainError. - Fix the value of the internal
LogitNormaltransform, which returned1 - pinstead ofp. A scalarLogitNormal(μ, σ)prior on a population parameter effectively acted asLogitNormal(-μ, σ)in Bayesian fits and in the prior term ofMAPandJointMAPobjectives. - Fix the default initial value of
VectorDomain(; lower, upper), where the dimension is inferred:init_paramsreturnednothingfor such a parameter, sofitandsample_paramsfailed on it.VectorDomain(n; lower, upper)was unaffected. - Fix
==on domains andConstrainedpriors, which compared by identity. Two identicalVectorDomains constructed separately compared unequal.isequalandhashnow agree with==. - Fix steady-state periodic infusions incorrectly converging to the constant-rate equilibrium.
- Fix steady-state records with an absorption lag time and multiple overlapping implied infusions, which switched on more infusions than they terminated. Such a record climbed to the constant-rate plateau instead of washing out; it now reproduces the same doses written out as separate records, on both the analytical and the numerical path.
- Evaluate
@dosecontrolat each additional (addl) dose's own time instead of reusing the values evaluated at the initiating record's time. A repeated regimen with time-varying dose control parameters now reproduces the same doses written out as separate records, and the reported dose control parameters are the ones the solver used. - Deactivate all earlier dose records on a reset (
evid = 3), a reset-and-dose record (evid = 4), and anss = 1dose record, as NONMEM does. Infusions in progress are terminated, and pending additional (addl) doses are cancelled, as is a dose still held back by an absorption lag. Previously a reset during an infusion left a negative rate behind, and the pending doses were still given. Infusions in progress also no longer contribute to the steady state of a steady-state dose record, andss = 2is no longer ignored for a constant-rate steady-state infusion solved numerically. - Fix
DosageRegimen(dr1, dr2; offset), which treated the dose times ofdr2as intervals between doses instead of shifting them. Withdr2dosing at times 0, 5, and 10 andoffset = 10after a regimen ending at 168, the doses landed at 178, 183, and 193 instead of 178, 183, and 188. - Return the negative time to the first dose from
tadfor times before that dose, as documented, instead of the time itself. For a subject without doses,tadreturnsmissinginstead of throwing aMethodError. Thetadcolumn of theDataFrames built from subjects, populations, and simulations changes accordingly. - Respect
covariates_directionin the analytical solver. The closed-form and linear-ODE paths applied a time-varying covariate's value from the end of each subinterval, which is correct only for:right(NOCB); with the default:left(LOCF), a covariate change took effect one subinterval too early. Results withcovariates_direction = :rightare unchanged. - Improve the accuracy of the analytical solutions for strongly decaying compartments, where the decay factor previously lost precision and underflowed to exactly zero. Parameter values with an exact limiting solution, such as an infinite volume or an infinite clearance, now return that solution with a successful return code.
- Fix a
MethodErrorwhen a model that mixes an analytical solution with an ODE is solved with a stiff solver such asRodas5P, and fix the handling of a failed inner ODE solution in such models. - Fix a type assertion error for models without parameters and random effects.
- Fix
@modelaccepting a variable defined with:=twice in one block, or a:=variable with the same name as a variable defined with=or~in another block. Such models could compute wrong values, because the statements in@preand@dosecontroldo not run in source order. They are now rejected. - Skip
@prestatements whose result nothing reads, such asunused := cl. Simulating or fitting the model threw if such a statement failed, for instance with aDomainErrorfromsqrt(cl - 3), or because it read a covariate outside its observed range. - Fix an
InexactErrorininspect(...; nsim=...)forInt-typed discrete observations. - Fix
simobsandpredictfor models defined with@emmodelthat haveCategorical,truncated,censored, orBernoulliLogitderived variables. These threw aMethodErroror aTypeErrorbecause the element type of the derived vectors was inferred separately from the distributions written into them. - Fix a
MethodErrorwhen simulating or fitting a model defined with@emmodelthat has a@dosecontrolblock and a subject with a non-numeric covariate, even one the dose control parameters do not depend on. - Fix the relative effective sample size used for Pareto-smoothed importance sampling in Bayesian cross-validation. ParetoSmooth.jl computed it from the pointwise log-likelihoods instead of the likelihoods. Pumas now computes it itself and passes it to PSIS.jl.
- Return an empty
NamedTuplefor the dynamics of simulations of models without continuous dynamics. Previously the field heldmissing, which surfaced as adynamicsentry inpostprocessoutput. - Fix
latexifyrendering of indexed parameters, and of derivatives, which showed a multiplication dot as in\mathrm{d} \cdot Central. The equations of the built-in analytical models now use the compartment names the models define, andlatexifyno longer throws aMethodErrorforDepots2Central1Periph1andCentral1Meta1. - Return an empty
NamedTupleinstead of throwing inwresidualsfor non-Gaussian models. - Enforce monotonicity of the logits in
OrderedLogit.
Deprecations and removals
- Deprecate the
@reactionsmacro. Write Catalyst reaction syntax directly in@dynamicsinstead. - Deprecate the options on the
BayesMCMC,MarginalMCMC, andJointMAPalgorithm structs that duplicatefitkeyword arguments, and pass them tofitinstead. This coversensemblealg,parallel_chains,parallel_subjects,verbose,rng,diffeq_options,ignore_numerical_error, andconstantcoefforBayesMCMCandMarginalMCMC, andensemblealg,diffeq_options,optim_alg,optim_options,optimize_fn, andconstantcoefforJointMAP. - Rename the
marginal_algkeyword ofMarginalMCMCtoapprox. The old name warns, setting both raises an error, and leaving the approximation unset is deprecated. - Deprecate the
ensemblealgfield ofExactCrossvalidationin favor of theensemblealgkeyword ofcrossvalidate, and remove it fromSubspaceCrossvalidation. - Deprecate passing a file path to
read_pumas. Read the file into a data frame first, for exampleread_pumas(CSV.read("data.csv", DataFrame; missingstring = ["", ".", "NA"])). Note themissingstringargument:read_pumastreated.andNAas missing, while theCSV.readdefault treats only the empty string as missing, so dropping it can silently turn numeric columns into string columns. - Deprecate
infer(fpm, SIR(...))without an explicit source for the covariance matrix of the initial proposal distribution. State the source withinfer(infer(fpm), sir), or supply the matrix with theproposal_covariancekeyword. - Deprecate
PSDDomain(init::AbstractVector). PassDiagonal(init)instead, or usePDiagDomainfor a domain of diagonal covariance matrices. - Deprecate
loglikelihood(fpm)for models fitted with a method that does not compute a likelihood, such asSAEM. The call warns and falls back toLaplaceI(); pass the approximation explicitly asloglikelihood(fpm, approx).lrteston twoSAEMfits behaves the same way. - Deprecate passing a likelihood approximation to
icoefanddosecontrol. Pass empirical Bayes estimates instead, for exampleicoef(model, subject, param, empirical_bayes(model, subject, param, approx)). - Deprecate selecting the quantities of
gsaby variable name. Pass a post-processing function as the first argument instead. - Deprecate the
batchkeyword ofgsa. Batching now follows fromensemblealg. - Deprecate
DataFrame(fpmi.vcov)in favor ofsamples_table. - Remove the
@ncamacro, together with the conversion of aSubjectto anNCASubjectand of aPopulationto anNCAPopulation. NCA is no longer a dependency of Pumas, so add and loadNCAyourself and compute the parameters from the simulation output:NCA.read_nca_pumas(DataFrame(sims); concentration = :dv)reads a simulation table into NCA profiles, whichrun_ncathen takes. - Remove
routefrom the dose representation.DosageRegimenandread_pumasstill accept aroutekeyword but warn and ignore it, androuteis no longer a column of theDataFrames built from subjects, populations, simulations, predictions, and inspections. Carry the route as a covariate instead, with values such as"ivbolus","ivinfusion", or"ev". - Remove
QuadratureExpectation, together with the unexportedLLQuadlikelihood approximation and the dependency on Integrals.jl.expectationsupportsMonteCarloExpectation. - Remove the re-export of Unitful.
using Pumasno longer brings the Unitful names into scope, so a model written with units needs its ownusing Unitful. - Remove the
Statistics.cormethod that Pumas defined for aVectorofVectors. Such a call now throws aMethodError, andcor(stack(v); dims = 2)computes the same correlation matrix.postprocess(f, sims; stat = cor)andcor(f, ::BayesMCMCResults)keep working, and now also accept anfthat returns a vector other than aVector, such as a view or a static vector.
Compatibility
- Pumas now runs on Julia 1.13.3.
- Pumas no longer depends on NCA.
using Pumasdoes not bringrun_nca,read_nca,summarize, or the other names NCA exports into scope, so a workflow computing NCA parameters needsNCAadded to its own project and loaded explicitly.using PumasUtilitiesdoes bring the names NCA exports into scope, since PumasUtilities re-exports NCA. NCA 3 is itself a rewrite:NCASubject,NCAPopulationandNCAReportare gone, a profile is aDataFrame, and per-endpoint functions such asNCA.aucare replaced by endpoint symbols passed torun_nca. The NCA section below lists the main changes. - Pumas now uses ModelingToolkitBase and Catalyst 16.
- Bayesian cross-validation now uses PSIS.jl instead of ParetoSmooth.jl for Pareto-smoothed importance sampling.
- The observed Kaplan-Meier curve of a time-to-event
vpcis now computed with SurvivalModels.jl instead of Survival.jl.
PumasPlots
Features and improvements
- Add
PumasPlots.Experimental.plot_vpcandPumasPlots.Experimental.plot_npdefor the predictive checks inPumas.Experimental, covering continuous, Bernoulli, categorical and cumulative discrete, and censored VPCs, as well as the NPDE and EWRES diagnostics. They stay experimental for as long as thePumas.ExperimentalAPI they render does. - Support inspections of fitted mixture models in the goodness-of-fit and diagnostic recipes, plotting the responsibility-weighted marginal predictions and residuals.
observations_vs_ipredictionsgained astratify_bykeyword that colors the points, and fits the trend lines, per stratum such as the subpopulation of a mixture-model inspection. - Add a
scale = :logoption toobservations_vs_predictionsandobservations_vs_ipredictions, which log-scales the axes and fits the trend lines on log-transformed data. - Show a loess trend line for continuous covariates in
empirical_bayes_vs_covariatesby default. - Add
likelihood_ratio_ppplot, a P-P plot of the likelihood-ratio statistics of bootstrap or SIR parameter samples against the reference Chi-squared distribution. - Change the default of the
identity,olsandzerolinetrend-line keywords on the diagnostic recipes fromtruetofalse, so only the loess line is drawn unless the others are requested. - Use one row per subject in
empirical_bayes_vs_covariatesandempirical_bayes_dist, so subjects with many observations no longer dominate the reported correlation or the histogram counts. Time-varying covariates use each subject's baseline value. - Size faceted plots to their content instead of squeezing them into Makie's default figure size, and split legends with many entries into several columns so they no longer overflow the figure.
- Treat
Boolcovariate columns as categorical rather than as continuous numbers. - Wrap the covariate facets of
npde_vs_covariateswhen only one NPDE is plotted, instead of producing a single row of facets. - Make the
groupkeyword ofvpc_plotselect the strata to draw. It was documented but ignored. It takes a tuple of pairs or aNamedTuple, and throws anArgumentErrorthat lists the valid choices when it names an unknown variable or matches no stratum. - Throw an error for keywords that
vpc_plotdoes not support, instead of ignoring them. Calls that passed such keywords, for examplerows,columns,facet, orfigurelegend, need them removed. The figure they drew is unchanged.
Documentation and error messages
- Report an informative error from
goodness_of_fitwhen the inspection contains neither weighted residuals nor NPDEs, pointing atinspect(fpm; nsim = n).
Bugs
- Fix
observations_vs_timedropping unrelated observations whenever any observation column wasmissingat a given time point. - Keep time points whose observed or simulated value is
missinginsim_plot. Previously such observations were silently dropped, and missing simulated values could error. - Fix the
vpc_plotlegend collapsing the two outer simulated-quantile bands into a single entry when they are drawn in different colors.
Deprecations
- Deprecate
covariates_checkin favor ofoverview_tableandcovariates_dist. It will be removed in a future breaking release.
PlottingUtilities
Features and improvements
- Support the
rowsandcolumnspagination keywords in plots that facet with a wrapped layout, such assim_plotwithseparate = true. Each page now holds at mostrows × columnspanels arranged incolumnscolumns. Previously the two keywords only took effect in plots faceted over explicit row and column groupings and were silently ignored otherwise. For wrapped layouts they must be given together and cannot be combined withlimit. - Set the keyword arguments of the plot functions built on
aog_spec, such assubject_fits, from a Makie theme, in a section keyed by package and function name, for exampleMakie.set_theme!(PumasPlots = (; subject_fits = (; ipred_color = :green))). A keyword given at the call takes precedence over the theme, and the theme over the default. A theme key the function does not accept throws an error that names it.
Bugs
- Fix
interactivethrowing aPlotlyBackendExceptionfor figures that set the axis ticks to a plain vector of tick positions, as the NCApower_modelanddose_vs_dose_normalizedplots do.
Deprecations
- Deprecate
pair_plotin favor of the more comprehensivepairplotfrom the PairPlots package, which ships with Pumas.
NCA
Behavior change
NCA 3 is a rewrite of the package, so code written for NCA 2 does not run unchanged. Migrating from NCA v2 explains the changes, lists the individual renames and removals, and links an agent skill for translating NCA 2 code. The main changes:
NCASubject,NCAPopulationandNCAReportare removed.read_ncareturns aDataFramewith one profile per dosing event and times relative to the dose, andrun_ncareturns aDataFrameof results.read_ncatakes long-format data in which each row repeats the dose information of its profile. The columns areconcentrationanddoseinstead ofconcandamt, column names are matched exactly (ignoring case) without aliases, and the unit keywords aretime_unit,concentration_unit,volume_unitanddose_unit.tauandassumed_taucolumns replaceiiandss.read_nca_pumasreads NONMEM-style tables in which dose rows are interleaved with the observations, such as Pumas simulation output.run_ncatakes the endpoints as its second positional argument instead of theparameterskeyword, and endpoint symbols replace per-endpoint functions such asNCA.auc. An endpoint that cannot be computed ismissing, with the reason in an<endpoint>_errcolumn, instead of a logged warning.- BLQ observations are flagged by a Boolean
blqcolumn instead of thellqkeyword, which gave the limit of quantification.transform_ncasubstitutes the flagged values according to itsblq_ruleskeyword. - Time columns cannot contain
missing, so plasma and urine observations cannot be analyzed in one data set. summarizealways skipsmissingvalues and always reportsnumsamplesandnonmissingcolumns, and itsskipmissingskeyword is removed.- The
concthresholdkeyword of the λz calculation is removed. BLQ handling covers it. - NCA no longer re-exports Unitful, but still works with Unitful data.
- The NCA 2 endpoint names, such as
cl,vss,mrt,auctauandthalf, still work but are deprecated.
NCAUtilities is merged into NCA. The NCA plots and
geomean_cv_tablecome with NCA, and NCAUtilities is no longer part of the Pumas installation, sousing NCAUtilitiesfails.cmaxssandcminssof a profile withassumed_tauare the maximum and minimum of the predicted steady-state curve at the observation times in[0, assumed_tau]and atassumed_tau. NCA 2 scaledcmaxandcminby the accumulation index, which only holds when the whole profile declines at λz. Reported values change for most such profiles.
Features and improvements
- Add
superpositionto predict steady-state and other multiple-dose profiles from single-dose data, with amax_auto_doseskeyword that caps the automatic number of doses. - Add exclusions of observations or whole subjects through an
exclusioncolumn of reasons, and alambdaz_maskcolumn that selects the points of the λz regression. Excluded and BLQ observations are masked instead of deleted, and BLQ substitution keeps the original values in a separate column. - Add the experimental
lambdaz_diagnosticsendpoint, with per-point diagnostics of the λz regression: studentized residuals, leverage, Cook's distance, jackknife influence on the adjusted R², DFBETA on λz, and leave-one-out λz and half-life. The experimentalformat_diagnosticsandexclude_lambdazwork with it. - Accept the
routevalues"ivbolus"and"ivinfusion", which are preferred over"iv"and"inf". - Include every column that is not a grouping column in
summarize, not only known endpoint names, so partial AUCs and renamed columns are summarized as well. - Reimplement the endpoint calculations and test many of them against WinNonlin results.
PumasUtilities
Behavior change
- PumasUtilities re-exports NCA instead of NCAUtilities, which was merged into NCA 3.1.
using PumasUtilitiesbrings the names NCA exports into scope, including the NCA plots andgeomean_cv_tablethat NCAUtilities provided before. Code written for NCA 2 or NCAUtilities needs to be updated to the NCA 3 API.
PumasReports
Behavior change
- The parameter tables of
reportalways have a description column, taken fromcoeftable, so a parameter without a description in@metadatashows its name. The column used to appear only for models that declared descriptions. reportno longer includes the "Data Checkout" figures built with the deprecatedcovariates_check. Covariate distributions are still shown for each fit throughcovariates_dist.
Bioequivalence
Behavior change
- Pass a regulatory criterion as a type, for example
pumas_be(data, FDA_HighlyVariable), instead of an enum value. The deprecatedFDAandEMA_CMAXaliases are removed. EMA_HighlyVariableperforms average bioequivalence with expanding limits (ABEL) on replicated crossover designs. The acceptance limits widen for a within-subject CV of the reference between 30% and 50%, and standard average bioequivalence applies at or below 30%. It used to fall back to the FDA reference-scaled analysis with a warning.reference_scaleis the regulatory constantθ, the square ofk, so the EMA value isreference_scale = 0.5776instead of0.76.- The EMA criteria,
EMA_HighlyVariableandEMA_NarrowTherapeuticIndex, fit replicated crossover designs withLinearModel, ordinary least squares with subjects as a fixed effect, instead of a mixed model.custom_model = LinearMixedModelselects a mixed model, which defaults to equal residual variances for the EMA criteria. - The nonparametric analysis of a crossover design defaults to Koch's cross-sequence rank-sum construction, which cancels the period effect between the sequences. The pooled signed-rank analysis of earlier releases is selected with
custom_model = SignedRankTest. Parallel designs, which failed before, run a rank-sum test. The result reports a median for each formulation, the Hodges-Lehmann estimate asMedian Ratio (%), and the distribution-free interval, and it no longer gives an equivalence verdict. Designs without a valid distribution-free interval, and samples too small to reachlevel_tost, are rejected with anArgumentError. - The nonparametric intervals come from HypothesisTests 0.12, which corrects the choice of order statistic, the null distribution behind the approximate interval, and the handling of zero differences. Reported intervals change.
cv_minandcv_maxpassed to a criterion that does not use them, andcustom_modelorremlwhere they have no effect, throw anArgumentErrorinstead of being ignored.- The acceptance bounds
:ABE_RULEand:ABEL_RULEof the result table are(lower, upper)tuples instead of strings. - The replicated crossover paradigms are renamed to
replicated_crossover_supports_abe_and_abel_onlyandreplicated_crossover_supports_abe_abel_and_rsabe. The low-level reference-scaling helpers are no longer exported and remain available qualified, for exampleBioequivalence.GeometricMeanRatioBounds.
Features and improvements
- Add a
wsv_modelkeyword topumas_beandrun_bethat selects the model of the within-subject variability of the reference in replicated designs:formulation_pooled_wsv_model,period_only_wsv_model,period_by_sequence_wsv_model(FDA) oradditive_sequence_wsv_model(EMA). - Add a
cv_maxkeyword topumas_beandrun_be, which caps the expansion ofEMA_HighlyVariable, for examplecv_max = 0.57382for Health Canada. - Make
assess_bepublic and exportset_result_table!,reference_scale_defaultandNoAssessmentBioequivalenceCriterion, so an analysis can run step by step aspreprocess_be,run_be,assess_be,set_result_table!, with or without an assessment. - Report whether a design supports ABEL in the
supports_abelfield ofdetect_design. - Re-export
SignedRankTest, socustom_model = SignedRankTestneeds nousing HypothesisTests. - Show
BioequivalenceEndpointOutputandBioequivalenceEndpointDecisionas one line inside containers and withprintorrepr, giving the criterion, the endpoint and the point estimate. The multi-line display is unchanged.
Documentation and error messages
- Rewrite the documentation as nine reference pages covering every
pumas_beargument, the regulatory criteria and their constants, and the fields of the output.
Bugs
- Fix the within-subject CV reported for paired designs, which was computed from a standard deviation that was too large by a factor of √2.
- Fix the HTML display of results, which misaligned the header of the results column and threw for an output whose result table was not populated.
Deprecations
- Remove the
userepeatedobsonlykeyword ofpumas_be,run_beandwithin_subject_variability. Only the repeated observations are used, as the FDA within-subject variability model requires.
OptimalDesign
Behavior change
named_fimreturns aDimArrayfrom DimensionalData withXandYdimensions instead of aNamedArray. Index it asnf[X = At("θ₁"), Y = At("θ₂")]instead ofnf["θ₁", "θ₂"], get the names withlookup(nf, X)instead ofnames(nf), and the matrix withparent(nf)instead ofnf.array.At,X,Yandlookupneedusing DimensionalData.- The default and the cached FIM throw an
ArgumentErrorwhen the dynamical system fails to solve, instead of computing withInfpredictions.
Bugs
- Fix the default FIM of models without random effects, which used the inverse of the observation standard deviations instead of the inverse of the variances. FIMs computed with
finitediff = trueorcache = truewere correct. Designs optimized with the default FIM for such models change. - Fix
cache = truefor models with numerical dynamics, which failed. The cached FIM rejects a solver with lazy interpolation, such asAutoVern7, and observation times outside the time span of the solution. - Fix the parameter names reported by
compare_designsfor parameters given in a different order than in the model.
InVitroInVivoCorrelation
Features and improvements
- Add InVitroInVivoCorrelation, an experimental package for Level A in vitro–in vivo correlation. It fits unit impulse responses, deconvolves the in vivo profiles numerically, fits the Level A correlation, predicts new formulations, computes FDA-style validation metrics (%PE, f1/f2) and plots the results, with
DataFrameinput and output.run_ivivcruns the whole workflow. The API may change in future releases, and the package warns about this when it is loaded.
SummaryTables
Features and improvements
Add
NumberFormat, which controls number formatting per value, per column, per variable or per table, with prefixes and suffixes, scaling, display limits like<0.001, magnitude suffixes like5.4Kand exponent style. Several formatting defaults change with it:- Exponential notation renders like
1.5 × 10⁶instead of1.5e6, whichexponent_style = :echanges back, andexponent_thresholdscontrols from which magnitudes on it is used at all. round_mode = :sigdigitsshows1234as1.23 × 10³instead of1230at 3 digits, so that every displayed digit is a significant one.trailing_zerosdefaults to:auto, so the exact rounding modes display exactly the requested precision whileround_mode = :autodoes not pad.trailing_zeros = truepads to the requested precision in the:autoand:sigdigitsmodes as well, for example1.50at 3 significant digits.- Trailing zeros are also stripped from e-notation mantissas and from negative numbers.
- Exponential notation renders like
Control the rule widths, paddings and footnote appearance of a
Tableper table or globally, using font-relative (em) or absolute (pt) lengths that render consistently across all backends. Cell indents and row and column gaps accept these lengths as well, where bare numbers still mean points.to_docxtakes an optionalDocxDefaultsargument, whosebase_fontsizesets the font size thatemlengths refer to in Word.Align the category bars of
overview_tablewith the corresponding text lines in HTML, typst and latex output.Display a
Tableas text in the REPL and in any othertext/plainoutput, with box-drawing rules. The REPL showed the fields of theTablestruct before. Bold, italic, underline and color are dropped, and long cells are not wrapped.
Bugs
- Reject
headerandfooterindices that lie outside the table or overlap each other, such asheader = 0orheader = 2, footer = 2. Such aTablewas accepted and rendered wrongly, and its typst output did not compile.
Deprecations
- Deprecate the
indent_ptkeyword in favor ofindent.
AlgebraOfGraphics
Behavior change
- Analyses (
linear,smooth,density,histogram,expectation,filled_contours) now fit in transformed space and back-transform their output when the relevant aesthetic carries ascalefunction set throughscales, for examplescales(Y = (; scale = log10)), so a fit on log-scaled data is computed in log space. This is distinct fromaxis = (; yscale = ...), which only transforms the display. - Analyses (
density,histogram,linear,smooth,frequency,expectation) now drop rows where any numeric input ismissingorNaNinstead of erroring or producing garbage. Infinite values throw anArgumentErrorthat names the column. Before, they caused unrelated errors in some analyses and were used silently in others:frequencycountedInfas a category,expectationincluded it in the mean, andhistogramdropped it. - Legend entries now hide elements from plot types that have no data for a given category, so layers of different plot types sharing a categorical scale no longer each contribute a swatch to every entry. Disable it globally with
legend = (; hide_unused = false)or per scale withhide_unused_legend. In paginated plots, the legend of each page shows only the categories present on that page.
Features and improvements
- Add
FacetSizeandfacet = (; size = FacetSize(...))for declaring an axis sizing policy that adapts to the resolved grid layout. The default wrapped layout resolves its row and column positions at draw time from the effective axis aspect, picking a column count that brings the bunched axis areas closest to a square shape. For square axes the column count is the same as before. For non-square axes, such as axes given awidthandheight, the default layout can have a different number of columns than in earlier releases.FacetSizeworks withdraw!as well asdraw. - Add a
directionkeyword to 1Dhistogram, which sets the bar orientation and the aesthetic the bins are computed in. - Accept the generic
dodge_xanddodge_ymapping for plot types with a native dodge attribute (BarPlot,BoxPlot,Violin,CrossBar), so a single mapping can be shared across companion layers instead of switching attribute names per layer. - Add support for
Stemplots. - Accept
UnitfulandDynamicQuantitiesdata in the analyses, including columns that containmissing. - Align
UnitfulandDynamicQuantitiesunits inABLines. The intercept takes the unit of y and the slope the unit of y/x, and incompatible units throw an error. A dimensionless slope is accepted when x and y carry the same unit.
Bugs
- Fix
paginatediscarding the layout scale palette, sowrappedcan be used to paginate with specific row and column shapes. - Fix palette pairs and
categoriespassed throughscalesnot matchingpresortedornonnumericwrapped data unless the keys were wrapped as well. - Fix mappings with
verbatimpicking up another layer's scale for the same aesthetic. - Fix
smoothwith the defaultdegree = 2collapsing onDateand other large-magnitude x axes. - Justify multiline footnotes according to
footnotealign.
PumasAide
Features and improvements
- Run a named chunk of a file with
include_julia_fileinstead of the whole file.# %%,##, and#-delimit chunks in a.jlfile, and#| label:in the{julia}blocks of a.qmd, so an agent can rerun one cell of a script it has already executed. - Report a compact workspace delta from
include_julia_file: one headline per binding the script created or reassigned, rather than the full objects. Bindings whose name begins with_are treated as intermediates and left out, and theshowargument expands named bindings in full. - Return from
eval_julia_codewhat the REPL would return, the standard output and the value of the final expression. Intermediate assignments are no longer surfaced. - Assign to workspace variables from top-level
forandwhileloops ineval_julia_code, following REPL soft scope. - Require
Authorization: Bearer <token>on every request withserve(; token), so a host that starts PumasAide can keep other local processes from running code in its session. - Search the docstrings of loaded Pumas packages, such as Pumas, NCA, Bioequivalence and PumasPlots, with
pumas_knowledge, so an agent can check the arguments and defaults of the installed versions. - Improve the matching of
pumas_knowledgesearch. - Throw from
servewhen the port is already in use, instead of failing inside the server task. - Apply pending Revise revisions before each tool call whenever Revise is loaded, so an edit to tracked code takes effect in the next tool call. A revision that fails, such as a syntax error in a tracked file, fails the tool call with that error.
- Tell the agent in the server instructions to call
vscodedisplay(x)when the user asks to see a plot or table in VS Code. - Write scripts into the project's own layout, taken from its agent instructions, organisation rules, or existing folders. The
programs/andreports/folders apply only when none of these sets a layout. - Mark tools
anthropic/alwaysLoadso Claude Code loads their schemas upfront, give each tool atitlefor clients to display, and markpumas_knowledgewithreadOnlyHintso clients can run its calls in parallel. The server reports its package version to MCP clients, where it reported1.0.0. - Log each tool call in the Julia session as a framed, syntax-highlighted block, so the code an agent ran and the errors it hit can be read off the server log.
- Point at the fix when a world-age error is raised, such as deserializing an object and using it in the same statement, which is resolved by splitting the statements or loading the model first.
- Trim the server instructions sent to the client to the essentials, so that they fit the size limits of common clients.
- Drop the hardcoded numeric ranges, thresholds, and acceptance criteria from the pharmacometric knowledge docs in favour of qualitative guidance, which an organisation pins down with its own rules.
Bugs
- Fix the world-age
MethodErrorraised when a serialized object, such as a Pumas fit read from a.jlsfile, was inspected in the call that loaded it. - Refuse a request whose
Hostis not an address the server serves under, and a state-changing request carrying an unrecognisedOrigin. Without the check, a page the user visits can point a hostname it controls at127.0.0.1and reach the local server through the browser as though it were local code. - Fix overlapping
eval_julia_codeandinclude_julia_filecalls failing withSystemError: dup: Bad file descriptoror returning each other's output. Calls now take turns. - Fix a tool result being lost when the client connection dropped mid-call. A client that reconnects receives the rest of the stream, result included.
- Fix logged tool calls splicing into each other in the server log when calls ran concurrently.
- Fix
include_julia_filewithshowover several chunks warning about unknown bindings for names another chunk created. - Fix
pumas_knowledgeprinting deprecation warnings, such as forPumas.FOCEI, when it built its docstring search index. - Fix the bioequivalence knowledge doc examples passing
logtransformed=trueon raw NCA values, which marks them as already logged and gives wrong GMRs. - Fix the BLQ handling knowledge doc. It separates NCA conventions from Beal's M1-M7 population PK methods, which the previous table misnumbered, and the NCA workflow makes BLQ handling an explicit decision step that the agent reports.
Deprecations and removals
- Remove the browser interface: the
/previewobject viewer and its sidebar, the dependency graph page, the column-stat charts, and the preview URLs in tool responses. Objects are shown in VS Code throughvscodedisplay. - Remove the
devkeyword ofserve, which served the browser interface. - Remove the
revisepreference. Pending Revise revisions are applied before each tool call whenever Revise is loaded. - Remove support for NCA 2. The NCA knowledge docs cover NCA 3 only, and PumasAide no longer depends on NCA, so projects that run NCA code add it themselves.
ADaM
Features and improvements
Features
- Add
write_spec,update_spec, andvalidate_specfor authoring an ADaM specification workbook from a variable template and a folder of SDTM.xptfiles, editing it without discarding reviewer changes made in Excel, and checking a derived.xptdataset against it. - Add
conc_summaryfor the PK-standard concentration statistics (N, GeoMean, GeoCV, GSD, Mean, SD, CV, Median, Q1, Q3, Min, Max) by treatment and nominal time, optionally nested by dose. - Add
bloq_summaryfor below-limit-of-quantification tables in one of three layouts. - Add
population_flag_summary,subject_inclusion_exclusion, andrecord_inclusion_exclusionto account for the analysis population. Each renders aSummaryTables.Table, or returns the underlyingDataFramewithas_df = true. - Add
covariate_pairplot_df,continuous_covariate_distribution_df,categorical_covariate_count_df,samples_per_subject_df, andsampling_time_dfto reshape an ADPPK dataset for the standard exploratory plots. - Add
profile_datasetto profile aDataFrame, or a folder of.xptand.sas7bdatfiles, into per-column statistics.*DTCcolumns report the distinct ISO 8601 formats present rather than the distinct values. - Add
occasionto deriveOCCon an ADPPK BDS dataset from a caller-supplied predicate.
Improvements
- Default
make_dtmtofmt = :iso8601_autoso aDTCcolumn of mixed precision parses, and accept aVector{DateFormat}and anon_error = :error | :missingkeyword. - Flag the entire non-ascending sequence in
make_time_flrather than only the record where time dropped, and add astrictkeyword for strictly increasing times. - Speed up the as-of joins in
join_columnswith a dictionary-based group index. - Simplify type signatures and validate argument types at the call rather than inside a derivation.
Bugs
- Fix
definition_table, which relied onSummaryTablesinternals. - Parse word-form frequencies such as
ONCE WEEKLY,TWICE DAILY, andONCE A WEEKininterdose_interval, which returned 0 or errored on them. - List categories with equal counts in sorted order in
definition_table. They followed hash order, which differs between Julia 1.12 and 1.13, so the same data could give a different table, and a column with more thanmax_categoriescategories could list a different subset.
Deprecations
- Rename the
tablekeyword ofbloq_summarytostyle, and identify total rows in the:simple_tablelayout by the time column so a colliding group value no longer renders bold. - Remove
basic_info_pc,subject_trt_count,bmi_summary, andvalidate_column_structurewith no replacement.
QuartoTools
Behavior change
- Every cached result is computed again once. The cache keys and the storage layout changed, so entries written by earlier versions are not read. They are left in place, not deleted.
- The key of a cached call covers every tracked function the call reaches, at any depth, so editing a function that the cached call depends on invalidates the entry. The key used to cover only the called function's own code.
- The dependency walk stops at packages the active project does not depend on, so a development tool loaded from a shared environment does not enter the cache key.
- A global that the cached code reads and whose value cannot be serialized is keyed on its type, with a warning that names it. Such a global used to make the call uncacheable.
- An entry that cannot be read is dropped and the call runs in its place, instead of failing. A call to a function for which
cacheablereturnsfalseruns uncached instead of raisingCannot cache function call.
Features and improvements
- Apply
@cacheto a function definition or a callable-object definition, not only to a call. A docstring above such a definition documents it. - Inspect and clean up caches with
entries,usage,drop!, andprune!.prune!removes entries by age, count, total size, or function name. Without a directory argument, the four functions cover the cache of the working directory and the cache beside each cached definition loaded so far. - Control what a cache key covers with
track!,untrack!,is_tracked,dependencies, andignore_global!. - Set the cache directory with
cache_directory!or theQUARTOTOOLS_CACHE_DIRECTORYenvironment variable, and turn caching off withdisable!orQUARTOTOOLS_CACHE_DISABLE. - Hash arguments with XXH3-128 instead of SHA-256, which reads the bytes of an argument about fifty times faster.
PumasLicenseManager
Behavior change
- On Linux outside cluster installs, the hardware ID includes the UID and the username of the user, hashed, so distinct users on one machine get distinct hardware IDs. The hardware ID of such a machine changes with this release.
PUMAS_CLUSTER_LICENSE_PATHis ignored on operating systems other than Linux.
Bugs
- Fix a floating-license seat being released as soon as the license details were displayed. The license handler is held for the session and freed at exit.
- Fix the floating-license watchdog dying silently on an unexpected error. It now exits the process.
- Fix an
UndefVarErroron Julia 1.12 and later when "enter license key" is picked from the interactive menu.