Bang-Bang

A classical bang-bang controller agent.

A deterministic, stateless control policy that switches between two action values based on a setpoint comparison of a selected observation field.

Control Logic:
  • If obs[obs_field] <= setpoint: Select “low” action

  • If obs[obs_field] > setpoint: Select “high” action

Action Space Behavior:
  • Discrete(n): Low=0, High=n-1 (requires n >= 2)

  • Box: Low=action_space.low, High=action_space.high

Note: This is a non-learning agent (update() does nothing).

class myriad.agents.classical.bangbang.AgentParams(action_space, setpoint, obs_field, low_action, high_action, invert=False)[source]

Bases: object

Static parameters for the bang-bang controller agent.

Variables:
  • action_space (myriad.core.spaces.Space) – Action space (Box or Discrete)

  • setpoint (float) – Switching setpoint for bang-bang control

  • obs_field (str) – Field name from observation NamedTuple to use for setpoint comparison

  • low_action (jax.jaxlib._jax.Array) – Pre-computed low action value (for JIT efficiency)

  • high_action (jax.jaxlib._jax.Array) – Pre-computed high action value (for JIT efficiency)

  • invert (bool) – If True, swap action selection (high when below setpoint, low when above)

action_space: Space
setpoint: float
obs_field: str
low_action: Array
high_action: Array
invert: bool = False
__init__(action_space, setpoint, obs_field, low_action, high_action, invert=False)
replace(**updates)

Returns a new object replacing the specified fields with new values.

class myriad.agents.classical.bangbang.AgentState(obs_index)[source]

Bases: object

Bang-bang controller state.

Variables:

obs_index (int) – Array index corresponding to obs_field (computed at init time)

obs_index: int
__init__(obs_index)
replace(**updates)

Returns a new object replacing the specified fields with new values.

myriad.agents.classical.bangbang.make_agent(action_space, setpoint=0.0, obs_field='theta', invert=False)[source]

Factory function to create a bang-bang controller agent.

Parameters:
  • action_space (Space) – Action space (Box or Discrete)

  • setpoint (float) – Bang-bang switching setpoint. Default 0.0.

  • obs_field (str) – Field name from observation NamedTuple to use for setpoint comparison. Default “theta” (pole angle for CartPole).

  • invert (bool) – If False (default): high action when obs > setpoint. If True: low action when obs > setpoint (swapped polarity)

Returns:

Agent instance with bang-bang control policy

Return type:

Agent[AgentState, AgentParams, Observation]

Example

>>> # Example: bang-bang controller for CartPole
>>> # Normal: push right when pole tilts right
>>> agent = make_agent(action_space, setpoint=0.0, obs_field="theta")
>>>
>>> # Inverted: push left when pole tilts right (opposite polarity)
>>> agent = make_agent(action_space, setpoint=0.0, obs_field="theta", invert=True)