Skip to content

Commit 7fb02c9

Browse files
committed
init
1 parent 8cbc581 commit 7fb02c9

File tree

3 files changed

+72
-47
lines changed

3 files changed

+72
-47
lines changed

docs/src/api/catalyst_api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ latexify(rn; form=:sde)
251251
(As of writing this, an upstream bug causes the SDE form to be erroneously
252252
displayed as the ODE form)
253253

254+
Finally, another optional argument (`expand_functions=true`) automatically expands by_catalyst defined functions (such as `mm`). To disable this, set `expand_functions=false`.
255+
254256
If [Graphviz](https://graphviz.org/) is installed and commandline accessible, it
255257
can be used to create and save network diagrams using [`Graph`](@ref) and
256258
[`savegraph`](@ref).

src/latexify_recipes.jl

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,6 @@ end
77

88
const LATEX_DEFS = CatalystLatexParams()
99

10-
# Implements handling of registered functions.
11-
const mm_names = ([:mm])
12-
const mmr_names = ([:mmr])
13-
const hill_names = ([:hill])
14-
const hillr_names = ([:hillr])
15-
const hillar_names = ([:hillar])
16-
17-
function make_mm_exp(expr::Expr)
18-
:($(expr.args[3]) * $(expr.args[2]) / ($(expr.args[4]) + $(expr.args[2])))
19-
end
20-
function make_mmr_exp(expr::Expr)
21-
:($(expr.args[3]) * $(expr.args[4]) / ($(expr.args[4]) + $(expr.args[2])))
22-
end
23-
function make_hill_exp(expr::Expr)
24-
:($(expr.args[3]) * ($(expr.args[2])^$(expr.args[5])) /
25-
($(expr.args[4])^$(expr.args[5]) + $(expr.args[2])^$(expr.args[5])))
26-
end
27-
function make_hillr_exp(expr::Expr)
28-
:($(expr.args[3]) * ($(expr.args[4])^$(expr.args[5])) /
29-
($(expr.args[4])^$(expr.args[5]) + $(expr.args[2])^$(expr.args[5])))
30-
end
31-
function make_hillar_exp(expr::Expr)
32-
:($(expr.args[4]) * ($(expr.args[2])^$(expr.args[6])) /
33-
($(expr.args[5])^$(expr.args[6]) + $(expr.args[2])^$(expr.args[6]) +
34-
$(expr.args[3])^$(expr.args[6])))
35-
end
36-
3710
#Recursively traverses an expression and removes things like X^1, 1*X. Will not actually have any effect on the expression when used as a function, but will make it much easier to look at it for debugging, as well as if it is transformed to LaTeX code.
3811
function recursive_clean!(expr)
3912
(expr isa Symbol) && (expr == :no___noise___scaling) && (return 1)
@@ -65,11 +38,6 @@ function recursive_clean!(expr)
6538
end
6639
if expr.head == :call
6740
(expr.args[1] == :/) && (expr.args[3] == 1) && (return expr.args[2])
68-
in(expr.args[1], mm_names) && return make_mm_exp(expr)
69-
in(expr.args[1], mmr_names) && return make_mmr_exp(expr)
70-
in(expr.args[1], hill_names) && return make_hill_exp(expr)
71-
in(expr.args[1], hillr_names) && return make_hillr_exp(expr)
72-
in(expr.args[1], hillar_names) && return make_hillar_exp(expr)
7341
(expr.args[1] == :binomial) && (expr.args[3] == 1) && return expr.args[2]
7442
#@isdefined($(expr.args[1])) || error("Function $(expr.args[1]) not defined.")
7543
end
@@ -206,7 +174,8 @@ function chemical_arrows(rn::ReactionSystem; expand = true,
206174
return latexstr
207175
end
208176

209-
@latexrecipe function f(rs::ReactionSystem; form = :reactions)
177+
@latexrecipe function f(rs::ReactionSystem; form = :reactions, expand_functions=true)
178+
expand_functions && (rs = expand_registered_functions(rs))
210179
if form == :reactions # Returns chemical reaction network code.
211180
cdot --> false
212181
env --> :chem

test/visualization/latexify.jl

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,35 @@ let
4242
end
4343

4444
# Latexify.@generate_test latexify(rn)
45-
@test_broken latexify(rn) == replace(
45+
@test_broken latexify(rn; expand_functions = false) == replace(
4646
raw"\begin{align*}
47-
\varnothing &\xrightarrow{\frac{v1 X4^{n1}}{K1^{n1} + X4^{n1}} \frac{v1 K1^{n1}}{K1^{n1} + X2^{n1}}} \mathrm{X1} \\
48-
\varnothing &\xrightarrow{\frac{v2 X5^{n2}}{K2^{n2} + X5^{n2}}} \mathrm{X2} \\
49-
\varnothing &\xrightarrow{\frac{v3 X3^{n3}}{K3^{n3} + X3^{n3}}} \mathrm{X3} \\
50-
\varnothing &\xrightarrow{\frac{v4 K4^{n4}}{K4^{n4} + X1^{n4}}} \mathrm{X4} \\
51-
\varnothing &\xrightarrow{\frac{v5 X2^{n5}}{K5^{n5} + X2^{n5}}} \mathrm{X5} \\
52-
\varnothing &\xrightarrow{\frac{v6 X1^{n6}}{K6^{n6} + X1^{n6} + X6^{n6}}} \mathrm{X6} \\
47+
\varnothing &\xrightarrow{\frac{X4^{n1} v1^{2} K1^{n1}}{\left( K1^{n1} + X4^{n1} \right) \left( K1^{n1} + X2^{n1} \right)}} \mathrm{X1} \\
48+
\varnothing &\xrightarrow{\mathrm{hill}\left( X5, v2, K2, n2 \right)} \mathrm{X2} \\
49+
\varnothing &\xrightarrow{\mathrm{hill}\left( X3, v3, K3, n3 \right)} \mathrm{X3} \\
50+
\varnothing &\xrightarrow{\mathrm{hillr}\left( X1, v4, K4, n4 \right)} \mathrm{X4} \\
51+
\varnothing &\xrightarrow{\mathrm{hill}\left( X2, v5, K5, n5 \right)} \mathrm{X5} \\
52+
\varnothing &\xrightarrow{\mathrm{hillar}\left( X1, X6, v6, K6, n6 \right)} \mathrm{X6} \\
53+
\mathrm{X2} &\xrightleftharpoons[k2]{k1} \mathrm{X1} + 2 \mathrm{X4} \\
54+
\mathrm{X4} &\xrightleftharpoons[k4]{k3} \mathrm{X3} \\
55+
3 \mathrm{X5} + \mathrm{X1} &\xrightleftharpoons[k6]{k5} \mathrm{X2} \\
56+
\mathrm{X1} &\xrightarrow{d1} \varnothing \\
57+
\mathrm{X2} &\xrightarrow{d2} \varnothing \\
58+
\mathrm{X3} &\xrightarrow{d3} \varnothing \\
59+
\mathrm{X4} &\xrightarrow{d4} \varnothing \\
60+
\mathrm{X5} &\xrightarrow{d5} \varnothing \\
61+
\mathrm{X6} &\xrightarrow{d6} \varnothing
62+
\end{align*}
63+
", "\r\n"=>"\n")
64+
65+
#Latexify.@generate_test latexify(rn; expand_functions=false)
66+
@test_broken latexify(rn; expand_functions = false) == replace(
67+
raw"\begin{align*}
68+
\varnothing &\xrightarrow{\frac{X4^{n1} v1^{2} K1^{n1}}{\left( K1^{n1} + X4^{n1} \right) \left( K1^{n1} + X2^{n1} \right)}} \mathrm{X1} \\
69+
\varnothing &\xrightarrow{\mathrm{mm}\left( X5, v2, K2 \right)} \mathrm{X2} \\
70+
\varnothing &\xrightarrow{\mathrm{mmr}\left( X3, v3, K3 \right)} \mathrm{X3} \\
71+
\varnothing &\xrightarrow{\mathrm{hillr}\left( X1, v4, K4, n4 \right)} \mathrm{X4} \\
72+
\varnothing &\xrightarrow{\mathrm{hill}\left( X2, v5, K5, n5 \right)} \mathrm{X5} \\
73+
\varnothing &\xrightarrow{\mathrm{hillar}\left( X1, X6, v6, K6, n6 \right)} \mathrm{X6} \\
5374
\mathrm{X2} &\xrightleftharpoons[k2]{k1} \mathrm{X1} + 2 \mathrm{X4} \\
5475
\mathrm{X4} &\xrightleftharpoons[k4]{k3} \mathrm{X3} \\
5576
3 \mathrm{X5} + \mathrm{X1} &\xrightleftharpoons[k6]{k5} \mathrm{X2} \\
@@ -63,14 +84,14 @@ let
6384
", "\r\n"=>"\n")
6485

6586
# Latexify.@generate_test latexify(rn, mathjax=false)
66-
@test_broken latexify(rn, mathjax = false) == replace(
87+
@test latexify(rn, mathjax = false) == replace(
6788
raw"\begin{align*}
68-
\varnothing &\xrightarrow{\frac{v1 X4^{n1}}{K1^{n1} + X4^{n1}} \frac{v1 K1^{n1}}{K1^{n1} + X2^{n1}}} \mathrm{X1} \\
69-
\varnothing &\xrightarrow{\frac{v2 X5^{n2}}{K2^{n2} + X5^{n2}}} \mathrm{X2} \\
70-
\varnothing &\xrightarrow{\frac{v3 X3^{n3}}{K3^{n3} + X3^{n3}}} \mathrm{X3} \\
89+
\varnothing &\xrightarrow{\frac{X4^{n1} v1^{2} K1^{n1}}{\left( K1^{n1} + X4^{n1} \right) \left( K1^{n1} + X2^{n1} \right)}} \mathrm{X1} \\
90+
\varnothing &\xrightarrow{\frac{X5 v2}{K2 + X5}} \mathrm{X2} \\
91+
\varnothing &\xrightarrow{\frac{K3 v3}{K3 + X3}} \mathrm{X3} \\
7192
\varnothing &\xrightarrow{\frac{v4 K4^{n4}}{K4^{n4} + X1^{n4}}} \mathrm{X4} \\
72-
\varnothing &\xrightarrow{\frac{v5 X2^{n5}}{K5^{n5} + X2^{n5}}} \mathrm{X5} \\
73-
\varnothing &\xrightarrow{\frac{v6 X1^{n6}}{K6^{n6} + X1^{n6} + X6^{n6}}} \mathrm{X6} \\
93+
\varnothing &\xrightarrow{\frac{v5 X2^{n5}}{X2^{n5} + K5^{n5}}} \mathrm{X5} \\
94+
\varnothing &\xrightarrow{\frac{v6 X1^{n6}}{X6^{n6} + K6^{n6} + X1^{n6}}} \mathrm{X6} \\
7495
\mathrm{X2} &\xrightleftharpoons[k2]{k1} \mathrm{X1} + 2 \mathrm{X4} \\
7596
\mathrm{X4} &\xrightleftharpoons[k4]{k3} \mathrm{X3} \\
7697
3 \mathrm{X5} + \mathrm{X1} &\xrightleftharpoons[k6]{k5} \mathrm{X2} \\
@@ -134,13 +155,46 @@ let
134155
end
135156

136157

158+
# Test using various `env` options.
159+
let
160+
rn = @reaction_network begin
161+
(p,d), 0 <--> X
162+
end
163+
chem_latex = latexify(rn; env = :arrows)
164+
@test chem_latex == latexify(rn; env = :chem)
165+
@test chem_latex == latexify(rn; env = :chemical)
166+
@test chem_latex == latexify(rn; env = :arrow)
167+
@test_throws Exception latexify(rn; env = :wrong_env)
168+
end
169+
170+
# Tests that the `mathrm` option affects the output.
171+
let
172+
rn = @reaction_network begin
173+
(k1,k2), 2X <--> X2
174+
end
175+
@test latexify(rn; mathrm = true) != latexify(rn; mathrm = false)
176+
end
177+
178+
# Tests for system with parametric stoichiometry.
179+
let
180+
rn = @reaction_network begin
181+
p, 0 --> n*X
182+
end
183+
184+
@test_broken latexify(rn) == replace(
185+
raw"\begin{align*}
186+
\varnothing &\xrightarrow{p} (m + n)\mathrm{X}
187+
\end{align*}
188+
", "\r\n"=>"\n")
189+
end
190+
137191
### Tests `form` Option ###
138192

139193
# Check for large number of networks.
140194
let
141195
for rn in reaction_networks_standard
142196
@test latexify(rn)==latexify(rn; form=:reactions)
143-
#@test_broken latexify(convert(ODESystem,rn)) == latexify(rn; form=:ode) # Slight difference due to some latexify weirdity. Both displays fine though
197+
#@test_broken latexify(convert(ODESystem,rn)) == latexify(rn; form=:ode) # Slight difference due to some latexify weirdly. Both displays fine though
144198
end
145199
end
146200

0 commit comments

Comments
 (0)