From 6e4680ff1c4a132ebd0cd4c588699e0e4c467eab Mon Sep 17 00:00:00 2001 From: hagrid67 <jdhwatson@gmail.com> Date: Wed, 8 Jul 2020 22:48:14 +0100 Subject: [PATCH] adding test_eval_timeout.py --- tests/test_eval_timeout.py | 159 +++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 tests/test_eval_timeout.py diff --git a/tests/test_eval_timeout.py b/tests/test_eval_timeout.py new file mode 100644 index 00000000..564e8301 --- /dev/null +++ b/tests/test_eval_timeout.py @@ -0,0 +1,159 @@ +from flatland.evaluators.client import FlatlandRemoteClient +from flatland.core.env_observation_builder import DummyObservationBuilder +#from my_observation_builder import CustomObservationBuilder +import numpy as np +import time + + + +from flatland.core.env import Environment +from flatland.core.env_observation_builder import ObservationBuilder +from flatland.core.env_prediction_builder import PredictionBuilder +from flatland.envs.agent_utils import RailAgentStatus, EnvAgent + + +class CustomObservationBuilder(ObservationBuilder): + + def __init__(self): + super(CustomObservationBuilder, self).__init__() + + def set_env(self, env: Environment): + super().set_env(env) + # Note : + # The instantiations which depend on parameters of the Env object should be + # done here, as it is only here that the updated self.env instance is available + self.rail_obs = np.zeros((self.env.height, self.env.width)) + + def reset(self): + """ + Called internally on every env.reset() call, + to reset any observation specific variables that are being used + """ + self.rail_obs[:] = 0 + for _x in range(self.env.width): + for _y in range(self.env.height): + # Get the transition map value at location _x, _y + transition_value = self.env.rail.get_full_transitions(_y, _x) + self.rail_obs[_y, _x] = transition_value + + def get(self, handle: int = 0): + + agent = self.env.agents[handle] + + + status = agent.status + position = agent.position + direction = agent.direction + initial_position = agent.initial_position + target = agent.target + + + return self.rail_obs, (status, position, direction, initial_position, target) + +remote_client = FlatlandRemoteClient(verbose=False) + +def my_controller(obs, number_of_agents): + _action = {} + for _idx in range(number_of_agents): + _action[_idx] = np.random.randint(0, 5) + return _action + +my_observation_builder = CustomObservationBuilder() + +evaluation_number = 0 + +step_delay_rate = 0.001 +step_delay = 6 + +reset_delay_rate = 0.2 +reset_delay = 10 + + +while True: + + evaluation_number += 1 + # Switch to a new evaluation environemnt + # + # a remote_client.env_create is similar to instantiating a + # RailEnv and then doing a env.reset() + # hence it returns the first observation from the + # env.reset() + # + # You can also pass your custom observation_builder object + # to allow you to have as much control as you wish + # over the observation of your choice. + time_start = time.time() + observation, info = remote_client.env_create( + obs_builder_object=my_observation_builder + ) + env_creation_time = time.time() - time_start + if not observation: + # + # If the remote_client returns False on a `env_create` call, + # then it basically means that your agent has already been + # evaluated on all the required evaluation environments, + # and hence its safe to break out of the main evaluation loop + break + + print("Evaluation Number : {}".format(evaluation_number)) + + if np.random.uniform() < reset_delay_rate: + print(f"eval {evaluation_number} sleeping for {reset_delay} seconds") + time.sleep(reset_delay) + + local_env = remote_client.env + number_of_agents = len(local_env.agents) + + time_taken_by_controller = [] + time_taken_per_step = [] + steps = 0 + + + + while True: + time_start = time.time() + action = my_controller(observation, number_of_agents) + time_taken = time.time() - time_start + time_taken_by_controller.append(time_taken) + + time_start = time.time() + + try: + observation, all_rewards, done, info = remote_client.env_step(action) + except StopAsyncIteration as err: + print("timeout error ", err) + break + + steps += 1 + time_taken = time.time() - time_start + time_taken_per_step.append(time_taken) + + if np.random.uniform() < step_delay_rate: + print(f"step {steps} sleeping for {step_delay} seconds") + time.sleep(step_delay) + + if done['__all__']: + print("Reward : ", sum(list(all_rewards.values()))) + break + + np_time_taken_by_controller = np.array(time_taken_by_controller) + np_time_taken_per_step = np.array(time_taken_per_step) + print("="*100) + print("="*100) + print("Evaluation Number : ", evaluation_number) + print("Current Env Path : ", remote_client.current_env_path) + print("Env Creation Time : ", env_creation_time) + print("Number of Steps : ", steps) + print("Mean/Std of Time taken by Controller : ", np_time_taken_by_controller.mean(), np_time_taken_by_controller.std()) + print("Mean/Std of Time per Step : ", np_time_taken_per_step.mean(), np_time_taken_per_step.std()) + print("="*100) + +print("Evaluation of all environments complete...") +######################################################################## +# Submit your Results +# +# Please do not forget to include this call, as this triggers the +# final computation of the score statistics, video generation, etc +# and is necesaary to have your submission marked as successfully evaluated +######################################################################## +print(remote_client.submit()) -- GitLab