diff --git a/docs/make.jl b/docs/make.jl index 4adf94b..e15b351 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -67,6 +67,7 @@ makedocs( "examples/Ross-Macdonald.md" ], "Threshold Linear Networks" => "TLN.md", + "AlgebraicPetri Integration" => "AlgebraicPetri.md", "Library Reference" => "api.md" ] ) diff --git a/docs/src/AlgebraicPetri.md b/docs/src/AlgebraicPetri.md new file mode 100644 index 0000000..3b69a7f --- /dev/null +++ b/docs/src/AlgebraicPetri.md @@ -0,0 +1,19 @@ +# AlgebraicPetri.jl Integration + +You can construct a [`ContinuousResourceSharer`](@ref) from an Open Petri Net for any kind of network supported by AlgebraicPetri.jl including: + +1. OpenPetriNet +2. OpenLabelledPetriNet +3. OpenLabelledReactionNet + +````@example +Brusselator = LabelledPetriNet([:A, :B, :D, :E, :X, :Y], + :t1 => (:A => (:X, :A)), + :t2 => ((:X, :X, :Y) => (:X, :X, :X)), + :t3 => ((:B, :X) => (:Y, :D, :B)), + :t4 => (:X => :E) +) + +open_bruss = Open([:A, :D], Brusselator, [:A, :B]) +rs = ContinuousResourceSharer{Float64}(open_bruss) +```` \ No newline at end of file diff --git a/ext/AlgebraicDynamicsAlgebraicPetriExt.jl b/ext/AlgebraicDynamicsAlgebraicPetriExt.jl index f2be5e8..b83e978 100644 --- a/ext/AlgebraicDynamicsAlgebraicPetriExt.jl +++ b/ext/AlgebraicDynamicsAlgebraicPetriExt.jl @@ -6,25 +6,33 @@ using Catlab using LabelledArrays import AlgebraicDynamics.UWDDynam: ContinuousResourceSharer +export OpenNet + +""" OpenNet=Union{OpenPetriNet,OpenLabelledPetriNet,OpenLabelledReactionNet} + +A type alias for any kind of open network from AlgebraicPetri. +""" +const OpenNet = Union{OpenPetriNet,OpenLabelledPetriNet,OpenLabelledReactionNet} + # vecfields need to be initialized differently depending on type of net -function vf(pn::OpenPetriNet,T::Type,ns::Int64) +function dynamics(pn::OpenPetriNet,T::Type,ns::Int64) vf(u, p, t) = vectorfield(apex(pn))(zeros(T,ns), u, p, t) end -function vf(pn::OpenLabelledPetriNet,T::Type,ns::Int64) +function dynamics(pn::OpenLabelledPetriNet,T::Type,ns::Int64) vf(u, p, t) = vectorfield(apex(pn))(LVector(NamedTuple{tuple(snames(apex(pn))...)}(zeros(T,ns))), u, p, t) end -function vf(pn::OpenLabelledReactionNet,T::Type,ns::Int64) +function dynamics(pn::OpenLabelledReactionNet,T::Type,ns::Int64) vf(u, p, t) = vectorfield(apex(pn))(LVector(NamedTuple{tuple(snames(apex(pn))...)}(zeros(T,ns))), u, rates(apex(pn)), t) end -function ContinuousResourceSharer{T}(pn::Union{OpenPetriNet,OpenLabelledPetriNet,OpenLabelledReactionNet}) where T +function ContinuousResourceSharer{T}(pn::OpenNet) where T nstates = nparts(apex(pn), :S) portmap = vcat(map(legs(pn)) do f f[:S](parts(dom(f), :S)) end...) nports = length(portmap) - ContinuousResourceSharer{T}(nports, nstates, vf(pn,T,nstates), portmap) + ContinuousResourceSharer{T}(nports, nstates, dynamics(pn,T,nstates), portmap) end end \ No newline at end of file