bloc.runner#
BlocRunner — BoulderRunner subclass with Bloc-specific normalisation.
All Bloc Python code that previously called Boulder free functions directly
now goes through BlocRunner. This means:
Mechanism normalisation and deprecated-key rejection live in one place.
Mechanism path resolution lives on
BlocConverter.resolve_mechanism.Schema lookups (
report_metadata,schema_entry) trigger registration of Bloc reactor kinds into Boulder’s global_SCHEMA_REGISTRYon demand.
Classes#
Orchestrator for the full YAML-to-SimulationResult pipeline, Bloc flavour. |
Module Contents#
- class bloc.runner.BlocRunner(config, *, plugins=None, config_path=None)#
Bases:
boulder.runner.BoulderRunnerOrchestrator for the full YAML-to-SimulationResult pipeline, Bloc flavour.
Differences from
BoulderRunner:Uses
BlocConverteras the converter.normalizerejects deprecatedmechanism_reac/mechanism_torchkeys.report_metadataandschema_entryensure Bloc reactor schemas are registered in Boulder’s global_SCHEMA_REGISTRYbefore lookup.
- converter_class#
- classmethod load(path)#
Load raw config with Bloc
from:inheritance resolved.Bloc YAML files may use a
from: <parent>.yamlkey for STONE overlay inheritance. Boulder’sload_config_fileis a plainyaml.safe_loadand passes the raw dict (includingfrom:) straight tonormalize_config, which then rejectsfrom:as an unknown top-level key.This override resolves the full inheritance chain via
load_yaml_with_inheritance()before handing the merged dict to Boulder’s normaliser. Files without afrom:key are loaded identically to the base implementation.
- classmethod normalize(cfg)#
Normalise config and inject Bloc-specific defaults.
Extends Boulder’s
normalize_configby:Rejecting deprecated
mechanism_reac/mechanism_torchfields inphases.gas(removed in the STONE architecture).Defaulting
metadata.gui_app_titleto"Bloc"so the browser tab and GUI header show Bloc instead of Boulder when opened via theblocCLI. An explicitly set value is never overwritten.
- classmethod report_metadata(config, *, explicit_kind=None)#
Return Calculation-Note reporting metadata for config.
Ensures Bloc’s reactor schemas are registered in Boulder’s global
_SCHEMA_REGISTRYbefore delegating toboulder.schema_registry.get_report_metadata_for_config().- Parameters:
config – Normalised config dict.
explicit_kind – Override the reactor kind used for schema lookup (forwarded as
explicit_kind=toget_report_metadata_for_config).
- classmethod schema_entry(kind)#
Return the
ReactorSchemaEntryfor kind.Ensures Bloc’s reactor schemas are registered before lookup.
- config#
- config_path = None#
- plugins = None#
- converter: boulder.cantera_converter.DualCanteraConverter | None = None#
- network: boulder.staged_network.StagedReactorNet | cantera.ReactorNet | None = None#
- results: Dict[str, Any] | None = None#
- code: str | None = None#
- result: boulder.simulation_result.SimulationResult | None = None#
- property scopes: Dict[str, Any]#
Return scope data as a
dict[str, pandas.DataFrame].Each key is a scope variable path (e.g.
nodes.r1.T); each value is a DataFrame with columnst(seconds) andvalue.Returns an empty dict if no scopes were declared or if
build()has not been called yet.
- property exposed_inputs: Dict[str, Any]#
Return signals that are not bound to any internal network target.
These are the FMI-friendly input variables — signals that a co- simulation master (FMU) could override at each
doStep.A signal is considered exposed (unbound) if its
iddoes not appear as asourcein any entry of thebindings:block.Returns a
dict[signal_id, signal_spec]where each value is the raw spec dict from thesignals:block. Returns an empty dict if no signals are declared or ifbuild()has not been called yet.Note
This is the Phase E FMU data-shape contract. No FMU code is generated here; this property just exposes the data structure that
boulder.fmiwould use. SeeFMI_FMU_EXPORT.md.
- classmethod from_yaml(path)#
Load, normalise, and validate a YAML file, returning a runner instance.
- classmethod validate(cfg)#
Validate a normalised config, raising on schema errors.
- build_stage_graph()#
Parse the config into a topologically-sorted
StageExecutionPlan.Pure config parsing — no Cantera objects are created. Stage IDs and node lists are available immediately after this call.
- new_trajectory()#
Return a fresh, empty
LagrangianTrajectory.
- solve_stage(plan, stage, inlet_states, trajectory, stream_reservoirs=True, _stream_node_dicts=None, _stream_conns_by_stage=None, interface_reservoirs=None, _iface_node_dicts=None, _iface_conns_by_stage=None)#
Build and solve one stage, updating inlet_states and trajectory in place.
This is exactly one iteration of the
solve_staged()loop body. Calling it once per stage in topological order is equivalent to callingsolve_staged()on the full plan.- Parameters:
plan – Full execution plan (needed for mechanism-switch target lookup).
stage – The
Stageto solve.inlet_states – Mutable
{node_id: ct.Solution}dict. Populated by upstream stages; consumed here to initialise inter-stage-inlet reactors. Updated in place with this stage’s outlet states.trajectory – Accumulates per-stage
SolutionArraysegments.stream_reservoirs – When
True(default), use synthesised stream-point reservoirs and real MFCs on the downstream side of each stage boundary._stream_node_dicts – Pre-built mapping
{stream_point_id: node_dict}. Populated bybuild()._stream_conns_by_stage – Pre-built mapping
{stage_id: [conn_dict, ...]}. Populated bybuild().interface_reservoirs – Deprecated alias for stream_reservoirs.
_iface_node_dicts – Deprecated alias for _stream_node_dicts.
_iface_conns_by_stage – Deprecated alias for _stream_conns_by_stage.
Examples
- build_viz_network(plan, trajectory, stream_reservoirs=True, interface_reservoirs=None)#
Assemble the full visualization
ReactorNetfrom all converged states.Connects all inter-stage connections into one ReactorNet (not solved again — just for visualization and Sankey generation). Sets
self.networkandtrajectory.viz_network.- Parameters:
plan – Execution plan (provides inter-stage connection list).
trajectory – Updated in place:
trajectory.viz_networkis set.stream_reservoirs – When
True(default), the original inter-stage connection IDs are added tobuilt_conn_idsso thatbuild_viz_networkdoes not create a direct source→target MFC that bypasses the stream-point reservoir.interface_reservoirs – Deprecated alias for stream_reservoirs.
Examples
- run_continuation(continuation=None)#
Execute a parameter continuation sweep as defined in
continuation:STONE block.Wraps
solve_stage()in an outer loop, mutating the target parameter between solves and collecting the trajectory. Equivalent to the manual loop incombustor.py:while combustor.T > 500: sim.solve_steady() inlet.mass_flow_rate *= 0.9
- Parameters:
continuation –
Parsed
continuation:dict from the STONE YAML. WhenNonethe method readsself.config.get("continuation"). Structure:parameter: connections.<id>.mass_flow_rate update: multiply: 0.9 # or set: <val> or list: [...] until: reactor_T_below: 500 # or reactor_T_above: <K> max_iters: 200
- Returns:
For chaining. After this call
self.networkis the visualization network built from the last converged iteration.- Return type:
self- Raises:
ValueError – If continuation is missing required keys or parameter path cannot be resolved.
- build()#
Instantiate the converter, build and solve the staged network.
Internally calls
build_stage_graph(),solve_stage()for each stage, andbuild_viz_network()— the same sequence emitted in the downloadable Python script.Returns
selffor chaining. After this call:self.converteris theDualCanteraConverter.self.networkis a raw visualizationReactorNet(upgraded to theStagedReactorNetfacade aftersolve()is called).self.codeis the generated standalone Python script string.
- solve()#
Build (if not done) and produce a typed
SimulationResult.After this call
self.resultis aSimulationResultandself.networkis the sameStagedReactorNetfacade asself.result.network— i.e.self.network is self.result.network.Returns
selffor chaining.
- run_headless(*, download_path=None, simulate=True, end_time=None, dt=None)#
Solve the network and optionally write a downloadable Python script.
This is the single source of truth for the
--headless --downloadCLI flow. CustomBoulderRunnersubclasses use the same method so the generated scripts stay on one code path (same converter wiring).- Parameters:
download_path – Path to write the standalone Python script. Skipped when
None.simulate – When
Trueandend_timeis set, runrun_streaming_simulationto append the time-advance section to the generated code.end_time – Simulation end time in seconds (from
settings.end_timein the YAML).dt – Simulation time step in seconds (from
settings.dtin the YAML).