From 0c1d0f510b16d1e4b609ba499a1ec2a8ee79e87e Mon Sep 17 00:00:00 2001 From: Chanumask Date: Tue, 24 Oct 2023 13:33:35 +0200 Subject: [PATCH] removed positionmix entirely (now also in collection) --- marl_factory_grid/environment/entity/wall.py | 10 ++-- .../environment/groups/agents.py | 17 +++++-- .../environment/groups/collection.py | 49 +++++++++++++++++- .../environment/groups/mixins.py | 51 ------------------- marl_factory_grid/environment/groups/utils.py | 23 +++++---- marl_factory_grid/environment/groups/walls.py | 7 ++- marl_factory_grid/modules/batteries/groups.py | 21 ++++++-- marl_factory_grid/modules/clean_up/groups.py | 24 ++++++--- .../modules/destinations/groups.py | 21 ++++++-- marl_factory_grid/modules/doors/groups.py | 7 ++- marl_factory_grid/modules/items/groups.py | 22 ++++++-- marl_factory_grid/modules/machines/groups.py | 17 +++++-- .../modules/maintenance/groups.py | 24 ++++++--- 13 files changed, 186 insertions(+), 107 deletions(-) diff --git a/marl_factory_grid/environment/entity/wall.py b/marl_factory_grid/environment/entity/wall.py index a10d104..3f0fb7c 100644 --- a/marl_factory_grid/environment/entity/wall.py +++ b/marl_factory_grid/environment/entity/wall.py @@ -1,16 +1,14 @@ -from typing import List - -import numpy as np - from marl_factory_grid.environment import constants as c from marl_factory_grid.environment.entity.entity import Entity -from marl_factory_grid.environment.entity.object import EnvObject from marl_factory_grid.utils.utility_classes import RenderEntity -from marl_factory_grid.utils import helpers as h class Wall(Entity): + @property + def var_has_position(self): + return True + @property def var_can_collide(self): return True diff --git a/marl_factory_grid/environment/groups/agents.py b/marl_factory_grid/environment/groups/agents.py index 571816e..f4a6ac6 100644 --- a/marl_factory_grid/environment/groups/agents.py +++ b/marl_factory_grid/environment/groups/agents.py @@ -1,12 +1,21 @@ from marl_factory_grid.environment.entity.agent import Agent from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin -class Agents(PositionMixin, Collection): +class Agents(Collection): _entity = Agent - is_blocking_light = False - can_move = True + + @property + def var_is_blocking_light(self): + return False + + @property + def var_can_move(self): + return True + + @property + def var_has_position(self): + return True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/marl_factory_grid/environment/groups/collection.py b/marl_factory_grid/environment/groups/collection.py index bce71c7..405fbfe 100644 --- a/marl_factory_grid/environment/groups/collection.py +++ b/marl_factory_grid/environment/groups/collection.py @@ -1,9 +1,12 @@ +from typing import List, Tuple + +from marl_factory_grid.environment.entity.entity import Entity from marl_factory_grid.environment.groups.objects import _Objects from marl_factory_grid.environment.entity.object import EnvObject class Collection(_Objects): - _entity = EnvObject + _entity = EnvObject # entity? object? objects? @property def var_is_blocking_light(self): @@ -20,11 +23,12 @@ class Collection(_Objects): @property def var_has_position(self): return False # alles was posmixin hat true + @property def var_has_bound(self): return False # batteries, globalpos, inventories true - @property # beide bounds hier? inventory can be bound + @property # beide bounds hier? inventory can be bound def var_can_be_bound(self): return False @@ -62,3 +66,44 @@ class Collection(_Objects): return next((idx for idx, x in enumerate(self) if x.belongs_to_entity(entity))) except (StopIteration, AttributeError): return None + + def spawn(self, coords: List[Tuple[(int, int)]]): + self.add_items([self._entity(pos) for pos in coords]) + + def render(self): + return [y for y in [x.render() for x in self] if y is not None] + + @classmethod + def from_coordinates(cls, positions: [(int, int)], *args, entity_kwargs=None, **kwargs, ): + collection = cls(*args, **kwargs) + collection.add_items( + [cls._entity(tuple(pos), **entity_kwargs if entity_kwargs is not None else {}) for pos in positions]) + return collection + + def __delitem__(self, name): + idx, obj = next((i, obj) for i, obj in enumerate(self) if obj.name == name) + try: + for observer in obj.observers: + observer.notify_del_entity(obj) + except AttributeError: + pass + super().__delitem__(name) + + def by_pos(self, pos: (int, int)): + pos = tuple(pos) + try: + return self.pos_dict[pos] + except StopIteration: + pass + except ValueError: + print() + + @property + def positions(self): + return [e.pos for e in self] + + def notify_del_entity(self, entity: Entity): + try: + self.pos_dict[entity.pos].remove(entity) + except (ValueError, AttributeError): + pass diff --git a/marl_factory_grid/environment/groups/mixins.py b/marl_factory_grid/environment/groups/mixins.py index 8a97283..48333ca 100644 --- a/marl_factory_grid/environment/groups/mixins.py +++ b/marl_factory_grid/environment/groups/mixins.py @@ -1,55 +1,4 @@ -from typing import List, Tuple - from marl_factory_grid.environment import constants as c -from marl_factory_grid.environment.entity.entity import Entity - - -class PositionMixin: - _entity = Entity - var_is_blocking_light: bool = True - var_can_collide: bool = True - var_has_position: bool = True - - def spawn(self, coords: List[Tuple[(int, int)]]): - self.add_items([self._entity(pos) for pos in coords]) - - def render(self): - return [y for y in [x.render() for x in self] if y is not None] - - @classmethod - def from_coordinates(cls, positions: [(int, int)], *args, entity_kwargs=None, **kwargs, ): - collection = cls(*args, **kwargs) - collection.add_items( - [cls._entity(tuple(pos), **entity_kwargs if entity_kwargs is not None else {}) for pos in positions]) - return collection - - def __delitem__(self, name): - idx, obj = next((i, obj) for i, obj in enumerate(self) if obj.name == name) - try: - for observer in obj.observers: - observer.notify_del_entity(obj) - except AttributeError: - pass - super().__delitem__(name) - - def by_pos(self, pos: (int, int)): - pos = tuple(pos) - try: - return self.pos_dict[pos] - except StopIteration: - pass - except ValueError: - print() - - @property - def positions(self): - return [e.pos for e in self] - - def notify_del_entity(self, entity: Entity): - try: - self.pos_dict[entity.pos].remove(entity) - except (ValueError, AttributeError): - pass # noinspection PyUnresolvedReferences,PyTypeChecker diff --git a/marl_factory_grid/environment/groups/utils.py b/marl_factory_grid/environment/groups/utils.py index 1971ff0..b47b103 100644 --- a/marl_factory_grid/environment/groups/utils.py +++ b/marl_factory_grid/environment/groups/utils.py @@ -1,17 +1,14 @@ from typing import List, Union -import numpy as np - from marl_factory_grid.environment.entity.util import GlobalPosition from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin, HasBoundMixin -from marl_factory_grid.environment.groups.objects import _Objects -from marl_factory_grid.modules.zones import Zone -from marl_factory_grid.utils import helpers as h -from marl_factory_grid.environment import constants as c -class Combined(PositionMixin, Collection): +class Combined(Collection): + + @property + def var_has_position(self): + return True @property def name(self): @@ -38,8 +35,14 @@ class Combined(PositionMixin, Collection): class GlobalPositions(Collection): _entity = GlobalPosition - is_blocking_light = False, - can_collide = False + + @property + def var_is_blocking_light(self): + return False + + @property + def var_can_collide(self): + return False def __init__(self, *args, **kwargs): super(GlobalPositions, self).__init__(*args, **kwargs) diff --git a/marl_factory_grid/environment/groups/walls.py b/marl_factory_grid/environment/groups/walls.py index c02b803..72ccde1 100644 --- a/marl_factory_grid/environment/groups/walls.py +++ b/marl_factory_grid/environment/groups/walls.py @@ -1,13 +1,16 @@ from marl_factory_grid.environment import constants as c from marl_factory_grid.environment.entity.wall import Wall from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin -class Walls(PositionMixin, Collection): +class Walls(Collection): _entity = Wall symbol = c.SYMBOL_WALL + @property + def var_has_position(self): + return True + def __init__(self, *args, **kwargs): super(Walls, self).__init__(*args, **kwargs) self._value = c.VALUE_OCCUPIED_CELL diff --git a/marl_factory_grid/modules/batteries/groups.py b/marl_factory_grid/modules/batteries/groups.py index 90d1fa9..cc0a09d 100644 --- a/marl_factory_grid/modules/batteries/groups.py +++ b/marl_factory_grid/modules/batteries/groups.py @@ -1,13 +1,26 @@ from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin, HasBoundMixin from marl_factory_grid.modules.batteries.entitites import Pod, Battery class Batteries(Collection): _entity = Battery - is_blocking_light: bool = False - can_collide: bool = False + + @property + def var_is_blocking_light(self): + return False + + @property + def var_can_collide(self): + return False + + @property + def var_can_move(self): + return False + + @property + def var_has_position(self): + return True @property def obs_tag(self): @@ -21,7 +34,7 @@ class Batteries(Collection): self.add_items(batteries) -class ChargePods(PositionMixin, Collection): +class ChargePods(Collection): _entity = Pod diff --git a/marl_factory_grid/modules/clean_up/groups.py b/marl_factory_grid/modules/clean_up/groups.py index 6e5a8ad..510d444 100644 --- a/marl_factory_grid/modules/clean_up/groups.py +++ b/marl_factory_grid/modules/clean_up/groups.py @@ -1,14 +1,26 @@ +from marl_factory_grid.environment import constants as c from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin from marl_factory_grid.modules.clean_up.entitites import DirtPile -from marl_factory_grid.environment import constants as c - -class DirtPiles(PositionMixin, Collection): +class DirtPiles(Collection): _entity = DirtPile - is_blocking_light: bool = False - can_collide: bool = False + + @property + def var_is_blocking_light(self): + return False + + @property + def var_can_collide(self): + return False + + @property + def var_can_move(self): + return False + + @property + def var_has_position(self): + return True @property def amount(self): diff --git a/marl_factory_grid/modules/destinations/groups.py b/marl_factory_grid/modules/destinations/groups.py index 4c6e0b9..5f91bb4 100644 --- a/marl_factory_grid/modules/destinations/groups.py +++ b/marl_factory_grid/modules/destinations/groups.py @@ -1,14 +1,27 @@ from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin from marl_factory_grid.modules.destinations.entitites import Destination from marl_factory_grid.environment import constants as c from marl_factory_grid.modules.destinations import constants as d -class Destinations(PositionMixin, Collection): +class Destinations(Collection): _entity = Destination - is_blocking_light: bool = False - can_collide: bool = False + + @property + def var_is_blocking_light(self): + return False + + @property + def var_can_collide(self): + return False + + @property + def var_can_move(self): + return False + + @property + def var_has_position(self): + return True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/marl_factory_grid/modules/doors/groups.py b/marl_factory_grid/modules/doors/groups.py index 3cd9307..687846e 100644 --- a/marl_factory_grid/modules/doors/groups.py +++ b/marl_factory_grid/modules/doors/groups.py @@ -1,16 +1,19 @@ from typing import Union from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin from marl_factory_grid.modules.doors import constants as d from marl_factory_grid.modules.doors.entitites import Door -class Doors(PositionMixin, Collection): +class Doors(Collection): symbol = d.SYMBOL_DOOR _entity = Door + @property + def var_has_position(self): + return True + def __init__(self, *args, **kwargs): super(Doors, self).__init__(*args, can_collide=True, **kwargs) diff --git a/marl_factory_grid/modules/items/groups.py b/marl_factory_grid/modules/items/groups.py index 0fb2495..997f91b 100644 --- a/marl_factory_grid/modules/items/groups.py +++ b/marl_factory_grid/modules/items/groups.py @@ -5,14 +5,18 @@ from marl_factory_grid.environment import constants as c from marl_factory_grid.environment.groups.collection import Collection from marl_factory_grid.environment.groups.objects import _Objects -from marl_factory_grid.environment.groups.mixins import PositionMixin, IsBoundMixin, HasBoundMixin +from marl_factory_grid.environment.groups.mixins import IsBoundMixin, HasBoundMixin from marl_factory_grid.environment.entity.agent import Agent from marl_factory_grid.modules.items.entitites import Item, DropOffLocation -class Items(PositionMixin, Collection): +class Items(Collection): _entity = Item + @property + def var_has_position(self): + return False + @property def is_blocking_light(self): return False @@ -103,17 +107,25 @@ class Inventories(HasBoundMixin, _Objects): state[i.INVENTORY].spawn(state[c.AGENT]) -class DropOffLocations(PositionMixin, Collection): +class DropOffLocations(Collection): _entity = DropOffLocation @property - def is_blocking_light(self): + def var_is_blocking_light(self): return False @property - def can_collide(self): + def var_can_collide(self): return False + @property + def var_can_move(self): + return False + + @property + def var_has_position(self): + return True + def __init__(self, *args, **kwargs): super(DropOffLocations, self).__init__(*args, **kwargs) diff --git a/marl_factory_grid/modules/machines/groups.py b/marl_factory_grid/modules/machines/groups.py index 7d71617..1c70cc2 100644 --- a/marl_factory_grid/modules/machines/groups.py +++ b/marl_factory_grid/modules/machines/groups.py @@ -1,14 +1,23 @@ from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin from .entitites import Machine -class Machines(PositionMixin, Collection): +class Machines(Collection): _entity = Machine - is_blocking_light: bool = False - can_collide: bool = False + + @property + def var_can_collide(self): + return False + + @property + def var_is_blocking_light(self): + return False + + @property + def var_has_position(self): + return True def __init__(self, *args, **kwargs): super(Machines, self).__init__(*args, **kwargs) diff --git a/marl_factory_grid/modules/maintenance/groups.py b/marl_factory_grid/modules/maintenance/groups.py index 585c34e..e25704f 100644 --- a/marl_factory_grid/modules/maintenance/groups.py +++ b/marl_factory_grid/modules/maintenance/groups.py @@ -1,18 +1,28 @@ from marl_factory_grid.environment.groups.collection import Collection -from marl_factory_grid.environment.groups.mixins import PositionMixin from .entities import Maintainer from ..machines import constants as mc from ..machines.actions import MachineAction from ...utils.states import Gamestate -class Maintainers(PositionMixin, Collection): - +class Maintainers(Collection): _entity = Maintainer - var_can_collide = True - var_can_move = True - var_is_blocking_light = False - var_has_position = True + + @property + def var_can_collide(self): + return True + + @property + def var_can_move(self): + return True + + @property + def var_is_blocking_light(self): + return False + + @property + def var_has_position(self): + return True def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)