MADDENING#
Modular Automatic Differentiation and Data Enhanced Neural-network INteracting Graph — a pure-JAX, autodifferentiable framework for composing physical models from typed nodes connected by unit-aware edges. MADDENING is the base framework on which MIME and the MICROROBOTICA IDE are built.
Every Graph step compiles into a single XLA op. Take
jax.grad through 1000-step rollouts; vmap across initial conditions for free.
Author a Node as a pure function of
(state, dt, inputs). Wire it into the graph with unit-aware
Edges and let the scheduler topologically sort and parallelise it.
Gauss-Seidel and Jacobi Coupling for strongly coupled subsystems, Aitken / IQN-ILS acceleration, GCD-based Multi-rate scheduling, and a Richardson + PI adaptive timestepper.
How MADDENING is wired#
MADDENING is split into a small core (node ABC, typed edges, graph manager), a scheduler that resolves coupling and multi-rate timing, an XLA-compilation path, a surrogate training subsystem, a multi-GPU layer (Cartesian and graph-partitioned sharding plus sharded sparse Krylov solvers), an FMI 3.0 export path, and a cloud layer for distributing all of it. MIME plugs in at the node level — same runtime, microrobotics-specific physics + metadata.
flowchart LR
subgraph CORE["core"]
direction TB
Node["SimulationNode<br/><i>pure (state, dt, in) → out</i>"]
Edge["EdgeSpec<br/><i>typed, unit-aware</i>"]
Graph["GraphManager<br/><i>topological sort + cycle staggering</i>"]
end
subgraph SCHED["scheduling"]
direction TB
Coup["coupling<br/><i>Gauss-Seidel · Jacobi</i>"]
Accel["acceleration<br/><i>Aitken · IQN-ILS</i>"]
Multi["multi-rate<br/><i>GCD scheduler</i>"]
Adapt["adaptive dt<br/><i>Richardson + PI</i>"]
end
XLA["XLA compilation<br/><i>jit · vmap · grad</i>"]
subgraph SURR["surrogates"]
direction TB
Train["MLP / DeepONet / FNO<br/><i>training + data loaders</i>"]
Swap["hot-swap registry"]
end
subgraph CLOUD["cloud / API"]
direction TB
Sky["SkyPilot"]
ZMQ["ZMQ rendezvous"]
WRTC["WebRTC streaming"]
API["FastAPI + WebSocket"]
end
USD["USD codeless schemas<br/><i>graph + trajectory serializer</i>"]
Node --> Graph
Edge --> Graph
Graph --> Coup
Coup --> Accel
Graph --> Multi
Graph --> Adapt
Graph --> XLA
Train --> Swap
Swap --> Graph
Graph --> USD
Graph --> ZMQ
Sky --> ZMQ
Graph --> API
ZMQ -.-> WRTC
MIM["MIME<br/><i>SimulationNode subclasses<br/>+ biocompat / SOUP / regime</i>"]:::ext
Node --> MIM
classDef ext stroke-dasharray:5 3
User Guide
- Installation
- Quickstart
- Graph parameters, calibration and system identification
- Exporting a graph as an FMU
- Surviving spot preemption
- Inspecting a graph
- Geometry-dependent mappings
- Moving a node’s own sampling onto an edge
- Upgrading from 0.3.1
- Serving the REST API on a network
- ZeroMQ transports
- Glossary
Algorithm Guide
- [Node Name]
- AdaptiveNode
- BallNode
- HeartPumpNode
- HeatNode
- LBMNode
- RigidBody2DNode
- SpringDamperNode
- WaveletAdaptiveNode
- Interface mapping
- The
Mappingprotocol - Weights live in
params["mappings"] - A mapped edge inside a coupling group: what
convergence_norm="interface"reads StaticLinearMappingand its factories- Shapes and validation
- Serialisation
- Registering your own mapping kind
- Sparse mappings
- Geometry-dependent mappings
- Legacy closures
- The
- Unit-Aware Edge Transforms
- Uncertainty Quantification Roadmap
- Explicit ODE Integrators
Developer Guide
- Node Authoring Guide
- The Contract
- Directory Structure
- Step-by-Step
- Where a constant belongs, and what a saved graph carries
- Boundary Input Specification
- Exposing Flux Quantities
- Additive vs Replacive Inputs
- A node that draws random numbers
- Non-state arrays and sharded execution
- Coupling Patterns
- Transform Registration
- New Node Checklist
- Testing Standards
- 1. Unit Tests (mandatory for all code)
- 2. Integration Tests (mandatory for nodes)
- 3. Verification Benchmarks (mandatory for physics nodes)
- Running Tests
- Environment Variables
- 4. Property-Based Testing (recommended for physics nodes)
- Test time budget
- The claims inventories
- Numeric constants carry their units
- Differential tests
- Test Organization
- pytest Configuration
- Profiling and benchmarking
- Documentation Standards
- Edge validation: migration guide (v0.2 → v0.3.0)
halo_widthmigration guide (v0.2 → v0.3.0)StaticArraymigration guide (v0.2 → v0.3.0)- Sharded static data and domain integrals (v0.2.1)
- The picture
- Declaring a sharded static array
- Reading the sharded slab in
update_padded - Declaring domain-integral outputs
shard_info: when you’d rather recompute the mask- Sharding policy is part of the JIT cache key
- A static copied along a mesh axis, inside a loop (MADD-ANO-068)
- What’s still TODO
- See also
- Sharding topology: structured vs unstructured
- Stability Report
- Versioned documentation: design and rollout
- Settled design decisions
- The shape of the live site (target)
- How a user sees it: PyData theme’s version switcher
- How a build produces all the versions
- Why this design over alternatives
- Rollout sequence
- How a developer triggers a version-specific local build
- What goes in a new release’s switcher.json
- Open questions
- Authoring an AdaptiveNode
- Static Typing Policy
- Choosing a coupling algorithm
- Start here
- Reading
coupling_diagnostics() - How the numbers were produced
- Where the measurement contradicted the theory
- The finding that matters most
- What IQN costs
- Four combinations that theory says should win
- Do all these configurations agree?
- A note on the global L2 norm and large grids
- The adjoint solve has no absolute tolerance
- A member with a reverse-mode-only derivative
linear_solver="dense"is not an escape hatch on a grid- What the way a graph is built can change
- An edge from a node to itself
- Invariants
- Deprecation policy
- Stability freeze round — 0.4.0
- WaveletAdaptiveNode: the worked AdaptiveNode subclass
- Quick start
- The seven contract items, answered
- Declared order, measured
- What the merged-tree audit changed (1.0.1)
- Construction inside a trace
- Observing the selection:
selection_diagnostics - What the phase-3 audit changed (1.1.0)
- Using a different source:
source_field - Performance notes
- What porting it onto the 0.4.0 API found
- Out of scope for this port
- Property-Based Verification
Validation
- Context of Use (COU) Template
- Framework Verification Summary
- MADDENING SOUP Package Document
- Development record for v0.4.0
- Defects found and fixed before the release
- Claims inventories and what they found
- Test and CI changes
- Verification evidence
- Engineering notes
- The multi-GPU session runner
- Hardware session, 2026-10-12
- Index of the anomaly registry
- The account of each area
- Calibratable graphs
- Interface mappings
- FMI 3.0: the gate closes
- Coupling and solvers
AdaptiveNode- Multi-GPU and sharding
- Performance
- Persistence and the graph API
- Cloud
- The shipped examples
- Static typing:
py.typedand a blocking pyright gate - Security
- API stability
- The rest of the cycle’s changelog
Regulatory
Release notes