Graphics.to_graphviz(F::AbstractDecapode; directed = true, kw...)

Visualize the given Decapode through Graphviz. Ensure that you have called using Catlab.Graphics before-hand, and have a way of visualizing SVG files in your current environment.

function oapply(relation::RelationDiagram, podes::Vector{D}) where {D<:OpenSummationDecapode}

Compose a list of Decapodes as specified by the given relation diagram.

The Decapodes must be given in the same order as they were specified in the relation.

State variables (such as the (C,V) given in the head of the following @relation) do not affect the result of a composition.


julia> compose_diff_adv = @relation (C,V) begin
  diffusion(C, ϕ₁)
  advection(C, ϕ₂, V)
  superposition(ϕ₁, ϕ₂, ϕ, C)

julia> oapply(compose_diff_adv, [(Diffusion, [:C, :ϕ]),
  (Advection, [:C, :ϕ, :V]), (Superposition, [:ϕ₁, :ϕ₂, :ϕ, :C])]);
Open(d::SummationDecapode{T,U,V}, names::AbstractVector{Symbol}) where {T,U,V}

creates an OpenSummationDecapode based on named variables rather than variable indices. See AlgebraicPetri.jl's Open for the analogous verion for LabelledReactionNetworks.

function average_rewrite(deca_source::SummationDecapode)

Compute each quantitity in the given Decapode by the average of all computation paths leading to that node.

function collate(equations, boundaries, uwd, symbols)

Create a collage of two Decapodes that simulates with boundary conditions. ```

function contract_operators(d::SummationDecapode; allowable_ops::Set{Symbol} = Set{Symbol}())

Find chains of Op1s in the given Decapode, and replace them with a single Op1 with a vector of function names. After this process, all Vars that are not a part of any computation are removed.


Rename tangent variables by their depending variable appended with a dot. e.g. If D == ∂ₜ(C), then rename D to Ċ.

If a tangent variable updates multiple vars, choose one arbitrarily. e.g. If D == ∂ₜ(C) and D == ∂ₜ(B), then rename D to either Ċ or B ̇.

function fill_names!(d::AbstractNamedDecapode; lead_symbol::Symbol = Symbol("•"))

Provide a variable name to all the variables that don't have names.


function findchains(d::SummationDecapode; allowableops::Set{Symbol} = Set{Symbol}())

Find chains of Op1s in the given Decapode. A chain ends when the target of the last Op1 is part of an Op2 or sum, or is a target of multiple Op1s. Only operators with names included in the allowable_ops set are allowed to be contracted. If the set is empty then all operators are allowed.


Find the order of each tangent variable in the Decapode, and the index of the variable that it is dependent on. Returns a tuple of (dep, order), both of which respecting the order in which incident(d, :∂ₜ, :op1) returns Vars.

function find_tgts_of_many_ops(d::SummationDecapode)

Searches SummationDecapode, d, for all Vars which have two or more distinct operations leading into the same variable.

function find_variable_mapping(deca_source, deca_tgt)

Returns array of match on variables between from a Decapode source to a target, also returns if mapping is valid WARNING: This assumes that variable names are unique. If variable names are not unique or do not exist, corrsponding mapping value is set to 0.

function get_preprocess_indices(deca_source::SummationDecapode)

Searches SummationDecapode, deca_source, for all Vars which are valid for average rewriting preprocessing. Namely this just includes all op2 and summation operations. Returns two arrays, first is array of valid Op2 ids, second is array of valid Σ ids.

function get_valid_op1s(deca_source::SummationDecapode, varID)

Searches SummationDecapode, deca_source, at the request varID and returns all op1s which are allowed to be averaged. Returns an array of indices of valid op1 sources.

Namely this is meant to exclude ∂ₜ from being included in an average.

function infer_types!(d::SummationDecapode, op1_rules::Vector{NamedTuple{(:src_type, :tgt_type, :replacement_type, :op), NTuple{4, Symbol}}})

Infer types of Vars given rules wherein one type is known and the other not.

function is_tgt_of_many_ops(d::SummationDecapode, var)

Return true if there are two or more distinct operations leading into Var var (not counting ∂ₜ).

function preprocess_average_rewrite(deca_source::SummationDecapode)

Preprocesses SummationDecapode, deca_source, for easier average rewriting later on. Specifically, all op2 and summation results are stored in variables called "Temp" and results are then passed off to their original result along an op1 called "temp". This "temp" operation is equivalent to an identity function.

function process_average_rewrite(deca_source::SummationDecapode)

Rewrites SummationDecapode, deca_source, by including averages of redundent operations. While this function only searches for op1s to match on, because of preprocessing, this indirectly includes op2 and summations in the final result.

function resolve_overloads!(d::SummationDecapode, op1_rules::Vector{NamedTuple{(:src_type, :tgt_type, :resolved_name, :op), NTuple{4, Symbol}}})

Resolve function overloads based on types of src and tgt.

function type_check_Decapodes_composition(relation::RelationDiagram, decs::Vector{OpenSummationDecapode})

Check that the types of all Vars connected by the same junction match.

This function only throws an error on the first type mismatch found.

function unique_by!(acset, column_names::Vector{Symbol})

Given column names from the same table, remove duplicate rows.

WARNING: This function does not check if other tables index into the one given. Removal of rows is performed with prejudice.

See also: unique_by.


julia> unique_by!(parallel_arrows(Graph, 123), :E, [:src,:tgt]) == parallel_arrows(Graph, 1)
function unique_by(acset, column_names::Vector{Symbol})

Given column names from the same table, return a copy of the acset with duplicate rows removed. Removal of rows is performed with prejudice.

WARNING: This function does not check if other tables index into the one given. Removal of rows is performed with prejudice.

See also: unique_by!.


julia> unique_by(parallel_arrows(Graph, 123), :E, [:src,:tgt]) == parallel_arrows(Graph, 1)