47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
"""
|
|
Utility functions used for classic control environments.
|
|
"""
|
|
|
|
from typing import Optional, SupportsFloat, Tuple
|
|
|
|
|
|
def verify_number_and_cast(x: SupportsFloat) -> float:
|
|
"""Verify parameter is a single number and cast to a float."""
|
|
try:
|
|
x = float(x)
|
|
except (ValueError, TypeError) as e:
|
|
raise ValueError(f"An option ({x}) could not be converted to a float.") from e
|
|
return x
|
|
|
|
|
|
def maybe_parse_reset_bounds(
|
|
options: Optional[dict], default_low: float, default_high: float
|
|
) -> Tuple[float, float]:
|
|
"""
|
|
This function can be called during a reset() to customize the sampling
|
|
ranges for setting the initial state distributions.
|
|
|
|
Args:
|
|
options: Options passed in to reset().
|
|
default_low: Default lower limit to use, if none specified in options.
|
|
default_high: Default upper limit to use, if none specified in options.
|
|
|
|
Returns:
|
|
Tuple of the lower and upper limits.
|
|
"""
|
|
if options is None:
|
|
return default_low, default_high
|
|
|
|
low = options.get("low") if "low" in options else default_low
|
|
high = options.get("high") if "high" in options else default_high
|
|
|
|
# We expect only numerical inputs.
|
|
low = verify_number_and_cast(low)
|
|
high = verify_number_and_cast(high)
|
|
if low > high:
|
|
raise ValueError(
|
|
f"Lower bound ({low}) must be lower than higher bound ({high})."
|
|
)
|
|
|
|
return low, high
|