Skip to content

Commit b7b6e8b

Browse files
committed
init
1 parent 5277a2c commit b7b6e8b

28 files changed

+891
-768
lines changed

docs/make.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,17 @@ include("pages.jl")
3131
# pages = pages)
3232

3333
makedocs(sitename = "Catalyst.jl",
34-
authors = "Samuel Isaacson",
35-
format = Documenter.HTML(; analytics = "UA-90474609-3",
36-
prettyurls = (get(ENV, "CI", nothing) == "true"),
37-
assets = ["assets/favicon.ico"],
38-
canonical = "https://docs.sciml.ai/Catalyst/stable/"),
39-
modules = [Catalyst, ModelingToolkit],
40-
doctest = false,
41-
clean = true,
42-
pages = pages,
43-
pagesonly = true,
44-
warnonly = true)
34+
authors = "Samuel Isaacson",
35+
format = Documenter.HTML(; analytics = "UA-90474609-3",
36+
prettyurls = (get(ENV, "CI", nothing) == "true"),
37+
assets = ["assets/favicon.ico"],
38+
canonical = "https://docs.sciml.ai/Catalyst/stable/"),
39+
modules = [Catalyst, ModelingToolkit],
40+
doctest = false,
41+
clean = true,
42+
pages = pages,
43+
pagesonly = true,
44+
warnonly = true)
4545

4646
deploydocs(repo = "github.com/SciML/Catalyst.jl.git";
47-
push_preview = true)
47+
push_preview = true)

docs/pages.jl

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ pages = Any[
22
"Home" => "index.md",
33
"Introduction to Catalyst" => Any[
44
"introduction_to_catalyst/catalyst_for_new_julia_users.md",
5-
# "introduction_to_catalyst/introduction_to_catalyst.md"
6-
# Advanced introduction.
5+
# "introduction_to_catalyst/introduction_to_catalyst.md"
6+
# Advanced introduction.
77
],
88
"Model Creation and Properties" => Any[
99
"model_creation/dsl_basics.md",
@@ -21,8 +21,7 @@ pages = Any[
2121
"Model creation examples" => Any[
2222
"model_creation/examples/basic_CRN_library.md",
2323
"model_creation/examples/programmatic_generative_linear_pathway.md",
24-
"model_creation/examples/hodgkin_huxley_equation.md",
25-
#"model_creation/examples/smoluchowski_coagulation_equation.md"
24+
"model_creation/examples/hodgkin_huxley_equation.md" #"model_creation/examples/smoluchowski_coagulation_equation.md"
2625
]
2726
],
2827
"Model simulation" => Any[
@@ -31,15 +30,12 @@ pages = Any[
3130
"model_simulation/simulation_structure_interfacing.md",
3231
"model_simulation/ensemble_simulations.md",
3332
# Stochastic simulation statistical analysis.
34-
"model_simulation/ode_simulation_performance.md",
35-
# SDE Performance considerations/advice.
36-
# Jump Performance considerations/advice.
37-
# Finite state projection
33+
"model_simulation/ode_simulation_performance.md" # SDE Performance considerations/advice. # Jump Performance considerations/advice. # Finite state projection
3834
],
3935
"Steady state analysis" => Any[
4036
"steady_state_functionality/homotopy_continuation.md",
4137
"steady_state_functionality/nonlinear_solve.md",
42-
"steady_state_functionality/steady_state_stability_computation.md",
38+
"steady_state_functionality/steady_state_stability_computation.md",
4339
"steady_state_functionality/bifurcation_diagrams.md",
4440
"steady_state_functionality/dynamical_systems.md"
4541
],
@@ -58,9 +54,9 @@ pages = Any[
5854
]
5955
],
6056
"Spatial modelling" => Any[
61-
# Intro.
62-
# Lattice ODEs.
63-
# Lattice Jumps.
57+
# Intro.
58+
# Lattice ODEs.
59+
# Lattice Jumps.
6460
],
6561
# "Developer Documentation" => Any[
6662
# # Contributor's guide.

ext/CatalystBifurcationKitExtension.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ import BifurcationKit as BK
77
# Creates and exports hc_steady_states function.
88
include("CatalystBifurcationKitExtension/bifurcation_kit_extension.jl")
99

10-
end
10+
end

ext/CatalystBifurcationKitExtension/bifurcation_kit_extension.jl

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,27 @@
22

33
# Creates a BifurcationProblem, using a ReactionSystem as an input.
44
function BK.BifurcationProblem(rs::ReactionSystem, u0_bif, ps, bif_par, args...;
5-
plot_var=nothing, record_from_solution=BK.record_sol_default, jac=true, u0=[], kwargs...)
6-
if !isautonomous(rs)
5+
plot_var = nothing, record_from_solution = BK.record_sol_default, jac = true, u0 = [], kwargs...)
6+
if !isautonomous(rs)
77
error("Attempting to create a `BifurcationProblem` for a non-autonomous system (e.g. where some rate depend on $(rs.iv)). This is not possible.")
88
end
99

1010
# Converts symbols to symbolics.
1111
(bif_par isa Symbol) && (bif_par = ModelingToolkit.get_var_to_name(rs)[bif_par])
1212
(plot_var isa Symbol) && (plot_var = ModelingToolkit.get_var_to_name(rs)[plot_var])
13-
((u0_bif isa Vector{<:Pair{Symbol,<:Any}}) || (u0_bif isa Dict{Symbol, <:Any})) && (u0_bif = symmap_to_varmap(rs, u0_bif))
14-
((ps isa Vector{<:Pair{Symbol,<:Any}}) || (ps isa Dict{Symbol, <:Any})) && (ps = symmap_to_varmap(rs, ps))
15-
((u0 isa Vector{<:Pair{Symbol,<:Any}}) || (u0 isa Dict{Symbol, <:Any})) && (u0 = symmap_to_varmap(rs, u0))
13+
((u0_bif isa Vector{<:Pair{Symbol, <:Any}}) || (u0_bif isa Dict{Symbol, <:Any})) &&
14+
(u0_bif = symmap_to_varmap(rs, u0_bif))
15+
((ps isa Vector{<:Pair{Symbol, <:Any}}) || (ps isa Dict{Symbol, <:Any})) &&
16+
(ps = symmap_to_varmap(rs, ps))
17+
((u0 isa Vector{<:Pair{Symbol, <:Any}}) || (u0 isa Dict{Symbol, <:Any})) &&
18+
(u0 = symmap_to_varmap(rs, u0))
1619

1720
# Creates NonlinearSystem.
1821
Catalyst.conservationlaw_errorcheck(rs, vcat(ps, u0))
19-
nsys = complete(convert(NonlinearSystem, rs; remove_conserved=true, defaults=Dict(u0)))
22+
nsys = complete(convert(
23+
NonlinearSystem, rs; remove_conserved = true, defaults = Dict(u0)))
2024

2125
# Makes BifurcationProblem (this call goes through the ModelingToolkit-based BifurcationKit extension).
22-
return BK.BifurcationProblem(nsys, u0_bif, ps, bif_par, args...; plot_var=plot_var,
23-
record_from_solution=record_from_solution, jac=jac, kwargs...)
24-
end
26+
return BK.BifurcationProblem(nsys, u0_bif, ps, bif_par, args...; plot_var = plot_var,
27+
record_from_solution = record_from_solution, jac = jac, kwargs...)
28+
end

ext/CatalystHomotopyContinuationExtension.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ import Symbolics: unwrap, wrap, Rewriters, symtype, issym, istree
1111
# Creates and exports hc_steady_states function.
1212
include("CatalystHomotopyContinuationExtension/homotopy_continuation_extension.jl")
1313

14-
end
14+
end

ext/CatalystHomotopyContinuationExtension/homotopy_continuation_extension.jl

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ Notes:
3535
- Homotopy-based steady state finding only works when all rates are rational polynomials (e.g. constant, linear, mm, or hill functions).
3636
```
3737
"""
38-
function Catalyst.hc_steady_states(rs::ReactionSystem, ps; filter_negative=true, neg_thres=-1e-20, u0=[], kwargs...)
39-
if !isautonomous(rs)
38+
function Catalyst.hc_steady_states(rs::ReactionSystem, ps; filter_negative = true,
39+
neg_thres = -1e-20, u0 = [], kwargs...)
40+
if !isautonomous(rs)
4041
error("Attempting to compute steady state for a non-autonomous system (e.g. where some rate depend on $(rs.iv)). This is not possible.")
4142
end
4243
ss_poly = steady_state_polynomial(rs, ps, u0)
@@ -49,10 +50,11 @@ end
4950
function steady_state_polynomial(rs::ReactionSystem, ps, u0)
5051
rs = Catalyst.expand_registered_functions(rs)
5152
ns = complete(convert(NonlinearSystem, rs; remove_conserved = true))
52-
pre_varmap = [symmap_to_varmap(rs,u0)..., symmap_to_varmap(rs,ps)...]
53+
pre_varmap = [symmap_to_varmap(rs, u0)..., symmap_to_varmap(rs, ps)...]
5354
Catalyst.conservationlaw_errorcheck(rs, pre_varmap)
54-
p_vals = ModelingToolkit.varmap_to_vars(pre_varmap, parameters(ns); defaults = ModelingToolkit.defaults(ns))
55-
p_dict = Dict(parameters(ns) .=> p_vals)
55+
p_vals = ModelingToolkit.varmap_to_vars(
56+
pre_varmap, parameters(ns); defaults = ModelingToolkit.defaults(ns))
57+
p_dict = Dict(parameters(ns) .=> p_vals)
5658
eqs_pars_funcs = vcat(equations(ns), conservedequations(rs))
5759
eqs = map(eq -> substitute(eq.rhs - eq.lhs, p_dict), eqs_pars_funcs)
5860
eqs_intexp = make_int_exps.(eqs)
@@ -61,12 +63,14 @@ function steady_state_polynomial(rs::ReactionSystem, ps, u0)
6163
end
6264

6365
# Parses and expression and return a version where any exponents that are Float64 (but an int, like 2.0) are turned into Int64s.
64-
make_int_exps(expr) = wrap(Rewriters.Postwalk(Rewriters.PassThrough(___make_int_exps))(unwrap(expr))).val
66+
function make_int_exps(expr)
67+
wrap(Rewriters.Postwalk(Rewriters.PassThrough(___make_int_exps))(unwrap(expr))).val
68+
end
6569
function ___make_int_exps(expr)
6670
!istree(expr) && return expr
67-
if (operation(expr) == ^)
71+
if (operation(expr) == ^)
6872
if isinteger(arguments(expr)[2])
69-
return arguments(expr)[1] ^ Int64(arguments(expr)[2])
73+
return arguments(expr)[1]^Int64(arguments(expr)[2])
7074
else
7175
error("An non integer ($(arguments(expr)[2])) was found as a variable exponent. Non-integer exponents are not supported for homotopy continuation based steady state finding.")
7276
end
@@ -95,7 +99,7 @@ function reorder_sols!(sols, ss_poly, rs::ReactionSystem)
9599
end
96100

97101
# Filters away solutions with negative species concentrations (and for neg_thres < val < 0.0, sets val=0.0).
98-
function filter_negative_f(sols; neg_thres=-1e-20)
102+
function filter_negative_f(sols; neg_thres = -1e-20)
99103
for sol in sols, idx in 1:length(sol)
100104
(neg_thres < sol[idx] < 0) && (sol[idx] = 0)
101105
end
@@ -104,9 +108,13 @@ end
104108

105109
# Sometimes (when polynomials are created from coupled CRN/DAEs), the steady state polynomial have the wrong type.
106110
# This converts it to the correct type, which homotopy continuation can handle.
107-
const WRONG_POLY_TYPE = Vector{DynamicPolynomials.Polynomial{DynamicPolynomials.Commutative{DynamicPolynomials.CreationOrder}, DynamicPolynomials.Graded{DynamicPolynomials.LexOrder}}}
108-
const CORRECT_POLY_TYPE = Vector{DynamicPolynomials.Polynomial{DynamicPolynomials.Commutative{DynamicPolynomials.CreationOrder}, DynamicPolynomials.Graded{DynamicPolynomials.LexOrder}, Float64}}
111+
const WRONG_POLY_TYPE = Vector{DynamicPolynomials.Polynomial{
112+
DynamicPolynomials.Commutative{DynamicPolynomials.CreationOrder},
113+
DynamicPolynomials.Graded{DynamicPolynomials.LexOrder}}}
114+
const CORRECT_POLY_TYPE = Vector{DynamicPolynomials.Polynomial{
115+
DynamicPolynomials.Commutative{DynamicPolynomials.CreationOrder},
116+
DynamicPolynomials.Graded{DynamicPolynomials.LexOrder}, Float64}}
109117
function poly_type_convert(ss_poly)
110118
(typeof(ss_poly) == WRONG_POLY_TYPE) && return convert(CORRECT_POLY_TYPE, ss_poly)
111119
return ss_poly
112-
end
120+
end

ext/CatalystStructuralIdentifiabilityExtension.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ import StructuralIdentifiability as SI
77
# Creates and exports hc_steady_states function.
88
include("CatalystStructuralIdentifiabilityExtension/structural_identifiability_extension.jl")
99

10-
end
10+
end

ext/CatalystStructuralIdentifiabilityExtension/structural_identifiability_extension.jl

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ Notes:
2626
- This function is part of the StructuralIdentifiability.jl extension. StructuralIdentifiability.jl must be imported to access it.
2727
- `measured_quantities` and `known_p` input may also be symbolic (e.g. measured_quantities = [rs.X])
2828
"""
29-
function Catalyst.make_si_ode(rs::ReactionSystem; measured_quantities = [], known_p = [],
30-
ignore_no_measured_warn = false, remove_conserved = true)
29+
function Catalyst.make_si_ode(rs::ReactionSystem; measured_quantities = [], known_p = [],
30+
ignore_no_measured_warn = false, remove_conserved = true)
3131
# Creates a MTK ODESystem, and a list of measured quantities (there are equations).
3232
# Gives these to SI to create an SI ode model of its preferred form.
3333
osys, conseqs, _ = make_osys(rs; remove_conserved)
34-
measured_quantities = make_measured_quantities(rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
34+
measured_quantities = make_measured_quantities(
35+
rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
3536
return SI.mtk_to_si(osys, measured_quantities)[1]
3637
end
3738

@@ -62,16 +63,19 @@ Notes:
6263
- This function is part of the StructuralIdentifiability.jl extension. StructuralIdentifiability.jl must be imported to access it.
6364
- `measured_quantities` and `known_p` input may also be symbolic (e.g. measured_quantities = [rs.X])
6465
"""
65-
function SI.assess_local_identifiability(rs::ReactionSystem, args...; measured_quantities = [],
66-
known_p = [], funcs_to_check = Vector(), remove_conserved = true,
67-
ignore_no_measured_warn=false, kwargs...)
66+
function SI.assess_local_identifiability(
67+
rs::ReactionSystem, args...; measured_quantities = [],
68+
known_p = [], funcs_to_check = Vector(), remove_conserved = true,
69+
ignore_no_measured_warn = false, kwargs...)
6870
# Creates a ODESystem, list of measured quantities, and functions to check, of SI's preferred form.
6971
osys, conseqs, vars = make_osys(rs; remove_conserved)
70-
measured_quantities = make_measured_quantities(rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
72+
measured_quantities = make_measured_quantities(
73+
rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
7174
funcs_to_check = make_ftc(funcs_to_check, conseqs, vars)
7275

7376
# Computes identifiability and converts it to a easy to read form.
74-
out = SI.assess_local_identifiability(osys, args...; measured_quantities, funcs_to_check, kwargs...)
77+
out = SI.assess_local_identifiability(
78+
osys, args...; measured_quantities, funcs_to_check, kwargs...)
7579
return make_output(out, funcs_to_check, reverse.(conseqs))
7680
end
7781

@@ -100,16 +104,19 @@ Notes:
100104
- This function is part of the StructuralIdentifiability.jl extension. StructuralIdentifiability.jl must be imported to access it.
101105
- `measured_quantities` and `known_p` input may also be symbolic (e.g. measured_quantities = [rs.X])
102106
"""
103-
function SI.assess_identifiability(rs::ReactionSystem, args...; measured_quantities = [], known_p = [],
104-
funcs_to_check = Vector(), remove_conserved = true,
105-
ignore_no_measured_warn=false, kwargs...)
107+
function SI.assess_identifiability(
108+
rs::ReactionSystem, args...; measured_quantities = [], known_p = [],
109+
funcs_to_check = Vector(), remove_conserved = true,
110+
ignore_no_measured_warn = false, kwargs...)
106111
# Creates a ODESystem, list of measured quantities, and functions to check, of SI's preferred form.
107112
osys, conseqs, vars = make_osys(rs; remove_conserved)
108-
measured_quantities = make_measured_quantities(rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
113+
measured_quantities = make_measured_quantities(
114+
rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
109115
funcs_to_check = make_ftc(funcs_to_check, conseqs, vars)
110116

111117
# Computes identifiability and converts it to a easy to read form.
112-
out = SI.assess_identifiability(osys, args...; measured_quantities, funcs_to_check, kwargs...)
118+
out = SI.assess_identifiability(
119+
osys, args...; measured_quantities, funcs_to_check, kwargs...)
113120
return make_output(out, funcs_to_check, reverse.(conseqs))
114121
end
115122

@@ -138,12 +145,14 @@ Notes:
138145
- This function is part of the StructuralIdentifiability.jl extension. StructuralIdentifiability.jl must be imported to access it.
139146
- `measured_quantities` and `known_p` input may also be symbolic (e.g. measured_quantities = [rs.X])
140147
"""
141-
function SI.find_identifiable_functions(rs::ReactionSystem, args...; measured_quantities = [],
142-
known_p = [], remove_conserved = true, ignore_no_measured_warn=false,
143-
kwargs...)
148+
function SI.find_identifiable_functions(
149+
rs::ReactionSystem, args...; measured_quantities = [],
150+
known_p = [], remove_conserved = true, ignore_no_measured_warn = false,
151+
kwargs...)
144152
# Creates a ODESystem, and list of measured quantities, of SI's preferred form.
145153
osys, conseqs = make_osys(rs; remove_conserved)
146-
measured_quantities = make_measured_quantities(rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
154+
measured_quantities = make_measured_quantities(
155+
rs, measured_quantities, known_p, conseqs; ignore_no_measured_warn)
147156

148157
# Computes identifiable functions and converts it to a easy to read form.
149158
out = SI.find_identifiable_functions(osys, args...; measured_quantities, kwargs...)
@@ -154,10 +163,11 @@ end
154163

155164
# From a reaction system, creates the corresponding MTK-style ODESystem for SI application
156165
# Also compute the, later needed, conservation law equations and list of system symbols (unknowns and parameters).
157-
function make_osys(rs::ReactionSystem; remove_conserved=true)
166+
function make_osys(rs::ReactionSystem; remove_conserved = true)
158167
# Creates the ODESystem corresponding to the ReactionSystem (expanding functions and flattening it).
159168
# Creates a list of the systems all symbols (unknowns and parameters).
160-
ModelingToolkit.iscomplete(rs) || error("Identifiability should only be computed for complete systems. A ReactionSystem can be marked as complete using the `complete` function.")
169+
ModelingToolkit.iscomplete(rs) ||
170+
error("Identifiability should only be computed for complete systems. A ReactionSystem can be marked as complete using the `complete` function.")
161171
rs = complete(Catalyst.expand_registered_functions(flatten(rs)))
162172
osys = complete(convert(ODESystem, rs; remove_conserved))
163173
vars = [unknowns(rs); parameters(rs)]
@@ -177,10 +187,11 @@ end
177187
# Creates a list of measured quantities of a form that SI can read.
178188
# Each measured quantity must have a form like:
179189
# `obs_var ~ X` # (Here, `obs_var` is a variable, and X is whatever we can measure).
180-
function make_measured_quantities(rs::ReactionSystem, measured_quantities::Vector{T}, known_p::Vector{S},
181-
conseqs; ignore_no_measured_warn=false) where {T,S}
190+
function make_measured_quantities(
191+
rs::ReactionSystem, measured_quantities::Vector{T}, known_p::Vector{S},
192+
conseqs; ignore_no_measured_warn = false) where {T, S}
182193
# Warning if the user didn't give any measured quantities.
183-
if ignore_no_measured_warn || isempty(measured_quantities)
194+
if ignore_no_measured_warn || isempty(measured_quantities)
184195
@warn "No measured quantity provided to the `measured_quantities` argument, any further identifiability analysis will likely fail. You can disable this warning by setting `ignore_no_measured_warn=true`."
185196
end
186197

@@ -192,7 +203,8 @@ function make_measured_quantities(rs::ReactionSystem, measured_quantities::Vecto
192203
# Creates one internal observation variable for each measured quantity (`___internal_observables`).
193204
# Creates a vector of equations, setting each measured quantity equal to one observation variable.
194205
@variables t (___internal_observables(Catalyst.get_iv(rs)))[1:length(mqs)]
195-
return Equation[(q isa Equation) ? q : (___internal_observables[i] ~ q) for (i,q) in enumerate(mqs)]
206+
return Equation[(q isa Equation) ? q : (___internal_observables[i] ~ q)
207+
for (i, q) in enumerate(mqs)]
196208
end
197209

198210
# Creates the functions that we wish to check for identifiability.
@@ -211,9 +223,9 @@ end
211223
function make_output(out, funcs_to_check, conseqs)
212224
funcs_to_check = vector_subs(funcs_to_check, conseqs)
213225
out = Dict(zip(vector_subs(keys(out), conseqs), values(out)))
214-
sortdict = Dict(ftc => i for (i,ftc) in enumerate(funcs_to_check))
215-
return sort(out; by = x -> sortdict[x])
226+
sortdict = Dict(ftc => i for (i, ftc) in enumerate(funcs_to_check))
227+
return sort(out; by = x -> sortdict[x])
216228
end
217229

218230
# For a vector of expressions and a conservation law, substitutes the law into every equation.
219-
vector_subs(eqs, subs) = [substitute(eq, subs) for eq in eqs]
231+
vector_subs(eqs, subs) = [substitute(eq, subs) for eq in eqs]

0 commit comments

Comments
 (0)