def set_state(self, state: Dict): pass xmod co-simulation master ---------------------------------------------------------------------- class XModCoSimulation: """Orchestrates coupled xmod models."""

def step(self, t: float, dt: float, inputs: Dict[str, np.ndarray]) -> XModStep: x_meas = inputs.get("x_measured", np.array([0.0]))[0] F_cmd = self.Kp * (self.x_ref - x_meas) return XModStep( outputs={"F_cmd": np.array([F_cmd])}, new_time=t + dt )

I'll write it as a with a small demo. """ xmod co-simulation — a lightweight modular co-simulation framework. Models exchange data via ports and advance with their own solvers. Master coordinates time steps and data exchange. """ import numpy as np from dataclasses import dataclass from typing import Dict, List, Callable from abc import ABC, abstractmethod ---------------------------------------------------------------------- Core xmod types ---------------------------------------------------------------------- @dataclass class XModPort: """Defines a data port for a model.""" name: str shape: tuple = () dtype: type = float

@dataclass class XModStep: """Result of a model step.""" outputs: Dict[str, np.ndarray] # port name -> value new_time: float event_occurred: bool = False

def __init__(self, name: str, Kp: float, x_ref: float = 0.0): super().__init__(name) self.Kp = Kp self.x_ref = x_ref self.input_ports = [XModPort("x_measured")] self.output_ports = [XModPort("F_cmd")]

# Log results history = [] def log(t, outputs): x = outputs["mass_spring"].get("x", [0])[0] history.append((t, x)) print(f"t={t:.3f}, x={x:.4f}")

def get_state(self): return {} # stateless

en_USEN