2022-05-13 13:58:19 +01:00
""" Wrapper to enforce the proper ordering of environment operations. """
2022-09-16 23:41:27 +01:00
import gymnasium as gym
2022-09-08 10:10:07 +01:00
from gymnasium . error import ResetNeeded
2021-09-16 16:16:49 +02:00
2022-09-16 23:41:27 +01:00
class OrderEnforcing ( gym . Wrapper ) :
2022-05-13 13:58:19 +01:00
""" A wrapper that will produce an error if :meth:`step` is called before an initial :meth:`reset`.
Example :
2023-01-20 14:28:09 +01:00
>> > import gymnasium as gym
>> > from gymnasium . wrappers import OrderEnforcing
>> > env = gym . make ( " CartPole-v1 " , render_mode = " human " )
2022-05-13 13:58:19 +01:00
>> > env = OrderEnforcing ( env )
2023-01-20 14:28:09 +01:00
>> > env . step ( 0 ) # doctest: +SKIP
gymnasium . error . ResetNeeded : Cannot call env . step ( ) before calling env . reset ( )
>> > env . render ( ) # doctest: +SKIP
gymnasium . error . ResetNeeded ( ' Cannot call `env.render()` before calling `env.reset()`, if this is a intended action, set `disable_render_order_enforcing=True` on the OrderEnforcer wrapper. ' )
>> > _ = env . reset ( )
2022-05-13 13:58:19 +01:00
>> > env . render ( )
2023-01-20 14:28:09 +01:00
>> > _ = env . step ( 0 )
2022-05-13 13:58:19 +01:00
"""
2022-04-30 01:43:59 +02:00
2022-09-16 23:41:27 +01:00
def __init__ ( self , env : gym . Env , disable_render_order_enforcing : bool = False ) :
2022-05-18 15:07:54 +01:00
""" A wrapper that will produce an error if :meth:`step` is called before an initial :meth:`reset`.
Args :
env : The environment to wrap
disable_render_order_enforcing : If to disable render order enforcing
"""
2022-08-30 19:41:59 +05:30
super ( ) . __init__ ( env )
2022-05-18 15:07:54 +01:00
self . _has_reset : bool = False
self . _disable_render_order_enforcing : bool = disable_render_order_enforcing
2021-09-16 16:16:49 +02:00
def step ( self , action ) :
2022-05-18 15:07:54 +01:00
""" Steps through the environment with `kwargs`. """
if not self . _has_reset :
raise ResetNeeded ( " Cannot call env.step() before calling env.reset() " )
2022-05-13 13:58:19 +01:00
return self . env . step ( action )
2021-09-16 16:16:49 +02:00
2022-01-19 23:28:59 +01:00
def reset ( self , * * kwargs ) :
2022-05-13 13:58:19 +01:00
""" Resets the environment with `kwargs`. """
2021-09-16 16:16:49 +02:00
self . _has_reset = True
2022-01-19 23:28:59 +01:00
return self . env . reset ( * * kwargs )
2022-05-13 13:58:19 +01:00
2022-06-15 15:33:03 +02:00
def render ( self , * args , * * kwargs ) :
2022-05-18 15:07:54 +01:00
""" Renders the environment with `kwargs`. """
if not self . _disable_render_order_enforcing and not self . _has_reset :
raise ResetNeeded (
" Cannot call `env.render()` before calling `env.reset()`, if this is a intended action, "
" set `disable_render_order_enforcing=True` on the OrderEnforcer wrapper. "
2022-05-13 13:58:19 +01:00
)
2022-06-15 15:33:03 +02:00
return self . env . render ( * args , * * kwargs )
2022-07-04 18:19:25 +01:00
@property
def has_reset ( self ) :
""" Returns if the environment has been reset before. """
return self . _has_reset