Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
59 changes: 59 additions & 0 deletions src/amr.it
Original file line number Diff line number Diff line change
@@ -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
89 changes: 14 additions & 75 deletions src/amr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -249,16 +188,16 @@ 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"])
Dict("type"=>"PointMass", "parameters"=>p) => PointMass(p["value"])
end
end

load(::Type{Distribution}, ::Nothing) = PointMass(missing)
load(::Type{Distribution}, ::Nothing) = Undefined()

function load(::Type{Note}, d::AbstractDict)
@match d begin
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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
end # module end
4 changes: 4 additions & 0 deletions src/askemdecapodes.it
Original file line number Diff line number Diff line change
@@ -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
36 changes: 9 additions & 27 deletions src/decapodes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
8 changes: 3 additions & 5 deletions test/core.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
include("../src/SyntacticModels.jl")

using .SyntacticModels
using .SyntacticModels.ASKEMDecapodes
using SyntacticModels
using SyntacticModels.ASKEMDecapodes

using Test
using JSON3
Expand Down Expand Up @@ -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")
include("serialization_mwe.jl")