Catlab.jl
Catlab.jl copied to clipboard
Wiring diagrams of typed morphisms
I have the theory
@theory BiproductCategory(Ob,Hom) => EpidemiologyC(Ob,Hom) begin
spontaneous(A::Ob, B::Ob)::(A → B)
transmission(A::Ob, B::Ob)::(A ⊗ B → B)
exposure(A::Ob, B::Ob, C::Ob)::(A ⊗ B → C ⊗ B)
end
with the instance
@instance EpidemiologyC(PetriCospanOb, PetriCospan) begin
@import dom, codom, compose, id, otimes, munit, braid, mcopy, mmerge, create, delete, pair, copair, proj1, proj2, coproj1, coproj2
spontaneous(A::PetriCospanOb, B::PetriCospanOb) = PetriCospan([1], Petri.Model(1:2, [(Dict(1=>1), Dict(2=>1))]), [2])
transmission(A::PetriCospanOb, B::PetriCospanOb) = PetriCospan([1,2], Petri.Model(1:2, [(Dict(1=>1, 2=>1), Dict(2=>2))]), [2])
exposure(A::PetriCospanOb, B::PetriCospanOb, C::PetriCospanOb) = PetriCospan([1, 2], Petri.Model(1:3, [(Dict(1=>1, 2=>1), Dict(3=>1, 2=>1))]), [3, 2])
end
if I create a presentation on this theory
@present BasicEpi(FreeEpidemiologyC) begin
S::Ob
E::Ob
I::Ob
R::Ob
D::Ob
end
S,E,I,R,D = generators(BasicEpi)
F(ex) = functor((PetriCospanOb, PetriCospan), ex, generators=Dict(map(x->x=>PetriCospanOb(1), generators(BasicEpi))))
doing the code
sir = transmission(S,I) ⋅ spontaneous(I,R)
F(sir)
works as intended, but using the program macro
sir = @program BasicEpi (s::S, i::I) begin
i_2 = transmission{S,I}(s, i)
return spontaneous{I,R}(i)
end
F(to_hom_expr(FreeEpidemiologyC, sir))
does not work