a4fb5d7182
Add the construction layer (C9/C19/C23): a named, param-generic graph-as-data (`Blueprint`) that *compiles* to the flat, type-erased instance the run loop already runs. The unit of reuse is the `Composite` — a nestable sub-graph fragment exposing one output port (C8) and named input roles — which `Blueprint::compile()` **inlines** by raw-index lowering into the flat `(nodes, sources, edges)` the unchanged `Harness::bootstrap` consumes. Design (settled in spec 0012, ledger C9/C19/C23): a composite is an authoring-level node, NOT a runtime `Box<dyn Node>` sub-engine. The chosen inlining approach keeps the sacrosanct deterministic run loop untouched and leaves the composite interior fully inspectable for the deferred cross-graph optimiser; the rejected "runtime sub-engine" reading would have put throwaway complexity into the run loop and kept the interior opaque. The compilat is wired by raw index, not by name; names survive only as non-load-bearing debug symbols (as `FieldSpec.name` already is). Lowering is recursive index rewriting: interior items append at an offset, interior edges rewrite by that offset, an edge into a composite fans through its input roles (one blueprint edge -> several flat edges), an edge out resolves to the interior output port, and nesting recurses inside-out. Construction-phase faults are caught as a typed `CompileError` (BadInteriorIndex / RoleKindMismatch / OutputPortOutOfRange); the lowered flat compilat is validated by bootstrap's existing kind- and Kahn-cycle-check (wrapped as `CompileError::Bootstrap`), with no re-implementation. Non-goals (deferred per C23/C16): no optimisation pass (CSE/DCE, sweep-invariant hoisting), no external optimisation crate, no named-handle ergonomic wiring, no `aura graph` render (#13). Verification: 48 engine tests green (8 blueprint: derived-schema, single + nested composite inlining, the three CompileError paths, bootstrap-error wrap, and the headline `composite_sma_cross_runs_bit_identical_to_hand_wired` C1 demonstrator — the SMA-cross composite lowers to a flat graph byte-identical to the hand-wired sample harness, producing bit-for-bit identical equity + exposure traces); `cargo clippy --workspace --all-targets -D warnings` clean. `Node`, `Harness::bootstrap`, the run loop, and `Edge`/`Target`/`SourceSpec` are unchanged. closes #12
41 lines
2.0 KiB
Rust
41 lines
2.0 KiB
Rust
//! `aura-engine` — the headless, UI-agnostic reactive SoA engine.
|
|
//!
|
|
//! Delivered across cycles 0003-0004 — the harness and its deterministic run
|
|
//! loop:
|
|
//!
|
|
//! - [`Harness`] — the closed root graph that runs (a flat node array + an index
|
|
//! edge table, topologically ordered) and its deterministic `run` loop: a
|
|
//! k-way merge of timestamped sources (C3/C4) driven through a wired DAG of
|
|
//! nodes, cycle by cycle, with freshness-gated recompute and the two firing
|
|
//! policies (C5/C6) deciding when each node re-evaluates and what it holds.
|
|
//! - [`Edge`] / [`Target`] / [`SourceSpec`] — producer->consumer wiring,
|
|
//! source->consumer wiring, and a declared source (its kind + target slots).
|
|
//! - [`BootstrapError`] — wiring faults caught once, at bootstrap (kind
|
|
//! mismatch, bad index, directed cycle).
|
|
//!
|
|
//! Delivered in cycle 0009 — the run report surface:
|
|
//!
|
|
//! - [`RunMetrics`] / [`RunManifest`] / [`RunReport`] — the `(manifest, metrics)`
|
|
//! pair C18 mandates per run, with [`RunReport::to_json`] for the structured
|
|
//! C14 face;
|
|
//! - [`summarize`] — the post-run pure reduction over a run's recorded
|
|
//! pip-equity + exposure streams into [`RunMetrics`]; [`f64_field`] bridges a
|
|
//! recording sink's `Vec<Scalar>` rows to it.
|
|
//!
|
|
//! Still to come (subsequent cycles): the `Source` trait + data-server ingestion
|
|
//! and source-native time normalization (C3/C11), the broker-independent
|
|
//! position-event output and downstream broker nodes (C10), and the param
|
|
//! injection + orchestration axes of the atomic sim unit
|
|
//! (`(topology + params + data-window + seed)`, swept by optimize / walk-forward
|
|
//! / Monte-Carlo) — its `-> metrics` reduction now ships via [`summarize`].
|
|
//!
|
|
//! Visualization is never here: it is a downstream consumer node on the streams.
|
|
|
|
mod blueprint;
|
|
mod harness;
|
|
mod report;
|
|
|
|
pub use blueprint::{Blueprint, BlueprintNode, CompileError, Composite, OutPort};
|
|
pub use harness::{BootstrapError, Edge, Harness, SourceSpec, Target};
|
|
pub use report::{f64_field, summarize, RunManifest, RunMetrics, RunReport};
|