|
| 1 | +### Prepares Tests ### |
| 2 | + |
| 3 | +# Fetch packages |
| 4 | +using ModelingToolkit, JumpProcesses, NonlinearSolve, OrdinaryDiffEq, StaticArrays, |
| 5 | + SteadyStateDiffEq, StochasticDiffEq, Test |
| 6 | +using ModelingToolkit: t_nounits as t, D_nounits as D |
| 7 | + |
| 8 | +# Sets rnd number. |
| 9 | +using StableRNGs |
| 10 | +rng = StableRNG(12345) |
| 11 | +seed = rand(rng, 1:100) |
| 12 | + |
| 13 | +### Basic Tests ### |
| 14 | + |
| 15 | +# Prepares a models and initial conditions/parameters (of different forms) to be used as problem inputs. |
| 16 | +begin |
| 17 | + # Prepare system components. |
| 18 | + @parameters kp kd k1 k2=0.5 Z0 |
| 19 | + @variables X(t) Y(t) Z(t)=Z0 |
| 20 | + alg_eqs = [ |
| 21 | + 0 ~ kp - k1 * X + k2 * Y - kd * X, |
| 22 | + 0 ~ -k1 * Y + k1 * X - k2 * Y + k2 * Z, |
| 23 | + 0 ~ k1 * Y - k2 * Z |
| 24 | + ] |
| 25 | + diff_eqs = [ |
| 26 | + D(X) ~ kp - k1 * X + k2 * Y - kd * X, |
| 27 | + D(Y) ~ -k1 * Y + k1 * X - k2 * Y + k2 * Z, |
| 28 | + D(Z) ~ k1 * Y - k2 * Z |
| 29 | + ] |
| 30 | + noise_eqs = fill(0.01, 3, 6) |
| 31 | + jumps = [ |
| 32 | + MassActionJump(kp, Pair{Symbolics.BasicSymbolic{Real}, Int64}[], [X => 1]), |
| 33 | + MassActionJump(kd, [X => 1], [X => -1]), |
| 34 | + MassActionJump(k1, [X => 1], [X => -1, Y => 1]), |
| 35 | + MassActionJump(k2, [Y => 1], [X => 1, Y => -1]), |
| 36 | + MassActionJump(k1, [Y => 1], [Y => -1, Z => 1]), |
| 37 | + MassActionJump(k2, [Z => 1], [Y => 1, Z => -1]) |
| 38 | + ] |
| 39 | + |
| 40 | + # Create systems (without structural_simplify, since that might modify systems to affect intended tests). |
| 41 | + osys = complete(ODESystem(diff_eqs, t; name = :osys)) |
| 42 | + ssys = complete(SDESystem( |
| 43 | + diff_eqs, noise_eqs, t, [X, Y, Z], [kp, kd, k1, k2]; name = :ssys)) |
| 44 | + jsys = complete(JumpSystem(jumps, t, [X, Y, Z], [kp, kd, k1, k2]; name = :jsys)) |
| 45 | + nsys = complete(NonlinearSystem(alg_eqs; name = :nsys)) |
| 46 | + |
| 47 | + u0_alts = [ |
| 48 | + # Vectors not providing default values. |
| 49 | + [X => 4, Y => 5], |
| 50 | + [osys.X => 4, osys.Y => 5], |
| 51 | + # Vectors providing default values. |
| 52 | + [X => 4, Y => 5, Z => 10], |
| 53 | + [osys.X => 4, osys.Y => 5, osys.Z => 10], |
| 54 | + # Static vectors not providing default values. |
| 55 | + SA[X => 4, Y => 5], |
| 56 | + SA[osys.X => 4, osys.Y => 5], |
| 57 | + # Static vectors providing default values. |
| 58 | + SA[X => 4, Y => 5, Z => 10], |
| 59 | + SA[osys.X => 4, osys.Y => 5, osys.Z => 10], |
| 60 | + # Dicts not providing default values. |
| 61 | + Dict([X => 4, Y => 5]), |
| 62 | + Dict([osys.X => 4, osys.Y => 5]), |
| 63 | + # Dicts providing default values. |
| 64 | + Dict([X => 4, Y => 5, Z => 10]), |
| 65 | + Dict([osys.X => 4, osys.Y => 5, osys.Z => 10]), |
| 66 | + # Tuples not providing default values. |
| 67 | + (X => 4, Y => 5), |
| 68 | + (osys.X => 4, osys.Y => 5), |
| 69 | + # Tuples providing default values. |
| 70 | + (X => 4, Y => 5, Z => 10), |
| 71 | + (osys.X => 4, osys.Y => 5, osys.Z => 10) |
| 72 | + ] |
| 73 | + tspan = (0.0, 10.0) |
| 74 | + p_alts = [ |
| 75 | + # Vectors not providing default values. |
| 76 | + [kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10], |
| 77 | + [osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10], |
| 78 | + # Vectors providing default values. |
| 79 | + [kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10], |
| 80 | + [osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.k2 => 0.5, osys.Z0 => 10], |
| 81 | + # Static vectors not providing default values. |
| 82 | + SA[kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10], |
| 83 | + SA[osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10], |
| 84 | + # Static vectors providing default values. |
| 85 | + SA[kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10], |
| 86 | + SA[osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.k2 => 0.5, osys.Z0 => 10], |
| 87 | + # Dicts not providing default values. |
| 88 | + Dict([kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10]), |
| 89 | + Dict([osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10]), |
| 90 | + # Dicts providing default values. |
| 91 | + Dict([kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10]), |
| 92 | + Dict([osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, |
| 93 | + osys.k2 => 0.5, osys.Z0 => 10]), |
| 94 | + # Tuples not providing default values. |
| 95 | + (kp => 1.0, kd => 0.1, k1 => 0.25, Z0 => 10), |
| 96 | + (osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.Z0 => 10), |
| 97 | + # Tuples providing default values. |
| 98 | + (kp => 1.0, kd => 0.1, k1 => 0.25, k2 => 0.5, Z0 => 10), |
| 99 | + (osys.kp => 1.0, osys.kd => 0.1, osys.k1 => 0.25, osys.k2 => 0.5, osys.Z0 => 10) |
| 100 | + ] |
| 101 | +end |
| 102 | + |
| 103 | +# Perform ODE simulations (singular and ensemble). |
| 104 | +let |
| 105 | + # Creates normal and ensemble problems. |
| 106 | + base_oprob = ODEProblem(osys, u0_alts[1], tspan, p_alts[1]) |
| 107 | + base_sol = solve(base_oprob, Tsit5(); saveat = 1.0) |
| 108 | + base_eprob = EnsembleProblem(base_oprob) |
| 109 | + base_esol = solve(base_eprob, Tsit5(); trajectories = 2, saveat = 1.0) |
| 110 | + |
| 111 | + # Simulates problems for all input types, checking that identical solutions are found. |
| 112 | + # test failure. |
| 113 | + for u0 in u0_alts, p in p_alts |
| 114 | + oprob = remake(base_oprob; u0, p) |
| 115 | + @test base_sol == solve(oprob, Tsit5(); saveat = 1.0) |
| 116 | + eprob = remake(base_eprob; u0, p) |
| 117 | + @test base_esol == solve(eprob, Tsit5(); trajectories = 2, saveat = 1.0) |
| 118 | + end |
| 119 | +end |
| 120 | + |
| 121 | +# Solves a nonlinear problem (EnsembleProblems are not possible for these). |
| 122 | +let |
| 123 | + base_nlprob = NonlinearProblem(nsys, u0_alts[1], p_alts[1]) |
| 124 | + base_sol = solve(base_nlprob, NewtonRaphson()) |
| 125 | + # Solves problems for all input types, checking that identical solutions are found. |
| 126 | + for u0 in u0_alts, p in p_alts |
| 127 | + nlprob = remake(base_nlprob; u0, p) |
| 128 | + @test base_sol == solve(nlprob, NewtonRaphson()) |
| 129 | + end |
| 130 | +end |
| 131 | + |
| 132 | +# Perform steady state simulations (singular and ensemble). |
| 133 | +let |
| 134 | + # Creates normal and ensemble problems. |
| 135 | + base_ssprob = SteadyStateProblem(osys, u0_alts[1], p_alts[1]) |
| 136 | + base_sol = solve(base_ssprob, DynamicSS(Tsit5())) |
| 137 | + base_eprob = EnsembleProblem(base_ssprob) |
| 138 | + base_esol = solve(base_eprob, DynamicSS(Tsit5()); trajectories = 2) |
| 139 | + |
| 140 | + # Simulates problems for all input types, checking that identical solutions are found. |
| 141 | + # test failure. |
| 142 | + for u0 in u0_alts, p in p_alts |
| 143 | + ssprob = remake(base_ssprob; u0, p) |
| 144 | + @test base_sol == solve(ssprob, DynamicSS(Tsit5())) |
| 145 | + eprob = remake(base_eprob; u0, p) |
| 146 | + @test base_esol == solve(eprob, DynamicSS(Tsit5()); trajectories = 2) |
| 147 | + end |
| 148 | +end |
0 commit comments