diff --git a/airplane/__init__.py b/airplane/__init__.py new file mode 100644 index 0000000..11c1bb8 --- /dev/null +++ b/airplane/__init__.py @@ -0,0 +1,15 @@ +from gymnasium.envs.registration import register + + +register( + id="ReducedSymmetricGliderPullout-v0", + entry_point="airplane.reduced_symmetric_glider_pullout:ReducedSymmetricGliderPullout", + max_episode_steps=100, +) + + +register( + id="ReducedBankedGliderPullout-v0", + entry_point="airplane.reduced_banked_glider_pullout:ReducedBankedGliderPullout", + max_episode_steps=100, +) \ No newline at end of file diff --git a/airplane/airplane_env.py b/airplane/airplane_env.py new file mode 100644 index 0000000..3781343 --- /dev/null +++ b/airplane/airplane_env.py @@ -0,0 +1,47 @@ +import numpy as np +from gymnasium import Env + +class AirplaneEnv(Env): + metadata = {"render_modes": ["human", "ascii", "ansi"], "render_fps": 60} + # TODO(gtorre): use render fps + + def __init__(self, airplane, render_mode=None): + self.airplane = airplane + + self.visualiser = None + self.render_mode = render_mode + assert render_mode is None or render_mode in self.metadata["render_modes"] + self.window = None + self.clock = None + + def seed(self, seed=None): + np.random.seed(seed) + + def render(self, mode: str | None = "ascii"): + """Renders the environment. + :param mode: str, the mode to render with: + - human: render to the current display or terminal and + return nothing. Usually for human consumption. + - ansi: Return a string (str) or StringIO.StringIO containing a + terminal-style text representation. The text can include newlines + and ANSI escape sequences (e.g. for colors). + """ + if mode == "human": + pass + #if not self.visualiser: + #self.visualiser = Visualizer(self.airplane) + #self.visualiser.plot() + + else: # ANSI or ASCII + # TODO: Add additional observations + print( + f"\u001b[34m Flight Path Angle (deg): {np.rad2deg(self.airplane.flight_path_angle):.2f}\u001b[37m" + ) + # TODO: Proper stall prediction + if self.airplane.flight_path_angle > 0.7: + print("\u001b[35m -- STALL --\u001b[37m") + + def close(self): + if self.window is not None: + # close + raise NotImplementedError \ No newline at end of file diff --git a/airplane/grumman.py b/airplane/grumman.py new file mode 100644 index 0000000..e451825 --- /dev/null +++ b/airplane/grumman.py @@ -0,0 +1,131 @@ +import numpy as np + + +class Grumman: + #################################### + ### Grumman American AA-1 Yankee ### + #################################### + """Base class for airplane parameters""" + + def __init__(self): + ###################### + ### Sim parameters ### + ###################### + self.TIME_STEP = 0.01 + self.GRAVITY = 9.81 + self.AIR_DENSITY = 1.225 # Density (ρ) [kg/m3] + + ########################### + ### Airplane parameters ### + ########################### + # Aerodynamic model: CL coefficients + self.CL_0 = 0.41 + self.CL_ALPHA = 4.6983 + self.CL_ELEVATOR = 0.361 + self.CL_QHAT = 2.42 + # Aerodynamic model: CD coefficients + self.CD_0 = 0.0525 + self.CD_ALPHA = 0.2068 + self.CD_ALPHA2 = 1.8712 + # Aerodynamic model: Cm coefficients + self.CM_0 = 0.076 + self.CM_ALPHA = -0.8938 + self.CM_ELEVATOR = -1.0313 + self.CM_QHAT = -7.15 + # Aerodynamic model: Cl coefficients + self.Cl_BETA = -0.1089 + self.Cl_PHAT = -0.52 + self.Cl_RHAT = 0.19 + self.Cl_AILERON = -0.1031 + self.Cl_RUDDER = 0.0143 + # Physical model + self.MASS = 697.18 # Mass (m) [kg] + self.WING_SURFACE_AREA = 9.1147 # Wing surface area (S) [m2] + self.CHORD = 1.22 # Chord (c) [m] + self.WING_SPAN = 7.46 # Wing Span (b) [m] + self.I_XX = 808.06 # Inertia [Kg.m^2] + self.I_YY = 1011.43 # Inertia [Kg.m^2] + self.ALPHA_STALL = np.deg2rad(15) # Stall angle of attack (αs) [rad] + self.ALPHA_NEGATIVE_STALL = np.deg2rad(-7) # Negative stall angle of attack (αs) [rad] + self.CL_STALL = self.CL_0 + self.CL_ALPHA * self.ALPHA_STALL + self.CL_REF = self.CL_STALL + # self.STALL_AIRSPEED = 32.19 # Stall air speed (Vs) [m/s] + self.STALL_AIRSPEED = np.sqrt(self.MASS * self.GRAVITY / (0.5 * self.AIR_DENSITY * \ + self.WING_SURFACE_AREA * self.CL_REF)) # Stall air speed (Vs) [m/s] + self.MAX_CRUISE_AIRSPEED = 2 * self.STALL_AIRSPEED # Maximum air speed (Vs) [m/s] + + # Throttle model + self.THROTTLE_LINEAR_MAPPING = None + self._initialize_throttle_model() + + def _update_state_from_derivative(self, value_to_update, value_derivative): + value_to_update += self.TIME_STEP * value_derivative + return value_to_update + + def _alpha_from_cl(self, c_lift): + alpha = (c_lift - self.CL_0) / self.CL_ALPHA + return alpha + + def _cl_from_lift_force_and_speed(self, lift_force, airspeed): + cl = 2 * lift_force / (self.AIR_DENSITY * self.WING_SURFACE_AREA * airspeed ** 2) + return cl + + def _cl_from_alpha(self, alpha, elevator, q_hat): + # TODO: review model + if alpha <= self.ALPHA_NEGATIVE_STALL: + c_lift = self.CL_0 + self.CL_ALPHA * self.ALPHA_NEGATIVE_STALL + elif alpha >= self.ALPHA_STALL: + # Stall model: Lift saturation + c_lift = self.CL_0 + self.CL_ALPHA * self.ALPHA_STALL + # Stall model: Lift reduction with opposite slope + # c_lift = - self.CL_ALPHA * alpha + self.CL_0 + 2 * self.CL_ALPHA * self.ALPHA_STALL + else: + c_lift = self.CL_0 + self.CL_ALPHA * alpha + self.CL_ELEVATOR * elevator + self.CL_QHAT * q_hat + return c_lift + + def _lift_force_at_speed_and_cl(self, airspeed, lift_coefficient): + return 0.5 * self.AIR_DENSITY * self.WING_SURFACE_AREA * airspeed ** 2 * lift_coefficient + + def _cd_from_alpha(self, alpha): + c_drag = self.CD_0 + self.CD_ALPHA * alpha + self.CD_ALPHA2 * (alpha ** 2) + return c_drag + + def _cd_from_cl(self, c_lift): + c_drag = self._cd_from_alpha(self._alpha_from_cl(c_lift)) + return c_drag + + def _drag_force_at_speed_and_cd(self, airspeed, drag_coefficient): + return 0.5 * self.AIR_DENSITY * self.WING_SURFACE_AREA * airspeed ** 2 * drag_coefficient + + def _drag_force_at_cruise_speed(self, airspeed): + cruise_lift_force = self.MASS * self.GRAVITY + cruise_cl = self._cl_from_lift_force_and_speed(cruise_lift_force, airspeed) + alpha = self._alpha_from_cl(cruise_cl) + cruise_cd = self._cd_from_alpha(alpha) + drag_force = self._drag_force_at_speed_and_cd(airspeed, cruise_cd) + return drag_force + + def _rolling_moment_coefficient(self, beta, p_hat, r_hat, aileron, rudder): + c_rolling_moment = self.Cl_BETA * beta + self.Cl_PHAT * p_hat + self.Cl_RHAT * r_hat + \ + self.Cl_AILERON * aileron + self.Cl_RUDDER * rudder + return c_rolling_moment + + def _rolling_moment_at_speed_and_cl(self, airspeed, rolling_moment_coefficient): + return 0.5 * self.AIR_DENSITY * self.WING_SURFACE_AREA * self.WING_SPAN * airspeed ** 2 * rolling_moment_coefficient + + def _pitching_moment_coefficient(self, alpha, elevator, q_hat): + c_pitch_moment = self.CM_0 + self.CM_ALPHA * alpha + self.CM_ELEVATOR * elevator + self.CM_QHAT * q_hat + return c_pitch_moment + + def _pitching_moment_at_speed_and_cm(self, airspeed, pitching_moment_coefficient): + return 0.5 * self.AIR_DENSITY * self.WING_SURFACE_AREA * self.CHORD * airspeed ** 2 * pitching_moment_coefficient + + def _initialize_throttle_model(self, ): + # Throttle model: Thrust force = Kt * δ_throttle + # Max Thrust -> Kt * 1 = Drag(V=Vmax) -> Kt = 0.5 ρ S (Vmax)^2 CD + # δ_throttle = 1.0 -> Max Cruise speed: V' = Vmax -> V_dot = 0 = Thrust Force - Drag Force + self.THROTTLE_LINEAR_MAPPING = self._drag_force_at_cruise_speed(self.MAX_CRUISE_AIRSPEED) + + def _thrust_force_at_throttle(self, throttle): + thrust_force = self.THROTTLE_LINEAR_MAPPING * throttle + return thrust_force \ No newline at end of file diff --git a/airplane/reduced_banked_glider_pullout.py b/airplane/reduced_banked_glider_pullout.py new file mode 100644 index 0000000..e327c09 --- /dev/null +++ b/airplane/reduced_banked_glider_pullout.py @@ -0,0 +1,71 @@ +import numpy as np +import gymnasium +from gymnasium import spaces +from matplotlib import pyplot as plt +from airplane.reduced_grumman import ReducedGrumman +from airplane.airplane_env import AirplaneEnv + + +class ReducedBankedGliderPullout(AirplaneEnv): + + def __init__(self, render_mode=None): + + self.airplane = ReducedGrumman() + super().__init__(self.airplane) + + """ bins_space = { + "flight_path_angle": np.linspace(np.deg2rad(-90), np.deg2rad(0), 20, dtype=np.float32), # Flight Path Angle (γ) (0) + "airspeed_norm": np.linspace(0.7, 4.0, 20, dtype=np.float32), # Air Speed (V) (1) + "bank_angle": np.linspace( np.deg2rad(-20), np.deg2rad(200), 20, dtype=np.float32), # Bank Angle (mu) (2) + } + + action_space= np.array(np.meshgrid(np.linspace(-0.5, 1.0, 5, dtype=np.float32), + np.linspace(np.deg2rad(-30), np.deg2rad(30), 5, dtype=np.float32))).T.reshape(-1, 2) + """ + + # Observation space: Flight Path Angle (γ), Air Speed (V), Bank Angle (μ) + self.observation_space = spaces.Box(np.array([np.deg2rad(-180), 0.7, np.deg2rad(-20)], np.float32), + np.array([np.deg2rad(0), 4.0, np.deg2rad(200)], np.float32), shape=(3,), dtype=np.float32) + # Action space: Lift Coefficient (CL), Bank Rate (μ') + self.action_space = spaces.Box(np.array([-0.5, np.deg2rad(-30)], np.float32), np.array([1.0, np.deg2rad(30)], np.float32), shape=(2,), dtype=np.float32) + + def _get_obs(self): + return np.vstack([self.airplane.flight_path_angle, self.airplane.airspeed_norm, self.airplane.bank_angle], dtype=np.float32).T + + def _get_info(self): + return {} + + def reset(self, seed=None, options=None): + + # Choose the initial agent's state uniformly + [flight_path_angle, airspeed_norm, bank_angle] = np.random.uniform(self.observation_space.low, self.observation_space.high) + self.airplane.reset(flight_path_angle, airspeed_norm, bank_angle) + + observation = self._get_obs(), {} + + return observation + + def step(self, action: list): + # Update state + action = np.clip(action, self.action_space.low, self.action_space.high) + c_lift = action[0] + bank_rate = action[1] + init_terminal = self.termination() + + self.airplane.command_airplane(c_lift, bank_rate, 0) + + # Calculate step reward: Height Loss + # TODO: Analyze policy performance based on reward implementation. + reward = self.airplane.TIME_STEP * self.airplane.airspeed_norm * np.sin(self.airplane.flight_path_angle) #- 1e-3 * bank_rate ** 2 + #reward = self.airplane.TIME_STEP * (self.airspeed_norm * self.STALL_AIRSPEED) * np.sin(self.airplane.flight_path_angle) + terminated = self.termination() + observation = self._get_obs() + info = self._get_info() + terminated = self.termination() | init_terminal + reward = np.where(init_terminal, 0, reward) + return observation, reward, terminated, False, info + + + def termination(self,): + terminate = np.where(((self.airplane.flight_path_angle>=0) | (self.airplane.flight_path_angle<=-180)) & (self.airplane.airspeed_norm >= 1) , True, False) + return terminate \ No newline at end of file diff --git a/airplane/reduced_grumman.py b/airplane/reduced_grumman.py new file mode 100644 index 0000000..c577bce --- /dev/null +++ b/airplane/reduced_grumman.py @@ -0,0 +1,56 @@ +import numpy as np +from airplane.grumman import Grumman + +class ReducedGrumman(Grumman): + #################################### + ### Grumman American AA-1 Yankee ### + #################################### + """Class for simplified airplane state and dynamics""" + + # NOTE: Commands as seperate objects? e.g. bank.rotate(airplane), + # throttle.accelerate(airplane), etc. + # NOTE: Use of α instead of Cl? + + def __init__(self): + super().__init__() + ########################## + ### Airplane variables ### + ########################## + self.flight_path_angle = np.zeros(10000, dtype=np.float32) # Flight Path Angle (γ) [rad] + self.airspeed_norm = np.ones_like(self.flight_path_angle, dtype=np.float32) # Air Speed (V/Vs) [1] + self.bank_angle = 0.0 # Bank Angle (μ) [rad] + # previous commands + self.last_c_lift = 0.0 + self.last_bank_rate = 0.0 + self.last_throttle = 0.0 + + def command_airplane(self, c_lift, bank_rate, delta_throttle): + self.last_c_lift = c_lift + self.last_bank_rate = bank_rate + self.last_throttle = delta_throttle + + c_drag = self._cd_from_cl(c_lift) + + # V_dot = - g sin γ - 0.5 * (ρ S V^2 CD / m) + (thrust force / m) + airspeed_dot = - self.GRAVITY * np.sin(self.flight_path_angle) - 0.5 * self.AIR_DENSITY * ( + self.WING_SURFACE_AREA / self.MASS) * (self.airspeed_norm * self.STALL_AIRSPEED) ** 2 * c_drag \ + + (self.THROTTLE_LINEAR_MAPPING * delta_throttle / self.MASS) + + # γ_dot = 0.5 * (ρ S V CL cos µ / m) - g cos γ / V + flight_path_angle_dot = 0.5 * self.AIR_DENSITY * (self.WING_SURFACE_AREA / self.MASS) * ( + self.airspeed_norm * self.STALL_AIRSPEED) * c_lift * np.cos(self.bank_angle) \ + - (self.GRAVITY / (self.airspeed_norm * self.STALL_AIRSPEED)) * np.cos( + self.flight_path_angle) + + # μ_dot = μ_dot_commanded + bank_angle_dot = bank_rate + + + self.airspeed_norm = self._update_state_from_derivative(self.airspeed_norm, airspeed_dot / self.STALL_AIRSPEED) + self.flight_path_angle = self._update_state_from_derivative(self.flight_path_angle, flight_path_angle_dot) + self.bank_angle = self._update_state_from_derivative(self.bank_angle, bank_angle_dot) + + def reset(self, flight_path_angle, airspeed_norm, bank_angle): + self.flight_path_angle = flight_path_angle + self.airspeed_norm = airspeed_norm + self.bank_angle = bank_angle \ No newline at end of file diff --git a/airplane/reduced_symmetric_glider_pullout.py b/airplane/reduced_symmetric_glider_pullout.py new file mode 100644 index 0000000..b189229 --- /dev/null +++ b/airplane/reduced_symmetric_glider_pullout.py @@ -0,0 +1,92 @@ +import numpy as np +from gymnasium import spaces + +from airplane.reduced_grumman import ReducedGrumman +from airplane.airplane_env import AirplaneEnv + +try: + import cupy as xp + if not xp.cuda.is_available(): + raise ImportError("CUDA is not available. Falling back to NumPy.") +except (ImportError, AttributeError): + xp = np + +class ReducedSymmetricGliderPullout(AirplaneEnv): + + def __init__(self, render_mode=None): + self.airplane = ReducedGrumman() + super().__init__(self.airplane) + + # Observation space: Flight Path Angle (γ), Air Speed (V) + self.observation_space = spaces.Box(np.array([-np.pi, 0.6], np.float32), + np.array([0, 4.0], np.float32), shape=(2,), dtype=np.float32) + # Action space: Lift Coefficient + self.action_space = spaces.Box(-0.5, 1.0, shape=(1,), dtype=np.float32) + + def _get_obs(self): + return np.vstack([self.airplane.flight_path_angle, self.airplane.airspeed_norm], dtype=np.float32).T + + def _get_info(self): + return {} + + def reset(self, seed=None, options=None): + + # Choose the initial agent's state uniformly + [flight_path_angle, airspeed_norm] = np.random.uniform(self.observation_space.low, self.observation_space.high) + self.airplane.reset(flight_path_angle, airspeed_norm, 0) + + observation = self._get_obs() + # clip the observation to the observation space + observation = np.clip(observation, self.observation_space.low, self.observation_space.high).flatten() + assert self.observation_space.contains(observation), "Observation is not within the observation space!" + return observation, {} + + def step(self, action: list): + # Update state + c_lift = action #action[0] + #self.airplane.command_airplane(c_lift, 0, 0) + + delta_throttle = 0 + bank_rate = 0 + + init_terminal = self.termination() + + self.airplane.last_c_lift = c_lift + self.airplane.last_bank_rate = bank_rate + self.airplane.last_throttle = delta_throttle + + c_drag = self.airplane._cd_from_cl(c_lift) + + # V_dot = - g sin γ - 0.5 * (ρ S V^2 CD / m) + (thrust force / m) + airspeed_dot = - self.airplane.GRAVITY * np.sin(self.airplane.flight_path_angle) - 0.5 * self.airplane.AIR_DENSITY * ( + self.airplane.WING_SURFACE_AREA / self.airplane.MASS) * (self.airplane.airspeed_norm * self.airplane.STALL_AIRSPEED) ** 2 * c_drag \ + + (self.airplane.THROTTLE_LINEAR_MAPPING * delta_throttle / self.airplane.MASS) + + # γ_dot = 0.5 * (ρ S V CL cos µ / m) - g cos γ / V + flight_path_angle_dot = 0.5 * self.airplane.AIR_DENSITY * (self.airplane.WING_SURFACE_AREA / self.airplane.MASS) * ( + self.airplane.airspeed_norm * self.airplane.STALL_AIRSPEED) * c_lift * np.cos(self.airplane.bank_angle) \ + - (self.airplane.GRAVITY / (self.airplane.airspeed_norm * self.airplane.STALL_AIRSPEED)) * np.cos( + self.airplane.flight_path_angle) + + # μ_dot = μ_dot_commanded + bank_angle_dot = bank_rate + + self.airplane.airspeed_norm += self.airplane.TIME_STEP * (airspeed_dot / self.airplane.STALL_AIRSPEED) + self.airplane.flight_path_angle += self.airplane.TIME_STEP * flight_path_angle_dot + #clip the state to the observation space + self.airplane.airspeed_norm = np.clip(self.airplane.airspeed_norm, self.observation_space.low[1], self.observation_space.high[1]) + self.airplane.flight_path_angle = np.clip(self.airplane.flight_path_angle, self.observation_space.low[0], self.observation_space.high[0]) + # Calculate step reward: Height Loss + reward = self.airplane.TIME_STEP * self.airplane.airspeed_norm * np.sin(self.airplane.flight_path_angle)*27.331231856346 + + # Get the next state + info = self._get_info() + terminated = self.termination() | init_terminal + reward = np.where(init_terminal, 0, reward) + + return np.vstack([self.airplane.flight_path_angle, self.airplane.airspeed_norm], dtype=np.float32).T, reward, terminated, False, info + + + def termination(self,): + terminate = np.where((self.airplane.flight_path_angle >= 0.0) & (self.airplane.airspeed_norm >= 1) , True, False) + return terminate diff --git a/src/PolicyIteration.py b/src/PolicyIteration.py index a9dc9f1..1d462ba 100644 --- a/src/PolicyIteration.py +++ b/src/PolicyIteration.py @@ -1,12 +1,13 @@ import os import pickle +import numpy as np import gymnasium as gym from loguru import logger + from scipy.spatial import Delaunay +from functools import cached_property from utils.utils import plot_3D_value_function - -import numpy as np try: import cupy as cp @@ -15,8 +16,7 @@ logger.info("CUDA driver is available.") except (ImportError, AttributeError): - - import numpy as cp + cp = np logger.warning("CUDA is not available. Falling back to NumPy.") def asarray(arr, *args, **kwargs): """In NumPy, this just ensures the object is a NumPy array, with support for additional arguments.""" @@ -28,12 +28,12 @@ def asnumpy(arr, *args, **kwargs): np.asarray = asarray np.asnumpy = asnumpy - cp = np + class PolicyIteration(object): - """ - A class to perform Policy Iteration on discretized continuous environments. + + """A class to perform Policy Iteration on discretized continuous environments. Attributes: env (gym.Env): The Gym environment to work with. @@ -51,19 +51,29 @@ class PolicyIteration(object): Example: - from classic_control.cartpole import CartPoleEnv - - env = CartPoleEnv() - bins_space = { - "x_space": np.linspace(-x_lim, x_lim, 12), # position space (0) - "x_dot_space": np.linspace(-x_dot_lim, x_dot_lim, 12), # velocity space (1) - "theta_space": np.linspace(-theta_lim, theta_lim, 12), # angle space (2) - "theta_dot_space": np.linspace(-theta_dot_lim, theta_dot_lim, 12), # angular velocity space (3) - } - action_space = [0, 1] - pi = PolicyIteration(env, bins_space, action_space) - pi.run() - """ + import pickle + import airplane + import numpy as np + import gymnasium as gym + from utils.utils import test_enviroment + from PolicyIteration import PolicyIteration + + glider = gym.make('ReducedSymmetricGliderPullout-v0') + + bins_space = { + "flight_path_angle": np.linspace(-np.pi, 0.5, 100, dtype=np.float32), # Flight Path Angle (γ) (0) + "airspeed_norm": np.linspace(0.7, 4.0, 100, dtype=np.float32), # Air Speed (V) (1) + } + + pi = PolicyIteration( + env=glider, + bins_space=bins_space, + action_space=np.linspace(-0.4, 1.0, 15, dtype=np.float32), + gamma=0.99, + theta=1e-3, + ) + + pi.run() """ metadata = {"img_path": os.getcwd()+"/img/",} @@ -124,6 +134,12 @@ def __init__(self, env: gym.Env, self.grid = np.meshgrid(*self.bins_space.values(), indexing='ij') # Flatten and stack to create a list of points in the space self.states_space = np.vstack([g.ravel() for g in self.grid], dtype=np.float32).T + + # get x and y coordinates + x = self.states_space[:,0] + y = self.states_space[:,1] + self.terminal_states = np.where((x >= 0.0) & (y >= 1) , True, False) + self.terminal_reward = 0 # self.num_simplex_points:int = int(self.states_space[0].shape[0] + 1) # number of points in a simplex one more than the dimension self.space_dim:int = int(self.states_space[0].shape[0]) @@ -131,7 +147,7 @@ def __init__(self, env: gym.Env, self.num_states:int = int(self.states_space.shape[0]) self.num_actions:int = int(self.action_space.shape[0]) - logger.info(f"The action space is: {self.action_space}") + #logger.info(f"The action space is: {self.action_space}") logger.info(f"Number of states: {len(self.states_space)}") logger.info(f"Total states:{len(self.states_space)*len(self.action_space)}") @@ -160,6 +176,7 @@ def __in_cell__(self, obs: cp.ndarray) -> cp.ndarray: Returns: np.ndarray: A boolean array indicating whether each observation is within the valid state bounds. """ + #return cp.all((obs >= self.cell_lower_bounds[:, None]) & (obs <= self.cell_upper_bounds[:, None]), axis=1) return cp.all((obs >= self.cell_lower_bounds) & (obs <= self.cell_upper_bounds), axis=1) def barycentric_coordinates(self, points:np.ndarray)->tuple: @@ -224,14 +241,22 @@ def calculate_transition_reward_table(self): "points_indexes": The indexes of the points in the simplex. """ for j, action in enumerate(self.action_space): - self.env.state = cp.asarray(self.states_space, dtype=cp.float32) - obs_gpu, reward_gpu, _, _, _ = self.env.step(action) + self.env.reset() + #self.env.state = cp.asarray(self.states_space, dtype=cp.float32) + state = np.array(self.states_space, dtype=np.float32) + self.env.airplane.flight_path_angle = state[:,0].copy() + self.env.airplane.airspeed_norm = state[:,1].copy() + self.env.airplane.bank_angle = state[:,2].copy() + + obs_gpu, reward_gpu, terminated, _, _ = self.env.step(action) + # log if any state is outside the bounds of the environment states_outside_gpu = self.__in_cell__(obs_gpu) if bool(cp.any(~states_outside_gpu)): # get the indexes of the states outside the bounds - reward_gpu = cp.where(states_outside_gpu, reward_gpu, -100) logger.warning(f"Some states are outside the bounds of the environment.") + # if the state is terminal, set the reward to zero + #reward_gpu = cp.where(terminated, 0, reward_gpu) # if any state is outside the bounds of the environment clip it to the bounds obs_gpu = cp.clip(obs_gpu, self.cell_lower_bounds, self.cell_upper_bounds) # get the barycentric coordinates of the resulting state in CPU for now. @@ -244,18 +269,28 @@ def calculate_transition_reward_table(self): self.lambdas[:,j] = cp.asarray(lambdas, dtype=cp.float32) self.simplexes[:,j] = cp.asarray(simplexes, dtype=cp.float32) self.points_indexes[:,j] = cp.asarray(points_indexes, dtype=cp.int32) + def get_value(self, lambdas:cp.ndarray, point_indexes:cp.ndarray, value_function:cp.ndarray)->cp.ndarray: - """ Calculates the next state value based on the given lambdas, point indexes, and value function. + """ Compute the next state value using barycentric coordinates. + + This function extracts values from the given value_function at indices specified by + point_indexes and then computes the weighted sum using the provided barycentric coordinates (lambdas). + It returns a one-dimensional array containing the computed value for each state. + Args: - lambdas (cp.ndarray): The lambdas array of shape (num_states, num_simplex_points,1). - point_indexes (cp.ndarray): The point indexes array of shape (num_states, num_simplex_points,1). - value_function (cp.ndarray): The value function. + lambdas (cp.ndarray): A CuPy array of barycentric coordinates with shape + (num_states, num_simplex_points, 1). + point_indexes (cp.ndarray): A CuPy array of simplex vertex indices with shape + (num_states, num_simplex_points, 1) used to index into the value_function. + value_function (cp.ndarray): A CuPy array containing the current state values. + Returns: - cp.ndarray: The next state value. + cp.ndarray: A one-dimensional CuPy array of computed next state values (shape (num_states,)). + Raises: - Exception: If states in point_indexes are not found in the value function. """ + Exception: If any of the indices in point_indexes are not valid for the given value_function. """ assert lambdas.shape == (self.num_states, self.num_simplex_points,1), f"lambdas shape: {lambdas.shape}" assert point_indexes.shape == (self.num_states, self.num_simplex_points,1), f"point_indexes shape: {point_indexes.shape}" @@ -280,12 +315,17 @@ def policy_evaluation(self): logger.info("Starting policy evaluation") while cp.abs(float(max_error)) > self.theta: # initialize the new value function to zeros - new_value_function = cp.zeros_like(self.value_function, dtype=cp.float32) + new_value_function = cp.zeros_like(self.value_function, dtype=cp.float32) + vf_next_state = cp.zeros_like(self.value_function, dtype=cp.float32) new_val = cp.zeros_like(self.value_function, dtype=cp.float32) + new_value_function[self.terminal_states] = self.terminal_reward + new_val[self.terminal_states] = self.terminal_reward + for j, _ in enumerate(self.action_space): # Checkout 'Variable Resolution Discretization in Optimal Control, eq 5' - next_state_value = self.get_value(self.lambdas[:, j], self.points_indexes[:, j], self.value_function) - new_val += self.policy[:,j] * (self.reward[:,j] + self.gamma * next_state_value) + vf_next_state[~self.terminal_states] = self.get_value(self.lambdas[:, j], self.points_indexes[:, j], self.value_function)[~self.terminal_states] + new_val[~self.terminal_states] += self.policy[~self.terminal_states,j] * (self.reward[~self.terminal_states,j] + self.gamma * vf_next_state[~self.terminal_states]) + new_value_function = new_val # update the error: the maximum difference between the new and old value functions errors = cp.fabs(new_value_function[:] - self.value_function[:]) diff --git a/src/utils/utils.py b/src/utils/utils.py index a378ed9..357383d 100644 --- a/src/utils/utils.py +++ b/src/utils/utils.py @@ -11,18 +11,24 @@ def plot_3D_value_function(vf: np.array, """ Plots a 3D value function in some color scale.""" # Assuming points is a 2D array where each row is a point [position, velocity] - X = points[:, 0] # x-axis (position) - Y = points[:, 1] # y-axis (velocity) + X = points[:, 0] # x-axis + # transformb X from rad to deg + X = np.rad2deg(X) + Y = points[:, 1] # y-axis vf = vf # z-axis (value function) vf_to_plot = (vf - vf.min()) / (vf.max() - vf.min()) if normalize else vf fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # Use plot_trisurf for unstructured triangular surface plot surf = ax.plot_trisurf(X, Y, vf_to_plot, cmap=cmap, edgecolor='white', linewidth=0.2) + # Add title + ax.set_title('Reduced Symmetric Glider Value Function ', pad=20) # Add labels - ax.set_xlabel('position') - ax.set_ylabel('velocity') - ax.set_zlabel('Normalized Value Function') + ax.set_xlabel('Flight Path Angle (γ) [deg]', labelpad=10) + ax.set_ylabel('V/Vs', labelpad=10) + ax.set_zlabel('Normalized Value Function', labelpad=10) + ax.set_xticks(np.round(np.linspace(min(X), max(X), 5))) # 5 ticks on the x-axis + ax.set_yticks(np.round(np.linspace(min(Y), max(Y), 5))) # 5 ticks on the y-axis # Add color bar to represent the value range if path is not None: plt.savefig(path) # Show the plot @@ -70,7 +76,7 @@ def get_optimal_action(state:np.array, optimal_policy:np.array): Returns: action: The optimal action for the given state. """ - lambdas, simmplex_info = get_barycentric_coordinates(optimal_policy, state) + lambdas, simmplex_info = get_barycentric_coordinates(optimal_policy,state) simplex, points_indexes = simmplex_info actions = optimal_policy.action_space probabilities = np.zeros(len(actions), dtype=np.float32) diff --git a/test.py b/test.py index 8a5dd1a..8aa5879 100644 --- a/test.py +++ b/test.py @@ -1,30 +1,33 @@ import pickle +import airplane import numpy as np +import gymnasium as gym from utils.utils import plot_3D_value_function from PolicyIteration import PolicyIteration -from classic_control.continuous_mountain_car import Continuous_MountainCarEnv -env=Continuous_MountainCarEnv() +glider = gym.make('ReducedSymmetricGliderPullout-v0') bins_space = { - "x_space": np.linspace(env.min_position, env.max_position, 100, dtype=np.float32), # position space (0) - "x_dot_space": np.linspace(-abs(env.max_speed), abs(env.max_speed), 100, dtype=np.float32), # velocity space (1) + "flight_path_angle": np.linspace(-np.pi-0.01, 0.10, 100, dtype=np.float32), # Flight Path Angle (γ) (0) + "airspeed_norm": np.linspace(0.7, 4, 100, dtype=np.float32), # Air Speed (V) (1) } pi = PolicyIteration( - env=env, + env=glider, bins_space=bins_space, - action_space=np.linspace(-1.0, +1.0,9, dtype=np.float32), + action_space=np.linspace(-0.4, 1.0, 15, dtype=np.float32), gamma=0.99, theta=1e-3, ) -pi.run() -with open(env.__class__.__name__ + ".pkl", "rb") as f: + +#pi.run() + +with open(glider.__class__.__name__ + ".pkl", "rb") as f: pi: PolicyIteration = pickle.load(f) plot_3D_value_function(vf = pi.value_function, points = pi.states_space, - normalize=True, + normalize=False, show=True, path="./test_vf.png") \ No newline at end of file diff --git a/testing.ipynb b/testing.ipynb index b5a7f7d..d2f758b 100644 --- a/testing.ipynb +++ b/testing.ipynb @@ -13,17 +13,1248 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "002626e9", + "execution_count": 1, + "id": "9c6a7123", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m2025-03-10 11:32:33.563\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m\u001b[0m:\u001b[36m20\u001b[0m - \u001b[33m\u001b[1mCUDA is not available. Falling back to NumPy.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.568\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mLower bounds: [-3.1415927 0.9 -0.34906584]\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.570\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mUpper bounds: [0. 4.5 3.4906585]\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.571\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m151\u001b[0m - \u001b[1mNumber of states: 8000\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.571\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m152\u001b[0m - \u001b[1mTotal states:576000\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.573\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m165\u001b[0m - \u001b[1mPolicy Iteration was correctly initialized.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.574\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m166\u001b[0m - \u001b[1mThe enviroment name is: TimeLimit\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.574\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m390\u001b[0m - \u001b[1mCreating Delaunay triangulation over the state space...\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.996\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m392\u001b[0m - \u001b[1mDelaunay triangulation created.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:33.997\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m402\u001b[0m - \u001b[1mGenerating transition and reward function table...\u001b[0m\n", + "/home/nromero/anaconda3/envs/DynamicProgramming/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:159: UserWarning: \u001b[33mWARN: The obs returned by the `reset()` method is not within the observation space.\u001b[0m\n", + " logger.warn(f\"{pre} is not within the observation space.\")\n", + "/home/nromero/anaconda3/envs/DynamicProgramming/lib/python3.11/site-packages/gymnasium/core.py:311: UserWarning: \u001b[33mWARN: env.airplane to get variables from other wrappers is deprecated and will be removed in v1.0, to get this variable you can do `env.unwrapped.airplane` for environment variables or `env.get_wrapper_attr('airplane')` that will search the reminding wrappers.\u001b[0m\n", + " logger.warn(\n", + "/home/nromero/anaconda3/envs/DynamicProgramming/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:228: UserWarning: \u001b[33mWARN: Expects `terminated` signal to be a boolean, actual type: \u001b[0m\n", + " logger.warn(\n", + "/home/nromero/anaconda3/envs/DynamicProgramming/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:159: UserWarning: \u001b[33mWARN: The obs returned by the `step()` method is not within the observation space.\u001b[0m\n", + " logger.warn(f\"{pre} is not within the observation space.\")\n", + "/home/nromero/anaconda3/envs/DynamicProgramming/lib/python3.11/site-packages/gymnasium/utils/passive_env_checker.py:246: UserWarning: \u001b[33mWARN: The reward returned by `step()` must be a float, int, np.integer or np.floating, actual type: \u001b[0m\n", + " logger.warn(\n", + "\u001b[32m2025-03-10 11:32:34.000\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:37.189\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:40.183\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:43.159\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:46.071\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:48.612\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:51.111\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:53.257\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:55.422\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:57.725\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:32:59.973\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:02.233\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:04.457\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:07.260\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:10.255\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:13.343\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:15.893\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:18.551\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:21.666\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:23.366\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:25.046\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:26.790\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:28.670\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:30.387\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:32.134\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:34.158\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:36.198\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:38.240\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:40.266\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:42.311\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:44.275\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:46.222\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:48.468\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:50.514\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:52.535\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:55.166\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:57.578\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:33:59.952\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:01.933\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:03.818\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:05.921\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:08.129\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:10.222\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:11.934\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:13.855\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:15.998\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:17.991\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:19.763\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:21.526\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:23.483\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:25.516\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:27.486\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:29.438\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:31.380\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:33.281\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:34.941\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:36.651\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:38.347\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:41.196\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:43.508\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:46.056\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:48.715\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:51.347\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:54.544\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:34:57.181\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:00.748\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:03.135\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:05.102\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:07.151\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:09.058\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:10.944\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:12.882\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mcalculate_transition_reward_table\u001b[0m:\u001b[36m257\u001b[0m - \u001b[33m\u001b[1mSome states are outside the bounds of the environment.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:14.767\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m404\u001b[0m - \u001b[1mTransition and reward function table generated.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:14.767\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m406\u001b[0m - \u001b[1msolving step 0\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:14.767\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m315\u001b[0m - \u001b[1mStarting policy evaluation\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:14.797\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.04500000178813934 | Avg Error: 0.01600000075995922 | 800<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:19.289\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.009999999776482582 | Avg Error: 0.004000000189989805 | 621<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:23.737\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0020000000949949026 | Avg Error: 0.0010000000474974513 | 3706<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.902\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.903\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m356\u001b[0m - \u001b[1mPolicy evaluation finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.903\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m365\u001b[0m - \u001b[1mStarting policy improvement\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.950\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m378\u001b[0m - \u001b[1mThe number of updated different actions: 576000\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.950\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m381\u001b[0m - \u001b[1mPolicy improvement finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.951\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m406\u001b[0m - \u001b[1msolving step 1\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:29.951\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m315\u001b[0m - \u001b[1mStarting policy evaluation\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:30.004\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.04800000041723251 | Avg Error: 0.006000000052154064 | 1707<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:37.576\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.004000000189989805 | Avg Error: 0.0010000000474974513 | 4169<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:44.947\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0010000000474974513 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.910\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.910\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m356\u001b[0m - \u001b[1mPolicy evaluation finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.910\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m365\u001b[0m - \u001b[1mStarting policy improvement\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.950\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m378\u001b[0m - \u001b[1mThe number of updated different actions: 6020\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.950\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m381\u001b[0m - \u001b[1mPolicy improvement finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.951\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m406\u001b[0m - \u001b[1msolving step 2\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:52.951\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m315\u001b[0m - \u001b[1mStarting policy evaluation\u001b[0m\n", + "\u001b[32m2025-03-10 11:35:53.007\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.024000000208616257 | Avg Error: 0.0010000000474974513 | 6709<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:00.112\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0010000000474974513 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.005\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.006\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m356\u001b[0m - \u001b[1mPolicy evaluation finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.006\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m365\u001b[0m - \u001b[1mStarting policy improvement\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.029\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m378\u001b[0m - \u001b[1mThe number of updated different actions: 1910\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.029\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m381\u001b[0m - \u001b[1mPolicy improvement finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.030\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m406\u001b[0m - \u001b[1msolving step 3\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.030\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m315\u001b[0m - \u001b[1mStarting policy evaluation\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:04.059\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.010999999940395355 | Avg Error: 0.0 | 7768<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.036\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.036\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m356\u001b[0m - \u001b[1mPolicy evaluation finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.037\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m365\u001b[0m - \u001b[1mStarting policy improvement\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.064\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m378\u001b[0m - \u001b[1mThe number of updated different actions: 386\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.064\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m381\u001b[0m - \u001b[1mPolicy improvement finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.065\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m406\u001b[0m - \u001b[1msolving step 4\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.065\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m315\u001b[0m - \u001b[1mStarting policy evaluation\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:08.097\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0020000000949949026 | Avg Error: 0.0 | 7981<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.564\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.564\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m356\u001b[0m - \u001b[1mPolicy evaluation finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.565\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m365\u001b[0m - \u001b[1mStarting policy improvement\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.595\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m378\u001b[0m - \u001b[1mThe number of updated different actions: 64\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.596\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m381\u001b[0m - \u001b[1mPolicy improvement finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.596\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mrun\u001b[0m:\u001b[36m406\u001b[0m - \u001b[1msolving step 5\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.596\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m315\u001b[0m - \u001b[1mStarting policy evaluation\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.628\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m339\u001b[0m - \u001b[1mMax Error: 0.0 | Avg Error: 0.0 | 8000<0.001\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.629\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_evaluation\u001b[0m:\u001b[36m356\u001b[0m - \u001b[1mPolicy evaluation finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.629\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m365\u001b[0m - \u001b[1mStarting policy improvement\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.655\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36mpolicy_improvement\u001b[0m:\u001b[36m381\u001b[0m - \u001b[1mPolicy improvement finished.\u001b[0m\n", + "\u001b[32m2025-03-10 11:36:12.714\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mPolicyIteration\u001b[0m:\u001b[36msave\u001b[0m:\u001b[36m425\u001b[0m - \u001b[1mPolicy and value function saved.\u001b[0m\n" + ] + } + ], "source": [ "import pickle\n", + "import airplane\n", "import numpy as np\n", + "import gymnasium as gym\n", "from utils.utils import test_enviroment\n", - "from PolicyIteration import PolicyIteration" + "from PolicyIteration import PolicyIteration\n", + "\n", + "glider = gym.make('ReducedBankedGliderPullout-v0')\n", + "\n", + "bins_space = {\n", + " \"flight_path_angle\": np.linspace(np.deg2rad(-180), np.deg2rad(0), 20, dtype=np.float32), # Flight Path Angle (γ) (0)\n", + " \"airspeed_norm\": np.linspace(0.9, 4.5, 20, dtype=np.float32), # Air Speed (V) (1)\n", + " \"bank_angle\": np.linspace( np.deg2rad(-20), np.deg2rad(200), 20, dtype=np.float32), # Bank Angle (mu) (2)\n", + "}\n", + "\n", + "\n", + "action_space= np.array(np.meshgrid(np.linspace(-0.5, 1.0, 6, dtype=np.float32), \n", + " np.linspace(np.deg2rad(-30), np.deg2rad(30), 12, dtype=np.float32))).T.reshape(-1, 2)\n", + "\n", + "pi = PolicyIteration(\n", + " env=glider, \n", + " bins_space=bins_space,\n", + " action_space= action_space,\n", + " gamma=0.99,\n", + " theta=1e-3,\n", + ")\n", + "\n", + "\n", + "pi.run()" ] }, + { + "cell_type": "code", + "execution_count": 5, + "id": "442d7f05", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Action: [1. 0.524] | Reward: -0.011854943438053572 | State: (-80.16007232666016, 1.203194499015808, 150.3000030517578) | Terminated: False | Episode Length: 0.01 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.02374708114579749 | State: (-80.3203353881836, 1.2063888311386108, 150.59999084472656) | Terminated: False | Episode Length: 0.02 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.03567635565003305 | State: (-80.48078918457031, 1.2095831632614136, 150.89999389648438) | Terminated: False | Episode Length: 0.03 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.047642708128035866 | State: (-80.64144134521484, 1.2127772569656372, 151.19998168945312) | Terminated: False | Episode Length: 0.04 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.05964607839916092 | State: (-80.80228424072266, 1.2159712314605713, 151.5) | Terminated: False | Episode Length: 0.05 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.0716864049166001 | State: (-80.96331787109375, 1.2191649675369263, 151.79998779296875) | Terminated: False | Episode Length: 0.060000000000000005 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.0837636247592959 | State: (-81.12454223632812, 1.2223584651947021, 152.09999084472656) | Terminated: False | Episode Length: 0.07 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.09587767362401492 | State: (-81.28596496582031, 1.2255516052246094, 152.39999389648438) | Terminated: False | Episode Length: 0.08 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.10802848581758488 | State: (-81.44757843017578, 1.228744626045227, 152.6999969482422) | Terminated: False | Episode Length: 0.09 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.12021599424929892 | State: (-81.60939025878906, 1.2319371700286865, 152.99998474121094) | Terminated: False | Episode Length: 0.09999999999999999 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.1324401304234907 | State: (-81.77139282226562, 1.2351293563842773, 153.29998779296875) | Terminated: False | Episode Length: 0.10999999999999999 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.14470082443228416 | State: (-81.93358612060547, 1.2383211851119995, 153.59999084472656) | Terminated: False | Episode Length: 0.11999999999999998 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.15699800494852156 | State: (-82.09597778320312, 1.241512656211853, 153.8999786376953) | Terminated: False | Episode Length: 0.12999999999999998 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.16933159921887353 | State: (-82.25856018066406, 1.2447036504745483, 154.1999969482422) | Terminated: False | Episode Length: 0.13999999999999999 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.18170153305713466 | State: (-82.42134094238281, 1.247894048690796, 154.49998474121094) | Terminated: False | Episode Length: 0.15 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.1941077308377086 | State: (-82.58431243896484, 1.2510839700698853, 154.79998779296875) | Terminated: False | Episode Length: 0.16 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.20655011548928606 | State: (-82.74747467041016, 1.2542734146118164, 155.09999084472656) | Terminated: False | Episode Length: 0.17 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.21902860848871952 | State: (-82.91084289550781, 1.2574621438980103, 155.39999389648438) | Terminated: False | Episode Length: 0.18000000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.23154312985509834 | State: (-83.07439422607422, 1.260650396347046, 155.69998168945312) | Terminated: False | Episode Length: 0.19000000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.2440935981440278 | State: (-83.2381362915039, 1.2638379335403442, 156.0) | Terminated: False | Episode Length: 0.20000000000000004 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.2566799304421158 | State: (-83.4020767211914, 1.2670247554779053, 156.29998779296875) | Terminated: False | Episode Length: 0.21000000000000005 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.2693020423616708 | State: (-83.56621551513672, 1.2702109813690186, 156.59999084472656) | Terminated: False | Episode Length: 0.22000000000000006 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.28195984803561475 | State: (-83.73052978515625, 1.273396372795105, 156.89999389648438) | Terminated: False | Episode Length: 0.23000000000000007 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.2946532601126142 | State: (-83.8950424194336, 1.276581048965454, 157.1999969482422) | Terminated: False | Episode Length: 0.24000000000000007 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.3073821897524338 | State: (-84.05974578857422, 1.2797648906707764, 157.49998474121094) | Terminated: False | Episode Length: 0.25000000000000006 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.3201465466215152 | State: (-84.22463989257812, 1.2829477787017822, 157.8000030517578) | Terminated: False | Episode Length: 0.26000000000000006 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.3329462388887851 | State: (-84.38972473144531, 1.2861299514770508, 158.09999084472656) | Terminated: False | Episode Length: 0.2700000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.34578117322169616 | State: (-84.55499267578125, 1.289311170578003, 158.39999389648438) | Terminated: False | Episode Length: 0.2800000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.3586512547825038 | State: (-84.72044372558594, 1.2924914360046387, 158.6999969482422) | Terminated: False | Episode Length: 0.2900000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.37155638722478307 | State: (-84.88609313964844, 1.295670747756958, 158.99998474121094) | Terminated: False | Episode Length: 0.3000000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.384496472690188 | State: (-85.05192565917969, 1.2988489866256714, 159.29998779296875) | Terminated: False | Episode Length: 0.3100000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.39747141180545814 | State: (-85.21793365478516, 1.3020262718200684, 159.59999084472656) | Terminated: False | Episode Length: 0.3200000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.41048110367967466 | State: (-85.3841323852539, 1.3052024841308594, 159.89999389648438) | Terminated: False | Episode Length: 0.3300000000000001 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.4235254459017697 | State: (-85.5505142211914, 1.3083775043487549, 160.19998168945312) | Terminated: False | Episode Length: 0.34000000000000014 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.43660433453829267 | State: (-85.71707153320312, 1.3115514516830444, 160.5) | Terminated: False | Episode Length: 0.35000000000000014 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.4497176641314361 | State: (-85.8838119506836, 1.3147242069244385, 160.79998779296875) | Terminated: False | Episode Length: 0.36000000000000015 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.462865327697325 | State: (-86.05073547363281, 1.317895770072937, 161.09999084472656) | Terminated: False | Episode Length: 0.37000000000000016 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.47604721672457256 | State: (-86.21782684326172, 1.32106614112854, 161.39999389648438) | Terminated: False | Episode Length: 0.38000000000000017 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.48926322117310544 | State: (-86.38510131835938, 1.324235200881958, 161.6999969482422) | Terminated: False | Episode Length: 0.3900000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5025132294732619 | State: (-86.55255126953125, 1.327402949333191, 161.99998474121094) | Terminated: False | Episode Length: 0.4000000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5157971285251659 | State: (-86.72016906738281, 1.3305693864822388, 162.29998779296875) | Terminated: False | Episode Length: 0.4100000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5291148036983803 | State: (-86.8879623413086, 1.333734393119812, 162.59999084472656) | Terminated: False | Episode Length: 0.4200000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5424661388318416 | State: (-87.05592346191406, 1.3368979692459106, 162.89999389648438) | Terminated: False | Episode Length: 0.4300000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5558510162340805 | State: (-87.22406005859375, 1.3400602340698242, 163.19998168945312) | Terminated: False | Episode Length: 0.4400000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5692693166837299 | State: (-87.39236450195312, 1.3432209491729736, 163.5) | Terminated: False | Episode Length: 0.45000000000000023 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.582720919430324 | State: (-87.56082153320312, 1.3463801145553589, 163.79998779296875) | Terminated: False | Episode Length: 0.46000000000000024 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.5962057021953907 | State: (-87.72945404052734, 1.3495378494262695, 164.09999084472656) | Terminated: False | Episode Length: 0.47000000000000025 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.6097235411738414 | State: (-87.89823913574219, 1.3526939153671265, 164.39999389648438) | Terminated: False | Episode Length: 0.48000000000000026 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.6232743110356592 | State: (-88.06719207763672, 1.3558483123779297, 164.6999969482422) | Terminated: False | Episode Length: 0.49000000000000027 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.6368578849278896 | State: (-88.23629760742188, 1.3590011596679688, 164.99998474121094) | Terminated: False | Episode Length: 0.5000000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.6504741344769358 | State: (-88.40556335449219, 1.362152338027954, 165.29998779296875) | Terminated: False | Episode Length: 0.5100000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.6641229297911606 | State: (-88.57498168945312, 1.3653017282485962, 165.59999084472656) | Terminated: False | Episode Length: 0.5200000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.677804139463799 | State: (-88.74455261230469, 1.3684494495391846, 165.8999786376953) | Terminated: False | Episode Length: 0.5300000000000002 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.6915176305761824 | State: (-88.91427612304688, 1.3715953826904297, 166.1999969482422) | Terminated: False | Episode Length: 0.5400000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7052632687012773 | State: (-89.08414459228516, 1.374739408493042, 166.49998474121094) | Terminated: False | Episode Length: 0.5500000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7190409179075412 | State: (-89.25415802001953, 1.377881646156311, 166.79998779296875) | Terminated: False | Episode Length: 0.5600000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7328504407630978 | State: (-89.42432403564453, 1.3810219764709473, 167.09999084472656) | Terminated: False | Episode Length: 0.5700000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7466916983402333 | State: (-89.59461975097656, 1.3841603994369507, 167.39999389648438) | Terminated: False | Episode Length: 0.5800000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7605645502202167 | State: (-89.76506042480469, 1.3872967958450317, 167.69998168945312) | Terminated: False | Episode Length: 0.5900000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7744688544984455 | State: (-89.93563842773438, 1.39043128490448, 168.0) | Terminated: False | Episode Length: 0.6000000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.7884044677899188 | State: (-90.10635375976562, 1.3935637474060059, 168.29998779296875) | Terminated: False | Episode Length: 0.6100000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.8023712452350408 | State: (-90.27719116210938, 1.3966940641403198, 168.59999084472656) | Terminated: False | Episode Length: 0.6200000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.816369040505755 | State: (-90.44816589355469, 1.3998223543167114, 168.89999389648438) | Terminated: False | Episode Length: 0.6300000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.8303977058120122 | State: (-90.6192626953125, 1.4029484987258911, 169.1999969482422) | Terminated: False | Episode Length: 0.6400000000000003 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.8444570919085732 | State: (-90.79048919677734, 1.4060723781585693, 169.49998474121094) | Terminated: False | Episode Length: 0.6500000000000004 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.8585470481021481 | State: (-90.96183776855469, 1.4091942310333252, 169.8000030517578) | Terminated: False | Episode Length: 0.6600000000000004 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -0.8726674222588741 | State: (-91.13330078125, 1.41231369972229, 170.09999084472656) | Terminated: False | Episode Length: 0.6700000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.8868180608121324 | State: (-91.30488586425781, 1.4154309034347534, 170.34544372558594) | Terminated: False | Episode Length: 0.6800000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.900998808950988 | State: (-91.47655487060547, 1.4185458421707153, 170.59091186523438) | Terminated: False | Episode Length: 0.6900000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.9152095105021218 | State: (-91.64830780029297, 1.4216583967208862, 170.8363494873047) | Terminated: False | Episode Length: 0.7000000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.9294500079346705 | State: (-91.82013702392578, 1.4247685670852661, 171.08180236816406) | Terminated: False | Episode Length: 0.7100000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.9437201423653089 | State: (-91.99205780029297, 1.427876353263855, 171.3272705078125) | Terminated: False | Episode Length: 0.7200000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.9580197535635762 | State: (-92.16405487060547, 1.4309816360473633, 171.57272338867188) | Terminated: False | Episode Length: 0.7300000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.9723486799574463 | State: (-92.33612823486328, 1.4340845346450806, 171.8181610107422) | Terminated: False | Episode Length: 0.7400000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -0.9867067586391448 | State: (-92.50828552246094, 1.4371848106384277, 172.06362915039062) | Terminated: False | Episode Length: 0.7500000000000004 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.0010938253712118 | State: (-92.68051147460938, 1.4402825832366943, 172.30908203125) | Terminated: False | Episode Length: 0.7600000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.015509714592814 | State: (-92.85281372070312, 1.4433777332305908, 172.55453491210938) | Terminated: False | Episode Length: 0.7700000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.029954259426304 | State: (-93.02519226074219, 1.4464702606201172, 172.79998779296875) | Terminated: False | Episode Length: 0.7800000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.0444272916840305 | State: (-93.19763946533203, 1.4495601654052734, 173.04544067382812) | Terminated: False | Episode Length: 0.7900000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.058928641875398 | State: (-93.37015533447266, 1.4526472091674805, 173.29090881347656) | Terminated: False | Episode Length: 0.8000000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.073458139214179 | State: (-93.5427474975586, 1.4557316303253174, 173.53636169433594) | Terminated: False | Episode Length: 0.8100000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.0880156116260773 | State: (-93.71540069580078, 1.4588133096694946, 173.78179931640625) | Terminated: False | Episode Length: 0.8200000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.1026008857565432 | State: (-93.88811492919922, 1.4618921279907227, 174.0272674560547) | Terminated: False | Episode Length: 0.8300000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.1172137869788443 | State: (-94.06089782714844, 1.464968204498291, 174.27272033691406) | Terminated: False | Episode Length: 0.8400000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.1318541394023878 | State: (-94.2337417602539, 1.4680413007736206, 174.51817321777344) | Terminated: False | Episode Length: 0.8500000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.1465217658812985 | State: (-94.40665435791016, 1.471111536026001, 174.7636260986328) | Terminated: False | Episode Length: 0.8600000000000005 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.1612164880232518 | State: (-94.5796127319336, 1.4741787910461426, 175.0090789794922) | Terminated: False | Episode Length: 0.8700000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.175938126198561 | State: (-94.75262451171875, 1.4772430658340454, 175.25453186035156) | Terminated: False | Episode Length: 0.8800000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.1906864995495208 | State: (-94.92569732666016, 1.48030424118042, 175.5) | Terminated: False | Episode Length: 0.8900000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.2054614260000063 | State: (-95.09882354736328, 1.4833624362945557, 175.7454376220703) | Terminated: False | Episode Length: 0.9000000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.2202627222653293 | State: (-95.2719955444336, 1.4864176511764526, 175.9908905029297) | Terminated: False | Episode Length: 0.9100000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.2350902038623495 | State: (-95.44522094726562, 1.4894695281982422, 176.23635864257812) | Terminated: False | Episode Length: 0.9200000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.2499436851198427 | State: (-95.61849212646484, 1.492518424987793, 176.4818115234375) | Terminated: False | Episode Length: 0.9300000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.2648229791891255 | State: (-95.79180908203125, 1.4955639839172363, 176.72726440429688) | Terminated: False | Episode Length: 0.9400000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.279727898054937 | State: (-95.96515655517578, 1.4986064434051514, 176.97271728515625) | Terminated: False | Episode Length: 0.9500000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.2946582525465757 | State: (-96.13855743408203, 1.501645565032959, 177.21817016601562) | Terminated: False | Episode Length: 0.9600000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.3096138523492944 | State: (-96.31199645996094, 1.5046814680099487, 177.46363830566406) | Terminated: False | Episode Length: 0.9700000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.3245945060159496 | State: (-96.48545837402344, 1.5077139139175415, 177.70907592773438) | Terminated: False | Episode Length: 0.9800000000000006 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.3396000209789083 | State: (-96.65896606445312, 1.5107430219650269, 177.95452880859375) | Terminated: False | Episode Length: 0.9900000000000007 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.354630203562209 | State: (-96.83250427246094, 1.5137687921524048, 178.1999969482422) | Terminated: False | Episode Length: 1.0000000000000007 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.36968485899398 | State: (-97.00606536865234, 1.5167911052703857, 178.44544982910156) | Terminated: False | Episode Length: 1.0100000000000007 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.3847637914191098 | State: (-97.17965698242188, 1.5198098421096802, 178.69088745117188) | Terminated: False | Episode Length: 1.0200000000000007 | C_L: 1.0\n", + "Action: [1. 0.428] | Reward: -1.3998668039121742 | State: (-97.35327911376953, 1.5228252410888672, 178.9363555908203) | Terminated: False | Episode Length: 1.0300000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.4149936984906164 | State: (-97.52691650390625, 1.5258369445800781, 178.90907287597656) | Terminated: False | Episode Length: 1.0400000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.4301442766706631 | State: (-97.7005615234375, 1.528845191001892, 178.88180541992188) | Terminated: False | Episode Length: 1.0500000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.4453183388531636 | State: (-97.87421417236328, 1.53184974193573, 178.8545379638672) | Terminated: False | Episode Length: 1.0600000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.4605156843250102 | State: (-98.0478744506836, 1.5348505973815918, 178.8272705078125) | Terminated: False | Episode Length: 1.0700000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.4757361112606324 | State: (-98.2215347290039, 1.537847876548767, 178.79998779296875) | Terminated: False | Episode Length: 1.0800000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.490979416723567 | State: (-98.39521789550781, 1.5408413410186768, 178.77272033691406) | Terminated: False | Episode Length: 1.0900000000000007 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.5062453966681015 | State: (-98.56890106201172, 1.5438312292099, 178.7454376220703) | Terminated: False | Episode Length: 1.1000000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.5215338459409935 | State: (-98.74259185791016, 1.5468171834945679, 178.71817016601562) | Terminated: False | Episode Length: 1.1100000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.5368445582832653 | State: (-98.91630554199219, 1.5497993230819702, 178.69088745117188) | Terminated: False | Episode Length: 1.1200000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.5521773263320744 | State: (-99.09001922607422, 1.552777647972107, 178.66363525390625) | Terminated: False | Episode Length: 1.1300000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.5675319416226603 | State: (-99.26376342773438, 1.5557520389556885, 178.6363525390625) | Terminated: False | Episode Length: 1.1400000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.5829081945903676 | State: (-99.43750762939453, 1.5587226152420044, 178.6090850830078) | Terminated: False | Episode Length: 1.1500000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.598305874572745 | State: (-99.61127471923828, 1.5616891384124756, 178.58180236816406) | Terminated: False | Episode Length: 1.1600000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.613724769811723 | State: (-99.78506469726562, 1.5646517276763916, 178.55453491210938) | Terminated: False | Episode Length: 1.1700000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.6291646674558673 | State: (-99.9588623046875, 1.567610263824463, 178.52725219726562) | Terminated: False | Episode Length: 1.1800000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.6446253535627107 | State: (-100.13268280029297, 1.5705647468566895, 178.49998474121094) | Terminated: False | Episode Length: 1.1900000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.6601066131011626 | State: (-100.3065185546875, 1.5735151767730713, 178.47271728515625) | Terminated: False | Episode Length: 1.2000000000000008 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.6756082299539967 | State: (-100.48038482666016, 1.5764614343643188, 178.44544982910156) | Terminated: False | Episode Length: 1.2100000000000009 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.6911299869204168 | State: (-100.65426635742188, 1.5794035196304321, 178.41818237304688) | Terminated: False | Episode Length: 1.2200000000000009 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.7066716657187018 | State: (-100.82817077636719, 1.5823414325714111, 178.39089965820312) | Terminated: False | Episode Length: 1.2300000000000009 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.722233046988929 | State: (-101.00209045410156, 1.5852751731872559, 178.36363220214844) | Terminated: False | Episode Length: 1.2400000000000009 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.737813910295778 | State: (-101.17604064941406, 1.5882046222686768, 178.3363494873047) | Terminated: False | Episode Length: 1.2500000000000009 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.753414034131411 | State: (-101.35001373291016, 1.5911297798156738, 178.30908203125) | Terminated: False | Episode Length: 1.260000000000001 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.769033195918437 | State: (-101.52401733398438, 1.5940505266189575, 178.28179931640625) | Terminated: False | Episode Length: 1.270000000000001 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -1.7846711720129522 | State: (-101.69804382324219, 1.596967101097107, 178.25454711914062) | Terminated: False | Episode Length: 1.280000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.800327737707662 | State: (-101.87208557128906, 1.5998791456222534, 178.28179931640625) | Terminated: False | Episode Length: 1.290000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.8160026668954568 | State: (-102.04617309570312, 1.6027867794036865, 178.30908203125) | Terminated: False | Episode Length: 1.300000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.831695732394703 | State: (-102.22029113769531, 1.6056898832321167, 178.3363494873047) | Terminated: False | Episode Length: 1.310000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.8474067059524595 | State: (-102.39444732666016, 1.6085885763168335, 178.36363220214844) | Terminated: False | Episode Length: 1.320000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.8631353582477748 | State: (-102.56863403320312, 1.6114827394485474, 178.39089965820312) | Terminated: False | Episode Length: 1.330000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.8788814588950662 | State: (-102.74285888671875, 1.6143723726272583, 178.41818237304688) | Terminated: False | Episode Length: 1.340000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.8946447764475816 | State: (-102.91712188720703, 1.6172573566436768, 178.44544982910156) | Terminated: False | Episode Length: 1.350000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.910425078400943 | State: (-103.09141540527344, 1.6201378107070923, 178.47271728515625) | Terminated: False | Episode Length: 1.360000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.926222131196774 | State: (-103.26575469970703, 1.6230134963989258, 178.49998474121094) | Terminated: False | Episode Length: 1.370000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.9420357002264084 | State: (-103.44013214111328, 1.6258845329284668, 178.52725219726562) | Terminated: False | Episode Length: 1.380000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.9578655498346835 | State: (-103.61454772949219, 1.6287508010864258, 178.55453491210938) | Terminated: False | Episode Length: 1.390000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.973711443323816 | State: (-103.78899383544922, 1.6316123008728027, 178.58180236816406) | Terminated: False | Episode Length: 1.400000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -1.989573142957361 | State: (-103.96349334716797, 1.6344690322875977, 178.6090850830078) | Terminated: False | Episode Length: 1.410000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.0054504099642547 | State: (-104.13802337646484, 1.6373209953308105, 178.6363525390625) | Terminated: False | Episode Length: 1.420000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.0213430045429415 | State: (-104.31260681152344, 1.6401680707931519, 178.66363525390625) | Terminated: False | Episode Length: 1.430000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.0372506858655837 | State: (-104.48722076416016, 1.6430102586746216, 178.69088745117188) | Terminated: False | Episode Length: 1.440000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.0531732120823563 | State: (-104.66188049316406, 1.6458474397659302, 178.71817016601562) | Terminated: False | Episode Length: 1.450000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.0691103403258264 | State: (-104.83658599853516, 1.6486797332763672, 178.7454376220703) | Terminated: False | Episode Length: 1.460000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.0850618267154157 | State: (-105.0113296508789, 1.651507019996643, 178.77272033691406) | Terminated: False | Episode Length: 1.470000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.1010274263619473 | State: (-105.18612670898438, 1.6543292999267578, 178.79998779296875) | Terminated: False | Episode Length: 1.480000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.1170068933722783 | State: (-105.3609619140625, 1.6571464538574219, 178.8272705078125) | Terminated: False | Episode Length: 1.490000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.132999980854017 | State: (-105.53585052490234, 1.6599586009979248, 178.8545379638672) | Terminated: False | Episode Length: 1.500000000000001 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.149006440920324 | State: (-105.71077728271484, 1.662765622138977, 178.88180541992188) | Terminated: False | Episode Length: 1.5100000000000011 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.165026024694797 | State: (-105.88574981689453, 1.665567398071289, 178.90907287597656) | Terminated: False | Episode Length: 1.5200000000000011 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.181058482316445 | State: (-106.0607681274414, 1.6683640480041504, 178.9363555908203) | Terminated: False | Episode Length: 1.5300000000000011 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.197103562944743 | State: (-106.23583984375, 1.6711554527282715, 178.963623046875) | Terminated: False | Episode Length: 1.5400000000000011 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.213161014764773 | State: (-106.41095733642578, 1.673941731452942, 178.99090576171875) | Terminated: False | Episode Length: 1.5500000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.2292305849924503 | State: (-106.58612060546875, 1.676722526550293, 179.01817321777344) | Terminated: False | Episode Length: 1.5600000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.245312019879838 | State: (-106.76133728027344, 1.6794981956481934, 179.0454559326172) | Terminated: False | Episode Length: 1.5700000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.261405064720541 | State: (-106.93659973144531, 1.6822683811187744, 179.0727081298828) | Terminated: False | Episode Length: 1.5800000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.277509463855189 | State: (-107.11190795898438, 1.6850332021713257, 179.09999084472656) | Terminated: False | Episode Length: 1.5900000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.293624960677007 | State: (-107.28726959228516, 1.6877926588058472, 179.12725830078125) | Terminated: False | Episode Length: 1.6000000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.309751297637465 | State: (-107.46267700195312, 1.6905466318130493, 179.154541015625) | Terminated: False | Episode Length: 1.6100000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.325888216252017 | State: (-107.63813781738281, 1.6932951211929321, 179.1818084716797) | Terminated: False | Episode Length: 1.6200000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.3420354571059283 | State: (-107.81365203857422, 1.6960381269454956, 179.20909118652344) | Terminated: False | Episode Length: 1.6300000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.3581927598601795 | State: (-107.98921203613281, 1.6987755298614502, 179.23635864257812) | Terminated: False | Episode Length: 1.6400000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.3743598632574656 | State: (-108.16482543945312, 1.701507329940796, 179.2636260986328) | Terminated: False | Episode Length: 1.6500000000000012 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.390536505128274 | State: (-108.34049224853516, 1.7042336463928223, 179.2908935546875) | Terminated: False | Episode Length: 1.6600000000000013 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.406722422397049 | State: (-108.5162124633789, 1.7069542407989502, 179.3181610107422) | Terminated: False | Episode Length: 1.6700000000000013 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.422917351088446 | State: (-108.69197845458984, 1.7096692323684692, 179.34544372558594) | Terminated: False | Episode Length: 1.6800000000000013 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.4391210263336625 | State: (-108.8677978515625, 1.7123783826828003, 179.37271118164062) | Terminated: False | Episode Length: 1.6900000000000013 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -2.4553331823768634 | State: (-109.0436782836914, 1.7150819301605225, 179.39999389648438) | Terminated: False | Episode Length: 1.7000000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.4715535525816845 | State: (-109.21961212158203, 1.7177796363830566, 179.48179626464844) | Terminated: False | Episode Length: 1.7100000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.4877818692431566 | State: (-109.39559173583984, 1.7204716205596924, 179.56362915039062) | Terminated: False | Episode Length: 1.7200000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.5040178638218187 | State: (-109.5716323852539, 1.7231576442718506, 179.64544677734375) | Terminated: False | Episode Length: 1.7300000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.5202612669522377 | State: (-109.74772644042969, 1.7258379459381104, 179.72726440429688) | Terminated: False | Episode Length: 1.7400000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.536511808451626 | State: (-109.92387390136719, 1.728512167930603, 179.80908203125) | Terminated: False | Episode Length: 1.7500000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.5527692173285574 | State: (-110.10008239746094, 1.7311806678771973, 179.89089965820312) | Terminated: False | Episode Length: 1.7600000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.5690332217917833 | State: (-110.2763442993164, 1.7338430881500244, 179.97271728515625) | Terminated: False | Episode Length: 1.7700000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.5853035492591454 | State: (-110.45265197753906, 1.736499547958374, 180.05453491210938) | Terminated: False | Episode Length: 1.7800000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.6015799263665875 | State: (-110.62902069091797, 1.7391499280929565, 180.1363525390625) | Terminated: False | Episode Length: 1.7900000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.6178620789772657 | State: (-110.8054428100586, 1.7417943477630615, 180.21817016601562) | Terminated: False | Episode Length: 1.8000000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.634149732190753 | State: (-110.98191833496094, 1.7444326877593994, 180.29998779296875) | Terminated: False | Episode Length: 1.8100000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.6504426103523446 | State: (-111.158447265625, 1.7470648288726807, 180.38180541992188) | Terminated: False | Episode Length: 1.8200000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.6667404370624554 | State: (-111.33502960205078, 1.7496908903121948, 180.463623046875) | Terminated: False | Episode Length: 1.8300000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.683042935186117 | State: (-111.51166534423828, 1.7523107528686523, 180.54544067382812) | Terminated: False | Episode Length: 1.8400000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.699349826862568 | State: (-111.6883544921875, 1.7549244165420532, 180.6272735595703) | Terminated: False | Episode Length: 1.8500000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.715660833514941 | State: (-111.86509704589844, 1.757531762123108, 180.70907592773438) | Terminated: False | Episode Length: 1.8600000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.731975675860041 | State: (-112.0418930053711, 1.760132908821106, 180.79090881347656) | Terminated: False | Episode Length: 1.8700000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.7482940739182244 | State: (-112.21873474121094, 1.7627277374267578, 180.87271118164062) | Terminated: False | Episode Length: 1.8800000000000014 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.7646157470233628 | State: (-112.3956298828125, 1.7653162479400635, 180.9545440673828) | Terminated: False | Episode Length: 1.8900000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.780940413832907 | State: (-112.57258605957031, 1.7678983211517334, 181.03634643554688) | Terminated: False | Episode Length: 1.9000000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.7972677923380402 | State: (-112.74958038330078, 1.7704740762710571, 181.1181640625) | Terminated: False | Episode Length: 1.9100000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.8135975998739253 | State: (-112.9266357421875, 1.7730433940887451, 181.1999969482422) | Terminated: False | Episode Length: 1.9200000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.8299295531300404 | State: (-113.10372924804688, 1.7756062746047974, 181.28179931640625) | Terminated: False | Episode Length: 1.9300000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.8462633681606087 | State: (-113.2808837890625, 1.7781625986099243, 181.36363220214844) | Terminated: False | Episode Length: 1.9400000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.8625987603951164 | State: (-113.45808410644531, 1.7807124853134155, 181.4454345703125) | Terminated: False | Episode Length: 1.9500000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.8789354446489215 | State: (-113.63533782958984, 1.7832558155059814, 181.5272674560547) | Terminated: False | Episode Length: 1.9600000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.8952731351339502 | State: (-113.81263732910156, 1.7857924699783325, 181.6090850830078) | Terminated: False | Episode Length: 1.9700000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.9116115454694844 | State: (-113.98998260498047, 1.7883225679397583, 181.69090270996094) | Terminated: False | Episode Length: 1.9800000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.9279503886930343 | State: (-114.1673812866211, 1.7908461093902588, 181.77272033691406) | Terminated: False | Episode Length: 1.9900000000000015 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.9442893772712995 | State: (-114.3448257446289, 1.7933628559112549, 181.85452270507812) | Terminated: False | Episode Length: 2.0000000000000013 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.9606282231112164 | State: (-114.5223159790039, 1.7958730459213257, 181.9363555908203) | Terminated: False | Episode Length: 2.010000000000001 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.976966637571092 | State: (-114.6998519897461, 1.7983763217926025, 182.01817321777344) | Terminated: False | Episode Length: 2.020000000000001 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -2.99330433147182 | State: (-114.87743377685547, 1.800873041152954, 182.09999084472656) | Terminated: False | Episode Length: 2.0300000000000007 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.0096410151081865 | State: (-115.0550765991211, 1.8033628463745117, 182.1818084716797) | Terminated: False | Episode Length: 2.0400000000000005 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.025976398260254 | State: (-115.23275756835938, 1.805845856666565, 182.2636260986328) | Terminated: False | Episode Length: 2.0500000000000003 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.042310190204832 | State: (-115.41047668457031, 1.8083220720291138, 182.34544372558594) | Terminated: False | Episode Length: 2.06 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.058642099727028 | State: (-115.58824157714844, 1.8107913732528687, 182.42726135253906) | Terminated: False | Episode Length: 2.07 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.0749718351318798 | State: (-115.76605987548828, 1.8132537603378296, 182.5090789794922) | Terminated: False | Episode Length: 2.0799999999999996 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.09129910425607 | State: (-115.94391632080078, 1.815709114074707, 182.59091186523438) | Terminated: False | Episode Length: 2.0899999999999994 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.107623614479719 | State: (-116.12181854248047, 1.81815767288208, 182.67271423339844) | Terminated: False | Episode Length: 2.099999999999999 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.123945072738257 | State: (-116.29975891113281, 1.8205991983413696, 182.75453186035156) | Terminated: False | Episode Length: 2.109999999999999 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.140263185534376 | State: (-116.47773742675781, 1.8230335712432861, 182.8363494873047) | Terminated: False | Episode Length: 2.1199999999999988 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.156577658950055 | State: (-116.65576171875, 1.8254610300064087, 182.9181671142578) | Terminated: False | Episode Length: 2.1299999999999986 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.1728881986586677 | State: (-116.83383178710938, 1.8278813362121582, 182.99998474121094) | Terminated: False | Episode Length: 2.1399999999999983 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.189194509937161 | State: (-117.0119400024414, 1.8302946090698242, 183.08180236816406) | Terminated: False | Episode Length: 2.149999999999998 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.2054962976783097 | State: (-117.1900863647461, 1.8327007293701172, 183.16363525390625) | Terminated: False | Episode Length: 2.159999999999998 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.221793266403047 | State: (-117.3682861328125, 1.8350995779037476, 183.2454376220703) | Terminated: False | Episode Length: 2.1699999999999977 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.238085120272865 | State: (-117.5465087890625, 1.8374913930892944, 183.3272705078125) | Terminated: False | Episode Length: 2.1799999999999975 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.2543715631022883 | State: (-117.72477722167969, 1.8398758172988892, 183.40907287597656) | Terminated: False | Episode Length: 2.1899999999999973 | C_L: 1.0\n", + "Action: [1. 0.143] | Reward: -3.2706522983714215 | State: (-117.903076171875, 1.8422530889511108, 183.49090576171875) | Terminated: False | Episode Length: 2.199999999999997 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.2869270292385626 | State: (-118.0814208984375, 1.84462308883667, 183.51817321777344) | Terminated: False | Episode Length: 2.209999999999997 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.303195456474462 | State: (-118.25981140136719, 1.8469856977462769, 183.54544067382812) | Terminated: False | Episode Length: 2.2199999999999966 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.3194572804396776 | State: (-118.43826293945312, 1.8493410348892212, 183.57272338867188) | Terminated: False | Episode Length: 2.2299999999999964 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.3357122010952365 | State: (-118.61676025390625, 1.8516889810562134, 183.5999755859375) | Terminated: False | Episode Length: 2.239999999999996 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.351959918013358 | State: (-118.79530334472656, 1.8540295362472534, 183.62725830078125) | Terminated: False | Episode Length: 2.249999999999996 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.368200130388244 | State: (-118.9738998413086, 1.8563627004623413, 183.65452575683594) | Terminated: False | Episode Length: 2.259999999999996 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.384432537046931 | State: (-119.15253448486328, 1.858688473701477, 183.6818084716797) | Terminated: False | Episode Length: 2.2699999999999956 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.400656836460206 | State: (-119.33122253417969, 1.8610066175460815, 183.70907592773438) | Terminated: False | Episode Length: 2.2799999999999954 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.4168727267535886 | State: (-119.50997161865234, 1.8633173704147339, 183.73635864257812) | Terminated: False | Episode Length: 2.289999999999995 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.4330799057183685 | State: (-119.68875885009766, 1.865620493888855, 183.7636260986328) | Terminated: False | Episode Length: 2.299999999999995 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.4492780708227113 | State: (-119.86759948730469, 1.8679161071777344, 183.7908935546875) | Terminated: False | Episode Length: 2.3099999999999947 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.4654669192228194 | State: (-120.04649353027344, 1.870204210281372, 183.8181610107422) | Terminated: False | Episode Length: 2.3199999999999945 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.4816461477741565 | State: (-120.22543334960938, 1.872484564781189, 183.84544372558594) | Terminated: False | Episode Length: 2.3299999999999943 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.4978154530427314 | State: (-120.40442657470703, 1.8747572898864746, 183.87271118164062) | Terminated: False | Episode Length: 2.339999999999994 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.5139745313164386 | State: (-120.58345794677734, 1.877022385597229, 183.89999389648438) | Terminated: False | Episode Length: 2.349999999999994 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.530123078616458 | State: (-120.76253509521484, 1.8792798519134521, 183.92726135253906) | Terminated: False | Episode Length: 2.3599999999999937 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.5462607907087116 | State: (-120.94165802001953, 1.881529450416565, 183.9545440673828) | Terminated: False | Episode Length: 2.3699999999999934 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.562387363115378 | State: (-121.12084197998047, 1.8837714195251465, 183.9818115234375) | Terminated: False | Episode Length: 2.3799999999999932 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.5785024911264607 | State: (-121.3000717163086, 1.8860055208206177, 184.0090789794922) | Terminated: False | Episode Length: 2.389999999999993 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.594605869811414 | State: (-121.47933197021484, 1.888231873512268, 184.03634643554688) | Terminated: False | Episode Length: 2.399999999999993 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.6106971940308203 | State: (-121.65865325927734, 1.890450358390808, 184.06362915039062) | Terminated: False | Episode Length: 2.4099999999999926 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.626776158448124 | State: (-121.8380126953125, 1.8926609754562378, 184.0908966064453) | Terminated: False | Episode Length: 2.4199999999999924 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.6428424575414162 | State: (-122.0174331665039, 1.8948637247085571, 184.11817932128906) | Terminated: False | Episode Length: 2.429999999999992 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.6588957856152735 | State: (-122.19688415527344, 1.8970584869384766, 184.14544677734375) | Terminated: False | Episode Length: 2.439999999999992 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.674935836812646 | State: (-122.37638092041016, 1.8992453813552856, 184.17271423339844) | Terminated: False | Episode Length: 2.4499999999999917 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.690962305126797 | State: (-122.55593872070312, 1.9014242887496948, 184.19998168945312) | Terminated: False | Episode Length: 2.4599999999999915 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.7069748844132926 | State: (-122.73551177978516, 1.903595209121704, 184.22726440429688) | Terminated: False | Episode Length: 2.4699999999999913 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.7229732684020393 | State: (-122.91514587402344, 1.9057581424713135, 184.25453186035156) | Terminated: False | Episode Length: 2.479999999999991 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.738957150709372 | State: (-123.09484100341797, 1.9079129695892334, 184.2818145751953) | Terminated: False | Episode Length: 2.489999999999991 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.754926224850187 | State: (-123.27455139160156, 1.9100596904754639, 184.30908203125) | Terminated: False | Episode Length: 2.4999999999999907 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.7708801842501214 | State: (-123.4543228149414, 1.9121984243392944, 184.33636474609375) | Terminated: False | Episode Length: 2.5099999999999905 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.7868187222577805 | State: (-123.6341323852539, 1.914328932762146, 184.36363220214844) | Terminated: False | Episode Length: 2.5199999999999902 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.8027415321570084 | State: (-123.81397247314453, 1.916451334953308, 184.39088439941406) | Terminated: False | Episode Length: 2.52999999999999 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.818648307179203 | State: (-123.99386596679688, 1.9185655117034912, 184.4181671142578) | Terminated: False | Episode Length: 2.53999999999999 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.8345387405156734 | State: (-124.17381286621094, 1.9206715822219849, 184.4454345703125) | Terminated: False | Episode Length: 2.5499999999999896 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -3.8504125253300407 | State: (-124.35379028320312, 1.9227694272994995, 184.47271728515625) | Terminated: False | Episode Length: 2.5599999999999894 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.86626935477068 | State: (-124.53380584716797, 1.9248589277267456, 184.17271423339844) | Terminated: False | Episode Length: 2.569999999999989 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.882108902017585 | State: (-124.71397399902344, 1.9269402027130127, 183.87271118164062) | Terminated: False | Episode Length: 2.579999999999989 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.897930841142955 | State: (-124.89427947998047, 1.9290131330490112, 183.57272338867188) | Terminated: False | Episode Length: 2.5899999999999888 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.913734847156439 | State: (-125.07470703125, 1.9310777187347412, 183.27272033691406) | Terminated: False | Episode Length: 2.5999999999999885 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.9295205960504944 | State: (-125.25526428222656, 1.9331339597702026, 182.97271728515625) | Terminated: False | Episode Length: 2.6099999999999883 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.945287764845834 | State: (-125.4359359741211, 1.9351818561553955, 182.67271423339844) | Terminated: False | Episode Length: 2.619999999999988 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.961036031636963 | State: (-125.6167221069336, 1.9372212886810303, 182.3727264404297) | Terminated: False | Episode Length: 2.629999999999988 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.9767650756377853 | State: (-125.79761505126953, 1.939252257347107, 182.0727081298828) | Terminated: False | Episode Length: 2.6399999999999877 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -3.9924745772272807 | State: (-125.97859954833984, 1.9412747621536255, 181.77272033691406) | Terminated: False | Episode Length: 2.6499999999999875 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.008164217995231 | State: (-126.15968322753906, 1.943288803100586, 181.47271728515625) | Terminated: False | Episode Length: 2.6599999999999873 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.0238336807879875 | State: (-126.3408432006836, 1.9452942609786987, 181.17271423339844) | Terminated: False | Episode Length: 2.669999999999987 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.039482649754282 | State: (-126.52207946777344, 1.9472912549972534, 180.87271118164062) | Terminated: False | Episode Length: 2.679999999999987 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.055110810391046 | State: (-126.70337677001953, 1.949279546737671, 181.0090789794922) | Terminated: False | Episode Length: 2.6899999999999866 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.07071785484177 | State: (-126.88471984863281, 1.9512593746185303, 181.14544677734375) | Terminated: False | Episode Length: 2.6999999999999864 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.086303475689346 | State: (-127.06608581542969, 1.9532305002212524, 181.28179931640625) | Terminated: False | Episode Length: 2.709999999999986 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.101867365975675 | State: (-127.24749755859375, 1.9551929235458374, 181.4181671142578) | Terminated: False | Episode Length: 2.719999999999986 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.117409219221296 | State: (-127.4289321899414, 1.9571467638015747, 181.55453491210938) | Terminated: False | Episode Length: 2.7299999999999858 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.132928729445028 | State: (-127.61039733886719, 1.9590917825698853, 181.69090270996094) | Terminated: False | Episode Length: 2.7399999999999856 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.148425591183629 | State: (-127.7918930053711, 1.9610282182693481, 181.39089965820312) | Terminated: False | Episode Length: 2.7499999999999853 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.163899488425673 | State: (-127.97346496582031, 1.9629558324813843, 181.5272674560547) | Terminated: False | Episode Length: 2.759999999999985 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.179350115735466 | State: (-128.15505981445312, 1.9648746252059937, 181.22726440429688) | Terminated: False | Episode Length: 2.769999999999985 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.194777158159935 | State: (-128.33673095703125, 1.9667847156524658, 181.36363220214844) | Terminated: False | Episode Length: 2.7799999999999847 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.210180310339464 | State: (-128.5184326171875, 1.9686859846115112, 181.06361389160156) | Terminated: False | Episode Length: 2.7899999999999845 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.22555925845522 | State: (-128.7001953125, 1.9705783128738403, 180.7636260986328) | Terminated: False | Episode Length: 2.7999999999999843 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.240913690303861 | State: (-128.8820343017578, 1.9724619388580322, 180.89999389648438) | Terminated: False | Episode Length: 2.809999999999984 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.256243300211455 | State: (-129.0638885498047, 1.9743365049362183, 180.59999084472656) | Terminated: False | Episode Length: 2.819999999999984 | C_L: 1.0\n", + "Action: [1. 0.238] | Reward: -4.271547777242017 | State: (-129.24581909179688, 1.9762022495269775, 180.73635864257812) | Terminated: False | Episode Length: 2.8299999999999836 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -4.286826815920612 | State: (-129.42776489257812, 1.9780590534210205, 180.4363555908203) | Terminated: False | Episode Length: 2.8399999999999834 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.302080106654914 | State: (-129.60977172851562, 1.9799067974090576, 180.73635864257812) | Terminated: False | Episode Length: 2.849999999999983 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.317307346011213 | State: (-129.7917938232422, 1.981745719909668, 181.03634643554688) | Terminated: False | Episode Length: 2.859999999999983 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.3325082324477515 | State: (-129.97384643554688, 1.9835755825042725, 181.3363494873047) | Terminated: False | Episode Length: 2.869999999999983 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.3476824663604905 | State: (-130.15591430664062, 1.985396385192871, 181.6363525390625) | Terminated: False | Episode Length: 2.8799999999999826 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.362829750128748 | State: (-130.3379669189453, 1.9872081279754639, 181.9363555908203) | Terminated: False | Episode Length: 2.8899999999999824 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.377949788160709 | State: (-130.52003479003906, 1.9890108108520508, 182.23634338378906) | Terminated: False | Episode Length: 2.899999999999982 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.393042286938794 | State: (-130.70208740234375, 1.9908044338226318, 182.53636169433594) | Terminated: False | Episode Length: 2.909999999999982 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.4081069550648735 | State: (-130.8841094970703, 1.9925888776779175, 182.5090789794922) | Terminated: False | Episode Length: 2.9199999999999817 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.423143488087061 | State: (-131.06619262695312, 1.9943642616271973, 182.4818115234375) | Terminated: False | Episode Length: 2.9299999999999815 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.438151581968972 | State: (-131.248291015625, 1.9961304664611816, 182.45452880859375) | Terminated: False | Episode Length: 2.9399999999999813 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.453130933103363 | State: (-131.43043518066406, 1.9978874921798706, 182.42726135253906) | Terminated: False | Episode Length: 2.949999999999981 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.468081238325779 | State: (-131.6126251220703, 1.9996353387832642, 182.39999389648438) | Terminated: False | Episode Length: 2.959999999999981 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.483002194928214 | State: (-131.79486083984375, 2.0013740062713623, 182.3727264404297) | Terminated: False | Episode Length: 2.9699999999999807 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.497893500672772 | State: (-131.9771270751953, 2.003103256225586, 182.34544372558594) | Terminated: False | Episode Length: 2.9799999999999804 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.512754853805345 | State: (-132.15943908691406, 2.0048234462738037, 182.31817626953125) | Terminated: False | Episode Length: 2.9899999999999802 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.527585953069288 | State: (-132.34178161621094, 2.0065343379974365, 182.2908935546875) | Terminated: False | Episode Length: 2.99999999999998 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.542386497719104 | State: (-132.52415466308594, 2.0082356929779053, 182.2636260986328) | Terminated: False | Episode Length: 3.00999999999998 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.55715618753413 | State: (-132.70655822753906, 2.009927988052368, 182.23634338378906) | Terminated: False | Episode Length: 3.0199999999999796 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.571894722832227 | State: (-132.88900756835938, 2.011610984802246, 182.20907592773438) | Terminated: False | Episode Length: 3.0299999999999794 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.586601804483468 | State: (-133.07150268554688, 2.01328444480896, 182.1818084716797) | Terminated: False | Episode Length: 3.039999999999979 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.601277133923832 | State: (-133.25401306152344, 2.014948606491089, 182.154541015625) | Terminated: False | Episode Length: 3.049999999999979 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.6159204131688885 | State: (-133.4365692138672, 2.0166032314300537, 182.45452880859375) | Terminated: False | Episode Length: 3.0599999999999787 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.630531358858072 | State: (-133.6190948486328, 2.0182485580444336, 182.75453186035156) | Terminated: False | Episode Length: 3.0699999999999785 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.645109690112906 | State: (-133.8015899658203, 2.0198843479156494, 182.72726440429688) | Terminated: False | Episode Length: 3.0799999999999783 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.659655110702894 | State: (-133.984130859375, 2.0215108394622803, 183.02725219726562) | Terminated: False | Episode Length: 3.089999999999978 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.674167342822648 | State: (-134.16661071777344, 2.023127555847168, 182.99998474121094) | Terminated: False | Episode Length: 3.099999999999978 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.688646091501134 | State: (-134.34913635253906, 2.0247349739074707, 183.29998779296875) | Terminated: False | Episode Length: 3.1099999999999777 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.703091082099847 | State: (-134.53160095214844, 2.0263328552246094, 183.5999755859375) | Terminated: False | Episode Length: 3.1199999999999775 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.717502042632462 | State: (-134.71401977539062, 2.027921199798584, 183.57272338867188) | Terminated: False | Episode Length: 3.1299999999999772 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.731878680143065 | State: (-134.89646911621094, 2.0295000076293945, 183.87271118164062) | Terminated: False | Episode Length: 3.139999999999977 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.74622072596709 | State: (-135.07887268066406, 2.031069278717041, 183.84544372558594) | Terminated: False | Episode Length: 3.149999999999977 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.760527888566817 | State: (-135.26129150390625, 2.0326290130615234, 184.14544677734375) | Terminated: False | Episode Length: 3.1599999999999766 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.7747999026914245 | State: (-135.44363403320312, 2.0341789722442627, 184.11817932128906) | Terminated: False | Episode Length: 3.1699999999999764 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.789036478281722 | State: (-135.6260223388672, 2.035719394683838, 184.4181671142578) | Terminated: False | Episode Length: 3.179999999999976 | C_L: 1.0\n", + "Action: [1. 0.524] | Reward: -4.803237353591881 | State: (-135.80831909179688, 2.037250280380249, 184.71817016601562) | Terminated: False | Episode Length: 3.189999999999976 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.817402269755742 | State: (-135.99053955078125, 2.038771390914917, 184.69090270996094) | Terminated: False | Episode Length: 3.1999999999999758 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.831530939081078 | State: (-136.17279052734375, 2.040282964706421, 184.6636199951172) | Terminated: False | Episode Length: 3.2099999999999755 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.845623074644081 | State: (-136.35507202148438, 2.0417847633361816, 184.6363525390625) | Terminated: False | Episode Length: 3.2199999999999753 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.8596783903028316 | State: (-136.53736877441406, 2.043276786804199, 184.60906982421875) | Terminated: False | Episode Length: 3.229999999999975 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.873696600710742 | State: (-136.71971130371094, 2.0447592735290527, 184.58180236816406) | Terminated: False | Episode Length: 3.239999999999975 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.8876774213299905 | State: (-136.90208435058594, 2.046231985092163, 184.55453491210938) | Terminated: False | Episode Length: 3.2499999999999747 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.901620568444924 | State: (-137.08447265625, 2.047694683074951, 184.5272674560547) | Terminated: False | Episode Length: 3.2599999999999745 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.915525759175448 | State: (-137.26690673828125, 2.049147844314575, 184.49998474121094) | Terminated: False | Episode Length: 3.2699999999999743 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.9293927114903875 | State: (-137.4493408203125, 2.050591230392456, 184.47271728515625) | Terminated: False | Episode Length: 3.279999999999974 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.943221144220824 | State: (-137.63182067871094, 2.0520248413085938, 184.4454345703125) | Terminated: False | Episode Length: 3.289999999999974 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.9570107770734095 | State: (-137.81431579589844, 2.053448438644409, 184.4181671142578) | Terminated: False | Episode Length: 3.2999999999999736 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -4.9707613306436516 | State: (-137.99684143066406, 2.0548622608184814, 184.39088439941406) | Terminated: False | Episode Length: 3.3099999999999734 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -4.9844725264291725 | State: (-138.17938232421875, 2.0562663078308105, 184.4181671142578) | Terminated: False | Episode Length: 3.319999999999973 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -4.998144091887068 | State: (-138.3619384765625, 2.0576605796813965, 184.4454345703125) | Terminated: False | Episode Length: 3.329999999999973 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.011775755462796 | State: (-138.54449462890625, 2.05904483795166, 184.25453186035156) | Terminated: False | Episode Length: 3.3399999999999728 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.025367226383995 | State: (-138.72711181640625, 2.0604190826416016, 184.06362915039062) | Terminated: False | Episode Length: 3.3499999999999726 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.0389182154155545 | State: (-138.90982055664062, 2.0617835521698, 183.87271118164062) | Terminated: False | Episode Length: 3.3599999999999723 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.052428434886014 | State: (-139.0926055908203, 2.063138008117676, 183.6818084716797) | Terminated: False | Episode Length: 3.369999999999972 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.06589759871386 | State: (-139.27545166015625, 2.0644824504852295, 183.49090576171875) | Terminated: False | Episode Length: 3.379999999999972 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.079325422433716 | State: (-139.45834350585938, 2.06581711769104, 183.51817321777344) | Terminated: False | Episode Length: 3.3899999999999717 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.092711639348843 | State: (-139.64125061035156, 2.067141532897949, 183.3272705078125) | Terminated: False | Episode Length: 3.3999999999999715 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.106055967516749 | State: (-139.82421875, 2.0684561729431152, 183.1363525390625) | Terminated: False | Episode Length: 3.4099999999999713 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.119358126677849 | State: (-140.0072479248047, 2.06976056098938, 182.94544982910156) | Terminated: False | Episode Length: 3.419999999999971 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.132617838281248 | State: (-140.19032287597656, 2.0710551738739014, 182.75453186035156) | Terminated: False | Episode Length: 3.429999999999971 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.145834825510409 | State: (-140.37344360351562, 2.0723395347595215, 182.7818145751953) | Terminated: False | Episode Length: 3.4399999999999706 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.159008826205453 | State: (-140.5565643310547, 2.0736136436462402, 182.59091186523438) | Terminated: False | Episode Length: 3.4499999999999704 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.172139566262211 | State: (-140.73973083496094, 2.074877977371216, 182.6181640625) | Terminated: False | Episode Length: 3.45999999999997 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.1852267855770835 | State: (-140.9228973388672, 2.07613205909729, 182.64544677734375) | Terminated: False | Episode Length: 3.46999999999997 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.198270225204652 | State: (-141.1060791015625, 2.077376127243042, 182.67271423339844) | Terminated: False | Episode Length: 3.47999999999997 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.211269627369995 | State: (-141.2892303466797, 2.0786099433898926, 182.69998168945312) | Terminated: False | Episode Length: 3.4899999999999696 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.224224735480943 | State: (-141.47238159179688, 2.079833507537842, 182.72726440429688) | Terminated: False | Episode Length: 3.4999999999999694 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.237135294140291 | State: (-141.65554809570312, 2.0810470581054688, 182.75453186035156) | Terminated: False | Episode Length: 3.509999999999969 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.250001049157941 | State: (-141.8386993408203, 2.0822503566741943, 182.7818145751953) | Terminated: False | Episode Length: 3.519999999999969 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.26282174756299 | State: (-142.02183532714844, 2.0834434032440186, 182.80906677246094) | Terminated: False | Episode Length: 3.5299999999999687 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.275597137615759 | State: (-142.20497131347656, 2.0846264362335205, 182.8363494873047) | Terminated: False | Episode Length: 3.5399999999999685 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.288326968819762 | State: (-142.38809204101562, 2.085798978805542, 182.64544677734375) | Terminated: False | Episode Length: 3.5499999999999683 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.301010978088838 | State: (-142.57127380371094, 2.086961507797241, 182.45452880859375) | Terminated: False | Episode Length: 3.559999999999968 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.313648904288825 | State: (-142.7544708251953, 2.088113784790039, 182.2636260986328) | Terminated: False | Episode Length: 3.569999999999968 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.326240488261914 | State: (-142.93771362304688, 2.0892558097839355, 182.0727081298828) | Terminated: False | Episode Length: 3.5799999999999677 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.338785472850839 | State: (-143.1209716796875, 2.0903873443603516, 182.09999084472656) | Terminated: False | Episode Length: 3.5899999999999674 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.351283613072819 | State: (-143.30422973632812, 2.0915088653564453, 181.90907287597656) | Terminated: False | Episode Length: 3.5999999999999672 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.363734654931722 | State: (-143.48751831054688, 2.0926198959350586, 181.71817016601562) | Terminated: False | Episode Length: 3.609999999999967 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.376138346493309 | State: (-143.6708221435547, 2.0937206745147705, 181.74545288085938) | Terminated: False | Episode Length: 3.619999999999967 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.388494446337712 | State: (-143.85411071777344, 2.094811201095581, 181.55453491210938) | Terminated: False | Episode Length: 3.6299999999999666 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.400802705790864 | State: (-144.0374298095703, 2.095891237258911, 181.58181762695312) | Terminated: False | Episode Length: 3.6399999999999664 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.413062885938025 | State: (-144.22071838378906, 2.09696102142334, 181.39089965820312) | Terminated: False | Episode Length: 3.649999999999966 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.4252747414259614 | State: (-144.40402221679688, 2.098020315170288, 181.1999969482422) | Terminated: False | Episode Length: 3.659999999999966 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.437438029059673 | State: (-144.5873565673828, 2.099069356918335, 181.22726440429688) | Terminated: False | Episode Length: 3.6699999999999657 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.449552513681581 | State: (-144.77066040039062, 2.1001079082489014, 181.03634643554688) | Terminated: False | Episode Length: 3.6799999999999655 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.461617955513294 | State: (-144.95396423339844, 2.1011362075805664, 180.84544372558594) | Terminated: False | Episode Length: 3.6899999999999653 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.473634116992825 | State: (-145.1372833251953, 2.102154016494751, 180.87271118164062) | Terminated: False | Episode Length: 3.699999999999965 | C_L: 1.0\n", + "Action: [ 1. -0.333] | Reward: -5.485600766835183 | State: (-145.32058715820312, 2.103161334991455, 180.6818084716797) | Terminated: False | Episode Length: 3.709999999999965 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.497517670988598 | State: (-145.50389099121094, 2.104158401489258, 180.70907592773438) | Terminated: False | Episode Length: 3.7199999999999647 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.509384600867567 | State: (-145.6871795654297, 2.10514497756958, 180.73635864257812) | Terminated: False | Episode Length: 3.7299999999999645 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.5212013293362965 | State: (-145.8704376220703, 2.106121063232422, 180.7636260986328) | Terminated: False | Episode Length: 3.7399999999999642 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.532967630719475 | State: (-146.05369567871094, 2.107086658477783, 180.79090881347656) | Terminated: False | Episode Length: 3.749999999999964 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.544683280812963 | State: (-146.23692321777344, 2.108041763305664, 180.81817626953125) | Terminated: False | Episode Length: 3.759999999999964 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.5563480568944 | State: (-146.42013549804688, 2.1089863777160645, 180.84544372558594) | Terminated: False | Episode Length: 3.7699999999999636 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.567961737733732 | State: (-146.6033172607422, 2.1099205017089844, 180.87271118164062) | Terminated: False | Episode Length: 3.7799999999999634 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.579524103603652 | State: (-146.7864990234375, 2.110844135284424, 180.89999389648438) | Terminated: False | Episode Length: 3.789999999999963 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.591034936289959 | State: (-146.96963500976562, 2.111757278442383, 180.92726135253906) | Terminated: False | Episode Length: 3.799999999999963 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.602494019101828 | State: (-147.15277099609375, 2.1126596927642822, 180.95452880859375) | Terminated: False | Episode Length: 3.8099999999999627 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.613901136881997 | State: (-147.33587646484375, 2.1135518550872803, 180.9818115234375) | Terminated: False | Episode Length: 3.8199999999999625 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.625256076016864 | State: (-147.51895141601562, 2.1144332885742188, 181.0090789794922) | Terminated: False | Episode Length: 3.8299999999999623 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.636558624446499 | State: (-147.70201110839844, 2.115304470062256, 181.03634643554688) | Terminated: False | Episode Length: 3.839999999999962 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.6478085716745605 | State: (-147.88504028320312, 2.1161649227142334, 181.06361389160156) | Terminated: False | Episode Length: 3.849999999999962 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.65900570877813 | State: (-148.0680389404297, 2.1170146465301514, 181.0908966064453) | Terminated: False | Episode Length: 3.8599999999999617 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.6701498284174505 | State: (-148.2510223388672, 2.117854118347168, 181.1181640625) | Terminated: False | Episode Length: 3.8699999999999615 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.681240724845572 | State: (-148.4339599609375, 2.118682622909546, 181.14544677734375) | Terminated: False | Episode Length: 3.8799999999999613 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.692278193917908 | State: (-148.61688232421875, 2.1195008754730225, 181.17271423339844) | Terminated: False | Episode Length: 3.889999999999961 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.7032620331017 | State: (-148.79977416992188, 2.1203083992004395, 181.1999969482422) | Terminated: False | Episode Length: 3.899999999999961 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.7141920414853775 | State: (-148.98263549804688, 2.121105432510376, 181.22726440429688) | Terminated: False | Episode Length: 3.9099999999999606 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.7250680197878365 | State: (-149.16546630859375, 2.121891736984253, 181.25453186035156) | Terminated: False | Episode Length: 3.9199999999999604 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.735889770367611 | State: (-149.34825134277344, 2.1226675510406494, 181.28179931640625) | Terminated: False | Episode Length: 3.92999999999996 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.746657097231953 | State: (-149.53102111816406, 2.1234326362609863, 181.25453186035156) | Terminated: False | Episode Length: 3.93999999999996 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.757369804230433 | State: (-149.7137451171875, 2.1241869926452637, 181.22726440429688) | Terminated: False | Episode Length: 3.9499999999999598 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.768027696865897 | State: (-149.89645385742188, 2.1249308586120605, 181.1999969482422) | Terminated: False | Episode Length: 3.9599999999999596 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.77863058230345 | State: (-150.07911682128906, 2.125663995742798, 181.17271423339844) | Terminated: False | Episode Length: 3.9699999999999593 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.789178269379344 | State: (-150.2617645263672, 2.1263866424560547, 181.14544677734375) | Terminated: False | Episode Length: 3.979999999999959 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.799670568609766 | State: (-150.4443817138672, 2.127098560333252, 181.1181640625) | Terminated: False | Episode Length: 3.989999999999959 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.810107292199523 | State: (-150.626953125, 2.1277997493743896, 181.0908966064453) | Terminated: False | Episode Length: 3.9999999999999587 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.820488254050628 | State: (-150.80950927734375, 2.128490447998047, 181.06361389160156) | Terminated: False | Episode Length: 4.009999999999959 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.83081326977079 | State: (-150.9920196533203, 2.1291704177856445, 181.03634643554688) | Terminated: False | Episode Length: 4.019999999999959 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.841082156681794 | State: (-151.17449951171875, 2.1298396587371826, 181.0090789794922) | Terminated: False | Episode Length: 4.0299999999999585 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.851294733827783 | State: (-151.35693359375, 2.130498170852661, 180.9818115234375) | Terminated: False | Episode Length: 4.039999999999958 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.861450821983434 | State: (-151.53933715820312, 2.13114595413208, 180.95452880859375) | Terminated: False | Episode Length: 4.049999999999958 | C_L: 1.0\n", + "Action: [ 1. -0.048] | Reward: -5.871550243662032 | State: (-151.72169494628906, 2.1317832469940186, 180.92726135253906) | Terminated: False | Episode Length: 4.059999999999958 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.881592823123437 | State: (-151.90402221679688, 2.1324098110198975, 180.95452880859375) | Terminated: False | Episode Length: 4.069999999999958 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.891578387737176 | State: (-152.0863037109375, 2.133025646209717, 180.9818115234375) | Terminated: False | Episode Length: 4.079999999999957 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.901506766643729 | State: (-152.26853942871094, 2.1336307525634766, 181.0090789794922) | Terminated: False | Episode Length: 4.089999999999957 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.911377790762026 | State: (-152.45074462890625, 2.1342251300811768, 181.03634643554688) | Terminated: False | Episode Length: 4.099999999999957 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.921191292796827 | State: (-152.6328887939453, 2.1348087787628174, 181.06361389160156) | Terminated: False | Episode Length: 4.109999999999957 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.9309471072459985 | State: (-152.8149871826172, 2.1353816986083984, 181.0908966064453) | Terminated: False | Episode Length: 4.119999999999957 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.940645070407678 | State: (-152.99703979492188, 2.13594388961792, 181.1181640625) | Terminated: False | Episode Length: 4.129999999999956 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.950285020387329 | State: (-153.17904663085938, 2.136495590209961, 181.14544677734375) | Terminated: False | Episode Length: 4.139999999999956 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.9598667971046835 | State: (-153.3610076904297, 2.1370363235473633, 181.17271423339844) | Terminated: False | Episode Length: 4.149999999999956 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.9693902423005705 | State: (-153.54290771484375, 2.137566328048706, 181.1999969482422) | Terminated: False | Episode Length: 4.159999999999956 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.978855199543637 | State: (-153.72474670410156, 2.1380858421325684, 181.22726440429688) | Terminated: False | Episode Length: 4.1699999999999555 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.988261514236952 | State: (-153.90655517578125, 2.138594388961792, 181.25453186035156) | Terminated: False | Episode Length: 4.179999999999955 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -5.9976090336245 | State: (-154.08828735351562, 2.139092206954956, 181.28179931640625) | Terminated: False | Episode Length: 4.189999999999955 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.006897606797556 | State: (-154.26998901367188, 2.1395792961120605, 181.30908203125) | Terminated: False | Episode Length: 4.199999999999955 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.016127084700949 | State: (-154.45162963867188, 2.1400558948516846, 181.3363494873047) | Terminated: False | Episode Length: 4.209999999999955 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.025297320139215 | State: (-154.63320922851562, 2.14052152633667, 181.36363220214844) | Terminated: False | Episode Length: 4.2199999999999545 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.034408167782622 | State: (-154.8147430419922, 2.1409764289855957, 181.39089965820312) | Terminated: False | Episode Length: 4.229999999999954 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.04345948417309 | State: (-154.99620056152344, 2.141420602798462, 181.4181671142578) | Terminated: False | Episode Length: 4.239999999999954 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.052451127729994 | State: (-155.1776123046875, 2.1418540477752686, 181.4454345703125) | Terminated: False | Episode Length: 4.249999999999954 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.061382958755842 | State: (-155.3589630126953, 2.1422767639160156, 181.47271728515625) | Terminated: False | Episode Length: 4.259999999999954 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.070254839441841 | State: (-155.54025268554688, 2.142688751220703, 181.49998474121094) | Terminated: False | Episode Length: 4.269999999999953 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.079066633873347 | State: (-155.7214813232422, 2.143089771270752, 181.5272674560547) | Terminated: False | Episode Length: 4.279999999999953 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.087818208035192 | State: (-155.90264892578125, 2.1434803009033203, 181.55453491210938) | Terminated: False | Episode Length: 4.289999999999953 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.096509429816898 | State: (-156.08375549316406, 2.143860101699829, 181.58181762695312) | Terminated: False | Episode Length: 4.299999999999953 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.105140169017764 | State: (-156.26480102539062, 2.144228935241699, 181.6090850830078) | Terminated: False | Episode Length: 4.3099999999999525 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.113710297351841 | State: (-156.44577026367188, 2.144587278366089, 181.6363525390625) | Terminated: False | Episode Length: 4.319999999999952 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.122219688452785 | State: (-156.62667846679688, 2.14493465423584, 181.6636199951172) | Terminated: False | Episode Length: 4.329999999999952 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.130668217878586 | State: (-156.80752563476562, 2.1452713012695312, 181.69090270996094) | Terminated: False | Episode Length: 4.339999999999952 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.1390557631161835 | State: (-156.98831176757812, 2.145597219467163, 181.71817016601562) | Terminated: False | Episode Length: 4.349999999999952 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.147382203585955 | State: (-157.16900634765625, 2.1459124088287354, 181.74545288085938) | Terminated: False | Episode Length: 4.3599999999999515 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.155647420646086 | State: (-157.3496551513672, 2.146217107772827, 181.77272033691406) | Terminated: False | Episode Length: 4.369999999999951 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.163851297596819 | State: (-157.53021240234375, 2.1465108394622803, 181.8000030517578) | Terminated: False | Episode Length: 4.379999999999951 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.171993719684582 | State: (-157.71070861816406, 2.1467936038970947, 181.82725524902344) | Terminated: False | Episode Length: 4.389999999999951 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.180074574105988 | State: (-157.89114379882812, 2.1470658779144287, 181.85452270507812) | Terminated: False | Episode Length: 4.399999999999951 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.188093750011724 | State: (-158.07150268554688, 2.147327423095703, 181.88180541992188) | Terminated: False | Episode Length: 4.40999999999995 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.196051138510307 | State: (-158.25177001953125, 2.147578239440918, 181.90907287597656) | Terminated: False | Episode Length: 4.41999999999995 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.203946632671721 | State: (-158.43197631835938, 2.1478183269500732, 181.9363555908203) | Terminated: False | Episode Length: 4.42999999999995 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.211780127530935 | State: (-158.61212158203125, 2.14804744720459, 181.963623046875) | Terminated: False | Episode Length: 4.43999999999995 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.219551520091291 | State: (-158.7921600341797, 2.148266077041626, 181.99090576171875) | Terminated: False | Episode Length: 4.4499999999999496 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.2272607093277745 | State: (-158.97213745117188, 2.1484739780426025, 182.01817321777344) | Terminated: False | Episode Length: 4.459999999999949 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.234907596190157 | State: (-159.15203857421875, 2.1486709117889404, 182.04544067382812) | Terminated: False | Episode Length: 4.469999999999949 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.242492083606021 | State: (-159.3318634033203, 2.148857355117798, 182.0727081298828) | Terminated: False | Episode Length: 4.479999999999949 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.250014076483651 | State: (-159.5115966796875, 2.1490330696105957, 182.09999084472656) | Terminated: False | Episode Length: 4.489999999999949 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.257473481714812 | State: (-159.69126892089844, 2.149197816848755, 182.12725830078125) | Terminated: False | Episode Length: 4.4999999999999485 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.264870208177399 | State: (-159.87083435058594, 2.1493520736694336, 182.154541015625) | Terminated: False | Episode Length: 4.509999999999948 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.272204166737958 | State: (-160.05032348632812, 2.1494956016540527, 182.1818084716797) | Terminated: False | Episode Length: 4.519999999999948 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.279475270254092 | State: (-160.229736328125, 2.1496284008026123, 182.20907592773438) | Terminated: False | Episode Length: 4.529999999999948 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.286683433576733 | State: (-160.40907287597656, 2.1497504711151123, 182.23634338378906) | Terminated: False | Episode Length: 4.539999999999948 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.293828573552299 | State: (-160.58831787109375, 2.1498618125915527, 182.2636260986328) | Terminated: False | Episode Length: 4.549999999999947 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.300910609024721 | State: (-160.76747131347656, 2.1499624252319336, 182.2908935546875) | Terminated: False | Episode Length: 4.559999999999947 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.307929460837343 | State: (-160.946533203125, 2.150052547454834, 182.31817626953125) | Terminated: False | Episode Length: 4.569999999999947 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.314885051834704 | State: (-161.12550354003906, 2.1501317024230957, 182.34544372558594) | Terminated: False | Episode Length: 4.579999999999947 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.321777306864194 | State: (-161.3043975830078, 2.150200366973877, 182.3727264404297) | Terminated: False | Episode Length: 4.589999999999947 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.3286061527775805 | State: (-161.4832000732422, 2.1502583026885986, 182.39999389648438) | Terminated: False | Episode Length: 4.599999999999946 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.335371518432417 | State: (-161.6619110107422, 2.1503055095672607, 182.42726135253906) | Terminated: False | Episode Length: 4.609999999999946 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.342073334693324 | State: (-161.8405303955078, 2.1503422260284424, 182.45452880859375) | Terminated: False | Episode Length: 4.619999999999946 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.348711534433144 | State: (-162.01904296875, 2.1503679752349854, 182.4818115234375) | Terminated: False | Episode Length: 4.629999999999946 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.355286052533976 | State: (-162.19747924804688, 2.150383234024048, 182.5090789794922) | Terminated: False | Episode Length: 4.6399999999999455 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.361796825888083 | State: (-162.3758087158203, 2.15038800239563, 182.53636169433594) | Terminated: False | Episode Length: 4.649999999999945 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.368243793398677 | State: (-162.55404663085938, 2.1503820419311523, 182.56362915039062) | Terminated: False | Episode Length: 4.659999999999945 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.374626895980577 | State: (-162.73219299316406, 2.1503653526306152, 182.59091186523438) | Terminated: False | Episode Length: 4.669999999999945 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.380946076560748 | State: (-162.91024780273438, 2.1503379344940186, 182.6181640625) | Terminated: False | Episode Length: 4.679999999999945 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.387201280078709 | State: (-163.08819580078125, 2.1503000259399414, 182.64544677734375) | Terminated: False | Episode Length: 4.689999999999944 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.393392453486827 | State: (-163.26605224609375, 2.1502513885498047, 182.67271423339844) | Terminated: False | Episode Length: 4.699999999999944 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.399519545750478 | State: (-163.4438018798828, 2.1501922607421875, 182.69998168945312) | Terminated: False | Episode Length: 4.709999999999944 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.40558250784809 | State: (-163.62144470214844, 2.1501224040985107, 182.72726440429688) | Terminated: False | Episode Length: 4.719999999999944 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.41158129277106 | State: (-163.7989959716797, 2.1500420570373535, 182.75453186035156) | Terminated: False | Episode Length: 4.729999999999944 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.417515855523552 | State: (-163.9764404296875, 2.149951219558716, 182.7818145751953) | Terminated: False | Episode Length: 4.739999999999943 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.423386153122169 | State: (-164.15377807617188, 2.1498496532440186, 182.80906677246094) | Terminated: False | Episode Length: 4.749999999999943 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.4291921445955 | State: (-164.33102416992188, 2.1497373580932617, 182.8363494873047) | Terminated: False | Episode Length: 4.759999999999943 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.434933790983549 | State: (-164.50814819335938, 2.1496148109436035, 182.86361694335938) | Terminated: False | Episode Length: 4.769999999999943 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.440611055337044 | State: (-164.68516540527344, 2.1494812965393066, 182.89089965820312) | Terminated: False | Episode Length: 4.7799999999999425 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.446223902716615 | State: (-164.86209106445312, 2.1493375301361084, 182.9181671142578) | Terminated: False | Episode Length: 4.789999999999942 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.45177230019186 | State: (-165.03890991210938, 2.1491832733154297, 182.94544982910156) | Terminated: False | Episode Length: 4.799999999999942 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.457256216840283 | State: (-165.21560668945312, 2.1490182876586914, 182.97271728515625) | Terminated: False | Episode Length: 4.809999999999942 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.462675623746114 | State: (-165.39218139648438, 2.1488428115844727, 182.99998474121094) | Terminated: False | Episode Length: 4.819999999999942 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.468030493999012 | State: (-165.56866455078125, 2.1486568450927734, 183.02725219726562) | Terminated: False | Episode Length: 4.8299999999999415 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.473320802692636 | State: (-165.7450408935547, 2.1484603881835938, 183.05453491210938) | Terminated: False | Episode Length: 4.839999999999941 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.478546526923108 | State: (-165.92127990722656, 2.1482534408569336, 183.08180236816406) | Terminated: False | Episode Length: 4.849999999999941 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.483707645787353 | State: (-166.097412109375, 2.148035764694214, 183.1090850830078) | Terminated: False | Episode Length: 4.859999999999941 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.488804140381313 | State: (-166.27345275878906, 2.1478078365325928, 183.1363525390625) | Terminated: False | Episode Length: 4.869999999999941 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.493835993798052 | State: (-166.44935607910156, 2.147569417953491, 183.16363525390625) | Terminated: False | Episode Length: 4.87999999999994 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.498803191125734 | State: (-166.62515258789062, 2.147320508956909, 183.19090270996094) | Terminated: False | Episode Length: 4.88999999999994 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.503705719445488 | State: (-166.80081176757812, 2.1470611095428467, 183.21817016601562) | Terminated: False | Episode Length: 4.89999999999994 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.508543567829155 | State: (-166.97637939453125, 2.1467912197113037, 183.2454376220703) | Terminated: False | Episode Length: 4.90999999999994 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.513316727336911 | State: (-167.15182495117188, 2.1465110778808594, 183.27272033691406) | Terminated: False | Episode Length: 4.9199999999999395 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.518025191014784 | State: (-167.32713317871094, 2.1462204456329346, 183.29998779296875) | Terminated: False | Episode Length: 4.929999999999939 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.522668953892044 | State: (-167.50233459472656, 2.1459193229675293, 183.3272705078125) | Terminated: False | Episode Length: 4.939999999999939 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.527248012978481 | State: (-167.67739868164062, 2.1456077098846436, 183.3545379638672) | Terminated: False | Episode Length: 4.949999999999939 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.53176236726157 | State: (-167.85235595703125, 2.1452858448028564, 183.38180541992188) | Terminated: False | Episode Length: 4.959999999999939 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.536212017703518 | State: (-168.0271759033203, 2.144953489303589, 183.40907287597656) | Terminated: False | Episode Length: 4.9699999999999385 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.540596967238195 | State: (-168.20188903808594, 2.14461088180542, 183.4363555908203) | Terminated: False | Episode Length: 4.979999999999938 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.544917220767954 | State: (-168.37646484375, 2.1442577838897705, 183.463623046875) | Terminated: False | Episode Length: 4.989999999999938 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.5491727851603345 | State: (-168.55091857910156, 2.1438944339752197, 183.49090576171875) | Terminated: False | Episode Length: 4.999999999999938 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.553363669244655 | State: (-168.72523498535156, 2.1435208320617676, 183.51817321777344) | Terminated: False | Episode Length: 5.009999999999938 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.557489883808492 | State: (-168.89942932128906, 2.143136739730835, 183.54544067382812) | Terminated: False | Episode Length: 5.019999999999937 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.561551441594043 | State: (-169.07350158691406, 2.142742395401001, 183.57272338867188) | Terminated: False | Episode Length: 5.029999999999937 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.565548357294388 | State: (-169.2474365234375, 2.1423375606536865, 183.5999755859375) | Terminated: False | Episode Length: 5.039999999999937 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.569480647549629 | State: (-169.42123413085938, 2.14192271232605, 183.62725830078125) | Terminated: False | Episode Length: 5.049999999999937 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.573348330942925 | State: (-169.5948944091797, 2.1414973735809326, 183.65452575683594) | Terminated: False | Episode Length: 5.0599999999999365 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.577151427996416 | State: (-169.76844787597656, 2.141062021255493, 183.6818084716797) | Terminated: False | Episode Length: 5.069999999999936 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.580889961167037 | State: (-169.9418487548828, 2.1406161785125732, 183.70907592773438) | Terminated: False | Episode Length: 5.079999999999936 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.584563954842223 | State: (-170.1151123046875, 2.140160083770752, 183.73635864257812) | Terminated: False | Episode Length: 5.089999999999936 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.588173435335511 | State: (-170.28823852539062, 2.1396939754486084, 183.7636260986328) | Terminated: False | Episode Length: 5.099999999999936 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.5917184308820245 | State: (-170.46124267578125, 2.1392176151275635, 183.7908935546875) | Terminated: False | Episode Length: 5.1099999999999355 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.59519897163386 | State: (-170.63409423828125, 2.138730764389038, 183.8181610107422) | Terminated: False | Episode Length: 5.119999999999935 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.5986150896553655 | State: (-170.80682373046875, 2.1382341384887695, 183.84544372558594) | Terminated: False | Episode Length: 5.129999999999935 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.60196681891831 | State: (-170.97940063476562, 2.1377270221710205, 183.87271118164062) | Terminated: False | Episode Length: 5.139999999999935 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.605254195296952 | State: (-171.15184020996094, 2.137209892272949, 183.89999389648438) | Terminated: False | Episode Length: 5.149999999999935 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.608477256563002 | State: (-171.3241424560547, 2.1366825103759766, 183.92726135253906) | Terminated: False | Episode Length: 5.159999999999934 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.61163604238048 | State: (-171.49630737304688, 2.1361451148986816, 183.9545440673828) | Terminated: False | Episode Length: 5.169999999999934 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.614730594300477 | State: (-171.66831970214844, 2.1355974674224854, 183.9818115234375) | Terminated: False | Episode Length: 5.179999999999934 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.617760955755804 | State: (-171.84017944335938, 2.135039806365967, 184.0090789794922) | Terminated: False | Episode Length: 5.189999999999934 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.620727172055546 | State: (-172.01190185546875, 2.134471893310547, 184.03634643554688) | Terminated: False | Episode Length: 5.199999999999934 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.623629290379519 | State: (-172.18348693847656, 2.133894205093384, 184.06362915039062) | Terminated: False | Episode Length: 5.209999999999933 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.626467359772615 | State: (-172.3549041748047, 2.1333062648773193, 184.0908966064453) | Terminated: False | Episode Length: 5.219999999999933 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.629241431139061 | State: (-172.5261993408203, 2.1327083110809326, 184.11817932128906) | Terminated: False | Episode Length: 5.229999999999933 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.63195155723657 | State: (-172.6973419189453, 2.1321001052856445, 184.14544677734375) | Terminated: False | Episode Length: 5.239999999999933 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.6345977926704 | State: (-172.86831665039062, 2.1314821243286133, 184.17271423339844) | Terminated: False | Episode Length: 5.2499999999999325 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.637180193887314 | State: (-173.03915405273438, 2.1308541297912598, 183.87271118164062) | Terminated: False | Episode Length: 5.259999999999932 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.639698779507123 | State: (-173.20994567871094, 2.130216121673584, 183.57272338867188) | Terminated: False | Episode Length: 5.269999999999932 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.642153572672575 | State: (-173.38067626953125, 2.129568099975586, 183.27272033691406) | Terminated: False | Episode Length: 5.279999999999932 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.644544601046346 | State: (-173.55136108398438, 2.1289100646972656, 182.97271728515625) | Terminated: False | Episode Length: 5.289999999999932 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.6468718968073555 | State: (-173.7219696044922, 2.128242254257202, 182.67271423339844) | Terminated: False | Episode Length: 5.299999999999931 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.649135496646419 | State: (-173.8925018310547, 2.1275644302368164, 182.3727264404297) | Terminated: False | Episode Length: 5.309999999999931 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.651335441761225 | State: (-174.0629425048828, 2.1268765926361084, 182.39999389648438) | Terminated: False | Episode Length: 5.319999999999931 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.653471799798766 | State: (-174.23324584960938, 2.126178741455078, 182.42726135253906) | Terminated: False | Episode Length: 5.329999999999931 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.655544640209343 | State: (-174.4033966064453, 2.1254711151123047, 182.45452880859375) | Terminated: False | Episode Length: 5.339999999999931 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.657554034239835 | State: (-174.57337951660156, 2.124753475189209, 182.4818115234375) | Terminated: False | Episode Length: 5.34999999999993 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.659500054926863 | State: (-174.7432098388672, 2.12402606010437, 182.5090789794922) | Terminated: False | Episode Length: 5.35999999999993 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.661382777089872 | State: (-174.9128875732422, 2.123288869857788, 182.53636169433594) | Terminated: False | Episode Length: 5.36999999999993 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.663202277324129 | State: (-175.08241271972656, 2.122541666030884, 182.56362915039062) | Terminated: False | Episode Length: 5.37999999999993 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.664958633993619 | State: (-175.25177001953125, 2.1217846870422363, 182.59091186523438) | Terminated: False | Episode Length: 5.3899999999999295 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.666651927223867 | State: (-175.4209747314453, 2.1210179328918457, 182.6181640625) | Terminated: False | Episode Length: 5.399999999999929 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.668282238894665 | State: (-175.58999633789062, 2.120241403579712, 182.64544677734375) | Terminated: False | Episode Length: 5.409999999999929 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.669849652632717 | State: (-175.75888061523438, 2.119455099105835, 182.34544372558594) | Terminated: False | Episode Length: 5.419999999999929 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.671354229291479 | State: (-175.92767333984375, 2.1186587810516357, 182.3727264404297) | Terminated: False | Episode Length: 5.429999999999929 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.6727960557208705 | State: (-176.09629821777344, 2.1178529262542725, 182.39999389648438) | Terminated: False | Episode Length: 5.4399999999999284 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.674175220496997 | State: (-176.26475524902344, 2.117037534713745, 182.42726135253906) | Terminated: False | Episode Length: 5.449999999999928 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.675491813914488 | State: (-176.43304443359375, 2.1162121295928955, 182.45452880859375) | Terminated: False | Episode Length: 5.459999999999928 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.676745927978748 | State: (-176.60118103027344, 2.115377187728882, 182.4818115234375) | Terminated: False | Episode Length: 5.469999999999928 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.677937656398126 | State: (-176.76914978027344, 2.114532470703125, 182.5090789794922) | Terminated: False | Episode Length: 5.479999999999928 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.679067094576005 | State: (-176.9369354248047, 2.113677978515625, 182.53636169433594) | Terminated: False | Episode Length: 5.489999999999927 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.680134339602814 | State: (-177.10458374023438, 2.11281418800354, 182.56362915039062) | Terminated: False | Episode Length: 5.499999999999927 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.681139490247966 | State: (-177.2720489501953, 2.111940383911133, 182.59091186523438) | Terminated: False | Episode Length: 5.509999999999927 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.682082646951707 | State: (-177.4393310546875, 2.1110572814941406, 182.6181640625) | Terminated: False | Episode Length: 5.519999999999927 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.682963911816901 | State: (-177.60646057128906, 2.1101644039154053, 182.64544677734375) | Terminated: False | Episode Length: 5.5299999999999265 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.683783388600736 | State: (-177.77340698242188, 2.109261989593506, 182.34544372558594) | Terminated: False | Episode Length: 5.539999999999926 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.684541158384494 | State: (-177.9402618408203, 2.1083500385284424, 182.3727264404297) | Terminated: False | Episode Length: 5.549999999999926 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.685237327971843 | State: (-178.10693359375, 2.107428789138794, 182.39999389648438) | Terminated: False | Episode Length: 5.559999999999926 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.685872005797397 | State: (-178.2734375, 2.1064977645874023, 182.42726135253906) | Terminated: False | Episode Length: 5.569999999999926 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.686445301918154 | State: (-178.43975830078125, 2.1055572032928467, 182.45452880859375) | Terminated: False | Episode Length: 5.5799999999999255 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.686957328004857 | State: (-178.6059112548828, 2.104607343673706, 182.4818115234375) | Terminated: False | Episode Length: 5.589999999999925 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.687408197333288 | State: (-178.77188110351562, 2.1036479473114014, 182.5090789794922) | Terminated: False | Episode Length: 5.599999999999925 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.6877980247754945 | State: (-178.9376983642578, 2.1026790142059326, 182.53636169433594) | Terminated: False | Episode Length: 5.609999999999925 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.688126926790943 | State: (-179.1033172607422, 2.101700782775879, 182.56362915039062) | Terminated: False | Episode Length: 5.619999999999925 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.688395021417609 | State: (-179.2687530517578, 2.100713014602661, 182.59091186523438) | Terminated: False | Episode Length: 5.629999999999924 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.688602428262999 | State: (-179.43402099609375, 2.0997159481048584, 182.6181640625) | Terminated: False | Episode Length: 5.639999999999924 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.68874926849511 | State: (-179.59910583496094, 2.0987095832824707, 182.64544677734375) | Terminated: False | Episode Length: 5.649999999999924 | C_L: 1.0\n", + "Action: [ 1. -0.524] | Reward: -6.688835664833324 | State: (-179.76400756835938, 2.097693681716919, 182.34544372558594) | Terminated: False | Episode Length: 5.659999999999924 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.688861717469255 | State: (-179.92880249023438, 2.0966687202453613, 182.3727264404297) | Terminated: False | Episode Length: 5.6699999999999235 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.688827551971928 | State: (-180.09339904785156, 2.0956342220306396, 182.39999389648438) | Terminated: False | Episode Length: 5.679999999999923 | C_L: 1.0\n", + "Action: [1. 0.048] | Reward: -6.6887933864746 | State: (-180.09339904785156, 2.0956342220306396, 182.39999389648438) | Terminated: True | Episode Length: 5.689999999999923 | C_L: 1.0\n" + ] + }, + { + "data": { + "image/png": "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5LB169a7Os/KlSt1/9doNKxcuRJDQ0OGDh16y31UKlWlKUlWrFhR5TGf/zZy5EisrKx4++23KSkpqbT+ZlOT3Mjc3BygWolteSvqv7vxrl279o77Pvjgg8THx/PFF19UWldQUKCbK3TixIkolUreeOONSi2gN57X3Nz8prGPGTOGY8eOERwcrFuWl5fH559/jre3d4262Hbr1g0/Pz8++OADcnNzK60v/1qXlZVV6tbs5OSEq6vrTadUEUII0XhIi6UQQjQjW7duJScnhwkTJtx0fe/evXF0dGTjxo1Mnjy5RucwMTFh586dTJs2jV69evHHH3+wfft2Fi9efMvxgwDjxo3jm2++wdramoCAAIKDg9m9ezf29vY1isPKyorVq1czdepUunbtykMPPYSjoyMxMTFs376dfv36VUiA/61z586oVCreffddsrKyMDY21s1PeSsjRozAyMiI8ePHM2vWLHJzc/niiy9wcnIiMTHxtvFOnTqVH3/8kdmzZ7Nv3z769etHWVkZly5d4scff9TNmenv788rr7zCm2++yYABA7jvvvswNjbm+PHjuLq68s477wDaZG/16tX897//xd/fHycnJ4YMGcLLL7/M999/z+jRo5k3bx52dnasX7+eyMhIfvnll0oFgapCqVTy5ZdfMnr0aNq1a8fjjz+Om5sb8fHx7Nu3DysrK7Zt20ZOTg7u7u488MADdOrUCQsLC3bv3s3x48crtFQLIYRofCSxFEKIZmTjxo2YmJgwfPjwm65XKpWMHTuWjRs3kp6eXqOkTqVSsXPnTp5++mleeOEFLC0tWbJkCa+99tpt9/v4449RqVRs3LiRwsJC+vXrx+7du29aebWqHn74YVxdXfnf//7H+++/T1FREW5ubgwYMIDHH3/8tvu6uLiwZs0a3nnnHZ544gnKysrYt2/fbRPL1q1b8/PPP/Pqq6/yn//8BxcXF55++mkcHR2ZMWPGbc+nVCrZsmULy5cvZ8OGDWzevBkzMzN8fX157rnnKnQtfuONN/Dx8WHFihW88sormJmZ0bFjR6ZOnarb5rXXXiM6Opr33nuPnJwcBg0axJAhQ3B2dubIkSO89NJLrFixgsLCQjp27Mi2bdsYO3ZsFb+ylQUGBhIcHMybb77JypUryc3NxcXFhV69ejFr1iwAzMzMeOaZZ/jrr7/49ddfUavV+Pv7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mzePYcOGVWmfS5cuoVar+eyzz7hw4QLLly9nzZo1LF68uNrnb9eunW5MWnBwMC1btmTcuHHS26sOzZgxg8mTJ992m927d1cYL9itWzfduiNHjjBlyhSeeOIJTp8+zcSJE5k4caLuM/7NREZGMnbsWAYPHkxISAjz58/nySef5M8//9Rt89FHH2FhYcFff/2FqakpH330UY2vMTQ0lKysLN1r0aJFNT7WihUr+Pvvv9m6dSsnT55k2bJlzJkzh927d+u2mTlzJiNHjqRDhw488sgjbNiwgc2bNxMeHl7j896tJjPG0t7entatW7Nhwwbdk4nPPvsMJycn3TdmcHAwHTp0wNnZWbffyJEjefrpp7lw4QJdunSpdNyioqIKTdnlLYGlpaU1+gX8xx9/VFr222+/Adpf6N26dSMkJES3rvwc3t7eFZ7cxMTEsPPoefKHv8o9r62lILuQtm3bsmPHDlxcXOrtj4OoH+X3U+5r8yD3u/mpy3u+JSSBiLQ8vO3N8HUwp6WTBebGjf/Pf0lJCRqNBrVajVqtBrTzzRWUlOklHlNDVZUqR44ZMwZHR0e+//57Xn/9dV3subm5/PTTT7z77ru6ZbdSPh/2X3/9xaJFiwgNDaVz58589dVXtG7dWrfd6tWr+fDDD4mNjcXHx4fFixczdepU3XqVSsXKlSvZuXMne/fu5T//+Q+g/Vwyd+5c3njjDTIyMpg6dSqffPIJH374IcuXL0etVjNv3rwaJXUApqamuqIlhw4dIjMz847XPGLEiArdAL29vXn++edZs2ZNtQqWaDQaDAwMcHJyAsDJyYmlS5eydu1aLl26RI8ePQBYvnw569atIyIiAjs7O8aNG8e7776LhYUFAOvWrWPhwoV8//33LFy4kNjYWPr168fXX39NixYtdOcqf4F2rvLx48fz/PPP8+KLL942zvDwcJ5//nmOHj1KXl4ebdu25a233qqQiPv6+vLUU08RFhbGzz//jK2tLYsXL2bmzJm6bY4cOcLcuXO5dOkS7du3Z/Hixdx///2cPHmSzp07677uN/4cHTp0iFdeeYUTJ07g4ODAxIkTefvttzE3N6/y1/lG5claSkoKZ8+erXSvy9/b2trq7su/13300UeMHDmS559/HoDXX3+dXbt2sWLFClavXn3T865evRofHx/ef/99AFq3bs3Bgwf58MMPGT58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TUb2BaMjiohBVFhKqcQmWKYY6RDiib2tvoxERESshclkokOIJ9891p5Ph9xMswA3zucV8EFcMp2mrmT60j2cPqcCU8TaqCKQEkvPymXHkTMARIZp7koRERFrZDKZ6BLmxY/DOzDnwVY08Xcl+0IB78Yk0WlqDDOX7+XM+TyjY4rIdVJpCstXX32V9u3bU716ddzd3a+437x58wgPD8fJyQlvb2+GDx9ebPu2bdvo1KkTTk5OBAYGMm3atApOXvWs2nsCsxka+7vi7epkdBwRERExkMlkIrqRDwtHduSDQS1p6OvC2dx8Zq3YR6epK3l7xT7O5qjAFKnqKs08lhcuXODOO++kXbt2zJkz57L7zJgxgzfeeIPp06fTpk0bsrOz2b9/f9H2zMxMevToQbdu3Zg9ezbbt29nyJAhuLu78+ijj16nK6nc8gsKWbX3BACRDdRbKSIiIhYmk4meTXzp3siHX3Yc581f97IvLYs3lu9lztoU/t25Pg+0q0MNx0rz46eIlECl+Zc9ceJEwNIjeTmnTp3ixRdfZMGCBURHRxetDw8PL3o/f/58Lly4wCeffIKDgwNNmjQhPj6eGTNmqLC8RnkFZjqFerH9yBmaBbgbHUdERERuMDY2JvqG+9HrJl8WbjvKrF/3kZyezdQle/h4dTLDutTn/rZ1qOZga3RUESlHlaaw/CfLly+nsLCQI0eO0KhRI86ePUv79u154403CAwMBGD9+vV07twZBweHos/17NmTqVOncurUKWrWvHR009zcXHJz/xxC++zZswDk5+eTl2fcbR0Xz329M9iZ4LZwH25t6o25sIC8woLren5rZVR7izHU3tZHbW5drKm9+zTxpkdDTxZuP87bMUkczDjPq4t388GqJP7dOZiBrQJwtK/aBaY1tbc1ys/PNzrCDaPKFJbJyckUFhby2muvMWvWLNzc3HjxxRfp3r0727Ztw8HBgePHjxMcHFzscz4+PgAcP378soXl5MmTi3pL/2rFihV4enpWzMWUwPLly42OINeR2tu6qL2tj9rculhTezsAo0JhU7qJpYdtSM+6wKuLE3hn+R66BxTSztuMXaUZ+aN0rKm9rUl6errREW4YhhaWzz77LFOnTr3qPrt376Zhw4b/eKzCwkLy8vJ466236NGjBwBffvklvr6+xMTE0LNnz1JlfO655xgzZkzR8pEj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bIoNYHNxubCwEIB27drxwgsvkJeXV/QPe/ny5TRo0OCyt8GKiIiIiIixDh8+XDT668WBegIDA4mNjS1aHxkZSVxcnGED+DRu3LjY8ksvvcSECRNKdaxevXoxYMAAgoODSUpK4vnnn6d3796sX78eW1tbjh8/jre3d7HP2NnZ4eHhwfHjx0t7CWVWaZ6xPHjwIBkZGRw8eJCCgoKih3tDQkJwdname/fuPP300wwfPpyRI0dSWFjIlClTsLOzIyoqCoB7772XiRMnMnToUJ555hl27NjBrFmzmDlzpoFXJiIiIiIiV+Li4lJUSP21Z/KvxaW3tzcuLi6GZdy1a1ex23HL0lt5zz33FL1v2rQp4eHh1K9fn9jYWKKjo8uUsyJVmsJy/PjxxUZHioiIACAmJobIyEgaNmzIggULmDhxIu3atcPGxoaIiAiWLFmCn58fAG5ubixbtozhw4fTsmVLPD09GT9+fKWdakREREREpKpzc3NjyZIlnD179pIeycDAQOLi4nBxccHNzc2ghJbi19W1YuaUr1evHp6eniQmJhIdHY2vry9paWnF9snPzycjI+OKj/ddD5WmsJw3b94V57C8qHv37nTv3v2q+4SHh7N69epyTCYiIiIiIhXJzc3tioVjVZ+/8vDhw5w8ebKos6xdu3acPn2aLVu20LJlSwBWrlxJYWEhbdq0MSxnpSksRUREREREKrusrCwSExOLllNSUoiPj8fDwwMPDw8mTpzIHXfcga+vL0lJSYwbN46QkBB69uwJQKNGjejVqxePPPIIs2fPJi8vjxEjRnDPPfcYNiIsgI1hZxYREREREbEymzdvJiIioujRvjFjxhAREcH48eOxtbVl27Zt3HbbbYSFhTF06FBatmzJ6tWriz23OX/+fBo2bEh0dDR9+vShY8eOfPjhh0ZdEqAeSxERERERkesmMjISs9l8xe1Lly79x2N4eHjwxRdflGesMlOPpYiIiIiIiJSJCksREREREREpExWWIiIiIiIiUiYqLEVERERERKRMVFiKiIiIiIhImaiwFBERERERkTJRYSkiIiIiIiJlonksS6iwsBCAY8eOGZojPz+f9PR0jhw5gp2dmrGqU3tbF7W39VGbWxe1t3VRe1dtF2uCizWCNdNXdwmlpqYCcPPNNxucREREREREbgSpqakEBQUZHcNQJrPZbDY6RGWS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ggK+/fZbbr311mLr33vvPUJDQ3FycsLHx4d//etfRdsKCwuZPHkywcHBVKtWjWbNmvHtt98W+/zOnTu55ZZbcHV1xcXFhU6dOpGUlFT0+UmTJhEQEICjoyPNmzdnyZIlRZ/dv38/JpOJ77//nqioKKpXr06zZs1Yv359sXPMmzePoKAgqlevTv/+/Tl58mSx7Vu3biUqKgoXFxdcXV1p2bIlmzdvLtp+6623snnz5qJcIiIipaHCUkREbmiffvopnp6e/Pbbb4wcOZLHHnuMO++8k/bt2/P777/To0cPBg0axLlz5wA4ffo0Xbt2JSIigs2bN7NkyRJSU1O56667rniObdu2cebMGVq1alW0bvPmzTzxxBNMmjSJhIQElixZQufOnYu2T548mc8++4zZs2ezc+dORo8ezf33309cXBwAR44coXPnzjg6OrJy5Uq2bNnCkCFDyM/PB2DWrFm88cYbvP7662zbto2ePXty2223sW/fvmLZXnjhBZ566ini4+MJCwtj4MCBRcfYuHEjQ4cOZcSIEcTHxxMVFcUrr7xS7PP33XcfAQEBbNq0iS1btvDss89ib29ftD0oKAgfHx9Wr15dmuYRERGxMIuIiFxnc+fONbu5uV2y/sEHHzTffvvtRctdunQxd+zYsWg5Pz/fXKNGDfOgQYOK1h07dswMmNevX282m83ml19+2dyjR49ixz106JAZMCckJFw2zw8//GC2tbU1FxYWFq377rvvzK6urubMzMxL9s/JyTFXr17dvG7dumLrhw4dah44cKDZbDabn3vuOXNwcLD5woULlz2nv7+/+dVXXy22rnXr1ubHH3/cbDabzSkpKWbA/PHHHxdt37lzpxkw796922w2m80DBw409+nTp9gx7r777mJ/ty4uLuZ58+ZdNsNFERER5gkTJlx1HxERkatRj6WIiNzQwsPDi97b2tpSq1YtmjZtWrTOx8cHgLS0NMBy62dMTEzRM5vOzs40bNgQ4Iq3e54/fx5HR0dMJlPRuu7du1OnTh3q1avHoEGDmD9/flGvaGJiIufOnaN79+7FzvPZZ58VnSM+Pp5OnToV6x28KDMzk6NHj9KhQ4di6zt06MDu3buveP1+fn7FrnX37t20adOm2P7t2rUrtjxmzBgefvhhunXrxpQpUy77d1CtWrWiaxMRESkNDd4jIiI3tL8XZiaTqdi6i8XgxSkzsrKyuPXWW5k6deolx7pYmP2dp6cn586d48KFCzg4OADg4uLC77//TmxsLMuWLWP8+PFMmDCBTZs2kZWVBcCiRYuoXbt2sWM5OjoClmKtPFztWq/FhAkTuPfee1m0aBG//PILL730El999RX9+/cv2icjIwMvL69yySsiItZJPZYiIlKltGjRgp07d1K3bl1CQkKKvWrUqHHZzzRv3hyAXbt2FVtvZ2dHt27dmDZtGtu2bWP//v2sXLmSxo0b4+joyMGDBy85R2BgIGDpaVy9ejV5eXmXnM/V1RV/f3/Wrl1bbP3atWtp3LjxNV9ro0aN2LhxY7F1GzZsuGS/sLAwRo8ezbJlyxgwYABz584t2paTk0NSUhIRERHXfF4REZG/U2EpIiJVyvDhw8nIyGDgwIFs2rSJpKQkli5dykMPPURBQcFlP+Pl5UWLFi1Ys2ZN0bqFCxfy1ltvER8fz4EDB/jss88oLCykQYMGuLi48NRTTzF69Gg+/fRTkpKS+P3333n77bf59NNPARgxYgSZmZncc889bN68mX379vH5558XTbHy9NNPM3XqVL7++msSEhJ49tlniY+P58knn7zma33iiSdYsmQJr7/+Ovv27eOdd94pNrLs+fPnGTFiBLGxsRw4cIC1a9eyadMmGjVqVLTPhg0bcHR0vOQWWhERkZJQYSkiIlXKxZ7AgoICevToQdOmTRk1ahTu7u7Y2Fz5v72HH36Y+fPnFy27u7vz/fff07VrVxo1asTs2bP58ssvadKkCQAvv/wy//nPf5g8eTKNGjWiV69eLFq0iODgYABq1arFypUrycrKokuXLrRs2ZKPPvqo6NbWJ554gjFjxjB27FiaNm3KkiVL+PnnnwkNDb3ma23bti0fffQRs2bNolmzZixbtowXX3yxaLutrS0nT57kgQceICwsjLvuuovevXszceLEon2+/PJL7rvvPqpXr37N5xUREfk7k9lsNhsdQkRExGjnz5+nQYMGfP3111bTe5eenk6DBg3YvHlzUUEsIiJSGuqxFBERwTLYzmeffUZ6errRUa6b/fv3895776moFBGRMlOPpYiIiIiIiJSJeixFRERERESkTFRYioiIiIiISJmosBQREREREZEyUWEpIiIiIiIiZaLCUkRERERERMpEhaWIiIiIiIiUiQpLERERERERKRMVliIiIiIiIlImKixFRERERESkTP4P8Ufb3DfVO2sAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from utils.utils import get_optimal_action\n", + "\n", + "\n", + "\n", + "# generate a list of random initial states allowing for a wide range of values\n", + "np.random.seed(0)\n", + "initial_states = np.random.rand(5, 3)\n", + "initial_states[:, 0] = initial_states[:, 0] * np.deg2rad(90) - np.deg2rad(90) # Flight path angle\n", + "initial_states[:, 1] = initial_states[:, 1] * 3.3 + 0.7 # Airspeed\n", + "initial_states[:, 2] = initial_states[:, 2] * np.deg2rad(230) - np.deg2rad(30) # Bank angle\n", + "\n", + "initial_states = [np.array([np.deg2rad(-80.), 1.2, np.deg2rad(150)])] # Example state\n", + "\n", + "#initial_states = [np.array([np.deg2rad(-80.), 1.2, np.deg2rad(150)])] # Example state\n", + "fig, ax1 = plt.subplots(figsize=(10, 5)) # Main figure\n", + "\n", + "ax2 = ax1.twinx() # Create secondary y-axis\n", + "\n", + "# Loop through each initial state\n", + "for initial_state in initial_states:\n", + " state = np.array(initial_state) # Convert list to numpy array\n", + " glider.airplane.flight_path_angle = state[0]\n", + " glider.airplane.airspeed_norm = state[1]\n", + " glider.airplane.bank_angle = state[2]\n", + "\n", + " # Storage for plotting\n", + " flight_path_angles = []\n", + " time_steps = []\n", + " cl_values = []\n", + " height_lost_values = []\n", + "\n", + " total_height_lost = 0\n", + " episode_length = 0\n", + " terminated = False\n", + "\n", + " # Run simulation\n", + " while episode_length < 150:\n", + "\n", + " if not terminated:\n", + " try:\n", + " action = get_optimal_action(state, pi)\n", + " #action[0] = 1.0\n", + " state, reward, terminated, _, _ = glider.step(action)\n", + " state = state[0]\n", + " except:\n", + " terminated = True\n", + " \n", + "\n", + " total_height_lost += reward # Update height lost\n", + " episode_length += 0.01\n", + "\n", + " # Convert to readable format\n", + " flight_path_angle = float(np.rad2deg(state[0]))\n", + " V_norm = float(state[1])\n", + " bank_angle = float(np.rad2deg(state[2]))\n", + " C_L = float(action[0]) # Extract lift coefficient\n", + "\n", + " # Store values\n", + " flight_path_angles.append(flight_path_angle)\n", + " time_steps.append(episode_length)\n", + " cl_values.append(C_L)\n", + " height_lost_values.append(float(np.rad2deg(state[2])))\n", + "\n", + " print(f\"Action: {np.round(action,3)} | Reward: {total_height_lost} | \\\n", + " State: {flight_path_angle, V_norm, bank_angle} | Terminated: {terminated} |\\\n", + " Episode Length: {episode_length} | C_L: {C_L}\")\n", + "\n", + " if terminated:\n", + " break\n", + "\n", + " # Plot the flight path angle on primary axis\n", + " ax1.plot(time_steps, flight_path_angles,label=f\"V_norm={round(initial_state[1],2)}, Bank_angle={round(np.rad2deg(initial_state[2]),1)}°\") \n", + " # Plot height lost on secondary axis\n", + " ax2.plot(time_steps, height_lost_values, linestyle=\"dashed\", alpha=0.7)\n", + "\n", + " # Select 5 evenly spaced indices for C_L annotations\n", + " num_points = 5\n", + " if len(time_steps) > num_points:\n", + " indices = np.linspace(0, len(time_steps) - 1, num_points, dtype=int)\n", + " else:\n", + " indices = range(len(time_steps)) # If fewer than 5 points exist\n", + "\n", + " # Plot markers and add annotations for C_L\n", + " for i in indices:\n", + " ax1.scatter(time_steps[i], flight_path_angles[i], color=\"black\", marker=\"x\") # Mark point\n", + " ax1.text(time_steps[i], flight_path_angles[i], f\"{cl_values[i]:.2f}\", fontsize=7, \n", + " verticalalignment='bottom', \n", + " horizontalalignment='right')\n", + "\n", + "# Graph settings\n", + "ax1.set_xlabel(\"Time (seconds)\")\n", + "ax1.set_ylabel(\"Flight Path Angle (γ) [°]\", color=\"blue\")\n", + "ax2.set_ylabel(\"Bank Angle (μ) [°])\", color=\"red\")\n", + "ax1.set_title(\"Airplane trajectories\")\n", + "ax1.legend()\n", + "ax1.grid()\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bc4b24f4", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.colors as mcolors\n", + "from utils.utils import get_optimal_action\n", + "\n", + "vel_norm = 1.2\n", + "# Example discretization\n", + "flight_path_bins = np.linspace(np.deg2rad(-100), np.deg2rad(0), 30, dtype=np.float32)\n", + "bank_bins = np.linspace(np.deg2rad(0), np.deg2rad(180), 30, dtype=np.float32)\n", + "\n", + "# Prepare a 2D array to store the policy (CL values)\n", + "policy_values = np.zeros((len(bank_bins), len(flight_path_bins))) # Transpose shape\n", + "\n", + "# Fill in the 2D array by evaluating your policy at each (γ, μ)\n", + "for i, mu_rad in enumerate(bank_bins): # μ is now columns\n", + " for j, gamma_rad in enumerate(flight_path_bins): # γ is now rows\n", + " state = np.array([gamma_rad, vel_norm, mu_rad])\n", + " action = get_optimal_action(state, pi) # Replace with your actual policy call\n", + " cl = float(action[0]) # Assuming first element of `action` is the lift coefficient\n", + " policy_values[i, j] = cl\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d76a9ff0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAHnCAYAAACrENVnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABwcElEQVR4nO3dd1RUV7QG8G9AelekKVLsBUVBEXshYo8lVuztacSGPSr23jU27CYaSSzEimI3SqxBY8OGgCigIiBYwJn7/vAxzwl1hgvD4Pdba9Zyzj333H2GBDabc8+VCIIggIiIiIhIA2mpOwAiIiIiIlUxmSUiIiIijcVkloiIiIg0FpNZIiIiItJYTGaJiIiISGMxmSUiIiIijcVkloiIiIg0FpNZIiIiItJYTGaJiIiISGMxmSUiIiIijcVkloiIiKiYuHDhAjp06AA7OztIJBIEBQXles65c+dQp04d6OnpoUKFCtixY0eBxykmJrNERERExURqaipq1aqFdevW5al/REQE2rVrh+bNmyMsLAxjx47FkCFDcOLEiQKOVDwSQRAEdQdBREREROKSSCQ4ePAgOnXqlG2fyZMn4+jRo7hz5468rWfPnkhMTERwcHAhRJl/JdQdABEREZGm+/jxI9LS0gpkbEEQIJFIFNr09PSgp6eX77FDQ0Ph5eWl0Obt7Y2xY8fme+zCwmSWiIiIKB8+fvwIJycnxMbGFsj4xsbGSElJUWibOXMmZs2ale+xY2NjYW1trdBmbW2N5ORkfPjwAQYGBvm+RkFjMktERESUD2lpaYiNjUV0dDRMTU1FHTs5ORn29vaZxhajKltcMJklIiIiEoGJiQlMTExEHTPj1iZTU1PRE2UAsLGxQVxcnEJbXFwcTE1NNaIqC3A3AyIiIqJvlqenJ06fPq3QFhISAk9PTzVFpDwms0REREQiEAShQF7KSElJQVhYGMLCwgB82XorLCwMUVFRAICpU6eiX79+8v7Dhw/H06dPMWnSJDx48ADr16/H77//jnHjxon2uRQ0LjMgIiIiEoEqyWdexlTG9evX0bx5c/l7Pz8/AED//v2xY8cOvHz5Up7YAoCTkxOOHj2KcePGYfXq1Shbtiy2bNkCb29vcSZQCLjPLBEREVE+JCcnw8zMDAkJCQVyA1jJkiWRlJRUIGtmiwNWZomIiIhEUBQqs98irpklIiIiIo3FyiwRERGRCFiZVQ9WZomIiIhIY7EyS0RERCQCVmbVg5VZIiIiItJYrMwSERERiYCVWfVgMktEREQkAiaz6sFlBkRERESksViZJSIiIhIBK7PqwcosEREREWksVmaJiIiIRMDKrHqwMktEREREGouVWSIiIiIRsDKrHqzMEhEREZHGYmWWiIiISASszKoHk1kiIiIiETCZVQ8uMyAiIiIijcXKLBEREZEIWJlVD1ZmiYiIiEhjsTJLREREJAJWZtWDlVkiIiIi0liszBIRERGJgJVZ9WBlloiIiIg0FiuzRERERCJgZVY9mMwSERERiYDJrHpwmQERERERaSxWZomIiIhEwkpq4WNlloiIiIg0FiuzRERERCLgmln1YGWWiIiIiDQWK7NEREREImBlVj1YmSUiIiIijcXKLBEREZEIWJlVD1ZmiYiIiEhjsTJLREREJAJWZtWDySwRERGRCJjMqgeXGRARERGRxmJlloiIiEgErMyqByuzRERERKSxWJklIiIiEgErs+rByiwRERERaSxWZomIiIhEwMqserAyS0REREQai5VZIiIiIhGwMqseTGaJiIiIRMBkVj24zICIiIiINBYrs0REREQiYGVWPViZJSIiIiKNxcosERERkQhYmVUPVmaJiIiISGMxmSUiIiISQUZlVuyXstatWwdHR0fo6+vDw8MDV69ezbH/qlWrULlyZRgYGMDe3h7jxo3Dx48fVf0YCh2TWSIiIqJiIjAwEH5+fpg5cyZu3ryJWrVqwdvbG/Hx8Vn237NnD6ZMmYKZM2fi/v372Lp1KwIDA/HTTz8VcuSqYzJLREREJIKiUJldsWIFhg4dioEDB6JatWrYuHEjDA0NsW3btiz7X758GQ0bNkTv3r3h6OiIVq1aoVevXrlWc4sSJrNEREREIijIZDY5OVnh9enTp0zXT0tLw40bN+Dl5SVv09LSgpeXF0JDQ7OMuUGDBrhx44Y8eX369CmOHTuGtm3bFsAnVDCYzBIREREVcfb29jAzM5O/Fi5cmKnP69evIZVKYW1trdBubW2N2NjYLMft3bs35syZg0aNGkFHRwfly5dHs2bNNGqZAbfmIiIiIhJBQW7NFR0dDVNTU3m7np6eKOOfO3cOCxYswPr16+Hh4YHHjx9jzJgxmDt3LmbMmCHKNQoak1kiIiKiIs7U1FQhmc2KpaUl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8eMxYMCAHPs4OzvjzJkzOHLkCN6+fStf4rB+/XqEhIRg586dmDJlCmxsbDI9ezjj7ryc7sjLatNhIiIiImUVlcrst0alPau0tLTQunVrtG7dOl8XL126tHypQk7ev38vv+5/45DJZAC+3I03f/58xMfHy589HBISAlNTU1SrVi1fcRIRERFR0ZSnZHbNmjUYNmwY9PX1sWbNmhz7jh49WpTAvubp6QkLCwv0798f/v7+MDAwwObNmxEREYF27doBAFq1aoVq1aqhb9++WLJkCWJjYzF9+nSMHDmSlVciIiIqcKzMqkeektmVK1fCx8cH+vr6WLlyZbb9JBJJgSSzlpaWCA4OxrRp09CiRQukp6ejevXq+PPPP1GrVi0AgLa2No4cOYIRI0bA09MTRkZG6N+/P+bMmSN6PERERET/xWRWPfKUzEZERGT578Lk7u6OEydO5NjHwcEBx44dK6SIiIiIiEjd+JxXIiIiIhGwMqseeUpm/fz88jzgihUrVA6GiIiIiEgZeUpm//nnnzwNJsZjIomIiIg0ESuz6pGnZPbs2bMFHQcRERERkdLy/ASwp0+f8rcDIiIiomxkVGbFflHO8pzMVqxYEa9evZK/79Gjh/wJW0RERERE6pDnZPa/vxkcO3YMqampogdEREREpIlYmVUPbs1FREREJALeAKYeea7MSiSSTLsVcPcCIiIiIlKnPFdmBUHAgAEDoKenBwD4+PEjhg8fDiMjI4V+Bw4cEDdCIiIiIg3BSmrhy3My279/f4X3ffr0ET0YIiIiIiJl5DmZ3b59e0HGQURERKTRuGZWPfK8ZpaIiIiIqKjhbgZEREREImBlVj1YmSUiIiIijcXKLBEREZEIWJlVDyazRERERCJgMqseXGZARERERBqLlVkiIiIiEbAyqx6szBIRERGRxmJlloiIiEgErMyqByuzRERERKSxWJklIiIiEgErs+rByiwRERERaSxWZomIiIhEwMqserAyS0REREQai5VZIiIiIhGwMqseTGaJiIiIRMBkVj24zICIiIiINBYrs0REREQiYGVWPViZJSIiIiKNxcosERERkQhYmVUPVmaJiIiISGOxMktEREQkAlZm1YOVWSIiIiLSWKzMEhEREYmAlVn1YDJLREREJAIms+rBZQZEREREpLFYmSUiIiISASuz6sHKLBERERFpLFZmiYiI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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create the plot\n", + "plt.figure(figsize=(8, 6))\n", + "plt.imshow(policy_values.T, cmap=\"gray\", origin=\"lower\",\n", + " extent=[np.rad2deg(bank_bins[0]), np.rad2deg(bank_bins[-1]), \n", + " np.rad2deg(flight_path_bins[0]), np.rad2deg(flight_path_bins[-1])], interpolation=\"nearest\")\n", + "\n", + "# ValueError: 'nearet' is not a valid value for interpolation; supported values are 'lanczos', \n", + "# 'bilinear', 'bessel', 'spline36', 'catrom', 'none', 'spline16', 'gaussian', 'hamming', 'antialiased', \n", + "# 'hermite', 'mitchell', 'blackman', 'quadric', 'hanning', 'sinc', 'kaiser', 'bicubic', 'nearest'\n", + "\n", + "\n", + "# Add labels and colorbar\n", + "plt.xlabel(\"Bank Angle μ (degrees)\") # Now X-axis\n", + "plt.ylabel(\"Flight Path Angle γ (degrees)\") # Now Y-axis\n", + "plt.colorbar(label=\"Lift Coefficient (C_L)\")\n", + "plt.title(f\"Policy Visualization V/Vs={vel_norm}\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81f11551", + "metadata": {}, + "outputs": [], + "source": [ + "state = np.array([np.deg2rad(-80.), 1.2, np.deg2rad(150)]) # Example state\n", + "get_optimal_action(state, pi)[0] # Replace with your actual policy call" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3dd56bb", + "metadata": {}, + "outputs": [], + "source": [ + "# Normalize the policy values (0 to 1) for grayscale plotting\n", + "vmin, vmax = policy_values.min(), policy_values.max()\n", + "norm_values = (policy_values - vmin) / (vmax - vmin + 1e-8)\n", + "\n", + "# Create a mesh for plotting\n", + "X, Y = np.meshgrid(bank_angles, flight_path_angles)\n", + "\n", + "# Plot using pcolormesh (grayscale)\n", + "fig, ax = plt.subplots(figsize=(6, 4))\n", + "c = ax.pcolormesh(X, Y, norm_values, cmap='gray', shading='auto', norm=mcolors.Normalize(vmin=0, vmax=1))\n", + "\n", + "# Labels and title\n", + "ax.set_xlabel(\"Bank Angle (deg)\")\n", + "ax.set_ylabel(\"Flight Path Angle (deg)\")\n", + "ax.set_title(\"Optimal Policy (CL)\")\n", + "\n", + "# Optional: colorbar\n", + "plt.colorbar(c, ax=ax, label=\"Normalized CL\")\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8323f6d", + "metadata": {}, + "outputs": [], + "source": [ + "-192769.51 + -125086.89" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e954bd11", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from utils.utils import get_optimal_action\n", + "\n", + "# initial state\n", + "state = np.array([np.deg2rad(-60), 1.2, np.deg2rad(30)])\n", + "glider.airplane.flight_path_angle = state[0]\n", + "glider.airplane.airspeed_norm = state[1]\n", + "glider.airplane.bank_angle = state[2]\n", + "\n", + "total_height_lost = 0\n", + "episode_length = 0\n", + "terminated = False\n", + "\n", + "time_history = []\n", + "height_lost_history = []\n", + "\n", + "while episode_length < 20:\n", + " action = get_optimal_action(state, pi)\n", + " prev_state = state.copy()\n", + " state, reward, terminated, _, _ = glider.step(action)\n", + " state = state[0] \n", + " total_height_lost += reward\n", + " episode_length += 0.01\n", + "\n", + " time_history.append(episode_length) # for plotting!\n", + " height_lost_history.append(total_height_lost)\n", + "\n", + " #print(f\"Action: {np.round(action,3)} | Lost Height: {total_height_lost:.3f} | State: {state} | Terminated: {terminated} | Time: {episode_length:.2f}\")\n", + " if terminated:\n", + " break\n", + "\n", + "# Plotting the results\n", + "plt.figure(figsize=(10, 6))\n", + "plt.plot(time_history, height_lost_history, label=\"Height Lost\")\n", + "plt.xlabel(\"Time (s)\")\n", + "plt.ylabel(\"Height Lost (m)\")\n", + "plt.title(\"Height Lost Over Time\")\n", + "plt.legend()\n", + "plt.grid(True)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cd13daf", + "metadata": {}, + "outputs": [], + "source": [ + "STALL_AIRSPEED = 27.331231856346\n", + "from utils.utils import get_optimal_action\n", + "from tqdm import tqdm\n", + "with open(glider.__class__.__name__ + \".pkl\", \"rb\") as f:\n", + " pi: PolicyIteration = pickle.load(f)\n", + "\n", + "prom_episode_lenght = 0\n", + "dict_result = {}\n", + "dict_episode_length = {}\n", + "state_spaces = [v for v in pi.states_space if v[0] > -np.pi/2]\n", + "for state in tqdm(state_spaces):\n", + " initial_state = state.copy()\n", + " prev_state = state.copy()\n", + " glider.reset()\n", + " glider.airplane.flight_path_angle = state[0]\n", + " glider.airplane.airspeed_norm = state[1]\n", + " glider.airplane.bank_angle = state[2]\n", + " done = False\n", + " episode_length = 0\n", + " total_reward = 0\n", + " while not done:\n", + " action = get_optimal_action(state, pi)\n", + " prev_state = state.copy()\n", + " state, reward, done, _, _ = glider.step(action)\n", + " done = bool(done)\n", + " if done:\n", + " break\n", + " state = state[0]\n", + " # check if our state is in the state space\n", + " index = pi.triangulation.find_simplex(state)\n", + " if not done:\n", + " total_reward -= reward#*STALL_AIRSPEED\n", + " if (index ==-1) or episode_length > 70: \n", + " done = True\n", + " episode_length += 1\n", + " \n", + " dict_result[tuple(initial_state)] = total_reward\n", + " dict_episode_length[tuple(initial_state)] = episode_length\n", + " prom_episode_lenght += episode_length / len(pi.states_space)\n", + " #print(f\"Initial state: {initial_state} - Total reward: {total_reward}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab055601", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "epsilon = 1*1e-1\n", + "#dict_result = dict_episode_length\n", + "# Your dictionary with keys as coordinates (x, y) and values as the color intensity (z)\n", + "# Extracting the x, y and z values\n", + "x = [np.degrees(coord[0]) for coord in dict_result.keys() if 0.05 >= coord[0] >= -np.pi/2 - epsilon and coord[1] > 0.7]\n", + "#convert x to grad\n", + "y = [coord[1] for coord in dict_result.keys() if 0.05 >= coord[0] >= -np.pi/2 - epsilon and coord[1] > 0.7]\n", + "#convert y to Vs\n", + "keys_list = list(dict_result.keys())\n", + "values_list = list(dict_result.values())\n", + "z = [v for e,v in zip(keys_list, values_list) if 0.05 >= e[0] >= -np.pi/2 - epsilon and e[1] > 0.7]\n", + "\n", + "# Creating a 2D scatter plot\n", + "cmap = plt.get_cmap('viridis', 2048)\n", + "plt.tricontourf(y, x, z, cmap=cmap, levels=18) # Change 'viridis' to any other colormap you like\n", + "plt.colorbar(label='', shrink=0.8, ) # Add color bar for the z values\n", + "\n", + "# Add labels and a title\n", + "plt.ylabel('Flight Path Angle (γ) [deg]')\n", + "plt.xlabel('V/Vs')\n", + "\n", + "x_min, x_max = min(x), max(x)\n", + "y_min, y_max = min(y), max(y)\n", + "\n", + "# Set the minor ticks for the grid, keeping the dense grid with smaller squares\n", + "ax = plt.gca() # Get current axes\n", + "ax.set_yticks(np.linspace(x_min, x_max, 60), minor=True) # 20 minor ticks for grid\n", + "ax.set_xticks(np.linspace(y_min, y_max, 60), minor=True) # 20 minor ticks for grid\n", + "# put line x = 1\n", + "plt.axvline(x=1, color='r', linestyle='--', linewidth=0.5)\n", + "# put line y = 0\n", + "#plt.axhline(y=0, color='k', linestyle='--')\n", + "\n", + "# Show the plot\n", + "vals = np.round(np.linspace(-90, 0,6))\n", + "plt.yticks(vals) # Only 5 labels on x-axis\n", + "plt.xticks(np.linspace(round(y_min), round(y_max), 6)) # Only 5 labels on y-axis\n", + "# Enable the minor grid lines\n", + "ax.grid(which='minor', color='gray', linestyle='-', linewidth=0.5)\n", + "\n", + "# Habilitar la cuadrícula en las marcas menores\n", + "ax.grid(which='minor', color='gray', linestyle='-', linewidth=0.5)\n", + "\n", + "# Guardar la imagen sin borde blanco\n", + "plt.savefig('output.png', bbox_inches='tight')\n", + "\n", + "# set size of the plot\n", + "plt.gcf().set_size_inches(9, 5)\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8416867", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.interpolate import griddata\n", + "\n", + "# Your dictionary with keys as coordinates (x, y) and values as the color intensity (z)\n", + "# Extracting the x, y and z values\n", + "x = [np.degrees(coord[0]) for coord in dict_result.keys() if 5 >= coord[0] >= -np.pi/2 and coord[1] > 0.7]\n", + "y = [coord[1] for coord in dict_result.keys() if 5 >= coord[0] >= -np.pi/2 and coord[1] > 0.7]\n", + "keys_list = list(dict_result.keys())\n", + "values_list = list(dict_result.values())\n", + "z = [v for e,v in zip(keys_list, values_list) if 5 >= e[0] >= -np.pi/2 and e[1] > 0.7]\n", + "\n", + "# Create a grid for interpolation\n", + "x_grid = np.linspace(min(x), max(x), 100)\n", + "y_grid = np.linspace(min(y), max(y), 100)\n", + "X, Y = np.meshgrid(x_grid, y_grid)\n", + "\n", + "# Interpolate the scattered data into the grid\n", + "Z = griddata((y, x), z, (Y, X), method='linear')\n", + "\n", + "# Create the scatter plot\n", + "cmap = plt.get_cmap('viridis', 2048)\n", + "plt.scatter(y, x, c=z, cmap=cmap)\n", + "\n", + "# Add color bar\n", + "plt.colorbar(label='', shrink=0.8)\n", + "contour_levels = np.linspace(np.min(z), np.max(z), 10) # 10 levels\n", + "contour_levels = contour_levels[contour_levels != 0] # Remove zero from levels\n", + "\n", + "# Add contour lines on top of the scatter plot\n", + "contour = plt.contour(Y, X, Z, levels=contour_levels, colors='black', linewidths=0.75)\n", + "plt.clabel(contour, inline=True, fontsize=8) # Optional: add labels to the contours\n", + "\n", + "# Add labels and a title\n", + "plt.ylabel('Flight Path Angle (γ) [deg]')\n", + "plt.xlabel('V/Vs')\n", + "\n", + "# Plot vertical line at x=1\n", + "plt.axvline(x=1, color='k', linestyle='--')\n", + "\n", + "# Configure the minor ticks and grid\n", + "x_min, x_max = min(x), max(x)\n", + "y_min, y_max = min(y), max(y)\n", + "ax = plt.gca() # Get current axes\n", + "ax.set_yticks(np.linspace(x_min, x_max, 60), minor=True)\n", + "ax.set_xticks(np.linspace(y_min, y_max, 60), minor=True)\n", + "plt.yticks(np.linspace(x_min, x_max, 6)) # Major ticks on y-axis\n", + "plt.xticks(np.linspace(y_min, y_max, 4)) # Major ticks on x-axis\n", + "\n", + "# Set size of the plot\n", + "plt.gcf().set_size_inches(9, 5)\n", + "\n", + "# Enable the minor grid lines\n", + "ax.grid(which='minor', color='white', linestyle='-', linewidth=0.25)\n", + "\n", + "# Habilitar la cuadrícula en las marcas menores\n", + "ax.grid(which='minor', color='white', linestyle='-', linewidth=0.25)\n", + "\n", + "# Save the image\n", + "plt.savefig('output_with_contours.png', bbox_inches='tight')\n", + "\n", + "# Show the plot\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "204e0318", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "3c8fe4a4", @@ -172,7 +1403,7 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "DynamicProgramming", "language": "python", "name": "python3" },