Skip to content

Commit c560828

Browse files
authored
Merge pull request #769 from SciML/structuralidentifiabilityextension
Structuralidentifiabilityextension
2 parents 235ad85 + 90ab89e commit c560828

File tree

11 files changed

+750
-3
lines changed

11 files changed

+750
-3
lines changed

HISTORY.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@
33
## Catalyst unreleased (master branch)
44

55
## Catalyst 14.0
6+
- Added CatalystStructuralIdentifiabilityExtension, which permits StructuralIdentifiability.jl function to be applied directly to Catalyst systems. E.g. use
7+
```julia
8+
using Catalyst, StructuralIdentifiability
9+
goodwind_oscillator = @reaction_network begin
10+
(mmr(P,pₘ,1), dₘ), 0 <--> M
11+
(pₑ*M,dₑ), 0 <--> E
12+
(pₚ*E,dₚ), 0 <--> P
13+
end
14+
assess_identifiability(goodwind_oscillator; measured_quantities=[:M])
15+
```
16+
to assess (global) structural identifiability for all parameters and variables of the `goodwind_oscillator` model (under the presumption that we can measure `M` only).
17+
- Automatically handles conservation laws for structural identifiability problems (eliminates these internally to speed up computations).
18+
- Adds a tutorial to illustrate the use of the extension.
619
- Simulation of spatial ODEs now supported. For full details, please see https://github.com/SciML/Catalyst.jl/pull/644 and upcoming documentation. Note that these methods are currently considered alpha, with the interface and approach changing even in non-breaking Catalyst releases.
720
- LatticeReactionSystem structure represents a spatial reaction network:
821
```julia

Project.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
2626
[weakdeps]
2727
BifurcationKit = "0f109fa4-8a5d-4b75-95aa-f515264e7665"
2828
HomotopyContinuation = "f213a82b-91d6-5c5d-acf7-10f1c761b327"
29+
StructuralIdentifiability = "220ca800-aa68-49bb-acd8-6037fa93a544"
2930

3031
[extensions]
3132
CatalystBifurcationKitExtension = "BifurcationKit"
3233
CatalystHomotopyContinuationExtension = "HomotopyContinuation"
34+
CatalystStructuralIdentifiabilityExtension = "StructuralIdentifiability"
3335

3436
[compat]
3537
BifurcationKit = "0.3"
@@ -48,6 +50,7 @@ Reexport = "0.2, 1.0"
4850
Requires = "1.0"
4951
RuntimeGeneratedFunctions = "0.5.12"
5052
Setfield = "1"
53+
StructuralIdentifiability = "0.5.1"
5154
SymbolicUtils = "1.0.3"
5255
Symbolics = "5.14"
5356
Unitful = "1.12.4"
@@ -69,8 +72,9 @@ StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
6972
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
7073
SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f"
7174
StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
75+
StructuralIdentifiability = "220ca800-aa68-49bb-acd8-6037fa93a544"
7276
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
7377
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
7478

7579
[targets]
76-
test = ["BifurcationKit", "DomainSets", "Graphviz_jll", "HomotopyContinuation", "NonlinearSolve", "OrdinaryDiffEq", "Random", "SafeTestsets", "SciMLBase", "SciMLNLSolve", "StableRNGs", "Statistics", "SteadyStateDiffEq", "StochasticDiffEq", "Test", "Unitful"]
80+
test = ["BifurcationKit", "DomainSets", "Graphviz_jll", "HomotopyContinuation", "NonlinearSolve", "OrdinaryDiffEq", "Random", "SafeTestsets", "SciMLBase", "SciMLNLSolve", "StableRNGs", "Statistics", "SteadyStateDiffEq", "StochasticDiffEq", "StructuralIdentifiability", "Test", "Unitful"]

docs/Project.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
77
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
88
HomotopyContinuation = "f213a82b-91d6-5c5d-acf7-10f1c761b327"
99
Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
10+
Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
1011
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
1112
NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
1213
Optim = "429524aa-4258-5aef-a3af-852621145aeb"
@@ -22,6 +23,7 @@ Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
2223
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
2324
SteadyStateDiffEq = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f"
2425
StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
26+
StructuralIdentifiability = "220ca800-aa68-49bb-acd8-6037fa93a544"
2527
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
2628

2729
[compat]
@@ -47,4 +49,5 @@ Setfield = "1.1"
4749
SpecialFunctions = "2.1"
4850
SteadyStateDiffEq = "2.0.1"
4951
StochasticDiffEq = "6"
52+
StructuralIdentifiability = "0.5.1"
5053
Symbolics = "5.14"

docs/pages.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pages = Any["Home" => "index.md",
1616
"catalyst_applications/nonlinear_solve.md",
1717
"catalyst_applications/bifurcation_diagrams.md"],
1818
"Inverse Problems" => Any["inverse_problems/parameter_estimation.md",
19-
"inverse_problems/petab_ode_param_fitting.md"],
19+
"inverse_problems/petab_ode_param_fitting.md",
20+
"inverse_problems/structural_identifiability.md"],
2021
"FAQs" => "faqs.md",
2122
"API" => "api/catalyst_api.md"]

docs/src/inverse_problems/petab_ode_param_fitting.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fitted_sol = solve(oprob_fitted, Tsit5())
127127
plot!(fitted_sol; idxs=:P, label="Fitted solution", linestyle=:dash, lw=6, color=:lightblue)
128128
```
129129

130-
Here we use the `get_ps` function to retrieve a full parameter set using the optimal parameters. Alternatively, the `ODEProblem` or fitted simulation can be retrieved directly using the `get_odeproblem` or `get_odesol` [functions](https://sebapersson.github.io/PEtab.jl/dev/API_choosen/#PEtab.get_odeproblem), respectively (and the initial condition using the `get_u0` function). The calibration result can also be found in `res.xmin`, however, note that PEtab automatically ([unless a linear scale is selected](@ref petab_parameters_scales)) converts parameters to logarithmic scale, so typically `10 .^res.xmin` are the values of interest. If you investigate the result from this example you might note, that even if PEtab.jl has found the global optimum (which fits the data well), this does not actually correspond to the true parameter set. This phenomenon is related to the concept of *identifiability*, which is very important for parameter fitting.
130+
Here we use the `get_ps` function to retrieve a full parameter set using the optimal parameters. Alternatively, the `ODEProblem` or fitted simulation can be retrieved directly using the `get_odeproblem` or `get_odesol` [functions](https://sebapersson.github.io/PEtab.jl/dev/API_choosen/#PEtab.get_odeproblem), respectively (and the initial condition using the `get_u0` function). The calibration result can also be found in `res.xmin`, however, note that PEtab automatically ([unless a linear scale is selected](@ref petab_parameters_scales)) converts parameters to logarithmic scale, so typically `10 .^res.xmin` are the values of interest. If you investigate the result from this example you might note, that even if PEtab.jl has found the global optimum (which fits the data well), this does not actually correspond to the true parameter set. This phenomenon is related to the [concept of *identifiability*](@ref structural_identifiability), which is very important for parameter fitting.
131131

132132
### Final notes
133133
PEtab.jl also supports [multistart optimisation](@ref petab_multistart_optimisation), [automatic pre-equilibration before simulations](https://sebapersson.github.io/PEtab.jl/stable/Brannmark/), and [events](@ref petab_events). Various [plot recipes](@ref petab_plotting) exist for investigating the optimisation process. Please read the [PETab.jl documentation](https://sebapersson.github.io/PEtab.jl/stable/) for a more complete description of the package's features. Below follows additional details of various options and features (generally, PEtab is able to find good default values for most options that are not specified).

0 commit comments

Comments
 (0)