|
1 |
| -using ModelingToolkit, LinearAlgebra, Test |
| 1 | +using ModelingToolkit, LinearAlgebra, DiffEqJump, Test |
| 2 | +MT = ModelingToolkit |
2 | 3 |
|
3 | 4 | @parameters t k[1:20]
|
4 | 5 | @variables A(t) B(t) C(t) D(t)
|
@@ -79,3 +80,60 @@ du2 = sf.f(u,p,t)
|
79 | 80 | @test norm(du-du2) < 100*eps()
|
80 | 81 | G2 = sf.g(u,p,t)
|
81 | 82 | @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