# Changelog

## v0.29.0

### JuliaSimControl v0.8.2

#### Features

- Add Polynomial-Quadratic Regulator control design (PQR)
- Add function
`common_lyap`

that computes quadratic Lyapunov functions for uncertain systems - Add polynomial trajectory synthesizer
- Add function
`poly_approx`

for least-squares polynomial approximation of nonlinear dynamics

#### Tutorials

- Add PQR tutorials
- Add tutorial for control of PDE system
- Add input-simulation tutorial

### JuliaSimModelOptimizer v6.0.1

#### Features

- Add support for DataSets as input data
- Add symbolic regression interface
- Add support for log transformed search space
- Support for parameter scaling in PEtab import
- Add plot functions for analyzing convergence and multiple shooting segments
- Support MTK ODESystem in import_petab
- Add parallelization support for multiple shooting
- Add helper function for creating PEtab templates

### Bug fixes

- Fix multiple shooting methods
- Fix
`remake`

with`save_names`

- Fix
`remake`

with aliased parameters - Fix aliasing to an optimized value
- Use latin hypercube sampling for initial state in parametric_uq
- Fix
`remake`

with ChainedExperiments - Fix search space transformations
- Plot recipe fixes

### JuliaSimSurrogates v3.1.0

#### Features

- Add support for custom callbacks in training loop
- Add support for external simulators like JuliaSimBatteries
- Add support for plotting ExperimentData objects directly
- Add support to spawn data generation and training jobs on JuliaHub
- Added a Datagen app for tuning controllers
- DigitalEcho now supports deploying to MTK
- Generically handle constant values during normalization for the DigitalEcho
- Implemented Controller which has a fixed value at t=0
- Improved documentation
- Improves the performance of DigitalEcho
- Scalable storage format for data generation
- Support for training with GPUs

## v0.28.0

### JuliaSim

#### Features

- Upgrade to Julia v1.8.5.

### JuliaSimControl v0.8.0

#### Features

- Improve autotuning discretization with user options.
- Add tutorials:
- Uncertainty modeling for nonlinear systems,
- MPC on neural surrogates,
- Input-simulation tutorial,
- Self-driving car MPC,
- Disturbance modeling,
- MPC for redundant control allocation,
- MPC on model identified from data.

- Improve input integration for MPC controller and added integral action documentation.
- Enhance Collocation for MPC with choice of degree and roots.
- Add Radau option for collocation.

- Add documentation for GUI apps.
- Improve discretization in MPC.
- Improve trimming functionality.
- Simplify interface to constraints and costs for MPC controllers.

#### Deprecations

- Deprecate
`OpenLoopObserver`

in favor of`StateFeedback`

.

### JuliaSimModelOptimizer v5.5.4

#### Features

- Add support for experiment local parameters
- Add model autocomplete
*Experimental*Import FMUs into inverse problems- Add confidence level based plots
- Add support for chaining calibrations

### Bug fixes

- Add support for parameters depending on other parameters
- Fix saving behaviour for PEtab imported models
- Bug fixes for multi-replicate experiments
- Bug fixes for plots with a single saved state
- Handle errors that can happen during experiment solving

## v0.27.0

### JuliaSimModelOptimizer v5.0.0

#### Breaking changes

- Improve internal trial data representation. The data is now pre-transposed before the error function.
- Move code and rename
`ForwardSolve`

to`SingleShooting`

. - Saving behavior improvements. The keyword argument
`save_names`

now defaults to using all the model variables present in the trial data instead of using all the states of the system. - Move pharma specific code to PumasQSP.
`Trial`

-> `Experiment- Moved dosing to PumasQSP (both via callbacks and via
`CustomDosingTrial`

) - Moved
`PeriodicSteadyStateTrial`

to PumasQSP `SteadyStateTrial`

->`SteadyStateExperiment`

`ComparisonTrial`

->`ExperimentComparison`

- Renamed trial collections
`IndependentTrials`

->`IndependentExperiments`

`SteadyStateTrials`

->`SteadyStateExperiments`

`TrialChains`

->`ChainedExperiments`

#### Features

- Add support for parameter priors.
- Add parametrization support to the initial conditions.
- Add the possibility to import PEtab files.
- Add MAPEL.
- Add
`ReplicateData`

. This allows one to use multiple datasets for one trial. - Add trial chains. Trials can now have arbitrarily deep dependencies on any other previously defined trials.

#### Bug fixes

`MultipleShooting`

bug fixes.`KernelCollocate`

improvements.- MCMC clean-up.
- Trial collection polishing.
- Better missing data support.

#### Documentation

- Hierarchical MCMC docs.

## v0.26.0

### JuliaSim

#### Breaking Change

- Require at least JuliaHub v6.0.0 as the deployment platform.

#### Features

- Improve formatting of the
`JuliaSim.info`

output.

## v0.25.1

### JuliaSimModelOptimizer v4.1.2

#### Bug Fixes

- Add error handling in calibration.
- Decreased overhead for small problems.
- Fix a bug in how parameters and initial conditions were computed, when ForwardDiff was used, which could have lead to wrong results.
- Fix
`MultipleShooting`

bugs that could lead to wrong results.

### BuildingModelLibrary v0.2.3

#### Bug Fixes

- Bumps the CSV version to v0.10 (from earlier v0.9).

### BuildingModelLibraryMakie v0.1.6

#### Bug Fixes

- Fix room iteration order

### ThermalThermofluid v0.1.3

#### License

- Adds LICENSE

#### Bug Fixes

- Fixes room iteration order

## v0.25.0

### JuliaSimModelOptimizer v4.1.0

#### Features

- Hierarchical Bayesian inference is now available as a virtual population generation method. This method is enabled by setting the keyword argument
`hierarchical = true`

in`MCMCOpt`

, before passing it to the`vpop`

function. - Pathfinder MCMC initialization is now available. This is an alternative to the standard warmup phase and can be activated by setting the keyword argument
`warmup_method = PathfinderWarmUp()`

in`MCMCOpt`

, before passing it to the`vpop`

function.

## v0.24.1

### JuliaSimSurrogates v1.0.2

#### Bug Fixes

- Fix broken dashboard styling.

## v0.24.0

### JuliaSimControl v0.6.0

#### Breaking Changes

- The
`JuliaSimControls`

package has been renamed to`JuliaSimControl`

. All references to the package should be updated accordingly.

#### Features

- Add extremum seeking controllers.
- Add extremum seeking adaptive controllers.
- Add an offset option to
`frequency_response_analysis`

. - Add support for MadNLP.jl as a Model-Predictive Control (MPC) solver.
- Rely on the more robust linearization capabilities of ModelingToolkit (MTK) in favor of a JuliaSimControl-specific implementation.
- Increase performance of autotuning using static systems.
- Refactor MPC API and internals and upgrade capabilities using Optimization.jl
- Improve defaults for Ipopt tolerances.
- Improve autotuning performance.
- Add trapezoidal integration discretization.
- Add collocation for MPC.
- Add gradient options for the solver optimization for MPC.
- Add scaling of signals for MPC.
- Improve initial estimate for optimization in autoscaling.

#### Bug Fixes

- Fix some instances of
`linearize`

. - Fix PID autotuning and model reduction apps.
- Fix difference consts for MPC.

#### Documentation

- Update the MTK tutorial to use ModelingToolkitStandardLibrary.
- Add a tutorial for feed-forward control using an inverse-model.
- Add a tutorial for extremum seeking for rodel-reference adaptive control.
- Improve the documentation introduction.
- Add a tutorial on adaptive MPC.
- Improve MPC documentation.
- Add a tutorial on Optimal Control.
- Add a 'space shuttle reentry' example.

### JuliaSimModelOptimizer v4.0.2

#### Breaking Changes

`trial_cost(trial, x, prob)`

is now`trial(alg, x, prob)`

, where`alg`

is an optimization algorithm.- To obtain the cost function corresponding to an inverse problem and a specific optimization algorithm you now have to use
`observed(prob, alg)`

.

#### Features

- There is a new
`calibrate`

function that performs a single fit against the data in a robust way. - Add support for multiple shooting methods for optimization (
`DataShooting`

and`MultipleShooting`

). - Add support for collocation methods (
`KernelCollocate`

,`SplineCollocate`

,`NoiseRobustCollocate`

). `vpop`

now supports multithreaded parallelism via`EnsembleThreads`

.

#### Bug fixes

- You can construct
`IndependentTrials`

from`Vector{Any}`

containers. - Performance improvements: the overhead of the setup was reduced to under 10%.

### PumasQSP v2.1.2

#### Features

- Add support for dosing. The following types of doses can be used:
`Bolus`

, increment a state by some amount.`PeriodicBolus`

, same as`Bolus`

periodically.`Infusion`

, increments the rate of change of a state by some amount for a time window of given duration.`PeriodicInfusion`

, same as`Infusion`

periodically, where the period counts from the onset time of the`Infusion`

time window.

### BuildingModelLibrary v0.2.1

#### Features

- Simplified interface for creating building models based on ThermalThermofluid.
- The user can set the number of floors for the building

### BuildingModelLibraryMakie v0.1.5

#### Features

- Easily visualize building model simulations with Makie
- Create animations based on the simulation

### ThermalThermofluid v0.1.3

#### Features

- Create large building models using MTK

## v0.23.0

### JuliaSimModelOptimizer v3.1.1

#### Features

`DDS`

(Discretized Density Sampling) subsampling method: Custom-made subsampling method that matches the histogram of a virtual population to some input reference histogram for each one of the considered model states.- New plot recipe:
`plot(::AbstractQSPResult, ::InverseProblem; trial_names=get_name.(prob.trials))), kwargs...)`

to plot each trial whose name is in`trial_names`

, for every virtual patient in`AbstractQSPResult`

.

#### Bug fixes

- Fix indexing a
`vp::MCMCResult`

with an`::AbstractVector`

. This fixes using`vp::MCMCResult`

in`subsample`

. - Fix plotting bounds data: fix plot recipes breaking when keyword argument
`show_data=true`

and data is`(lower, upper)`

bounds. Now`show_data`

will plot two dashed lines for lower and upper bounds respectively. - Fix a bug in the
`plot(vp, trial)`

plot recipe where`saveat_reduction`

would not be forwarded to the underlying`solve_ensemble`

call. - Fix color and legend bugs in
`plot(vp, trial)`

and`plot(trial, prob, x)`

. - Fix
`plot(vp, trial, summary = true)`

not respecting the`states`

argument. - Remove OptimizationBBO specific kwargs from the
`vpop`

solve call. This will make it possible to use other optimization methods. - Fix GSA errors due to the missing
`samples`

keyword argument.

### Other

- Plot Functions page: API page with docstrings for each plot recipe.

## v0.22.0

### JuliaSimModelOptimizer v3.0.1

#### Features

- MCMC Refactor: Trials now contain a
`likelihood`

function and`noise_priors`

for the scale parameters of typical likelihoods (e.g. standard deviation terms in a Normal). Likelihoods are the closest to a Bayesian equivalent for the`err`

function of standard optimization, so makes sense to keep them on the trial level. This way users can adapt the`likelihood`

s and`noise_priors`

according to what is measured in a trial. The assumption is that each`Trial`

has its own`noise_priors`

, either a common one for all`save_idxs`

or one per`save_idxs`

. - Add timespan optimization: The timespan can now be specified symbolically. If the parameters used are in the search space, the timespan will be computed using the parameters from the optimization. The
`saveat`

can also be specified similarly.

#### Breaking changes

- Remove trial caching
- Remove MCMCModelCache
- Simplify API
- Refactor Subsample API
- Rename QSPCost and QSPSensitivity

#### Upgrade steps

- Trials can no longer be cached. This feature was not documented and not used by anyone. Removing this makes the
`QSPCost`

/`InverseProblem`

thread safe. - The
`solve_trial`

and the trial plot recipe no longer have the`ss_trial`

keyword argument for specifying the steady state trial for a trial with`forward_u0=true`

. This is now automatically retrieved by the`solve_trial`

function if a trial needs it. `subsample(alg, vp, trial; kwargs...)`

is now the subsampling API. Note that the`alg`

argument has been moved to the first position. Each subsampling algorithm alg (e.g. MAPEL, ARM, etc) has now a`Sampler`

callable struct that is returned by`get_sampler(alg, vp, trial)`

. Users can then call the`Sampler`

with the original`vp`

to get a subsampled`vp`

.

```
alg = MAPEL(binning_function, reference_weights, N_patients_to_subsample)
vp_subsampled = subsample(alg, vp, trial)
# ___OR___
sampler = get_sampler(alg, vp, trial)
idxs = sampler()
vp_subsampled = vp[idxs]
```

`QSPCost(model, trials; search_space)`

and`QSPSensitivity(model, trials; parameter_space)`

have been replaced by`InverseProblem(trials, model, search_space)`

and`SensitivityProblem(trials, model, parameter_space)`

. Note that the order of the arguments has changed and that the`search_space`

is no longer a keyword argument. Instead of building cost functions we now build the corresponding problems to be solved and the functions corresponding to the problems are conceptually separate. The`InverseProblem`

is still a callable struct, but this will be deprecated in a future version and it is not part of the public API. We will have a dedicated function for evaluating the cost corresponding to a problem.

#### Bug fixes

- Fix compat: A Symbolics.jl issue (
`JuliaSymbolics/Symbolics.jl#670`

) prompted us to add a compat bound on Symbolics to ~4.9. It was fixed with Symbolics v4.10.2 and the constraint was removed (`JuliaSymbolics/Symbolics.jl#671`

). - Fix bugs: Fix
`vpop_prob`

and cost errors from importing vpops. The cost function now works on named tuples that would arise form the Tables.jl interface.

#### Docs

- MCMC documentation
- Update docs links
- Refactor Docs

#### Other

- README updates
- CompatHelper: add new compat entry for MCMCChains at version 5, (keep existing compat)

### PumasQSP v2.0.1

#### Breaking changes

- PumasQSP now uses JuliaSimModleOptimizer v3 and that has an important breaking change:
`QSPCost(model, trials; search_space)`

and`QSPSensitivity(model, trials; parameter_space)`

have been replaced by`InverseProblem(trials, model, search_space)`

and`SensitivityProblem(trials, model, parameter_space)`

. Note that the order of the arguments has changed and that the`search_space`

is no longer a keyword argument. See the changelog for JuliaSimModelOptimizer for more details.

#### Bug fixes

- This release only changes the version number so that we can avoid a julia issue preventing package loading due to conflicting version numbers between the package and the sub-package.