Simulation Projects

Simulation projects connect multiple model projects into a federated simulation. Instead of building agents and behaviors, you import existing models and wire their inputs and outputs together.

Creating a Simulation

  1. On the dashboard, click New Project
  2. Select Simulation as the project type
  3. Name your simulation

The Simulation Editor

The simulation editor has a different layout than the model editor:

  • Models panel — Lists imported model references
  • Config panel — Max steps and data logging settings
  • Simulation graph — The canvas where you connect models

Importing Models

Click Import Model to add a model project to your simulation. Only model projects (not other simulations) can be imported — this prevents circular references. When imported, a snapshot of the model's interface contract is stored.

Simulation Nodes

The simulation graph uses special nodes alongside all the core nodes (math, branch, compare, etc.):

NodePurpose
Model ReferenceRepresents an imported model. Has exec ports (trigger a step) and dynamic data ports from the model's interface contract.
Step ControllerRuns a loop for N steps. Provides step number and loop control flow.
Data LoggerLogs values during the simulation for later analysis.

Coupling Models

The power of federation is coupling — connecting one model's outputs to another's inputs. You can use any core node for coupling logic:

StepController (100 steps)
  → ModelA.step()
    → read ModelA output (avg_price)
      → Multiply × 0.9
        → Branch (if > threshold)
          → write to ModelB input (price_signal)
            → ModelB.step()

This lets you build complex inter-model relationships using visual logic rather than writing Python orchestration code.

Configuration

  • Max Steps — How many simulation steps to run (default: 100)
  • Data Logging — Whether to log values during execution

Generated Output

Generating code from a simulation project produces a runner.py that orchestrates all the imported models. Each model's code is generated independently, and the runner handles initialization, stepping, and data coupling.