diff --git a/examples/play_model.py b/examples/play_model.py index e8939543ba638acd7396594c84c148c8d9ee7b9f..6f899f86ffde57ce031327fa367029f067a2f9b2 100644 --- a/examples/play_model.py +++ b/examples/play_model.py @@ -39,7 +39,7 @@ class Player(object): # self.obs = self.env.reset() self.env.obs_builder.reset() self.obs = self.env._get_observations() - for envAgent in self.env.get_agent_handles(): + for envAgent in range(self.env.get_num_agents()): norm = max(1, max_lt(self.obs[envAgent], np.inf)) self.obs[envAgent] = np.clip(np.array(self.obs[envAgent]) / norm, -1, 1) @@ -52,6 +52,7 @@ class Player(object): env = self.env # Pass the (stored) observation to the agent network and retrieve the action + #for handle in env.get_agent_handles(): for handle in env.get_agent_handles(): action = self.agent.act(np.array(self.obs[handle]), eps=self.eps) self.action_prob[action] += 1 @@ -145,7 +146,7 @@ def main(render=True, delay=0.0): # Reset environment obs = env.reset() - for a in range(env.number_of_agents): + for a in range(env.get_num_agents()): norm = max(1, max_lt(obs[a], np.inf)) obs[a] = np.clip(np.array(obs[a]) / norm, -1, 1) @@ -160,18 +161,18 @@ def main(render=True, delay=0.0): # env_renderer.renderEnv(show=True) # print(step) # Action - for a in range(env.number_of_agents): + for a in range(env.get_num_agents()): action = agent.act(np.array(obs[a]), eps=eps) action_prob[action] += 1 action_dict.update({a: action}) # Environment step next_obs, all_rewards, done, _ = env.step(action_dict) - for a in range(env.number_of_agents): + for a in range(env.get_num_agents()): norm = max(1, max_lt(next_obs[a], np.inf)) next_obs[a] = np.clip(np.array(next_obs[a]) / norm, -1, 1) # Update replay buffer and train agent - for a in range(env.number_of_agents): + for a in range(env.get_num_agents()): agent.step(obs[a], action_dict[a], all_rewards[a], next_obs[a], done[a]) score += all_rewards[a] @@ -196,7 +197,7 @@ def main(render=True, delay=0.0): print(('\rTraining {} Agents.\tEpisode {}\tAverage Score: {:.0f}\tDones: {:.2f}%' + '\tEpsilon: {:.2f} \t Action Probabilities: \t {}').format( - env.number_of_agents, + env.get_num_agents(), trials, np.mean(scores_window), 100 * np.mean(done_window), @@ -207,7 +208,7 @@ def main(render=True, delay=0.0): rFps = iFrame / (tNow - tStart) print(('\rTraining {} Agents.\tEpisode {}\tAverage Score: {:.0f}\tDones: {:.2f}%' + '\tEpsilon: {:.2f} fps: {:.2f} \t Action Probabilities: \t {}').format( - env.number_of_agents, + env.get_num_agents(), trials, np.mean(scores_window), 100 * np.mean(done_window), diff --git a/examples/temporary_example.py b/examples/temporary_example.py index c2720a9324cbf2761bae9031c8b22f16abf7c4be..0ed2f6207683b0983a6c8a9783c6677834437bd1 100644 --- a/examples/temporary_example.py +++ b/examples/temporary_example.py @@ -95,10 +95,10 @@ env = RailEnv(width=7, # Print the observation vector for agent 0 obs, all_rewards, done, _ = env.step({0:0}) -for i in range(env.number_of_agents): +for i in range(env.get_num_agents()): env.obs_builder.util_print_obs_subtree(tree=obs[i], num_features_per_node=5) -env_renderer = RenderTool(env) +env_renderer = RenderTool(env, gl="QT") env_renderer.renderEnv(show=True) print("Manual control: s=perform step, q=quit, [agent id] [1-2-3 action] \ diff --git a/flatland/envs/generators.py b/flatland/envs/generators.py index 7452d325530bb189084182f0bbc4bf26369e5881..c5e7d67ccea46a4125975a2dd6e6769d7aedd53a 100644 --- a/flatland/envs/generators.py +++ b/flatland/envs/generators.py @@ -24,7 +24,7 @@ def complex_rail_generator(nr_start_goal=1, nr_extra=10, min_dist=2, max_dist=99 The matrix with the correct 16-bit bitmaps for each cell. """ - def generator(width, height, agents_handles, num_resets=0): + def generator(width, height, num_agents, num_resets=0): rail_trans = RailEnvTransitions() grid_map = GridTransitionMap(width=width, height=height, transitions=rail_trans) rail_array = grid_map.grid @@ -175,7 +175,7 @@ def rail_from_manual_specifications_generator(rail_spec): the matrix of correct 16-bit bitmaps for each cell. """ - def generator(width, height, agents_handles, num_resets=0): + def generator(width, height, num_agents, num_resets=0): t_utils = RailEnvTransitions() height = len(rail_spec) @@ -192,7 +192,7 @@ def rail_from_manual_specifications_generator(rail_spec): agents_position, agents_direction, agents_target = get_rnd_agents_pos_tgt_dir_on_rail( rail, - len(agents_handles)) + num_agents) return rail, agents_position, agents_direction, agents_target @@ -215,10 +215,10 @@ def rail_from_GridTransitionMap_generator(rail_map): Generator function that always returns the given `rail_map' object. """ - def generator(width, height, agents_handles, num_resets=0): + def generator(width, height, num_agents, num_resets=0): agents_position, agents_direction, agents_target = get_rnd_agents_pos_tgt_dir_on_rail( rail_map, - len(agents_handles)) + num_agents) return rail_map, agents_position, agents_direction, agents_target @@ -240,7 +240,7 @@ def rail_from_list_of_saved_GridTransitionMap_generator(list_of_filenames): Generator function that always returns the given `rail_map' object. """ - def generator(width, height, agents_handles, num_resets=0): + def generator(width, height, num_agents, num_resets=0): t_utils = RailEnvTransitions() rail_map = GridTransitionMap(width=width, height=height, transitions=t_utils) rail_map.load_transition_map(list_of_filenames[num_resets % len(list_of_filenames)], override_gridsize=False) @@ -250,7 +250,7 @@ def rail_from_list_of_saved_GridTransitionMap_generator(list_of_filenames): agents_position, agents_direction, agents_target = get_rnd_agents_pos_tgt_dir_on_rail( rail_map, - len(agents_handles)) + num_agents) return rail_map, agents_position, agents_direction, agents_target @@ -298,7 +298,7 @@ def random_rail_generator(cell_type_relative_proportion=[1.0] * 11): The matrix with the correct 16-bit bitmaps for each cell. """ - def generator(width, height, agents_handles, num_resets=0): + def generator(width, height, num_agents, num_resets=0): t_utils = RailEnvTransitions() transition_probability = cell_type_relative_proportion @@ -533,7 +533,7 @@ def random_rail_generator(cell_type_relative_proportion=[1.0] * 11): agents_position, agents_direction, agents_target = get_rnd_agents_pos_tgt_dir_on_rail( return_rail, - len(agents_handles)) + num_agents) return return_rail, agents_position, agents_direction, agents_target diff --git a/flatland/envs/rail_env.py b/flatland/envs/rail_env.py index e2a751093ca7645af77e7dcc69b4d576348c54d9..3135e9e4979f6e170654bec615d2fe5475ab0bf4 100644 --- a/flatland/envs/rail_env.py +++ b/flatland/envs/rail_env.py @@ -5,6 +5,7 @@ Generator functions are functions that take width, height and num_resets as argu a GridTransitionMap object. """ import numpy as np +import pickle from flatland.core.env import Environment from flatland.core.env_observation_builder import TreeObsForRailEnv @@ -83,34 +84,43 @@ class RailEnv(Environment): self.width = width self.height = height - self.number_of_agents = number_of_agents + # use get_num_agents() instead + # self.number_of_agents = number_of_agents self.obs_builder = obs_builder_object self.obs_builder._set_env(self) - self.actions = [0] * self.number_of_agents - self.rewards = [0] * self.number_of_agents + self.actions = [0] * number_of_agents + self.rewards = [0] * number_of_agents self.done = False - self.dones = {"__all__": False} + self.dones = dict.fromkeys(list(range(number_of_agents)) + ["__all__"], False) + self.obs_dict = {} self.rewards_dict = {} - self.agents_handles = list(range(self.number_of_agents)) + # self.agents_handles = list(range(self.number_of_agents)) # self.agents_position = [] # self.agents_target = [] # self.agents_direction = [] - self.agents = [] # live agents - self.agents_static = [] # static agent information + self.agents = [None] * number_of_agents # live agents + self.agents_static = [None] * number_of_agents # static agent information self.num_resets = 0 self.reset() self.num_resets = 0 # yes, set it to zero again! self.valid_positions = None + # no more agent_handles def get_agent_handles(self): - return self.agents_handles + return range(self.get_num_agents()) + + def get_num_agents(self, static=True): + if static: + return len(self.agents_static) + else: + return len(self.agents) def add_agent_static(self, agent_static): """ Add static info for a single agent. @@ -119,11 +129,17 @@ class RailEnv(Environment): self.agents_static.append(agent_static) return len(self.agents_static) - 1 - def reset(self, regen_rail=True, replace_agents=True): + def restart_agents(self): + """ Reset the agents to their starting positions defined in agents_static """ - TODO: replace_agents is ignored at the moment; agents will always be replaced. + self.agents = EnvAgent.list_from_static(self.agents_static) + + def reset(self, regen_rail=True, replace_agents=True): + """ if regen_rail then regenerate the rails. + if replace_agents then regenerate the agents static. + Relies on the rail_generator returning agent_static lists (pos, dir, target) """ - tRailAgents = self.rail_generator(self.width, self.height, self.agents_handles, self.num_resets) + tRailAgents = self.rail_generator(self.width, self.height, self.get_num_agents(), self.num_resets) if regen_rail or self.rail is None: self.rail = tRailAgents[0] @@ -132,15 +148,16 @@ class RailEnv(Environment): self.agents_static = EnvAgentStatic.from_lists(*tRailAgents[1:4]) # Take the agent static info and put (live) agents at the start positions - self.agents = EnvAgent.list_from_static(self.agents_static[:len(self.agents_handles)]) + # self.agents = EnvAgent.list_from_static(self.agents_static[:len(self.agents_handles)]) + self.restart_agents() self.num_resets += 1 + # for handle in self.agents_handles: + # self.dones[handle] = False + self.dones = dict.fromkeys(list(range(self.get_num_agents())) + ["__all__"], False) # perhaps dones should be part of each agent. - self.dones = {"__all__": False} - for handle in self.agents_handles: - self.dones[handle] = False - + # Reset the state of the observation builder with the new environment self.obs_builder.reset() @@ -157,27 +174,30 @@ class RailEnv(Environment): # Reset the step rewards self.rewards_dict = dict() - for handle in self.agents_handles: - self.rewards_dict[handle] = 0 + # for handle in self.agents_handles: + # self.rewards_dict[handle] = 0 + for iAgent in range(self.get_num_agents()): + self.rewards_dict[iAgent] = 0 if self.dones["__all__"]: return self._get_observations(), self.rewards_dict, self.dones, {} - for i in range(len(self.agents_handles)): - handle = self.agents_handles[i] + # for i in range(len(self.agents_handles)): + for iAgent in range(self.get_num_agents()): + # handle = self.agents_handles[i] transition_isValid = None - agent = self.agents[i] + agent = self.agents[iAgent] - if handle not in action_dict: # no action has been supplied for this agent + if iAgent not in action_dict: # no action has been supplied for this agent continue - if self.dones[handle]: # this agent has already completed... + if self.dones[iAgent]: # this agent has already completed... continue - action = action_dict[handle] + action = action_dict[iAgent] if action < 0 or action > 3: print('ERROR: illegal action=', action, - 'for agent with handle=', handle) + 'for agent with index=', iAgent) return if action > 0: @@ -259,16 +279,16 @@ class RailEnv(Environment): agent.direction = movement else: # the action was not valid, add penalty - self.rewards_dict[handle] += invalid_action_penalty + self.rewards_dict[iAgent] += invalid_action_penalty # if agent is not in target position, add step penalty # if self.agents_position[i][0] == self.agents_target[i][0] and \ # self.agents_position[i][1] == self.agents_target[i][1]: # self.dones[handle] = True if np.equal(agent.position, agent.target).all(): - self.dones[handle] = True + self.dones[iAgent] = True else: - self.rewards_dict[handle] += step_penalty + self.rewards_dict[iAgent] += step_penalty # Check for end of episode + add global reward to all rewards! # num_agents_in_target_position = 0 @@ -283,17 +303,34 @@ class RailEnv(Environment): # Reset the step actions (in case some agent doesn't 'register_action' # on the next step) - self.actions = [0] * self.number_of_agents + self.actions = [0] * self.get_num_agents() return self._get_observations(), self.rewards_dict, self.dones, {} def _get_observations(self): self.obs_dict = {} - for handle in self.agents_handles: - self.obs_dict[handle] = self.obs_builder.get(handle) + # for handle in self.agents_handles: + for iAgent in range(self.get_num_agents()): + self.obs_dict[iAgent] = self.obs_builder.get(iAgent) return self.obs_dict def render(self): # TODO: pass - \ No newline at end of file + def save(self, sFilename): + dSave = { + "grid": self.rail.grid, + "agents_static": self.agents_static + } + with open(sFilename, "wb") as fOut: + pickle.dump(dSave, fOut) + + def load(self, sFilename): + with open(sFilename, "rb") as fIn: + dLoad = pickle.load(fIn) + self.rail.grid = dLoad["grid"] + self.height, self.width = self.rail.grid.shape + self.agents_static = dLoad["agents_static"] + self.agents = [None] * self.get_num_agents() + self.dones = dict.fromkeys(list(range(self.get_num_agents())) + ["__all__"], False) + diff --git a/flatland/utils/editor.py b/flatland/utils/editor.py index 3e55a793f840eab6738877528da6ac01e61629be..3c7f47012e383e1e2bca9af120152b65cfa43e81 100644 --- a/flatland/utils/editor.py +++ b/flatland/utils/editor.py @@ -310,7 +310,8 @@ class Controller(object): def regenerate(self, event): method = self.view.wRegenMethod.value - self.model.regenerate(method) + nAgents = self.view.wNAgents.value + self.model.regenerate(method, nAgents) def setRegenSize(self, event): self.model.setRegenSize(event["new"]) @@ -351,7 +352,7 @@ class EditorModel(object): self.bDebug_move = False self.wid_output = None self.drawMode = "Draw" - self.env_filename = "temp.npy" + self.env_filename = "temp.pkl" self.set_env(env) self.iSelectedAgent = None self.player = None @@ -526,17 +527,17 @@ class EditorModel(object): def clear(self): self.env.rail.grid[:, :] = 0 - self.env.number_of_agents = 0 + # self.env.number_of_agents = 0 self.env.agents = [] self.env.agents_static = [] - self.env.agents_handles = [] + # self.env.agents_handles = [] self.player = None self.redraw() def reset(self, replace_agents=False, nAgents=0): - if replace_agents: - self.env.agents_handles = range(nAgents) + # if replace_agents: + # self.env.agents_handles = range(nAgents) self.env.reset(regen_rail=True, replace_agents=replace_agents) self.player = Player(self.env) self.redraw() @@ -553,7 +554,8 @@ class EditorModel(object): def load(self): if os.path.exists(self.env_filename): self.log("load file: ", self.env_filename) - self.env.rail.load_transition_map(self.env_filename, override_gridsize=True) + # self.env.rail.load_transition_map(self.env_filename, override_gridsize=True) + self.env.load(self.env_filename) self.fix_env() self.set_env(self.env) self.redraw() @@ -562,9 +564,10 @@ class EditorModel(object): def save(self): self.log("save to ", self.env_filename, " working dir: ", os.getcwd()) - self.env.rail.save_transition_map(self.env_filename) + # self.env.rail.save_transition_map(self.env_filename) + self.env.save(self.env_filename) - def regenerate(self, method=None): + def regenerate(self, method=None, nAgents=0): self.log("Regenerate size", self.regen_size) if method is None or method == "Random Cell": @@ -575,7 +578,8 @@ class EditorModel(object): self.env = RailEnv(width=self.regen_size, height=self.regen_size, rail_generator=fnMethod, - number_of_agents=self.env.number_of_agents, + # number_of_agents=self.env.get_num_agents(), + number_of_agents=nAgents, obs_builder_object=TreeObsForRailEnv(max_depth=2)) self.env.reset(regen_rail=True) self.fix_env() diff --git a/flatland/utils/render_qt.py b/flatland/utils/render_qt.py index 19982f289f49b6b43549ef9df2fcdde3c8be3bb9..445f7749fcbd6320ec7c6e054be6e719686d516f 100644 --- a/flatland/utils/render_qt.py +++ b/flatland/utils/render_qt.py @@ -52,7 +52,6 @@ class QTGL(GraphicsLayer): lastx = x lasty = y else: - # print(gX, gY) gPoints = np.stack([array(gX), -array(gY)]).T * self.cell_pixels self.qtr.setLineWidth(5) self.qtr.drawPolyline(gPoints) @@ -89,3 +88,17 @@ class QTGL(GraphicsLayer): def endFrame(self): self.qtr.pop() self.qtr.endFrame() + + +def main(): + gl = QTGL(10, 10) + for i in range(10): + gl.beginFrame() + gl.plot([3+i, 4], [-4-i, -5], color="r") + gl.endFrame() + import time + time.sleep(1) + + +if __name__ == "__main__": + main() diff --git a/flatland/utils/rendertools.py b/flatland/utils/rendertools.py index 316344027f05c651482fc1ea555d957b9234e3d4..bd0a4bdcd38a8845f95b9537db759729ee31a840 100644 --- a/flatland/utils/rendertools.py +++ b/flatland/utils/rendertools.py @@ -149,11 +149,15 @@ class RenderTool(object): lut=max(len(self.env.agents), len(self.env.agents_static) + 1)) for iAgent, agent in enumerate(self.env.agents_static): + if agent is None: + continue oColor = cmap(iAgent) self.plotAgent(agent.position, agent.direction, oColor, target=agent.target if targets else None, static=True, selected=iAgent == iSelectedAgent) for iAgent, agent in enumerate(self.env.agents): + if agent is None: + continue oColor = cmap(iAgent) self.plotAgent(agent.position, agent.direction, oColor, target=agent.target if targets else None) @@ -591,38 +595,8 @@ class RenderTool(object): # Draw each agent + its orientation + its target if agents: - cmap = self.gl.get_cmap('hsv', lut=env.number_of_agents + 1) self.plotAgents(targets=True, iSelectedAgent=iSelectedAgent) - if False: - for i in range(env.number_of_agents): - self._draw_square(( - env.agents_position[i][1] * - cell_size + cell_size / 2, - -env.agents_position[i][0] * - cell_size - cell_size / 2), - cell_size / 8, cmap(i)) - for i in range(env.number_of_agents): - self._draw_square(( - env.agents_target[i][1] * - cell_size + cell_size / 2, - -env.agents_target[i][0] * - cell_size - cell_size / 2), - cell_size / 3, [c for c in cmap(i)]) - - # orientation is a line connecting the center of the cell to the - # side of the square of the agent - new_position = env._new_position(env.agents_position[i], env.agents_direction[i]) - new_position = (( - new_position[0] + env.agents_position[i][0]) / 2 * cell_size, - (new_position[1] + env.agents_position[i][1]) / 2 * cell_size) - - self.gl.plot( - [env.agents_position[i][1] * cell_size + cell_size / 2, new_position[1] + cell_size / 2], - [-env.agents_position[i][0] * cell_size - cell_size / 2, -new_position[0] - cell_size / 2], - color=cmap(i), - linewidth=2.0) - # Draw some textual information like fps yText = [-0.3, -0.6, -0.9] if frames: @@ -646,6 +620,9 @@ class RenderTool(object): self.gl.prettify2(env.width, env.height, self.nPixCell) + # TODO: for MPL, we don't want to call clf (called by endframe) + # for QT, we need to call endFrame() + # if not show: self.gl.endFrame() # t2 = time.time() diff --git a/notebooks/Editor2.ipynb b/notebooks/Editor2.ipynb index 49211826836893cf7ceb0c4652d7b112a191b3bf..078afa943f79ee5a999c3e5f41814f9ec177848d 100644 --- a/notebooks/Editor2.ipynb +++ b/notebooks/Editor2.ipynb @@ -77,7 +77,7 @@ { "data": { "text/plain": [ - "<Figure size 720x720 with 0 Axes>" + "<Figure size 432x288 with 0 Axes>" ] }, "metadata": {}, @@ -85,7 +85,7 @@ } ], "source": [ - "mvc = EditorMVC(sGL=\"PIL\")" + "mvc = EditorMVC(sGL=\"PIL\" ) # sGL=\"PIL\")" ] }, { @@ -113,12 +113,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e8a334cd72b94510b53b5fd0b4abaaf2", + "model_id": "6b1f996bbb834fcc962c80041465ac2d", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(Canvas(), VBox(children=(Text(value='temp.npy', description='Filename'), Button(description='Re…" + "HBox(children=(Canvas(), VBox(children=(Text(value='temp.pkl', description='Filename'), Button(description='Re…" ] }, "metadata": {}, @@ -139,7 +139,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "96e78fa758b64ea7827c695beef03bf2", + "model_id": "bf8e0dd6aa564b42a5ec3aa19c31a679", "version_major": 2, "version_minor": 0 }, @@ -155,120 +155,6 @@ "mvc.view.wOutput.clear_output()\n", "mvc.view.wOutput" ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mvc.editor.env.get_agent_handles()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mvc.editor.env._get_observations()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 720x720 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,10))\n", - "#ipv.view(0, 90, 1)\n", - "nBranchFactor = 4\n", - "\n", - "# A point in xyz representing the root node\n", - "gP0 = array([[0,0,0]]).T\n", - "nDepth = 3\n", - "\n", - "# iterate over layers / depths:\n", - "for i in range(nDepth):\n", - " nDepthNodes = nBranchFactor**i # number of nodes at this depth\n", - " rScale = nBranchFactor ** (nDepth - i)\n", - " rShrinkDepth = 1/(i+1) # shrink the horizontal scale as we go deeper\n", - "\n", - " # x,y,z coords for the nodes\n", - " gX1 = np.linspace(-(nDepthNodes-1), (nDepthNodes-1), nDepthNodes) * rShrinkDepth\n", - " gY1 = np.ones((nDepthNodes)) * i\n", - " gZ1 = np.zeros((nDepthNodes))\n", - " \n", - " #ipv.scatter(gX1, gZ1, -gY1, marker=\"sphere\")\n", - " \n", - " #gP0rep = np.repeat(gP0, nBranchFactor, axis=1)\n", - " \n", - " # All the new points\n", - " gP1 = array([gX1, gY1, gZ1])\n", - " \n", - " # The points from both the previous depth and this one\n", - " gP01 = np.append(gP0, gP1, axis=1)\n", - " \n", - " if nDepthNodes > 1:\n", - " nDepthNodesPrev = nDepthNodes / nBranchFactor\n", - " giP0 = np.repeat(np.arange(nDepthNodesPrev), nBranchFactor)\n", - " giP1 = np.arange(0, nDepthNodes) + nDepthNodesPrev\n", - " giLinePoints = np.stack([giP0, giP1]).ravel(\"F\")\n", - " #print(gP01[:,:10])\n", - " #print(giLinePoints)\n", - " for iLine in range(0, len(giLinePoints), 2):\n", - " iP0 = int(giLinePoints[iLine])\n", - " iP1 = int(giLinePoints[iLine+1])\n", - " p0 = [ gP01[0, iP0], gP01[1, iP0] ]\n", - " p1 = [ gP01[0, iP1], gP01[1, iP1] ]\n", - " \n", - " gLine = array([p0, p1]).T\n", - " #print(p0, p1, gLine)\n", - " #plt.plot(gP01[0], gP01[2], -gP01[1], lines=giLinePoints, color=\"gray\")\n", - " plt.plot(*gLine, color=\"gray\")\n", - " #ipv.plot(gP01[0], gP01[2], -gP01[1], lines=giLinePoints)\n", - "\n", - " gP0 = array([gX1, gY1, gZ1])\n", - " " - ] } ], "metadata": { diff --git a/tests/test_env_observation_builder.py b/tests/test_env_observation_builder.py index 9ec0db0a1ee5ab7dd5b235448298cee601af28f5..1692a98982a787ecbadf79feb7a35593f82522e4 100644 --- a/tests/test_env_observation_builder.py +++ b/tests/test_env_observation_builder.py @@ -83,3 +83,11 @@ def test_global_obs(): # If this assertion is wrong, it means that the observation returned # places the agent on an empty cell assert(np.sum(rail_map * global_obs[0][1][0]) > 0) + + +def main(): + test_global_obs() + + +if __name__ == "__main__": + main() diff --git a/tests/test_environments.py b/tests/test_environments.py index fe788b7c72fbcab358ac2120b0069c7cf64b1801..f12dfa3d6b57f76ce490c2c748fefc008ba371a5 100644 --- a/tests/test_environments.py +++ b/tests/test_environments.py @@ -201,3 +201,8 @@ def test_dead_end(): # rail_env.agents_direction[0] = 0 rail_env.agents = [EnvAgent(position=(2, 0), direction=0, target=(4, 0))] check_consistency(rail_env) + + +if __name__ == "__main__": + test_rail_environment_single_agent() + test_dead_end() \ No newline at end of file diff --git a/tox.ini b/tox.ini index 6e5ef99fe393ede204f109e3f080d54768c2cd39..5a97b7e1c5b2f09db2cca8da5e1cf9db002f26f1 100644 --- a/tox.ini +++ b/tox.ini @@ -8,7 +8,7 @@ python = [flake8] max-line-length = 120 -ignore = E121 E126 E123 E128 E133 E226 E241 E242 E704 W293 W391 W503 W504 W505 +ignore = E121 E126 E123 E128 E133 E226 E241 E242 E704 W291 W293 W391 W503 W504 W505 [testenv:flake8] basepython = python