@@ -244,11 +244,10 @@ let
244
244
Reaction (k2, [X2], [X1])
245
245
]
246
246
@named rs = ReactionSystem (rxs, t)
247
- osys = convert (ODESystem, complete (rs); remove_conserved = true )
248
- osys = complete (osys)
247
+ osys = complete (convert (ODESystem, complete (rs); remove_conserved = true ))
249
248
@unpack Γ = osys
250
249
251
- # Creates an `ODEProblem` .
250
+ # Creates the various problem types .
252
251
u0 = [X1 => 1.0 , X2 => 2.0 ]
253
252
ps = [k1 => 0.1 , k2 => 0.2 ]
254
253
oprob = ODEProblem (osys, u0, (0.0 , 1.0 ), ps)
@@ -294,65 +293,72 @@ let
294
293
@unpack X1, X2, X3 = rn
295
294
u0 = [X1 => 1.0 , X2 => 1.0 , X3 => 1.0 ]
296
295
ps = [:k1 => 0.1 , :k2 => 0.2 , :k3 => 0.3 , :k4 => 0.4 ]
297
- prob_old = ODEProblem (rn, u0, 1.0 , ps; remove_conserved = true )
298
296
conserved_quantity = conservationlaw_constants (rn)[1 ]. rhs
299
297
300
- # For a couple of iterations, updates the problem, ensuring that when a species is updated:
301
- # - Only that species and the conservation constant have their values updated.
302
- # The `≈` is because sometimes the computed values will not be fully exact.
303
- for _ = 1 : 3
304
- # Updates X2, checks the values of all species and Γ, then sets which is the old problem.
305
- X2_new = rand (rng, 1.0 : 10.0 )
306
- prob_new = remake (prob_old; u0 = [:X2 => X2_new])
307
- @test prob_old[:X1 ] ≈ prob_new[:X1 ]
308
- @test X2_new ≈ prob_new[:X2 ]
309
- @test prob_old[:X3 ] ≈ prob_new[:X3 ]
310
- @test substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => X2_new, X3 => prob_old[X3]])) ≈ prob_new. ps[:Γ ][1 ]
311
- prob_old = prob_new
312
-
313
- # Updates X3, checks the values of all species and Γ, then sets which is the old problem.
314
- X3_new = rand (rng, 1.0 : 10.0 )
315
- prob_new = remake (prob_old; u0 = [:X3 => X3_new])
316
- @test prob_old[:X1 ] ≈ prob_new[:X1 ]
317
- @test prob_old[:X2 ] ≈ prob_new[:X2 ]
318
- @test X3_new ≈ prob_new[:X3 ]
319
- @test substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => prob_old[X2], X3 => X3_new])) ≈ prob_new. ps[:Γ ][1 ]
320
- prob_old = prob_new
321
- end
322
-
323
- # Similarly, but now also updates the conservation constant. Here, once Γ has been updated:
324
- # - The conservation law constant will be kept fixed, and secondary updates are made to the
325
- # eliminated species.
326
- # Assumes that X3 is the eliminated species.
327
- # The random Γ is ensured to be large enough not to generate negative values in the eliminated species.
328
- for _ in 1 : 3
329
- # Updates Γ, checks the values of all species and Γ, then sets which is the old problem.
330
- Γ_new = substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => prob_old[X2], X3 => 0 ])) + rand (rng, 0.0 : 5.0 )
331
- prob_new = remake (prob_old; p = [:Γ => [Γ_new]], warn_initialize_determined = false )
332
- @test prob_old[:X1 ] ≈ prob_new[:X1 ]
333
- @test prob_old[:X2 ] ≈ prob_new[:X2 ]
334
- @test Γ_new ≈ prob_new. ps[:Γ ][1 ]
335
- @test substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => prob_old[X2], X3 => prob_new[X3]])) ≈ prob_new. ps[:Γ ][1 ]
336
- prob_old = prob_new
337
-
338
- # Updates X1 (non-eliminated species), checks the values of all species and Γ, then sets which is the old problem.
339
- # Note that now, `X3` will have its value modified (not and `Γ` remains unchanged).
340
- X1_new = rand (rng, 1.0 : 10.0 )
341
- prob_new = remake (prob_old; u0 = [:X1 => X1_new])
342
- @test X1_new ≈ prob_new[:X1 ]
343
- @test prob_old[:X2 ] ≈ prob_new[:X2 ]
344
- @test prob_old. ps[:Γ ][1 ] ≈ prob_new. ps[:Γ ][1 ]
345
- @test substitute (conserved_quantity, Dict ([X1 => X1_new, X2 => prob_old[X2], X3 => prob_new[X3]])) ≈ prob_new. ps[:Γ ][1 ]
346
- prob_old = prob_new
347
-
348
- # Updates X3 (the eliminated species). Right now, this will have no effect on `X3` (or the system).
349
- X3_new = rand (rng, 1.0 : 10.0 )
350
- prob_new = remake (prob_old; u0 = [:X3 => X3_new], warn_initialize_determined = false )
351
- @test prob_old[:X1 ] ≈ prob_new[:X1 ]
352
- @test prob_old[:X2 ] ≈ prob_new[:X2 ]
353
- @test prob_old[:X3 ] ≈ prob_new[:X3 ]
354
- @test prob_old. ps[:Γ ][1 ] ≈ prob_new. ps[:Γ ][1 ]
355
- prob_old = prob_new
298
+ # Loops through the tests for different problem types.
299
+ oprob_old = ODEProblem (rn, u0, 1.0 , ps; remove_conserved = true )
300
+ sprob_old = SDEProblem (rn, u0, 1.0 , ps; remove_conserved = true )
301
+
302
+ for prob in [oprob_old, sprob_old]
303
+ prob_old = prob
304
+
305
+ # For a couple of iterations, updates the problem, ensuring that when a species is updated:
306
+ # - Only that species and the conservation constant have their values updated.
307
+ # The `≈` is because sometimes the computed values will not be fully exact.
308
+ for _ = 1 : 3
309
+ # Updates X2, checks the values of all species and Γ, then sets which is the old problem.
310
+ X2_new = rand (rng, 1.0 : 10.0 )
311
+ prob_new = remake (prob_old; u0 = [:X2 => X2_new])
312
+ @test prob_old[:X1 ] ≈ prob_new[:X1 ]
313
+ @test X2_new ≈ prob_new[:X2 ]
314
+ @test prob_old[:X3 ] ≈ prob_new[:X3 ]
315
+ @test substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => X2_new, X3 => prob_old[X3]])) ≈ prob_new. ps[:Γ ][1 ]
316
+ prob_old = prob_new
317
+
318
+ # Updates X3, checks the values of all species and Γ, then sets which is the old problem.
319
+ X3_new = rand (rng, 1.0 : 10.0 )
320
+ prob_new = remake (prob_old; u0 = [:X3 => X3_new])
321
+ @test prob_old[:X1 ] ≈ prob_new[:X1 ]
322
+ @test prob_old[:X2 ] ≈ prob_new[:X2 ]
323
+ @test X3_new ≈ prob_new[:X3 ]
324
+ @test substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => prob_old[X2], X3 => X3_new])) ≈ prob_new. ps[:Γ ][1 ]
325
+ prob_old = prob_new
326
+ end
327
+
328
+ # Similarly, but now also updates the conservation constant. Here, once Γ has been updated:
329
+ # - The conservation law constant will be kept fixed, and secondary updates are made to the
330
+ # eliminated species.
331
+ # Assumes that X3 is the eliminated species.
332
+ # The random Γ is ensured to be large enough not to generate negative values in the eliminated species.
333
+ for _ in 1 : 3
334
+ # Updates Γ, checks the values of all species and Γ, then sets which is the old problem.
335
+ Γ_new = substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => prob_old[X2], X3 => 0 ])) + rand (rng, 0.0 : 5.0 )
336
+ prob_new = remake (prob_old; p = [:Γ => [Γ_new]], warn_initialize_determined = false )
337
+ @test prob_old[:X1 ] ≈ prob_new[:X1 ]
338
+ @test prob_old[:X2 ] ≈ prob_new[:X2 ]
339
+ @test Γ_new ≈ prob_new. ps[:Γ ][1 ]
340
+ @test substitute (conserved_quantity, Dict ([X1 => prob_old[X1], X2 => prob_old[X2], X3 => prob_new[X3]])) ≈ prob_new. ps[:Γ ][1 ]
341
+ prob_old = prob_new
342
+
343
+ # Updates X1 (non-eliminated species), checks the values of all species and Γ, then sets which is the old problem.
344
+ # Note that now, `X3` will have its value modified (not and `Γ` remains unchanged).
345
+ X1_new = rand (rng, 1.0 : 10.0 )
346
+ prob_new = remake (prob_old; u0 = [:X1 => X1_new])
347
+ @test X1_new ≈ prob_new[:X1 ]
348
+ @test prob_old[:X2 ] ≈ prob_new[:X2 ]
349
+ @test prob_old. ps[:Γ ][1 ] ≈ prob_new. ps[:Γ ][1 ]
350
+ @test substitute (conserved_quantity, Dict ([X1 => X1_new, X2 => prob_old[X2], X3 => prob_new[X3]])) ≈ prob_new. ps[:Γ ][1 ]
351
+ prob_old = prob_new
352
+
353
+ # Updates X3 (the eliminated species). Right now, this will have no effect on `X3` (or the system).
354
+ X3_new = rand (rng, 1.0 : 10.0 )
355
+ prob_new = remake (prob_old; u0 = [:X3 => X3_new], warn_initialize_determined = false )
356
+ @test prob_old[:X1 ] ≈ prob_new[:X1 ]
357
+ @test prob_old[:X2 ] ≈ prob_new[:X2 ]
358
+ @test prob_old[:X3 ] ≈ prob_new[:X3 ]
359
+ @test prob_old. ps[:Γ ][1 ] ≈ prob_new. ps[:Γ ][1 ]
360
+ prob_old = prob_new
361
+ end
356
362
end
357
363
end
358
364
0 commit comments