diff --git a/examples/complex_rail_benchmark.py b/examples/complex_rail_benchmark.py index 624ad6697a017ef883e6c81fc0361b31ae62a06c..a8d5a78d03a3003c6e095ea5c0662c7777ff38e0 100644 --- a/examples/complex_rail_benchmark.py +++ b/examples/complex_rail_benchmark.py @@ -3,9 +3,9 @@ import random import numpy as np -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer def run_benchmark(): diff --git a/examples/custom_observation_example.py b/examples/custom_observation_example.py index 401ff94a3b604ce366b55f2e0a55b61c2d81b536..4f3a18e52586662e69557adf3c986e518332c04d 100644 --- a/examples/custom_observation_example.py +++ b/examples/custom_observation_example.py @@ -5,11 +5,11 @@ import numpy as np from flatland.core.env_observation_builder import ObservationBuilder from flatland.core.grid.grid_utils import coordinate_to_position -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import random_rail_generator, complex_rail_generator from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.predictions import ShortestPathPredictorForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import random_rail_generator, complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer from flatland.utils.rendertools import RenderTool random.seed(100) diff --git a/examples/custom_railmap_example.py b/examples/custom_railmap_example.py index f6bd2bda9d4c0b8ebf0658759efa367ceeb0a098..f3350d697fa76849e5cfc07164825e4675dc5380 100644 --- a/examples/custom_railmap_example.py +++ b/examples/custom_railmap_example.py @@ -5,9 +5,9 @@ import numpy as np from flatland.core.grid.rail_env_grid import RailEnvTransitions from flatland.core.transition_map import GridTransitionMap -from flatland.envs.agent_generators import AgentGenerator, AgentGeneratorProduct -from flatland.envs.generators import RailGenerator, RailGeneratorProduct from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import RailGenerator, RailGeneratorProduct +from flatland.envs.schedule_generators import ScheduleGenerator, ScheduleGeneratorProduct from flatland.utils.rendertools import RenderTool random.seed(100) @@ -29,8 +29,8 @@ def custom_rail_generator() -> RailGenerator: return generator -def custom_agent_generator() -> AgentGenerator: - def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> AgentGeneratorProduct: +def custom_agent_generator() -> ScheduleGenerator: + def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> ScheduleGeneratorProduct: agents_positions = [] agents_direction = [] agents_target = [] diff --git a/examples/debugging_example_DELETE.py b/examples/debugging_example_DELETE.py index 68fdc8ab5ec3c7a56ae023fdd134916764b6224d..c4eae5f42e323dc6fe39d265968461aa59fcab81 100644 --- a/examples/debugging_example_DELETE.py +++ b/examples/debugging_example_DELETE.py @@ -3,10 +3,10 @@ import time import numpy as np -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer from flatland.utils.rendertools import RenderTool random.seed(1) diff --git a/examples/simple_example_1.py b/examples/simple_example_1.py index 7956c34fd4a5b94859a4b64441450afe2114133c..fbadbd657c36fa1dadf0bca65cff3e9cccd269ea 100644 --- a/examples/simple_example_1.py +++ b/examples/simple_example_1.py @@ -1,5 +1,5 @@ -from flatland.envs.generators import rail_from_manual_specifications_generator from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import rail_from_manual_specifications_generator from flatland.utils.rendertools import RenderTool # Example generate a rail given a manual specification, diff --git a/examples/simple_example_2.py b/examples/simple_example_2.py index 994c7deda1569b77d4adac8a17fa9ebe14b27ef6..6db9ba5abbd0999ef3896e733516ed6b3e498bae 100644 --- a/examples/simple_example_2.py +++ b/examples/simple_example_2.py @@ -2,8 +2,8 @@ import random import numpy as np -from flatland.envs.generators import random_rail_generator from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import random_rail_generator from flatland.utils.rendertools import RenderTool random.seed(100) diff --git a/examples/simple_example_3.py b/examples/simple_example_3.py index 1e20fcca7d799f52e48ae1511f6ffa3c55289355..66c44ed15a61a6e17d9e53ffe365396b26ca3b9b 100644 --- a/examples/simple_example_3.py +++ b/examples/simple_example_3.py @@ -2,10 +2,10 @@ import random import numpy as np -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer from flatland.utils.rendertools import RenderTool random.seed(1) diff --git a/examples/training_example.py b/examples/training_example.py index f339d32958423b90f6ed2c8b6e079737eeb919fe..3c1cddd03337e63b234f83cc98aca4993cd26de8 100644 --- a/examples/training_example.py +++ b/examples/training_example.py @@ -1,10 +1,10 @@ import numpy as np -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.observations import TreeObsForRailEnv, LocalObsForRailEnv from flatland.envs.predictions import ShortestPathPredictorForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer from flatland.utils.rendertools import RenderTool np.random.seed(1) diff --git a/flatland/cli.py b/flatland/cli.py index 56b2feab0bb46472b5dff916ac74f6760080ebe3..b2509287185a1582573a6eba347ef7d6ec27f10f 100644 --- a/flatland/cli.py +++ b/flatland/cli.py @@ -8,9 +8,9 @@ import click import numpy as np import redis -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer from flatland.evaluators.service import FlatlandRemoteEvaluationService from flatland.utils.rendertools import RenderTool diff --git a/flatland/envs/rail_env.py b/flatland/envs/rail_env.py index 27664403b40ac358009218b94a16a31c97d187ed..322bbf096dd1e88e7edab808624c861c6cb408d0 100644 --- a/flatland/envs/rail_env.py +++ b/flatland/envs/rail_env.py @@ -11,10 +11,10 @@ import numpy as np from flatland.core.env import Environment from flatland.core.grid.grid4_utils import get_new_position -from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail, AgentGenerator from flatland.envs.agent_utils import EnvAgentStatic, EnvAgent -from flatland.envs.generators import random_rail_generator, RailGenerator from flatland.envs.observations import TreeObsForRailEnv +from flatland.envs.rail_generators import random_rail_generator, RailGenerator +from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail, ScheduleGenerator m.patch() @@ -93,7 +93,7 @@ class RailEnv(Environment): width, height, rail_generator: RailGenerator = random_rail_generator(), - agent_generator: AgentGenerator = get_rnd_agents_pos_tgt_dir_on_rail(), + agent_generator: ScheduleGenerator = get_rnd_agents_pos_tgt_dir_on_rail(), number_of_agents=1, obs_builder_object=TreeObsForRailEnv(max_depth=2), max_episode_steps=None, @@ -110,11 +110,11 @@ class RailEnv(Environment): the env has been reset, and returns a GridTransitionMap object and a list of starting positions, targets, and initial orientations for agent handle. The rail_generator can pass a distance map in the hints or information for specific agent_generators. - Implementations can be found in flatland/envs/generators.py + Implementations can be found in flatland/envs/rail_generators.py agent_generator : function The agent_generator function is a function that takes the grid, the number of agents and optional hints and returns a list of starting positions, targets, initial orientations and speed for all agent handles. - Implementations can be found in flatland/envs/agent_generators.py + Implementations can be found in flatland/envs/schedule_generators.py width : int The width of the rail map. Potentially in the future, a range of widths to sample from. @@ -133,7 +133,7 @@ class RailEnv(Environment): """ self.rail_generator: RailGenerator = rail_generator - self.agent_generator: AgentGenerator = agent_generator + self.agent_generator: ScheduleGenerator = agent_generator self.rail = None self.width = width self.height = height diff --git a/flatland/envs/generators.py b/flatland/envs/rail_generators.py similarity index 100% rename from flatland/envs/generators.py rename to flatland/envs/rail_generators.py diff --git a/flatland/envs/agent_generators.py b/flatland/envs/schedule_generators.py similarity index 93% rename from flatland/envs/agent_generators.py rename to flatland/envs/schedule_generators.py index c03511bc186bb41554eecb8c1c62b73482012ed0..50f313781acdd6e70f71ef5f82d6ddb0b8c2181d 100644 --- a/flatland/envs/agent_generators.py +++ b/flatland/envs/schedule_generators.py @@ -1,4 +1,4 @@ -"""Agent generators (railway undertaking, "EVU").""" +"""Schedule generators (railway undertaking, "EVU").""" from typing import Tuple, List, Callable, Mapping, Optional, Any import msgpack @@ -9,8 +9,8 @@ from flatland.core.transition_map import GridTransitionMap from flatland.envs.agent_utils import EnvAgentStatic AgentPosition = Tuple[int, int] -AgentGeneratorProduct = Tuple[List[AgentPosition], List[AgentPosition], List[AgentPosition], List[float]] -AgentGenerator = Callable[[GridTransitionMap, int, Optional[Any]], AgentGeneratorProduct] +ScheduleGeneratorProduct = Tuple[List[AgentPosition], List[AgentPosition], List[AgentPosition], List[float]] +ScheduleGenerator = Callable[[GridTransitionMap, int, Optional[Any]], ScheduleGeneratorProduct] def speed_initialization_helper(nb_agents: int, speed_ratio_map: Mapping[float, float] = None) -> List[float]: @@ -37,7 +37,7 @@ def speed_initialization_helper(nb_agents: int, speed_ratio_map: Mapping[float, return list(map(lambda index: speeds[index], np.random.choice(nb_classes, nb_agents, p=speed_ratios))) -def complex_rail_generator_agents_placer(speed_ratio_map: Mapping[float, float] = None) -> AgentGenerator: +def complex_rail_generator_agents_placer(speed_ratio_map: Mapping[float, float] = None) -> ScheduleGenerator: def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None): start_goal = hints['start_goal'] start_dir = hints['start_dir'] @@ -55,7 +55,7 @@ def complex_rail_generator_agents_placer(speed_ratio_map: Mapping[float, float] return generator -def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] = None) -> AgentGenerator: +def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] = None) -> ScheduleGenerator: """ Given a `rail' GridTransitionMap, return a random placement of agents (initial position, direction and target). @@ -73,7 +73,7 @@ def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] = initial positions, directions, targets speeds """ - def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> AgentGeneratorProduct: + def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> ScheduleGeneratorProduct: def _path_exists(rail, start, direction, end): # BFS - Check if a path exists between the 2 nodes @@ -151,7 +151,7 @@ def get_rnd_agents_pos_tgt_dir_on_rail(speed_ratio_map: Mapping[float, float] = return generator -def agents_from_file(filename) -> AgentGenerator: +def agents_from_file(filename) -> ScheduleGenerator: """ Utility to load pickle file @@ -165,7 +165,7 @@ def agents_from_file(filename) -> AgentGenerator: initial positions, directions, targets speeds """ - def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> AgentGeneratorProduct: + def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None) -> ScheduleGeneratorProduct: with open(filename, "rb") as file_in: load_data = file_in.read() data = msgpack.unpackb(load_data, use_list=False) diff --git a/flatland/evaluators/client.py b/flatland/evaluators/client.py index a4968c0c8e827c060e0e3f7de0cf28cc0658089b..f2dac1c8705a651e2a7be026b4bd82a961efbbdd 100644 --- a/flatland/evaluators/client.py +++ b/flatland/evaluators/client.py @@ -1,18 +1,21 @@ -import redis +import hashlib import json +import logging import os -import numpy as np +import random +import time + import msgpack import msgpack_numpy as m -import hashlib -import random -from flatland.evaluators import messages -from flatland.envs.rail_env import RailEnv -from flatland.envs.generators import rail_from_file +import numpy as np +import redis + from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.predictions import ShortestPathPredictorForRailEnv -import time -import logging +from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import rail_from_file +from flatland.evaluators import messages + logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) m.patch() @@ -22,8 +25,8 @@ def are_dicts_equal(d1, d2): """ return True if all keys and values are the same """ return all(k in d2 and d1[k] == d2[k] for k in d1) \ - and all(k in d1 and d1[k] == d2[k] - for k in d2) + and all(k in d1 and d1[k] == d2[k] + for k in d2) class FlatlandRemoteClient(object): @@ -41,39 +44,40 @@ class FlatlandRemoteClient(object): where `service_id` is either provided as an `env` variable or is instantiated to "flatland_rl_redis_service_id" """ - def __init__(self, - remote_host='127.0.0.1', - remote_port=6379, - remote_db=0, - remote_password=None, - test_envs_root=None, - verbose=False): + + def __init__(self, + remote_host='127.0.0.1', + remote_port=6379, + remote_db=0, + remote_password=None, + test_envs_root=None, + verbose=False): self.remote_host = remote_host self.remote_port = remote_port self.remote_db = remote_db self.remote_password = remote_password self.redis_pool = redis.ConnectionPool( - host=remote_host, - port=remote_port, - db=remote_db, - password=remote_password) + host=remote_host, + port=remote_port, + db=remote_db, + password=remote_password) self.namespace = "flatland-rl" self.service_id = os.getenv( - 'FLATLAND_RL_SERVICE_ID', - 'FLATLAND_RL_SERVICE_ID' - ) + 'FLATLAND_RL_SERVICE_ID', + 'FLATLAND_RL_SERVICE_ID' + ) self.command_channel = "{}::{}::commands".format( - self.namespace, - self.service_id - ) + self.namespace, + self.service_id + ) if test_envs_root: self.test_envs_root = test_envs_root else: self.test_envs_root = os.getenv( - 'AICROWD_TESTS_FOLDER', - '/tmp/flatland_envs' - ) + 'AICROWD_TESTS_FOLDER', + '/tmp/flatland_envs' + ) self.verbose = verbose @@ -85,12 +89,12 @@ class FlatlandRemoteClient(object): def _generate_response_channel(self): random_hash = hashlib.md5( - "{}".format( - random.randint(0, 10**10) - ).encode('utf-8')).hexdigest() + "{}".format( + random.randint(0, 10 ** 10) + ).encode('utf-8')).hexdigest() response_channel = "{}::{}::response::{}".format(self.namespace, - self.service_id, - random_hash) + self.service_id, + random_hash) return response_channel def _blocking_request(self, _request): @@ -124,9 +128,9 @@ class FlatlandRemoteClient(object): if self.verbose: print("Response : ", _response) _response = msgpack.unpackb( - _response, - object_hook=m.decode, - encoding="utf8") + _response, + object_hook=m.decode, + encoding="utf8") if _response['type'] == messages.FLATLAND_RL.ERROR: raise Exception(str(_response["payload"])) else: @@ -181,7 +185,7 @@ class FlatlandRemoteClient(object): "Did you remember to set the AICROWD_TESTS_FOLDER environment variable " "to point to the location of the Tests folder ? \n" "We are currently looking at `{}` for the tests".format(self.test_envs_root) - ) + ) print("Current env path : ", test_env_file_path) self.env = RailEnv( width=1, @@ -207,7 +211,7 @@ class FlatlandRemoteClient(object): _request['payload']['action'] = action _response = self._blocking_request(_request) _payload = _response['payload'] - + # remote_observation = _payload['observation'] remote_reward = _payload['reward'] remote_done = _payload['done'] @@ -216,14 +220,14 @@ class FlatlandRemoteClient(object): # Replicate the action in the local env local_observation, local_reward, local_done, local_info = \ self.env.step(action) - + print(local_reward) if not are_dicts_equal(remote_reward, local_reward): raise Exception("local and remote `reward` are diverging") print(remote_reward, local_reward) if not are_dicts_equal(remote_done, local_done): raise Exception("local and remote `done` are diverging") - + # Return local_observation instead of remote_observation # as the remote_observation is build using a dummy observation # builder @@ -250,21 +254,23 @@ class FlatlandRemoteClient(object): if __name__ == "__main__": remote_client = FlatlandRemoteClient() + def my_controller(obs, _env): _action = {} for _idx, _ in enumerate(_env.agents): _action[_idx] = np.random.randint(0, 5) return _action - + + my_observation_builder = TreeObsForRailEnv(max_depth=3, - predictor=ShortestPathPredictorForRailEnv()) + predictor=ShortestPathPredictorForRailEnv()) episode = 0 obs = True - while obs: + while obs: obs = remote_client.env_create( - obs_builder_object=my_observation_builder - ) + obs_builder_object=my_observation_builder + ) if not obs: """ The remote env returns False as the first obs @@ -285,7 +291,5 @@ if __name__ == "__main__": print("Reward : ", sum(list(all_rewards.values()))) break - print("Evaluation Complete...") + print("Evaluation Complete...") print(remote_client.submit()) - - diff --git a/flatland/evaluators/service.py b/flatland/evaluators/service.py index 3ad0a97598c8beb66fc164eb45b670c87f3c96f9..8967b52d9d6ee70a7eb8af257ef6b4e25b531314 100644 --- a/flatland/evaluators/service.py +++ b/flatland/evaluators/service.py @@ -1,24 +1,26 @@ #!/usr/bin/env python from __future__ import print_function -import redis -from flatland.envs.generators import rail_from_file -from flatland.envs.rail_env import RailEnv -from flatland.core.env_observation_builder import DummyObservationBuilder -from flatland.evaluators import messages -from flatland.evaluators import aicrowd_helpers -from flatland.utils.rendertools import RenderTool -import numpy as np -import msgpack -import msgpack_numpy as m -import os + import glob +import os +import random import shutil import time import traceback + import crowdai_api +import msgpack +import msgpack_numpy as m +import numpy as np +import redis import timeout_decorator -import random +from flatland.core.env_observation_builder import DummyObservationBuilder +from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import rail_from_file +from flatland.evaluators import aicrowd_helpers +from flatland.evaluators import messages +from flatland.utils.rendertools import RenderTool use_signals_in_timeout = True if os.name == 'nt': @@ -35,7 +37,7 @@ m.patch() ######################################################## # CONSTANTS ######################################################## -PER_STEP_TIMEOUT = 10*60 # 5 minutes +PER_STEP_TIMEOUT = 10 * 60 # 5 minutes class FlatlandRemoteEvaluationService: @@ -59,17 +61,18 @@ class FlatlandRemoteEvaluationService: unpacked with `msgpack` (a patched version of msgpack which also supports numpy arrays). """ + def __init__(self, - test_env_folder="/tmp", - flatland_rl_service_id='FLATLAND_RL_SERVICE_ID', - remote_host='127.0.0.1', - remote_port=6379, - remote_db=0, - remote_password=None, - visualize=False, - video_generation_envs=[], - report=None, - verbose=False): + test_env_folder="/tmp", + flatland_rl_service_id='FLATLAND_RL_SERVICE_ID', + remote_host='127.0.0.1', + remote_port=6379, + remote_db=0, + remote_password=None, + visualize=False, + video_generation_envs=[], + report=None, + verbose=False): # Test Env folder Paths self.test_env_folder = test_env_folder @@ -83,15 +86,15 @@ class FlatlandRemoteEvaluationService: # Logging and Reporting related vars self.verbose = verbose self.report = report - + # Communication Protocol Related vars self.namespace = "flatland-rl" self.service_id = flatland_rl_service_id self.command_channel = "{}::{}::commands".format( - self.namespace, - self.service_id - ) - + self.namespace, + self.service_id + ) + # Message Broker related vars self.remote_host = remote_host self.remote_port = remote_port @@ -114,7 +117,7 @@ class FlatlandRemoteEvaluationService: "normalized_reward": 0.0 } } - + # RailEnv specific variables self.env = False self.env_renderer = False @@ -156,7 +159,7 @@ class FlatlandRemoteEvaluationService:   ├── .......   ├── ....... └── Level_99.pkl - """ + """ env_paths = sorted(glob.glob( os.path.join( self.test_env_folder, @@ -179,16 +182,16 @@ class FlatlandRemoteEvaluationService: """ if self.verbose or self.report: print("Attempting to connect to redis server at {}:{}/{}".format( - self.remote_host, - self.remote_port, - self.remote_db)) + self.remote_host, + self.remote_port, + self.remote_db)) self.redis_pool = redis.ConnectionPool( - host=self.remote_host, - port=self.remote_port, - db=self.remote_db, - password=self.remote_password - ) + host=self.remote_host, + port=self.remote_port, + db=self.remote_db, + password=self.remote_password + ) def get_redis_connection(self): """ @@ -200,13 +203,13 @@ class FlatlandRemoteEvaluationService: redis_conn.ping() except Exception as e: raise Exception( - "Unable to connect to redis server at {}:{} ." - "Are you sure there is a redis-server running at the " - "specified location ?".format( - self.remote_host, - self.remote_port - ) - ) + "Unable to connect to redis server at {}:{} ." + "Are you sure there is a redis-server running at the " + "specified location ?".format( + self.remote_host, + self.remote_port + ) + ) return redis_conn def _error_template(self, payload): @@ -220,8 +223,8 @@ class FlatlandRemoteEvaluationService: return _response @timeout_decorator.timeout( - PER_STEP_TIMEOUT, - use_signals=use_signals_in_timeout) # timeout for each command + PER_STEP_TIMEOUT, + use_signals=use_signals_in_timeout) # timeout for each command def _get_next_command(self, _redis): """ A low level wrapper for obtaining the next command from a @@ -231,7 +234,7 @@ class FlatlandRemoteEvaluationService: """ command = _redis.brpop(self.command_channel)[1] return command - + def get_next_command(self): """ A helper function to obtain the next command, which transparently @@ -246,18 +249,18 @@ class FlatlandRemoteEvaluationService: print("Command Service: ", command) except timeout_decorator.timeout_decorator.TimeoutError: raise Exception( - "Timeout in step {} of simulation {}".format( - self.current_step, - self.simulation_count - )) + "Timeout in step {} of simulation {}".format( + self.current_step, + self.simulation_count + )) command = msgpack.unpackb( - command, - object_hook=m.decode, - encoding="utf8" - ) + command, + object_hook=m.decode, + encoding="utf8" + ) if self.verbose: print("Received Request : ", command) - + return command def send_response(self, _command_response, command, suppress_logs=False): @@ -266,15 +269,15 @@ class FlatlandRemoteEvaluationService: if self.verbose and not suppress_logs: print("Responding with : ", _command_response) - + _redis.rpush( - command_response_channel, + command_response_channel, msgpack.packb( - _command_response, - default=m.encode, + _command_response, + default=m.encode, use_bin_type=True) ) - + def handle_ping(self, command): """ Handles PING command from the client. @@ -313,9 +316,9 @@ class FlatlandRemoteEvaluationService: ) if self.visualize: if self.env_renderer: - del self.env_renderer + del self.env_renderer self.env_renderer = RenderTool(self.env, gl="PILSVG", ) - + # Set max episode steps allowed self.env._max_episode_steps = \ int(1.5 * (self.env.width + self.env.height)) @@ -323,7 +326,7 @@ class FlatlandRemoteEvaluationService: if self.begin_simulation: # If begin simulation has already been initialized # atleast once - self.simulation_times.append(time.time()-self.begin_simulation) + self.simulation_times.append(time.time() - self.begin_simulation) self.begin_simulation = time.time() self.simulation_rewards.append(0) @@ -348,15 +351,15 @@ class FlatlandRemoteEvaluationService: _command_response['type'] = messages.FLATLAND_RL.ENV_CREATE_RESPONSE _command_response['payload'] = {} _command_response['payload']['observation'] = False - _command_response['payload']['env_file_path'] = False + _command_response['payload']['env_file_path'] = False self.send_response(_command_response, command) ##################################################################### # Update evaluation state ##################################################################### progress = np.clip( - self.simulation_count * 1.0 / len(self.env_file_paths), - 0, 1) + self.simulation_count * 1.0 / len(self.env_file_paths), + 0, 1) mean_reward = round(np.mean(self.simulation_rewards), 2) mean_normalized_reward = round(np.mean(self.simulation_rewards_normalized), 2) mean_percentage_complete = round(np.mean(self.simulation_percentage_complete), 3) @@ -399,9 +402,9 @@ class FlatlandRemoteEvaluationService: """ self.simulation_rewards_normalized[-1] += \ cumulative_reward / ( - self.env._max_episode_steps + - self.env.get_num_agents() - ) + self.env._max_episode_steps + + self.env.get_num_agents() + ) if done["__all__"]: # Compute percentage complete @@ -412,14 +415,14 @@ class FlatlandRemoteEvaluationService: complete += 1 percentage_complete = complete * 1.0 / self.env.get_num_agents() self.simulation_percentage_complete[-1] = percentage_complete - + # Record Frame if self.visualize: self.env_renderer.render_env( - show=False, - show_observations=False, - show_predictions=False - ) + show=False, + show_observations=False, + show_predictions=False + ) """ Only save the frames for environments which are separately provided in video_generation_indices param @@ -427,10 +430,10 @@ class FlatlandRemoteEvaluationService: current_env_path = self.env_file_paths[self.simulation_count] if current_env_path in self.video_generation_envs: self.env_renderer.gl.save_image( - os.path.join( - self.vizualization_folder_name, - "flatland_frame_{:04d}.png".format(self.record_frame_step) - )) + os.path.join( + self.vizualization_folder_name, + "flatland_frame_{:04d}.png".format(self.record_frame_step) + )) self.record_frame_step += 1 # Build and send response @@ -453,7 +456,7 @@ class FlatlandRemoteEvaluationService: _payload = command['payload'] # Register simulation time of the last episode - self.simulation_times.append(time.time()-self.begin_simulation) + self.simulation_times.append(time.time() - self.begin_simulation) if len(self.simulation_rewards) != len(self.env_file_paths): raise Exception( @@ -461,7 +464,7 @@ class FlatlandRemoteEvaluationService: to operate on all the test environments. """ ) - + mean_reward = round(np.mean(self.simulation_rewards), 2) mean_normalized_reward = round(np.mean(self.simulation_rewards_normalized), 2) mean_percentage_complete = round(np.mean(self.simulation_percentage_complete), 3) @@ -473,7 +476,7 @@ class FlatlandRemoteEvaluationService: # install it by : # # conda install -c conda-forge x264 ffmpeg - + print("Generating Video from thumbnails...") video_output_path, video_thumb_output_path = \ aicrowd_helpers.generate_movie_from_frames( @@ -518,14 +521,14 @@ class FlatlandRemoteEvaluationService: self.evaluation_state["score"]["score_secondary"] = mean_reward self.evaluation_state["meta"]["normalized_reward"] = mean_normalized_reward self.handle_aicrowd_success_event(self.evaluation_state) - print("#"*100) + print("#" * 100) print("EVALUATION COMPLETE !!") - print("#"*100) + print("#" * 100) print("# Mean Reward : {}".format(mean_reward)) print("# Mean Normalized Reward : {}".format(mean_normalized_reward)) print("# Mean Percentage Complete : {}".format(mean_percentage_complete)) - print("#"*100) - print("#"*100) + print("#" * 100) + print("#" * 100) def report_error(self, error_message, command_response_channel): """ @@ -536,16 +539,16 @@ class FlatlandRemoteEvaluationService: _command_response['type'] = messages.FLATLAND_RL.ERROR _command_response['payload'] = error_message _redis.rpush( - command_response_channel, + command_response_channel, msgpack.packb( - _command_response, - default=m.encode, + _command_response, + default=m.encode, use_bin_type=True) - ) + ) self.evaluation_state["state"] = "ERROR" self.evaluation_state["error"] = error_message self.handle_aicrowd_error_event(self.evaluation_state) - + def handle_aicrowd_info_event(self, payload): self.oracle_events.register_event( event_type=self.oracle_events.CROWDAI_EVENT_INFO, @@ -577,17 +580,17 @@ class FlatlandRemoteEvaluationService: print("Self.Reward : ", self.reward) print("Current Simulation : ", self.simulation_count) if self.env_file_paths and \ - self.simulation_count < len(self.env_file_paths): + self.simulation_count < len(self.env_file_paths): print("Current Env Path : ", - self.env_file_paths[self.simulation_count]) + self.env_file_paths[self.simulation_count]) - try: + try: if command['type'] == messages.FLATLAND_RL.PING: """ INITIAL HANDSHAKE : Respond with PONG """ self.handle_ping(command) - + elif command['type'] == messages.FLATLAND_RL.ENV_CREATE: """ ENV_CREATE @@ -612,8 +615,8 @@ class FlatlandRemoteEvaluationService: self.handle_env_submit(command) else: _error = self._error_template( - "UNKNOWN_REQUEST:{}".format( - str(command))) + "UNKNOWN_REQUEST:{}".format( + str(command))) if self.verbose: print("Responding with : ", _error) self.report_error( @@ -631,10 +634,11 @@ class FlatlandRemoteEvaluationService: if __name__ == "__main__": import argparse + parser = argparse.ArgumentParser(description='Submit the result to AIcrowd') - parser.add_argument('--service_id', - dest='service_id', - default='FLATLAND_RL_SERVICE_ID', + parser.add_argument('--service_id', + dest='service_id', + default='FLATLAND_RL_SERVICE_ID', required=False) parser.add_argument('--test_folder', dest='test_folder', @@ -642,16 +646,16 @@ if __name__ == "__main__": help="Folder containing the files for the test envs", required=False) args = parser.parse_args() - + test_folder = args.test_folder grader = FlatlandRemoteEvaluationService( - test_env_folder=test_folder, - flatland_rl_service_id=args.service_id, - verbose=True, - visualize=True, - video_generation_envs=["Test_0/Level_1.pkl"] - ) + test_env_folder=test_folder, + flatland_rl_service_id=args.service_id, + verbose=True, + visualize=True, + video_generation_envs=["Test_0/Level_1.pkl"] + ) result = grader.run() if result['type'] == messages.FLATLAND_RL.ENV_SUBMIT_RESPONSE: cumulative_results = result['payload'] diff --git a/flatland/utils/editor.py b/flatland/utils/editor.py index 69be59ae2a957f6a2aaa948d9830472d7824516a..af1aad222919b00b716dd9da0f3be9534d54e411 100644 --- a/flatland/utils/editor.py +++ b/flatland/utils/editor.py @@ -11,9 +11,9 @@ from numpy import array import flatland.utils.rendertools as rt from flatland.core.grid.grid4_utils import mirror from flatland.envs.agent_utils import EnvAgent, EnvAgentStatic -from flatland.envs.generators import complex_rail_generator, empty_rail_generator from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.rail_env import RailEnv, random_rail_generator +from flatland.envs.rail_generators import complex_rail_generator, empty_rail_generator class EditorMVC(object): diff --git a/tests/test_distance_map.py b/tests/test_distance_map.py index dbeb2fb46513d3badcc7694365b9204ad379380a..566505b7fa5c8389fd31e90ec565a5728c10a2b0 100644 --- a/tests/test_distance_map.py +++ b/tests/test_distance_map.py @@ -2,11 +2,11 @@ import numpy as np from flatland.core.grid.grid4 import Grid4Transitions from flatland.core.transition_map import GridTransitionMap -from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail -from flatland.envs.generators import rail_from_grid_transition_map from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.predictions import ShortestPathPredictorForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import rail_from_grid_transition_map +from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail def test_walker(): diff --git a/tests/test_flatland_envs_observations.py b/tests/test_flatland_envs_observations.py index c0e28534673ba1bdd9fccfde6259c1cb89fa39d6..63f4a9a52c147f0bd8181181d84ff8b8ead529c6 100644 --- a/tests/test_flatland_envs_observations.py +++ b/tests/test_flatland_envs_observations.py @@ -4,12 +4,12 @@ import numpy as np from flatland.core.grid.grid4 import Grid4TransitionsEnum -from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail from flatland.envs.agent_utils import EnvAgent -from flatland.envs.generators import rail_from_grid_transition_map from flatland.envs.observations import GlobalObsForRailEnv, TreeObsForRailEnv from flatland.envs.predictions import ShortestPathPredictorForRailEnv from flatland.envs.rail_env import RailEnv, RailEnvActions +from flatland.envs.rail_generators import rail_from_grid_transition_map +from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail from flatland.utils.rendertools import RenderTool from flatland.utils.simple_rail import make_simple_rail diff --git a/tests/test_flatland_envs_predictions.py b/tests/test_flatland_envs_predictions.py index 8c67a42aab026563a11981175395ca7e3180fd42..b58be79bc9db0cee5c2a523c965ec6cd96f18e52 100644 --- a/tests/test_flatland_envs_predictions.py +++ b/tests/test_flatland_envs_predictions.py @@ -5,11 +5,11 @@ import pprint import numpy as np from flatland.core.grid.grid4 import Grid4TransitionsEnum -from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail -from flatland.envs.generators import rail_from_grid_transition_map from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.predictions import DummyPredictorForRailEnv, ShortestPathPredictorForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import rail_from_grid_transition_map +from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail from flatland.utils.rendertools import RenderTool from flatland.utils.simple_rail import make_simple_rail diff --git a/tests/test_flatland_envs_rail_env.py b/tests/test_flatland_envs_rail_env.py index 9108d614e0b98ab7e302c285c8d0b9805b7b37ce..a812e01f5ed8e2f78be0411f0a29667c01981876 100644 --- a/tests/test_flatland_envs_rail_env.py +++ b/tests/test_flatland_envs_rail_env.py @@ -5,13 +5,13 @@ import numpy as np from flatland.core.grid.grid4 import Grid4Transitions from flatland.core.grid.rail_env_grid import RailEnvTransitions from flatland.core.transition_map import GridTransitionMap -from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer from flatland.envs.agent_utils import EnvAgent from flatland.envs.agent_utils import EnvAgentStatic -from flatland.envs.generators import complex_rail_generator -from flatland.envs.generators import rail_from_grid_transition_map from flatland.envs.observations import GlobalObsForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.rail_generators import rail_from_grid_transition_map +from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer """Tests for `flatland` package.""" diff --git a/tests/test_flatland_malfunction.py b/tests/test_flatland_malfunction.py index 60a15bb7d40fde7dcab4f06d2292d3bdc63f1fca..0877e63c1f049a35dbfd5b3686810d0ddb1833bc 100644 --- a/tests/test_flatland_malfunction.py +++ b/tests/test_flatland_malfunction.py @@ -1,9 +1,9 @@ import numpy as np -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer class SingleAgentNavigationObs(TreeObsForRailEnv): diff --git a/tests/test_flatland_utils_rendertools.py b/tests/test_flatland_utils_rendertools.py index ac5d7f4132b5c224206af3602b6c1341fe026d8b..8248c675995fc5c906e82d8650a5b619e7b038f2 100644 --- a/tests/test_flatland_utils_rendertools.py +++ b/tests/test_flatland_utils_rendertools.py @@ -11,9 +11,9 @@ from importlib_resources import path import flatland.utils.rendertools as rt import images.test -from flatland.envs.generators import empty_rail_generator from flatland.envs.observations import TreeObsForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import empty_rail_generator def checkFrozenImage(oRT, sFileImage, resave=False): diff --git a/tests/test_multi_speed.py b/tests/test_multi_speed.py index 8703800ec80c72659a11cc520c7f20df39cde158..dff0d2c2cacc8debdf7aa95867b004ba965373c2 100644 --- a/tests/test_multi_speed.py +++ b/tests/test_multi_speed.py @@ -1,8 +1,8 @@ import numpy as np -from flatland.envs.agent_generators import complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import complex_rail_generator_agents_placer np.random.seed(1) diff --git a/tests/test_speed_classes.py b/tests/test_speed_classes.py index 67054c81706cd8147c1f9bfc9e2387c4f5fb2823..d2754c2a1ff356d91c90fd473184f6d23639fd35 100644 --- a/tests/test_speed_classes.py +++ b/tests/test_speed_classes.py @@ -1,9 +1,9 @@ """Test speed initialization by a map of speeds and their corresponding ratios.""" import numpy as np -from flatland.envs.agent_generators import speed_initialization_helper, complex_rail_generator_agents_placer -from flatland.envs.generators import complex_rail_generator from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import complex_rail_generator +from flatland.envs.schedule_generators import speed_initialization_helper, complex_rail_generator_agents_placer def test_speed_initialization_helper(): diff --git a/tests/tests_generators.py b/tests/tests_generators.py index 46109c55a643f3a822acf1ba23f81241d2b26ef5..31cc8d1f29166b3366e606e2fb4c4e2d04567275 100644 --- a/tests/tests_generators.py +++ b/tests/tests_generators.py @@ -3,13 +3,13 @@ import numpy as np -from flatland.envs.agent_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer, \ - agents_from_file -from flatland.envs.generators import rail_from_grid_transition_map, rail_from_file, complex_rail_generator, \ - random_rail_generator, empty_rail_generator from flatland.envs.observations import TreeObsForRailEnv, GlobalObsForRailEnv from flatland.envs.predictions import ShortestPathPredictorForRailEnv from flatland.envs.rail_env import RailEnv +from flatland.envs.rail_generators import rail_from_grid_transition_map, rail_from_file, complex_rail_generator, \ + random_rail_generator, empty_rail_generator +from flatland.envs.schedule_generators import get_rnd_agents_pos_tgt_dir_on_rail, complex_rail_generator_agents_placer, \ + agents_from_file from flatland.utils.simple_rail import make_simple_rail