mirror of
				https://github.com/illiumst/marl-factory-grid.git
				synced 2025-10-31 04:37:25 +01:00 
			
		
		
		
	all vars are properties, removed comments
This commit is contained in:
		| @@ -80,7 +80,7 @@ General: | ||||
|     level_name: rooms  # 'double', 'large', 'simple', ... | ||||
| ``` | ||||
| ... or create your own , maybe with the help of [asciiflow.com](https://asciiflow.com/#/). | ||||
| Make sure to use `#` as [Walls](marl_factory_grid/environment/entity/wall_floor.py), `-` as free (walkable) [Floor](marl_factory_grid/environment/entity/wall_floor.py)-Tiles, `D` for [Walls](./modules/doors/entities.py). | ||||
| Make sure to use `#` as [Walls](marl_factory_grid/environment/entity/wall.py), `-` as free (walkable) [Floor](marl_factory_grid/environment/entity/wall.py)-Tiles, `D` for [Walls](./modules/doors/entities.py). | ||||
| Other Entites (define you own) may bring their own `Symbols` | ||||
|  | ||||
| #### Entites | ||||
|   | ||||
| @@ -5,10 +5,8 @@ import numpy as np | ||||
|  | ||||
| from .object import Object | ||||
| from .. import constants as c | ||||
| from .object import EnvObject | ||||
| from ...utils.utility_classes import RenderEntity | ||||
| from ...utils.render import RenderEntity | ||||
| from ...utils.results import ActionResult | ||||
| from ...utils.utility_classes import RenderEntity | ||||
|  | ||||
|  | ||||
| class Entity(Object, abc.ABC): | ||||
| @@ -152,7 +150,6 @@ class Entity(Object, abc.ABC): | ||||
|         pos = tuple(pos) | ||||
|         try: | ||||
|             return self.state.entities.pos_dict[pos] | ||||
|             # return next(e for e in self if e.pos == pos) | ||||
|         except StopIteration: | ||||
|             pass | ||||
|         except ValueError: | ||||
|   | ||||
| @@ -13,7 +13,7 @@ class Object: | ||||
|         return True | ||||
|  | ||||
|     @property | ||||
|     def var_has_position(self):  # brauchen wir das hier jetzt? | ||||
|     def var_has_position(self): | ||||
|         try: | ||||
|             return self.pos != c.VALUE_NO_POS or False | ||||
|         except AttributeError: | ||||
|   | ||||
							
								
								
									
										31
									
								
								marl_factory_grid/environment/entity/wall.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								marl_factory_grid/environment/entity/wall.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| 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_can_collide(self): | ||||
|         return True | ||||
|  | ||||
|     @property | ||||
|     def encoding(self): | ||||
|         return c.VALUE_OCCUPIED_CELL | ||||
|  | ||||
|     def render(self): | ||||
|         return RenderEntity(c.WALL, self.pos) | ||||
|  | ||||
|     @property | ||||
|     def var_is_blocking_pos(self): | ||||
|         return True | ||||
|  | ||||
|     @property | ||||
|     def var_is_blocking_light(self): | ||||
|         return True | ||||
| @@ -1,121 +0,0 @@ | ||||
| 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 Floor(EnvObject): | ||||
|  | ||||
|     @property | ||||
|     def var_has_position(self): | ||||
|         return True | ||||
|  | ||||
|     @property | ||||
|     def var_can_collide(self): | ||||
|         return False | ||||
|  | ||||
|     @property | ||||
|     def var_can_move(self): | ||||
|         return False | ||||
|  | ||||
|     @property | ||||
|     def var_is_blocking_pos(self): | ||||
|         return False | ||||
|  | ||||
|     @property | ||||
|     def var_is_blocking_light(self): | ||||
|         return False | ||||
|  | ||||
|     @property | ||||
|     def encoding(self): | ||||
|         return c.VALUE_OCCUPIED_CELL | ||||
|  | ||||
|     # @property | ||||
|     # def guests_that_can_collide(self): | ||||
|     #     return [x for x in self.guests if x.var_can_collide] | ||||
|  | ||||
|     @property | ||||
|     def guests(self): | ||||
|         return self._guests.values() | ||||
|  | ||||
|     @property | ||||
|     def x(self): | ||||
|         return self.pos[0] | ||||
|  | ||||
|     @property | ||||
|     def y(self): | ||||
|         return self.pos[1] | ||||
|  | ||||
|     @property | ||||
|     def is_blocked(self): | ||||
|         return any([x.var_is_blocking_pos for x in self.guests]) | ||||
|  | ||||
|     def __init__(self, pos, **kwargs): | ||||
|         super(Floor, self).__init__(**kwargs) | ||||
|         self._guests = dict() | ||||
|         self.pos = tuple(pos) | ||||
|         self._neighboring_floor: List[Floor] = list() | ||||
|         self._blocked_by = None | ||||
|  | ||||
|     def __len__(self): | ||||
|         return len(self._guests) | ||||
|  | ||||
|     def is_empty(self): | ||||
|         return not len(self._guests) | ||||
|  | ||||
|     def is_occupied(self): | ||||
|         return bool(len(self._guests)) | ||||
|  | ||||
|     def enter(self, guest, spawn=False): | ||||
|         same_pos = guest.name not in self._guests | ||||
|         not_blocked = not self.is_blocked | ||||
|         no_become_blocked_when_occupied = not (guest.var_is_blocking_pos and self.is_occupied()) | ||||
|         not_introduce_collision = not (spawn and guest.var_can_collide and any(x.var_can_collide for x in self.guests)) | ||||
|         if same_pos and not_blocked and no_become_blocked_when_occupied and not_introduce_collision: | ||||
|             self._guests.update({guest.name: guest}) | ||||
|             return c.VALID | ||||
|         else: | ||||
|             return c.NOT_VALID | ||||
|  | ||||
|     def leave(self, guest): | ||||
|         try: | ||||
|             del self._guests[guest.name] | ||||
|         except (ValueError, KeyError): | ||||
|             return c.NOT_VALID | ||||
|         return c.VALID | ||||
|  | ||||
|     def __repr__(self): | ||||
|         return f'{self.name}(@{self.pos})' | ||||
|  | ||||
|     def summarize_state(self, **_): | ||||
|         return dict(name=self.name, x=int(self.x), y=int(self.y)) | ||||
|  | ||||
|     def render(self): | ||||
|         return None | ||||
|  | ||||
|  | ||||
| class Wall(Entity): | ||||
|  | ||||
|     @property | ||||
|     def var_can_collide(self): | ||||
|         return True | ||||
|  | ||||
|     @property | ||||
|     def encoding(self): | ||||
|         return c.VALUE_OCCUPIED_CELL | ||||
|  | ||||
|     def render(self): | ||||
|         return RenderEntity(c.WALL, self.pos) | ||||
|  | ||||
|     @property | ||||
|     def var_is_blocking_pos(self): | ||||
|         return True | ||||
|  | ||||
|     @property | ||||
|     def var_is_blocking_light(self): | ||||
|         return True | ||||
| @@ -4,13 +4,29 @@ from marl_factory_grid.environment.entity.object import EnvObject | ||||
|  | ||||
| class Collection(Objects): | ||||
|     _entity = EnvObject | ||||
|     var_is_blocking_light: bool = False | ||||
|     var_can_collide: bool = False | ||||
|     var_can_move: bool = False | ||||
|  | ||||
|     var_has_position: bool = False  # alles was posmixin hat true | ||||
|     var_has_bound = False  # batteries, globalpos, inventories true | ||||
|     var_can_be_bound: 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 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 | ||||
|     def var_can_be_bound(self): | ||||
|         return False | ||||
|  | ||||
|     @property | ||||
|     def encodings(self): | ||||
|   | ||||
| @@ -33,9 +33,6 @@ class Entities(Objects): | ||||
|         self.pos_dict = defaultdict(list) | ||||
|         super().__init__() | ||||
|  | ||||
|     # def all_floors(self): | ||||
|     #     return[key for key, val in self.pos_dict.items() if any('floor' in x.name.lower() for x in val)] | ||||
|  | ||||
|     def guests_that_can_collide(self, pos): | ||||
|         return[x for val in self.pos_dict[pos] for x in val if x.var_can_collide] | ||||
|  | ||||
| @@ -91,8 +88,6 @@ class Entities(Objects): | ||||
|  | ||||
|     def by_pos(self, pos: (int, int)): | ||||
|         return self.pos_dict[pos] | ||||
|         # found_entities = [y for y in (x.by_pos(pos) for x in self.values() if hasattr(x, 'by_pos')) if y is not None] | ||||
|         # return found_entities | ||||
|  | ||||
|     @property | ||||
|     def positions(self): | ||||
|   | ||||
| @@ -1,10 +1,7 @@ | ||||
| from typing import List, Tuple | ||||
|  | ||||
| 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.wall_floor import Floor | ||||
|  | ||||
|  | ||||
| class PositionMixin: | ||||
| @@ -39,7 +36,6 @@ class PositionMixin: | ||||
|         pos = tuple(pos) | ||||
|         try: | ||||
|             return self.pos_dict[pos] | ||||
|             # return next(e for e in self if e.pos == pos) | ||||
|         except StopIteration: | ||||
|             pass | ||||
|         except ValueError: | ||||
|   | ||||
| @@ -54,7 +54,6 @@ class Objects: | ||||
|         assert self._data[item.name] is None, f'{item.name} allready exists!!!' | ||||
|         self._data.update({item.name: item}) | ||||
|         item.set_collection(self) | ||||
|         # self.notify_add_entity(item) | ||||
|         for observer in self.observers: | ||||
|             observer.notify_add_entity(item) | ||||
|         return self | ||||
|   | ||||
| @@ -1,10 +1,7 @@ | ||||
| import random | ||||
| from typing import List, Tuple | ||||
|  | ||||
| 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 | ||||
| from marl_factory_grid.environment.entity.wall_floor import Wall, Floor | ||||
|  | ||||
|  | ||||
| class Walls(PositionMixin, Collection): | ||||
| @@ -28,16 +25,3 @@ class Walls(PositionMixin, Collection): | ||||
|             return super().by_pos(pos)[0] | ||||
|         except IndexError: | ||||
|             return None | ||||
|  | ||||
|  | ||||
| class Floors(Walls): | ||||
|     _entity = Floor | ||||
|     symbol = c.SYMBOL_FLOOR | ||||
|     var_is_blocking_light: bool = False | ||||
|     var_can_collide: bool = False | ||||
|  | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         super(Floors, self).__init__(*args, **kwargs) | ||||
|         self._value = c.VALUE_FREE_CELL | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
| from typing import NamedTuple, Union | ||||
|  | ||||
| # Battery Env | ||||
| CHARGE_PODS          = 'ChargePods' | ||||
| BATTERIES            = 'Batteries' | ||||
|   | ||||
| @@ -1,10 +1,8 @@ | ||||
| from marl_factory_grid.environment.entity.mixin import BoundEntityMixin | ||||
| from marl_factory_grid.environment.entity.object import EnvObject, Object | ||||
| from marl_factory_grid.environment.entity.entity import Entity | ||||
| from marl_factory_grid.environment import constants as c | ||||
| from marl_factory_grid.utils.utility_classes import RenderEntity | ||||
|  | ||||
| from marl_factory_grid.environment.entity.entity import Entity | ||||
| from marl_factory_grid.environment.entity.object import Object | ||||
| from marl_factory_grid.modules.batteries import constants as b | ||||
| from marl_factory_grid.utils.utility_classes import RenderEntity | ||||
|  | ||||
|  | ||||
| class Battery(Object): | ||||
| @@ -70,7 +68,6 @@ class Pod(Entity): | ||||
|     def charge_battery(self, battery: Battery): | ||||
|         if battery.charge_level == 1.0: | ||||
|             return c.NOT_VALID | ||||
|         # if sum(guest for guest in self.tile.guests if 'agent' in guest.name.lower()) > 1: | ||||
|         if sum(1 for key, val in self.state.entities.pos_dict[self.pos] for guest in val if | ||||
|                'agent' in guest.name.lower()) > 1: | ||||
|             return c.NOT_VALID | ||||
|   | ||||
| @@ -45,10 +45,6 @@ class DirtPiles(PositionMixin, Collection): | ||||
|     def trigger_dirt_spawn(self, state, initial_spawn=False) -> bool: | ||||
|         free_for_dirt = [x for x in state.entities.floorlist if len(state.entities.pos_dict[x]) == 1 or ( | ||||
|                     len(state.entities.pos_dict[x]) == 2 and isinstance(next(y for y in x), DirtPile))] | ||||
|         # free_for_dirt = [x for x in state[c.FLOOR] | ||||
|         #                  if len(x.guests) == 0 or ( | ||||
|         #                          len(x.guests) == 1 and | ||||
|         #                          isinstance(next(y for y in x.guests), DirtPile))] | ||||
|         state.rng.shuffle(free_for_dirt) | ||||
|  | ||||
|         var = self.dirt_spawn_r_var | ||||
|   | ||||
| @@ -54,7 +54,7 @@ class DirtSmearOnMove(Rule): | ||||
|             if is_move(entity.state.identifier) and entity.state.validity == c.VALID: | ||||
|                 if old_pos_dirt := state[d.DIRT].by_pos(entity.last_pos): | ||||
|                     if smeared_dirt := round(old_pos_dirt.amount * self.smear_amount, 2): | ||||
|                         if state[d.DIRT].spawn(entity.pos, amount=smeared_dirt):            # pos statt tile | ||||
|                         if state[d.DIRT].spawn(entity.pos, amount=smeared_dirt): | ||||
|                             results.append(TickResult(identifier=self.name, entity=entity, | ||||
|                                                       reward=0, validity=c.VALID)) | ||||
|         return results | ||||
|   | ||||
| @@ -1,11 +1,10 @@ | ||||
| from collections import defaultdict | ||||
|  | ||||
| from marl_factory_grid.environment import constants as c | ||||
| from marl_factory_grid.environment.entity.agent import Agent | ||||
| from marl_factory_grid.environment.entity.entity import Entity | ||||
| from marl_factory_grid.environment import constants as c | ||||
| from marl_factory_grid.environment.entity.mixin import BoundEntityMixin | ||||
| from marl_factory_grid.utils.utility_classes import RenderEntity | ||||
| from marl_factory_grid.modules.destinations import constants as d | ||||
| from marl_factory_grid.utils.utility_classes import RenderEntity | ||||
|  | ||||
|  | ||||
| class Destination(Entity): | ||||
|   | ||||
| @@ -84,14 +84,12 @@ class Maintainer(Entity): | ||||
|     def _door_is_close(self, state): | ||||
|         state.print("Found a door that is close.") | ||||
|         try: | ||||
|             # return next(y for x in self.tile.neighboring_floor for y in x.guests if do.DOOR in y.name) | ||||
|             return next(y for x in state.entities.neighboring_positions(self.state.pos) for y in state.entities.pos_dict[x] if do.DOOR in y.name) | ||||
|         except StopIteration: | ||||
|             return None | ||||
|  | ||||
|     def _predict_move(self, state): | ||||
|         next_pos = self._path[0] | ||||
|         # if len(state[c.FLOORS].by_pos(next_pos).guests_that_can_collide) > 0: | ||||
|         if any(x for x in state.entities.pos_dict[next_pos] if x.var_can_collide) > 0: | ||||
|             action = c.NOOP | ||||
|         else: | ||||
|   | ||||
| @@ -1,14 +1,10 @@ | ||||
| from typing import List | ||||
|  | ||||
| from .entities import Maintainer | ||||
| from marl_factory_grid.environment.entity.wall_floor import Floor | ||||
| 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 | ||||
|  | ||||
| from ..machines import constants as mc | ||||
|  | ||||
|  | ||||
| class Maintainers(PositionMixin, Collection): | ||||
|  | ||||
|   | ||||
| @@ -1,12 +1,7 @@ | ||||
| import random | ||||
| from typing import List, Tuple | ||||
|  | ||||
| from marl_factory_grid.environment.entity.entity import Entity | ||||
| from marl_factory_grid.environment.entity.object import Object | ||||
| from marl_factory_grid.utils.utility_classes import RenderEntity | ||||
| from marl_factory_grid.environment import constants as c | ||||
|  | ||||
| from marl_factory_grid.modules.doors import constants as d | ||||
|  | ||||
|  | ||||
| class Zone(Object): | ||||
|   | ||||
| @@ -57,7 +57,7 @@ class Gamestate(object): | ||||
|  | ||||
|     @property | ||||
|     def moving_entites(self): | ||||
|         return [y for x in self.entities for y in x if x.var_can_move]  # wird das aus dem String gelesen? | ||||
|         return [y for x in self.entities for y in x if x.var_can_move] | ||||
|  | ||||
|     def __init__(self, entities, agents_conf, rules: Dict[str, dict], env_seed=69, verbose=False): | ||||
|         self.entities = entities | ||||
| @@ -110,15 +110,12 @@ class Gamestate(object): | ||||
|                 results.extend(on_check_done_result) | ||||
|         return results | ||||
|  | ||||
|  | ||||
|     def get_all_pos_with_collisions(self) -> List[Tuple[(int, int)]]: | ||||
|         positions = [pos for pos, entity_list_for_position in self.entities.pos_dict.items() | ||||
|                      if any([e.var_can_collide for e in entity_list_for_position])] | ||||
|         return positions | ||||
|  | ||||
|     def check_move_validity(self, moving_entity, position): | ||||
|         #         if (guest.name not in self._guests and not self.is_blocked) | ||||
|         #         and not (guest.var_is_blocking_pos and self.is_occupied()): | ||||
|         if moving_entity.pos != position and not any( | ||||
|                 entity.var_is_blocking_pos for entity in self.entities.pos_dict[position]) and not ( | ||||
|                 moving_entity.var_is_blocking_pos and self.entities.is_occupied(position)): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Chanumask
					Chanumask