oapply operad algebra evaluation via colimits with Specter-style composition patterns
/plugin marketplace add plurigrid/asi/plugin install plurigrid-asi-skills@plurigrid/asiThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Operad algebra evaluation via colimits with bidirectional navigation
Version: 1.1.0 Trit: +1 (Generator - composes systems)
oapply computes colimit of component diagram over wiring pattern:
using AlgebraicDynamics
# Pattern + components → composite
composite = oapply(wiring_diagram, [machine1, machine2, ...])
| Mode | Type | Gluing | Example |
|---|---|---|---|
| Undirected | ResourceSharer | Pushout (shared state) | Lotka-Volterra |
| Directed | Machine | Wiring (signal flow) | Control systems |
function oapply(d::UndirectedWiringDiagram, xs::Vector{ResourceSharer})
# 1. Coproduct of state spaces
S = coproduct((FinSet ∘ nstates).(xs))
# 2. Pushout identifies shared variables
S′ = pushout(portmap, junctions)
# 3. Induced dynamics sum at junctions
return ResourceSharer(induced_interface, induced_dynamics)
end
Navigate wiring diagrams with bidirectional paths:
using SpecterACSet
# Navigate to all boxes
select([wd_boxes, ALL], diagram)
# Navigate to all wires from a specific box
select([wd_wires, pred(w -> source_box(w) == 1)], diagram)
# Transform: rename all boxes
transform([wd_boxes, ALL, box_name], uppercase, diagram)
| Navigator | Select | Transform |
|---|---|---|
wd_boxes | All boxes | Update boxes |
wd_wires | All wires | Update wires |
wd_ports(box_id) | Ports of box | Update ports |
wd_outer_ports | Outer interface | Update interface |
Specter's comp-navs pattern mirrors oapply:
# Specter: compose navigators (fast - just allocation)
comp_navs(nav1, nav2, nav3)
# oapply: compose machines (colimit of diagram)
oapply(wiring, [machine1, machine2, machine3])
Both use composition as colimit - Specter over paths, oapply over state spaces.
# Lotka-Volterra as composed resource sharers
rabbit = ResourceSharer{Float64}([:pop], [:pop]) do u, p, t
[p.α * u[1]] # growth
end
fox = ResourceSharer{Float64}([:pop], [:pop]) do u, p, t
[-p.δ * u[1]] # decay
end
# Compose via shared population interface
predation = oapply(predation_diagram, [rabbit, fox])
# Wiring diagram → Sexp
sexp = sexp_of_wiring_diagram(diagram)
# Navigate: find all box names
box_names = select([SEXP_CHILDREN, pred(is_box), SEXP_HEAD, ATOM_VALUE], sexp)
# Roundtrip
diagram2 = wiring_diagram_of_sexp(sexp)
schema-validation (-1) ⊗ acsets (0) ⊗ oapply-colimit (+1) = 0 ✓
interval-presheaf (-1) ⊗ algebraic-dynamics (0) ⊗ oapply-colimit (+1) = 0 ✓
For time-varying systems, oapply composes observable functors:
# Koopman operator: lift nonlinear → infinite-dim linear
# oapply: compose lifted systems via colimit
composed_koopman = oapply(
dynamics_diagram,
[koopman_lift(system1), koopman_lift(system2)]
)