Wrappers#

All wrappers live in openswmm_gymnasium.wrappers and follow the standard Gymnasium Wrapper / ActionWrapper / RewardWrapper / ObservationWrapper protocols.

Action transformation#

RescaleBoxActions#

Recursively rescale every Box leaf of the action space to a uniform window (default [0, 1]). Handy for plugging in agents whose policy naturally emits values in [0, 1] or [-1, 1].

from openswmm_gymnasium.wrappers import RescaleBoxActions
env = RescaleBoxActions(env, src_low=0.0, src_high=1.0)

MaskDesignAction / MaskRuntimeAction#

Flatten a Dict({design, runtime}) env so the agent only sees one half; the other half is auto-filled (mid-range for runtime, sampled once at reset() for design — or pinned with frozen_design=).

from openswmm_gymnasium.wrappers import MaskDesignAction
env = MaskDesignAction(env, frozen_design={"node_max_depth": [10.0, 12.0]})

Reward transformation#

LinearScalarize / TchebycheffScalarize#

Convert vector reward to scalar:

from openswmm_gymnasium.wrappers import LinearScalarize, TchebycheffScalarize

env = LinearScalarize(mo_env, weights=[1.0, 0.5, 0.25])
env = TchebycheffScalarize(mo_env, weights=[1, 1, 1], utopia=[0, 0, 0])

Observation extension#

ForecastObservation#

Append features from a user-supplied callable each step. See Observations for an example.

Recording#

RecordTrajectory#

Write one JSONL file per episode for later visualisation / regression testing.

from openswmm_gymnasium.wrappers import RecordTrajectory
env = RecordTrajectory(env, output_dir="artifacts/run-001/")

Files are named episode_<NNNNN>.jsonl. The companion openswmm_gymnasium.viz module consumes this format.