Source code for flatland.envs.rail_env_action

from ast import literal_eval
from functools import lru_cache
from typing import NamedTuple, Any

import fastenum
import numpy as np

from flatland.core.grid.grid4 import Grid4TransitionsEnum


[docs] class RailEnvActions(fastenum.Enum): DO_NOTHING = 0 # implies change of direction in a dead-end! MOVE_LEFT = 1 MOVE_FORWARD = 2 MOVE_RIGHT = 3 STOP_MOVING = 4
[docs] @staticmethod @lru_cache def from_value(value: Any) -> "RailEnvActions": """ Returns the action if valid (either int value or in RailEnvActions), returns RailEnvActions.DO_NOTHING otherwise. """ if isinstance(value, RailEnvActions): return value if isinstance(value, str) and value.isdigit(): value = literal_eval(value) return { 0: RailEnvActions.DO_NOTHING, "DO_NOTHING": RailEnvActions.DO_NOTHING, "RailEnvActions.DO_NOTHING": RailEnvActions.DO_NOTHING, 1: RailEnvActions.MOVE_LEFT, "MOVE_LEFT": RailEnvActions.MOVE_LEFT, "RailEnvActions.MOVE_LEFT": RailEnvActions.MOVE_LEFT, 2: RailEnvActions.MOVE_FORWARD, "MOVE_FORWARD": RailEnvActions.MOVE_FORWARD, "RailEnvActions.MOVE_FORWARD": RailEnvActions.MOVE_FORWARD, 3: RailEnvActions.MOVE_RIGHT, "MOVE_RIGHT": RailEnvActions.MOVE_RIGHT, "RailEnvActions.MOVE_RIGHT": RailEnvActions.MOVE_RIGHT, 4: RailEnvActions.STOP_MOVING, "STOP_MOVING": RailEnvActions.STOP_MOVING, "RailEnvActions.STOP_MOVING": RailEnvActions.STOP_MOVING, }.get(value, RailEnvActions.DO_NOTHING)
[docs] @staticmethod def to_char(a: int): return { 0: 'B', 1: 'L', 2: 'F', 3: 'R', 4: 'S', }[a]
[docs] @staticmethod @lru_cache() def is_action_valid(action): if isinstance(action, RailEnvActions): return True # https://stackoverflow.com/questions/40429917/in-python-how-would-you-check-if-a-number-is-one-of-the-integer-types return isinstance(action, (int, np.integer)) and 0 <= action <= 4
[docs] @staticmethod @lru_cache() def is_moving_action(value: "RailEnvActions") -> bool: return value in [RailEnvActions.MOVE_RIGHT, RailEnvActions.MOVE_LEFT, RailEnvActions.MOVE_FORWARD]
[docs] @staticmethod @lru_cache() def is_left_right_action(value: "RailEnvActions") -> bool: return value in [RailEnvActions.MOVE_LEFT, RailEnvActions.MOVE_RIGHT]
RailEnvGridPos = NamedTuple('RailEnvGridPos', [('r', int), ('c', int)]) RailEnvNextAction = NamedTuple('RailEnvNextAction', [('action', RailEnvActions), ('next_position', RailEnvGridPos), ('next_direction', Grid4TransitionsEnum)])