Skip to content

HyDRA Identification

flowcean.hybrid.hydra is the curated facade for HyDRA identification, callbacks, trace schemas, simulations, and mode-selector APIs. Selector-specific types and helpers are also available from flowcean.hybrid.hydra.selector.

hydra

Curated HyDRA hybrid-system identification API.

Classes

LogCallback

Bases: HyDRACallback

Methods:
start
start(*, trace_count: int, threshold: float, start_width: int, step_width: int) -> None
pending_segment_found
pending_segment_found(segment: TraceSegment) -> None
candidate_window_evaluated
candidate_window_evaluated(candidate: HyDRACandidateFit) -> None
candidate_selected
candidate_selected(candidate: HyDRACandidateFit) -> None
grouping_evaluated
grouping_evaluated(grouping: HyDRAGroupingEvaluation) -> None
mode_finalized
mode_finalized(*, mode_id: int, triggering_segment: TraceSegment, accepted_segments: Sequence[TraceSegment]) -> None
learning_stopped
learning_stopped(*, segment: TraceSegment, reason: str) -> None
finish
finish(*, final_mode_count: int) -> None

PlotCallback

PlotCallback(trace: Trace, dims: Sequence[int] | None = None, *, trace_index: int = 0, ax: Axes | None = None, show: bool = True, pause: float = 0.001)

Bases: HyDRACallback

Live matplotlib visualization for HyDRA trace analysis progress.

Attributes
trace instance-attribute
trace = trace
dims instance-attribute
dims = list(dims) if dims is not None else [0]
trace_index instance-attribute
trace_index = trace_index
ax instance-attribute
ax = ax
show instance-attribute
show = show
pause instance-attribute
pause = pause
Methods:
start
start(*, trace_count: int, threshold: float, start_width: int, step_width: int) -> None
pending_segment_found
pending_segment_found(segment: TraceSegment) -> None
candidate_window_evaluated
candidate_window_evaluated(candidate: HyDRACandidateFit) -> None
candidate_selected
candidate_selected(candidate: HyDRACandidateFit) -> None
grouping_evaluated
grouping_evaluated(grouping: HyDRAGroupingEvaluation) -> None
mode_finalized
mode_finalized(*, mode_id: int, triggering_segment: TraceSegment, accepted_segments: Sequence[TraceSegment]) -> None
learning_stopped
learning_stopped(*, segment: TraceSegment, reason: str) -> None
finish
finish(*, final_mode_count: int) -> None

HyDRALearner

HyDRALearner(regressor_factory: Callable[[], SupervisedIncrementalLearner], threshold: float, start_width: int = 10, step_width: int = 5, selector_learner: HybridDecisionTreeLearner | None = None, callback: HyDRACallback | None = None, trace_schema: HyDRATraceSchema | None = None)

Bases: SupervisedLearner

Identify hybrid-system modes from trace inputs and derivatives.

regressor_factory must create fresh incremental supervised learners. The current learner supports single-output derivative training. When a selector learner is provided, HyDRA labels accurate trace segments and trains a selector to route future rows to learned modes.

Attributes
regressor_factory instance-attribute
regressor_factory: Callable[[], SupervisedIncrementalLearner] = regressor_factory
threshold instance-attribute
threshold: float = threshold
start_width instance-attribute
start_width: int = start_width
step_width instance-attribute
step_width: int = step_width
selector_learner instance-attribute
selector_learner: HybridDecisionTreeLearner | None = selector_learner
callback instance-attribute
callback: HyDRACallback = callback or NoOpCallback()
trace_schema instance-attribute
trace_schema: HyDRATraceSchema | None = trace_schema
Methods:
learn
learn(inputs: LazyFrame, outputs: LazyFrame) -> HyDRAModel

HyDRAModel

HyDRAModel(modes: list[Model], *, input_features: list[str], output_features: list[str], selector: HybridDecisionTreeModel | None = None, trace_schema: HyDRATraceSchema | None = None)

Bases: Model

Model composed of learned continuous modes and an optional selector.

A single-mode model predicts directly with that mode. A multi-mode model needs a selector for batch prediction. Model persistence uses Flowcean's trusted-only pickle-based model serialization.

Attributes
modes instance-attribute
modes = modes
input_features instance-attribute
input_features = input_features
output_features instance-attribute
output_features = output_features
selector instance-attribute
selector = selector
trace_schema instance-attribute
trace_schema = trace_schema
Methods:
predict_with_diagnostics
predict_with_diagnostics(input_features: DataFrame | LazyFrame) -> HyDRABatchPrediction
simulate
simulate(t_span: tuple[float, float], x0: Iterable[float], *, input_stream: InputStream | None = None, capture_inputs: bool | None = None, sample_times: Iterable[float] | None = None, sample_dt: float | None = None, rtol: float = 1e-07, atol: float = 1e-09, max_step: float | None = None) -> Trace
predict_next_state
predict_next_state(state: Iterable[float], *, t: float, dt: float, input_stream: InputStream | None = None, rtol: float = 1e-07, atol: float = 1e-09, max_step: float | None = None) -> ndarray

HyDRATraceSchema dataclass

HyDRATraceSchema(time: str, state: tuple[str, ...], derivative: tuple[str, ...], inputs: tuple[str, ...] = ())

Column schema for HyDRA trace-based learning.

Parameters:

Name Type Description Default
time str

Time column name.

required
state tuple[str, ...]

State column names used as model inputs.

required
derivative tuple[str, ...]

Derivative column names used as model outputs.

required
inputs tuple[str, ...]

Optional external input column names.

()

HyDRA currently expects derivative columns to align with state columns and supports single-output training in HyDRALearner.

Attributes
time instance-attribute
time: str
state instance-attribute
state: tuple[str, ...]
derivative instance-attribute
derivative: tuple[str, ...]
inputs class-attribute instance-attribute
inputs: tuple[str, ...] = ()
input_features property
input_features: tuple[str, ...]
Methods:
validate_input_features
validate_input_features(input_features: Sequence[str]) -> None
validate_output_features
validate_output_features(output_features: Sequence[str]) -> None
validate_state_derivative_width
validate_state_derivative_width() -> None

HybridDecisionTreeLearner

HybridDecisionTreeLearner(feature_config: SelectorFeatureConfig, **tree_kwargs: Any)

Bases: SupervisedLearner

Attributes
classifier instance-attribute
classifier: DecisionTreeClassifier = DecisionTreeClassifier(**classifier_kwargs)
feature_config instance-attribute
feature_config = feature_config
Methods:
learn
learn(inputs: DataFrame | LazyFrame, outputs: DataFrame | LazyFrame) -> HybridDecisionTreeModel
learn_from_traces
learn_from_traces(traces: list[DataFrame], mode_to_flow: dict[int, Model] | None = None) -> HybridDecisionTreeModel

HybridDecisionTreeModel

HybridDecisionTreeModel(classifier: DecisionTreeClassifier, feature_columns: tuple[str, ...], feature_config: SelectorFeatureConfig, mode_to_flow: dict[int, Model] | None = None)

Bases: Model

Attributes
classifier instance-attribute
classifier = classifier
feature_columns instance-attribute
feature_columns = feature_columns
feature_config instance-attribute
feature_config = feature_config
mode_to_flow instance-attribute
mode_to_flow = mode_to_flow or {}
Methods:
predict_details
predict_details(input_features: DataFrame | LazyFrame) -> list[ModePredictionResult]
resolve_flow
resolve_flow(mode_id: int) -> Model | None
feature_importances
feature_importances() -> dict[str, float]
tree_text
tree_text() -> str
summary_text
summary_text() -> str
leaf_summary_text
leaf_summary_text() -> str
mode_summary_text
mode_summary_text() -> str
to_dot
to_dot() -> str
to_svg
to_svg() -> str
save_svg
save_svg(path: str | Path) -> None
debug_prediction_text
debug_prediction_text(input_features: DataFrame | LazyFrame) -> str
inspect
inspect() -> SelectorInspection

ModePredictionResult dataclass

ModePredictionResult(ready: bool, mode_id: int | None, probabilities: dict[int, float] = dict(), leaf_id: int | None = None, flow_model: Model | None = None)
Attributes
ready instance-attribute
ready: bool
mode_id instance-attribute
mode_id: int | None
probabilities class-attribute instance-attribute
probabilities: dict[int, float] = field(default_factory=dict)
leaf_id class-attribute instance-attribute
leaf_id: int | None = None
flow_model class-attribute instance-attribute
flow_model: Model | None = None

SelectorEvaluationReport dataclass

SelectorEvaluationReport(accuracy: float, samples: int, confusion_matrix: DataFrame)
Attributes
accuracy instance-attribute
accuracy: float
samples instance-attribute
samples: int
confusion_matrix instance-attribute
confusion_matrix: DataFrame

SelectorFeatureConfig dataclass

SelectorFeatureConfig(state_features: tuple[str, ...] = (), input_features: tuple[str, ...] = (), derivative_features: tuple[str, ...] = (), state_history: int = 0, input_history: int = 0, derivative_history: int = 0, mode_history: int = 0)

Configuration for selector feature construction.

Parameters:

Name Type Description Default
state_features tuple[str, ...]

State columns available to the selector.

()
input_features tuple[str, ...]

Raw input columns available to the selector.

()
derivative_features tuple[str, ...]

Derivative columns available to the selector.

()
state_history int

Number of previous state rows used for selector features.

0
input_history int

Number of previous input rows used for selector features.

0
derivative_history int

Number of previous derivative rows used for selector features.

0
mode_history int

Number of previous mode labels used for selector features.

0
Attributes
state_features class-attribute instance-attribute
state_features: tuple[str, ...] = ()
input_features class-attribute instance-attribute
input_features: tuple[str, ...] = ()
derivative_features class-attribute instance-attribute
derivative_features: tuple[str, ...] = ()
state_history class-attribute instance-attribute
state_history: int = 0
input_history class-attribute instance-attribute
input_history: int = 0
derivative_history class-attribute instance-attribute
derivative_history: int = 0
mode_history class-attribute instance-attribute
mode_history: int = 0
max_history property
max_history: int
Methods:
required_columns
required_columns() -> tuple[str, ...]
validate
validate() -> None

SelectorInspection dataclass

SelectorInspection(feature_columns: tuple[str, ...], classes: tuple[int, ...], max_depth: int, n_leaves: int, nodes: tuple[SelectorNodeInspection, ...], leaves: tuple[SelectorLeafInspection, ...], modes: tuple[SelectorModeInspection, ...])
Attributes
feature_columns instance-attribute
feature_columns: tuple[str, ...]
classes instance-attribute
classes: tuple[int, ...]
max_depth instance-attribute
max_depth: int
n_leaves instance-attribute
n_leaves: int
nodes instance-attribute
nodes: tuple[SelectorNodeInspection, ...]
leaves instance-attribute
leaves: tuple[SelectorLeafInspection, ...]
modes instance-attribute
modes: tuple[SelectorModeInspection, ...]

SelectorLeafInspection dataclass

SelectorLeafInspection(node_id: int, mode_id: int, sample_count: int, weighted_class_support: dict[int, float], flow_summary: str)
Attributes
node_id instance-attribute
node_id: int
mode_id instance-attribute
mode_id: int
sample_count instance-attribute
sample_count: int
weighted_class_support instance-attribute
weighted_class_support: dict[int, float]
flow_summary instance-attribute
flow_summary: str

SelectorModeInspection dataclass

SelectorModeInspection(mode_id: int, weighted_support: float, flow_summary: str)
Attributes
mode_id instance-attribute
mode_id: int
weighted_support instance-attribute
weighted_support: float
flow_summary instance-attribute
flow_summary: str

SelectorNodeInspection dataclass

SelectorNodeInspection(node_id: int, sample_count: int, impurity: float, is_leaf: bool, predicted_mode_id: int, weighted_class_support: dict[int, float], feature_index: int | None = None, feature_name: str | None = None, threshold: float | None = None, left_child_id: int | None = None, right_child_id: int | None = None)
Attributes
node_id instance-attribute
node_id: int
sample_count instance-attribute
sample_count: int
impurity instance-attribute
impurity: float
is_leaf instance-attribute
is_leaf: bool
predicted_mode_id instance-attribute
predicted_mode_id: int
weighted_class_support instance-attribute
weighted_class_support: dict[int, float]
feature_index class-attribute instance-attribute
feature_index: int | None = None
feature_name class-attribute instance-attribute
feature_name: str | None = None
threshold class-attribute instance-attribute
threshold: float | None = None
left_child_id class-attribute instance-attribute
left_child_id: int | None = None
right_child_id class-attribute instance-attribute
right_child_id: int | None = None

StatefulHybridDecisionTreeSelector

StatefulHybridDecisionTreeSelector(model: HybridDecisionTreeModel, seed_modes: Sequence[int] = ())
Attributes
model instance-attribute
model = model
config instance-attribute
config = model.feature_config
Methods:
predict
predict(sample: Mapping[str, Any]) -> ModePredictionResult

StateTraceComparison dataclass

StateTraceComparison(absolute_error: ndarray, mae: float, rmse: float, max_error: float)
Attributes
absolute_error instance-attribute
absolute_error: ndarray
mae instance-attribute
mae: float
rmse instance-attribute
rmse: float
max_error instance-attribute
max_error: float

Functions:

evaluate_selector_autoregressive

evaluate_selector_autoregressive(model: HybridDecisionTreeModel, traces: list[DataFrame], seed_modes: tuple[int, ...] | list[int] = ()) -> SelectorEvaluationReport

evaluate_selector_oracle

evaluate_selector_oracle(model: HybridDecisionTreeModel, traces: list[DataFrame]) -> SelectorEvaluationReport

compare_state_traces

compare_state_traces(reference: Trace, predicted: Trace) -> StateTraceComparison