@@ -102,6 +102,13 @@ struct System <: IntermediateDeprecationSystem
102102 """
103103 brownians:: Vector{SymbolicT}
104104 """
105+ The poissonian variables of the system, created via `@poissonians`. Each poissonian
106+ variable represents an independent Poisson counting process with an associated rate.
107+ A system with poissonians cannot be simulated directly. It needs to be compiled using
108+ `mtkcompile` which converts poissonians into jump equations.
109+ """
110+ poissonians:: Vector{SymbolicT}
111+ """
105112 The independent variable for a time-dependent system, or `nothing` for a time-independent
106113 system.
107114 """
@@ -286,7 +293,7 @@ struct System <: IntermediateDeprecationSystem
286293
287294 function System (
288295 tag, eqs, noise_eqs, jumps, constraints, costs, consolidate, unknowns, ps,
289- brownians, iv, observed, var_to_name, name, description, bindings,
296+ brownians, poissonians, iv, observed, var_to_name, name, description, bindings,
290297 initial_conditions, guesses, systems, initialization_eqs, continuous_events,
291298 discrete_events, connector_type, assertions = Dict {SymbolicT, String} (),
292299 metadata = MetadataT (), gui_metadata = nothing , is_dde = false , tstops = [],
@@ -350,7 +357,7 @@ struct System <: IntermediateDeprecationSystem
350357 end
351358 return new (
352359 tag, eqs, noise_eqs, jumps, constraints, costs,
353- consolidate, unknowns, ps, brownians, iv,
360+ consolidate, unknowns, ps, brownians, poissonians, iv,
354361 observed, var_to_name, name, description, bindings, initial_conditions,
355362 guesses, systems, initialization_eqs, continuous_events, discrete_events,
356363 connector_type, assertions, metadata, gui_metadata, is_dde,
@@ -433,6 +440,7 @@ All other keyword arguments are named identically to the corresponding fields in
433440"""
434441function System (
435442 eqs:: Vector{Equation} , iv, dvs, ps, brownians = SymbolicT[];
443+ poissonians = SymbolicT[],
436444 constraints = Union{Equation, Inequality}[], noise_eqs = nothing , jumps = JumpType[],
437445 costs = SymbolicT[], consolidate = default_consolidate,
438446 # `@nospecialize` is only supported on the first 32 arguments. Keep this early.
@@ -477,6 +485,7 @@ function System(
477485 filter! (! Base. Fix2 (_is_unknown_delay_or_evalat, iv), dvs)
478486 end
479487 brownians = unwrap_vars (brownians)
488+ poissonians = unwrap_vars (poissonians)
480489
481490 if noise_eqs != = nothing
482491 noise_eqs = unwrap_vars (noise_eqs)
@@ -613,7 +622,7 @@ function System(
613622 jumps = Vector {JumpType} (jumps)
614623 return System (
615624 __get_new_tag (), eqs, noise_eqs, jumps, constraints,
616- costs, consolidate, dvs, ps, brownians, iv, observed,
625+ costs, consolidate, dvs, ps, brownians, poissonians, iv, observed,
617626 var_to_name, name, description, bindings, initial_conditions, guesses, systems, initialization_eqs,
618627 continuous_events, discrete_events, connector_type, assertions, metadata, gui_metadata, is_dde,
619628 tstops, inputs, outputs, tearing_state, true , false ,
@@ -704,13 +713,25 @@ function System(eqs::Vector{Equation}, iv; kwargs...)
704713 eqs = [diffeqs; othereqs]
705714
706715 brownians = Set {SymbolicT} ()
716+ poissonians = Set {SymbolicT} ()
707717 for x in allunknowns
708718 x = unwrap (x)
709719 if getvariabletype (x) == BROWNIAN
710720 push! (brownians, x)
721+ elseif getvariabletype (x) == POISSONIAN
722+ push! (poissonians, x)
711723 end
712724 end
713725 setdiff! (allunknowns, brownians)
726+ setdiff! (allunknowns, poissonians)
727+
728+ # Extract variables and parameters from poissonian rate expressions
729+ for p in poissonians
730+ rate = getpoissonianrate (p)
731+ if rate != = nothing
732+ collect_vars! (allunknowns, ps, rate, iv)
733+ end
734+ end
714735
715736 cstrs = Vector {Union{Equation, Inequality}} (get (kwargs, :constraints , []))
716737 _cstrunknowns, cstrps = process_constraint_system (cstrs, allunknowns, ps, iv)
@@ -764,7 +785,8 @@ function System(eqs::Vector{Equation}, iv; kwargs...)
764785 end
765786
766787 return System (
767- eqs, iv, collect (allunknowns), collect (new_ps), collect (brownians); kwargs...
788+ eqs, iv, collect (allunknowns), collect (new_ps), collect (brownians);
789+ poissonians = collect (poissonians), kwargs...
768790 )
769791end
770792
@@ -995,6 +1017,7 @@ function flatten(sys::System, noeqs = false)
9951017 return System (
9961018 noeqs ? Equation[] : equations (sys), get_iv (sys), unknowns (sys),
9971019 parameters (sys; initial_parameters = true ), brownians (sys);
1020+ poissonians = poissonians (sys),
9981021 jumps = jumps (sys), constraints = constraints (sys), costs = costs,
9991022 consolidate = default_consolidate, observed = observed (sys),
10001023 bindings = bindings (sys), initial_conditions = initial_conditions (sys),
@@ -1424,6 +1447,7 @@ function Base.isapprox(sysa::System, sysb::System)
14241447 issetequal (get_unknowns (sysa), get_unknowns (sysb)) &&
14251448 issetequal (get_ps (sysa), get_ps (sysb)) &&
14261449 issetequal (get_brownians (sysa), get_brownians (sysb)) &&
1450+ issetequal (get_poissonians (sysa), get_poissonians (sysb)) &&
14271451 issetequal (get_observed (sysa), get_observed (sysb)) &&
14281452 isequal (get_description (sysa), get_description (sysb)) &&
14291453 isequal (get_bindings (sysa), get_bindings (sysb)) &&
@@ -1452,7 +1476,8 @@ function Base.copy(sys::System)
14521476 return System (
14531477 __get_new_tag (), copy (get_eqs (sys)), _maybe_copy (get_noise_eqs (sys)), copy (get_jumps (sys)),
14541478 copy (get_constraints (sys)), copy (get_costs (sys)), get_consolidate (sys),
1455- copy (get_unknowns (sys)), copy (get_ps (sys)), copy (get_brownians (sys)), get_iv (sys),
1479+ copy (get_unknowns (sys)), copy (get_ps (sys)), copy (get_brownians (sys)),
1480+ copy (get_poissonians (sys)), get_iv (sys),
14561481 copy (get_observed (sys)), copy (get_var_to_name (sys)), nameof (sys), get_description (sys),
14571482 copy (get_bindings (sys)), copy (get_initial_conditions (sys)), copy (get_guesses (sys)),
14581483 map (copy, get_systems (sys)), copy (get_initialization_eqs (sys)),
0 commit comments