Skip to content

Commit 8f2afc2

Browse files
Merge pull request #358 from TorkelE/add_reaction_to_jump_tests
Add tests for Jumps created through reactions.
2 parents 4e2e1db + 85fb902 commit 8f2afc2

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

test/reactionsystem.jl

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using ModelingToolkit, LinearAlgebra, Test
1+
using ModelingToolkit, LinearAlgebra, DiffEqJump, Test
2+
MT = ModelingToolkit
23

34
@parameters t k[1:20]
45
@variables A(t) B(t) C(t) D(t)
@@ -79,3 +80,60 @@ du2 = sf.f(u,p,t)
7980
@test norm(du-du2) < 100*eps()
8081
G2 = sf.g(u,p,t)
8182
@test norm(G-G2) < 100*eps()
83+
84+
# test with JumpSystem
85+
js = convert(JumpSystem, rs)
86+
87+
@test all(map(type -> type <: DiffEqJump.MassActionJump, typeof.(js.eqs[1:14])))
88+
@test all(map(type -> type <: DiffEqJump.ConstantRateJump, typeof.(js.eqs[15:18])))
89+
@test all(map(type -> type <: DiffEqJump.VariableRateJump, typeof.(js.eqs[19:20])))
90+
91+
pars = rand(length(k)); u0 = rand(1:100,4); time = rand();
92+
jumps = Vector{Union{ConstantRateJump, MassActionJump, VariableRateJump}}(undef,length(js.eqs))
93+
94+
jumps[1] = MassActionJump(pars[1], Vector{Pair{Int,Int}}(), [1 => 1]);
95+
jumps[2] = MassActionJump(pars[2], [2 => 1], [2 => -1]);
96+
jumps[3] = MassActionJump(pars[3], [1 => 1], [1 => -1, 3 => 1]);
97+
jumps[4] = MassActionJump(pars[4], [3 => 1], [1 => 1, 2 => 1, 3 => -1]);
98+
jumps[5] = MassActionJump(pars[5], [3 => 1], [1 => 2, 3 => -1]);
99+
jumps[6] = MassActionJump(pars[6], [1 => 1, 2 => 1], [1 => -1, 2 => -1, 3 => 1]);
100+
jumps[7] = MassActionJump(pars[7], [2 => 2], [1 => 1, 2 => -2]);
101+
jumps[8] = MassActionJump(pars[8], [1 => 1, 2 => 1], [2 => -1, 3 => 1]);
102+
jumps[9] = MassActionJump(pars[9], [1 => 1, 2 => 1], [1 => -1, 2 => -1, 3 => 1, 4 => 1]);
103+
jumps[10] = MassActionJump(pars[10], [1 => 2], [1 => -2, 3 => 1, 4 => 1]);
104+
jumps[11] = MassActionJump(pars[11], [1 => 2], [1 => -1, 2 => 1]);
105+
jumps[12] = MassActionJump(pars[12], [1 => 1, 2 => 3, 3 => 4], [1 => -1, 2 => -3, 3 => -2, 4 => 3]);
106+
jumps[13] = MassActionJump(pars[13], [1 => 3, 2 => 1], [1 => -3, 2 => -1]);
107+
jumps[14] = MassActionJump(pars[14], Vector{Pair{Int,Int}}(), [1 => 2]);
108+
109+
jumps[15] = ConstantRateJump((u,p,t) -> p[15]*u[1]/(2+u[1]), integrator -> (integrator.u[1] -= 1))
110+
jumps[16] = ConstantRateJump((u,p,t) -> p[16], integrator -> (integrator.u[1] -= 1; integrator.u[2] += 1;))
111+
jumps[17] = ConstantRateJump((u,p,t) -> p[17]*u[1]*exp(u[2])*binomial(u[3],2), integrator -> (integrator.u[3] -= 2; integrator.u[4] += 1))
112+
jumps[18] = ConstantRateJump((u,p,t) -> p[18]*u[2], integrator -> (integrator.u[2] += 2))
113+
114+
jumps[19] = VariableRateJump((u,p,t) -> p[19]*u[1]*t, integrator -> (integrator.u[1] -= 1; integrator.u[2] += 1))
115+
jumps[20] = VariableRateJump((u,p,t) -> p[20]*t*u[1]*binomial(u[2],2)*u[3], integrator -> (integrator.u[2] -= 2; integrator.u[3] -= 1; integrator.u[4] += 2))
116+
117+
statetoid = Dict(convert(Variable,state) => i for (i,state) in enumerate(states(js)))
118+
parammap = map((x,y)->Pair(x(),y),parameters(js),pars)
119+
for i = 1:14
120+
maj = MT.assemble_maj(js, js.eqs[i], statetoid,parammap)
121+
@test abs(jumps[i].scaled_rates - maj.scaled_rates) < 10*eps()
122+
@test jumps[i].reactant_stoch == maj.reactant_stoch
123+
@test jumps[i].net_stoch == maj.net_stoch
124+
end
125+
for i = 15:18
126+
(i==16) && continue
127+
crj = MT.assemble_crj(js, js.eqs[i], statetoid)
128+
@test abs(crj.rate(u0,p,time) - jumps[i].rate(u0,p,time)) < 10*eps()
129+
fake_integrator1 = (u=zeros(4),p=p,t=0); fake_integrator2 = deepcopy(fake_integrator1);
130+
crj.affect!(fake_integrator1); jumps[i].affect!(fake_integrator2);
131+
@test fake_integrator1 == fake_integrator2
132+
end
133+
for i = 19:20
134+
crj = MT.assemble_vrj(js, js.eqs[i], statetoid)
135+
@test abs(crj.rate(u0,p,time) - jumps[i].rate(u0,p,time)) < 10*eps()
136+
fake_integrator1 = (u=zeros(4),p=p,t=0.); fake_integrator2 = deepcopy(fake_integrator1);
137+
crj.affect!(fake_integrator1); jumps[i].affect!(fake_integrator2);
138+
@test fake_integrator1 == fake_integrator2
139+
end

0 commit comments

Comments
 (0)