From 5a6a444af44290d9621ff70187173d5765400cf1 Mon Sep 17 00:00:00 2001 From: romue Date: Tue, 18 May 2021 13:33:13 +0200 Subject: [PATCH 1/3] refactored assets structure and added agent1violation.png --- .../factory/assets/{ => agents}/agent.png | Bin .../factory/assets/{ => agents}/agent1.png | Bin .../factory/assets/agents/agent1violation.png | Bin 0 -> 6754 bytes .../factory/assets/{ => agents}/agent2.png | Bin .../factory/assets/{ => agents}/agent3.png | Bin .../factory/assets/{ => agents}/agent4.png | Bin .../factory/assets/{ => agents}/agent5.png | Bin .../factory/assets/{ => agents}/agent6.png | Bin environments/factory/renderer.py | 2 +- 9 files changed, 1 insertion(+), 1 deletion(-) rename environments/factory/assets/{ => agents}/agent.png (100%) rename environments/factory/assets/{ => agents}/agent1.png (100%) create mode 100644 environments/factory/assets/agents/agent1violation.png rename environments/factory/assets/{ => agents}/agent2.png (100%) rename environments/factory/assets/{ => agents}/agent3.png (100%) rename environments/factory/assets/{ => agents}/agent4.png (100%) rename environments/factory/assets/{ => agents}/agent5.png (100%) rename environments/factory/assets/{ => agents}/agent6.png (100%) diff --git a/environments/factory/assets/agent.png b/environments/factory/assets/agents/agent.png similarity index 100% rename from environments/factory/assets/agent.png rename to environments/factory/assets/agents/agent.png diff --git a/environments/factory/assets/agent1.png b/environments/factory/assets/agents/agent1.png similarity index 100% rename from environments/factory/assets/agent1.png rename to environments/factory/assets/agents/agent1.png diff --git a/environments/factory/assets/agents/agent1violation.png b/environments/factory/assets/agents/agent1violation.png new file mode 100644 index 0000000000000000000000000000000000000000..119a0d367ca1f89171706dcafffaea03d3e47cb2 GIT binary patch literal 6754 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 Date: Tue, 18 May 2021 14:22:22 +0200 Subject: [PATCH 2/3] added vizualization for violations --- environments/factory/base_factory.py | 6 ++++++ environments/factory/renderer.py | 6 +++--- environments/factory/simple_factory_getting_dirty.py | 11 ++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/environments/factory/base_factory.py b/environments/factory/base_factory.py index 85cb6e2..e6c53fb 100644 --- a/environments/factory/base_factory.py +++ b/environments/factory/base_factory.py @@ -67,6 +67,7 @@ class BaseFactory(gym.Env): self.steps = 0 self.cumulative_reward = 0 self.monitor = FactoryMonitor(self) + self.agent_states = [] # Agent placement ... agents = np.zeros((self.n_agents, *self.level.shape), dtype=np.int8) floor_tiles = np.argwhere(self.level == h.IS_FREE_CELL) @@ -74,9 +75,13 @@ class BaseFactory(gym.Env): np.random.shuffle(floor_tiles) for i, (x, y) in enumerate(floor_tiles[:self.n_agents]): agents[i, x, y] = h.IS_OCCUPIED_CELL + agent_state = AgentState(i, -1) + agent_state.update(pos=[x, y]) + self.agent_states.append(agent_state) # state.shape = level, agent 1,..., agent n, self.state = np.concatenate((np.expand_dims(self.level, axis=0), agents), axis=0) # Returns State, Reward, Done, Info + return self.state, 0, self.done, {} def additional_actions(self, agent_i: int, action: int) -> ((int, int), bool): @@ -102,6 +107,7 @@ class BaseFactory(gym.Env): for i, collision_vec in enumerate(self.check_all_collisions(states, self.state.shape[0])): states[i].update(collision_vector=collision_vec) + self.agent_states = states reward, info = self.calculate_reward(states) self.cumulative_reward += reward diff --git a/environments/factory/renderer.py b/environments/factory/renderer.py index 6ee3a2f..89de3c6 100644 --- a/environments/factory/renderer.py +++ b/environments/factory/renderer.py @@ -41,9 +41,9 @@ class Renderer: rect = pygame.Rect(x, y, self.cell_size, self.cell_size) pygame.draw.rect(self.screen, Renderer.WHITE, rect, 1) - def blit_params(self, entity, name): + def blit_params(self, entity): r, c = entity.pos - img = self.assets[name] + img = self.assets[entity.name] if entity.value_operation == 'opacity': img.set_alpha(255*entity.value) elif entity.value_operation == 'scale': @@ -71,7 +71,7 @@ class Renderer: self.fill_bg() for asset, entities in pos_dict.items(): for entity in entities: - bp = self.blit_params(entity, asset) + bp = self.blit_params(entity) if 'agent' in asset and self.view_radius > 0: visibility_rect = bp['dest'].inflate((self.view_radius*2)*self.cell_size, (self.view_radius*2)*self.cell_size) shape_surf = pygame.Surface(visibility_rect.size, pygame.SRCALPHA) diff --git a/environments/factory/simple_factory_getting_dirty.py b/environments/factory/simple_factory_getting_dirty.py index 346b53c..74501eb 100644 --- a/environments/factory/simple_factory_getting_dirty.py +++ b/environments/factory/simple_factory_getting_dirty.py @@ -41,10 +41,15 @@ class GettingDirty(BaseFactory): dirt = [Entity('dirt', [x, y], min(1.1*self.state[DIRT_INDEX, x, y], 1), 'opacity') for x, y in np.argwhere(self.state[DIRT_INDEX] > h.IS_FREE_CELL)] - walls = [Entity('dirt', pos) for pos in np.argwhere(self.state[h.LEVEL_IDX] > h.IS_FREE_CELL)] - agents = [Entity('agent1', pos) for pos in np.argwhere(self.state[h.AGENT_START_IDX] > h.IS_FREE_CELL)] + walls = [Entity('wall', pos) for pos in np.argwhere(self.state[h.LEVEL_IDX] > h.IS_FREE_CELL)] - self.renderer.render(OrderedDict(dirt=dirt, wall=walls, agent1=agents)) + agents = {f'agent{i+1}': [Entity(f'agent{i+1}' + if (agent.action_valid and agent.collision_vector[h.LEVEL_IDX] <= 0) else f'agent{i+1}violation', + agent.pos) + ] + for i, agent in enumerate(self.agent_states)} + print(agents) + self.renderer.render(OrderedDict(dirt=dirt, wall=walls, **agents)) def spawn_dirt(self) -> None: free_for_dirt = self.free_cells(excluded_slices=DIRT_INDEX) From 9b28b011258e87f71a8477e61965d85348e8fdd6 Mon Sep 17 00:00:00 2001 From: romue Date: Tue, 18 May 2021 14:29:55 +0200 Subject: [PATCH 3/3] added vizualization for violations --- .../factory/simple_factory_getting_dirty.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/environments/factory/simple_factory_getting_dirty.py b/environments/factory/simple_factory_getting_dirty.py index 74501eb..e3cb5fe 100644 --- a/environments/factory/simple_factory_getting_dirty.py +++ b/environments/factory/simple_factory_getting_dirty.py @@ -39,16 +39,12 @@ class GettingDirty(BaseFactory): height, width = self.state.shape[1:] self.renderer = Renderer(width, height, view_radius=2) - dirt = [Entity('dirt', [x, y], min(1.1*self.state[DIRT_INDEX, x, y], 1), 'opacity') - for x, y in np.argwhere(self.state[DIRT_INDEX] > h.IS_FREE_CELL)] - walls = [Entity('wall', pos) for pos in np.argwhere(self.state[h.LEVEL_IDX] > h.IS_FREE_CELL)] - - agents = {f'agent{i+1}': [Entity(f'agent{i+1}' - if (agent.action_valid and agent.collision_vector[h.LEVEL_IDX] <= 0) else f'agent{i+1}violation', - agent.pos) - ] + dirt = [Entity('dirt', [x, y], min(1.1*self.state[DIRT_INDEX, x, y], 1), 'opacity') + for x, y in np.argwhere(self.state[DIRT_INDEX] > h.IS_FREE_CELL)] + walls = [Entity('wall', pos) for pos in np.argwhere(self.state[h.LEVEL_IDX] > h.IS_FREE_CELL)] + violation = lambda agent: agent.action_valid and agent.collision_vector[h.LEVEL_IDX] <= 0 + agents = {f'agent{i+1}': [Entity(f'agent{i+1}' if violation(agent) else f'agent{i+1}violation', agent.pos)] for i, agent in enumerate(self.agent_states)} - print(agents) self.renderer.render(OrderedDict(dirt=dirt, wall=walls, **agents)) def spawn_dirt(self) -> None: