diff --git a/Project.toml b/Project.toml index fa157a5..8b485df 100644 --- a/Project.toml +++ b/Project.toml @@ -8,6 +8,7 @@ version = "0.1.0" ACSets = "227ef7b5-1206-438b-ac65-934d6da304b8" Catlab = "134e5e36-593f-5add-ad60-77f754baafbe" Decapodes = "679ab3ea-c928-4fe6-8d59-fd451142d391" +DiagrammaticEquations = "6f00c28b-6bed-4403-80fa-30e0dc12f317" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" diff --git a/src/amr.it b/src/amr.it new file mode 100644 index 0000000..f9aa5a2 --- /dev/null +++ b/src/amr.it @@ -0,0 +1,59 @@ +@sum MathML begin + Math(str::String) + Presentation(str::String) +end + +struct ExpressionFormula + expression::String + expression_mathml::MathML +end + +struct Unit + expression::String + expression_mathml::MathML +end + + +@sum Distribution begin + StandardUniform() + Uniform(min::Float64, max::Float64) + StandardNormal() + Normal(mean::Float64, variance::Float64) + PointMass(value::Float64) + Undefined() +end + +struct Observable + id::Symbol + name::String + states::Vector{Symbol} + f::ExpressionFormula +end + +@sum Expression begin + Rate(target::Symbol, f::ExpressionFormula) + Initial(target::Symbol, f::ExpressionFormula) + Parameter(id::Symbol, name::String, description::String, units::Unit, value::Float64, distribution::Distribution) + Time(id::Symbol, units::Unit) +end + +@sum Note begin + Name(str::String) + Description(str::String) + Grounding(ontology::String, identifier::String) + Units(expression::String) +end + +struct Annotation + entity::Symbol + type::Symbol + note::Note +end + +struct Header + name::String + schema::String + description::String + schema_name::String + model_version::String +end diff --git a/src/amr.jl b/src/amr.jl index 42c7984..e698c99 100644 --- a/src/amr.jl +++ b/src/amr.jl @@ -16,81 +16,20 @@ using StructTypes using ..SyntacticModelsBase -@data MathML <: AbstractTerm begin - Math(String) - Presentation(String) -end - -nomath = Math("") +@intertypes "amr.it" module amr end -@as_record struct ExpressionFormula{T} <: AbstractTerm - expression::T - expression_mathml::MathML -end - -@as_record struct Unit <: AbstractTerm - expression::String - expression_mathml::MathML -end +using .amr +nomath = Math("") nounit = Unit("", nomath) -@data Distribution <: AbstractTerm begin - StandardUniform - Uniform(min, max) - StandardNormal - Normal(mean, variance) - PointMass(value) -end - -@as_record struct Observable{T <: AbstractTerm} - id::Symbol - name::String - states::Vector{Symbol} - f::ExpressionFormula -end - -@data Expression <: AbstractTerm begin - Rate(target::Symbol, f::ExpressionFormula) - Initial(target::Symbol, f::ExpressionFormula) - Parameter(id::Symbol, name::String, description::String, units::Unit, value::Float64, distribution::Distribution) - Time(id::Symbol, units::Unit) -end - -@data Semantic <: AbstractTerm begin +@data Semantic <: AbstractTerm begin ODEList(statements::Vector{Expression}) ODERecord(rates::Vector{Rate}, initials::Vector{Initial}, parameters::Vector{Parameter}, time::Time) - # Metadata - Typing(system::ACSetSpec, map::Vector{Pair}) - # Stratification -end - -@data Note <: AbstractTerm begin - Name(str::String) - Description(str::String) - Grounding(ontology::String, identifier::String) - Units(expression::String) + Typing(system::ACSetSpec, map::Vector{Base.Pair}) end -StructTypes.StructType(::Type{Note}) = StructTypes.AbstractType() -StructTypes.subtypekey(::Type{Note}) = :_type -StructTypes.subtypes(::Type{Note}) = - (Name=Name,Description=Description,Grounding=Grounding,Units=Units,) - -@as_record struct Annotation{E,T} <: AbstractTerm - entity::E - type::T - note::Note -end - -@as_record struct Header <: AbstractTerm - name::String - schema::String - description::String - schema_name::String - model_version::String -end @as_record struct ASKEModel <: AbstractTerm header::Header @@ -249,8 +188,8 @@ end function load(::Type{Distribution}, d::AbstractDict) @match d begin - Dict("type"=>"StandardUniform1") => StandardUniform - Dict("type"=>"StandardNormal") => StandardNormal + Dict("type"=>"StandardUniform1") => StandardUniform() + Dict("type"=>"StandardNormal") => StandardNormal() Dict("type"=>"Uniform", "parameters"=>p) => Uniform(p["minimum"], p["maximum"]) Dict("type"=>"Uniform1", "parameters"=>p) => Uniform(p["minimum"], p["maximum"]) Dict("type"=>"Normal", "parameters"=>p) => Normal(p["mu"], p["var"]) @@ -258,7 +197,7 @@ function load(::Type{Distribution}, d::AbstractDict) end end -load(::Type{Distribution}, ::Nothing) = PointMass(missing) +load(::Type{Distribution}, ::Nothing) = Undefined() function load(::Type{Note}, d::AbstractDict) @match d begin @@ -281,7 +220,7 @@ function load(::Type{Parameter}, d::AbstractDict) u, d["value"], load(Distribution, get(d,"distribution", nothing)) - ) + ) end function load(::Type{ODERecord}, d::AbstractDict) @@ -297,10 +236,10 @@ function load(::Type{ODERecord}, d::AbstractDict) end function load(::Type{Header}, d::AbstractDict) - @match d begin - Dict("name"=>n, "schema"=>s, "description"=>d, "schema_name"=>sn, "model_version"=>mv) => Header(n,s,d,sn,mv) - _ => error("Information for Header was not found in $d") - end + @match d begin + Dict("name"=>n, "schema"=>s, "description"=>d, "schema_name"=>sn, "model_version"=>mv) => Header(n,s,d,sn,mv) + _ => error("Information for Header was not found in $d") + end end function load(::Type{Typing}, d::AbstractDict) @@ -460,4 +399,4 @@ function load(::Type{ASKEModel}, ex::Expr) end ASKEModel(elts[2][1], elts[2][2], [elts[4], elts[6]]) end -end # module end \ No newline at end of file +end # module end diff --git a/src/askemdecapodes.it b/src/askemdecapodes.it new file mode 100644 index 0000000..df3f910 --- /dev/null +++ b/src/askemdecapodes.it @@ -0,0 +1,4 @@ +@sum ASKEMDeca begin + ASKEMDecaExpr(header::amr.Header, model::decapodes.DecaExpr, annotations::Vector{amr.Annotation}) + ASKEMDecapode(header::amr.Header, model::decapodeacset.SymSummationDecapode, annotations::Vector{amr.Annotation}) +end diff --git a/src/decapodes.jl b/src/decapodes.jl index 1217a31..b6f9753 100644 --- a/src/decapodes.jl +++ b/src/decapodes.jl @@ -4,16 +4,22 @@ export ASKEMDecaExpr, ASKEMDecapode using ..SyntacticModelsBase using ..AMR +import ..AMR: amr using StructTypes using Decapodes using MLStyle +import DiagrammaticEquations: decapodes, decapodeacset -@data ASKEMDeca <: AbstractTerm begin - ASKEMDecaExpr(header::AMR.Header, model::Decapodes.DecaExpr, annotations::Vector{AMR.Annotation{Symbol,Symbol}}) - ASKEMDecapode(header::AMR.Header, model::Decapodes.SummationDecapode, annotations::Vector{AMR.Annotation{Symbol,Symbol}}) +@intertypes "askemdecapodes.it" module askemdecapodes + import ..amr + import ..decapodes + import ..decapodeacset end +using .askemdecapodes +using .askemdecapodes: ASKEMDecaExpr, ASKEMDecapode + @doc """ ASKEMDeca Stores a Decapode with the model metadata for ASKEM AMR conformance. @@ -34,28 +40,4 @@ model metadata for ASKEM AMR conformance. """ ASKEMDecapode(header::AMR.Header, model::Decapodes.SummationDecapode) = ASKEMDecapode(header,model,Vector{AMR.Annotation{Symbol,Symbol}}()) -StructTypes.StructType(::Type{ASKEMDeca}) = StructTypes.AbstractType() -StructTypes.subtypekey(::Type{ASKEMDeca}) = :_type -StructTypes.subtypes(::Type{ASKEMDeca}) = (ASKEMDecaExpr=ASKEMDecaExpr, ASKEMDecapode=ASKEMDecapode) - -SyntacticModelsBase._dict(x::T) where {T<:Union{Decapodes.DecaExpr, Decapodes.Equation, Decapodes.Term}} = begin - Dict(:_type => typename_last(T), [k=>_dict(getfield(x, k)) for k in fieldnames(T)]...) end - -StructTypes.StructType(::Type{Decapodes.Equation}) = StructTypes.AbstractType() -StructTypes.subtypekey(::Type{Decapodes.Equation}) = :_type -StructTypes.subtypes(::Type{Decapodes.Equation}) = (Eq=Eq,) - -StructTypes.StructType(::Type{Decapodes.Term}) = StructTypes.AbstractType() -StructTypes.subtypekey(::Type{Decapodes.Term}) = :_type -StructTypes.subtypes(::Type{Decapodes.Term}) = (Var=Decapodes.Var, - Lit=Decapodes.Lit, - Judgement=Decapodes.Judgement, - AppCirc1=Decapodes.AppCirc1, - App1=Decapodes.App1, - App2=Decapodes.App2, - Plus=Decapodes.Plus, - Mult=Decapodes.Mult, - Tan=Decapodes.Tan) - -end \ No newline at end of file diff --git a/test/core.jl b/test/core.jl index 55f9996..a0c1144 100644 --- a/test/core.jl +++ b/test/core.jl @@ -1,7 +1,5 @@ -include("../src/SyntacticModels.jl") - -using .SyntacticModels -using .SyntacticModels.ASKEMDecapodes +using SyntacticModels +using SyntacticModels.ASKEMDecapodes using Test using JSON3 @@ -35,4 +33,4 @@ include("amr_examples.jl") include("decapodes_examples.jl") include("uwd_examples.jl") include("composite_models_examples.jl") -include("serialization_mwe.jl") \ No newline at end of file +include("serialization_mwe.jl")