diff options
Diffstat (limited to 'kennel/engine')
| -rw-r--r-- | kennel/engine/components/component.py | 1 | ||||
| -rw-r--r-- | kennel/engine/components/markov_transition_state.py | 24 | ||||
| -rw-r--r-- | kennel/engine/entities/cat.py | 14 | ||||
| -rw-r--r-- | kennel/engine/entities/entity.py | 1 | ||||
| -rw-r--r-- | kennel/engine/systems/markov_transition_state_system.py | 13 | ||||
| -rw-r--r-- | kennel/engine/systems/system.py | 3 |
6 files changed, 54 insertions, 2 deletions
diff --git a/kennel/engine/components/component.py b/kennel/engine/components/component.py index 9f56407..90506b9 100644 --- a/kennel/engine/components/component.py +++ b/kennel/engine/components/component.py @@ -5,6 +5,7 @@ from enum import Enum class ComponentType(str, Enum): POSITION = "POSITION" CONTROLLABLE = "CONTROLLABLE" + MARKOV = "MARKOV" class Component: diff --git a/kennel/engine/components/markov_transition_state.py b/kennel/engine/components/markov_transition_state.py new file mode 100644 index 0000000..cec8223 --- /dev/null +++ b/kennel/engine/components/markov_transition_state.py @@ -0,0 +1,24 @@ +from kennel.engine.components.component import Component, ComponentType + + +class MarkovTransitionState(Component): + def __init__( + self, + state_names: dict[int, str], + initial_state_vector: list[float], + transition_matrix: list[list[float]], + ): + # TODO: Poll rate per state? + # TODO: State being an enum instead of a vector, just choose max and map + self.state_names = state_names + self.state = initial_state_vector + self.transition_matrix = transition_matrix + + super().__init__(ComponentType.MARKOV) + + def get_max_state_name(self, state_vector: list[float]): + max_val = max(state_vector) + return self.state_names[state_vector.index(max_val)] + + def to_dict(self): + return {"state": self.get_max_state_name(self.state)} diff --git a/kennel/engine/entities/cat.py b/kennel/engine/entities/cat.py index 02fdb33..edcde37 100644 --- a/kennel/engine/entities/cat.py +++ b/kennel/engine/entities/cat.py @@ -1,6 +1,18 @@ +from kennel.engine.components.position import Position + +from .entity import Entity, EntityType + + +class Cat(Entity): + def __init__(self, id: str): + components = [Position(0, 0)] + + super().__init__(EntityType.CAT, id, components) + + # # # IDLE, FROLICKING, EEPY, ALERT, CHASING_CURSOR, CHASING_CAT, SCRATCHING, ITCHY -# state_stochastic_matrix = [ +# state_stochastic_matrix = [ [1, 0] # # IDLE # [0.5, 0.1, 0.1, 0.1, 0.1, 0.05, 0.05, 0], # # FROLICKING diff --git a/kennel/engine/entities/entity.py b/kennel/engine/entities/entity.py index d40ab19..30e325a 100644 --- a/kennel/engine/entities/entity.py +++ b/kennel/engine/entities/entity.py @@ -6,6 +6,7 @@ from kennel.engine.components.component import Component, ComponentType class EntityType(str, Enum): LASER = "LASER" + CAT = "CAT" class Entity: diff --git a/kennel/engine/systems/markov_transition_state_system.py b/kennel/engine/systems/markov_transition_state_system.py new file mode 100644 index 0000000..ad3de65 --- /dev/null +++ b/kennel/engine/systems/markov_transition_state_system.py @@ -0,0 +1,13 @@ +from kennel.engine.components.component import ComponentType +from kennel.engine.entities.entity import EntityManager +from kennel.engine.systems.system import System, SystemType +from kennel.engine.systems.network import NetworkSystem + + +class MarkovTransitionStateSystem(System): + def __init__(self, network_system: NetworkSystem): + super().__init__(SystemType.MARKOV) + + def update(self, entity_manager: EntityManager, delta_time: float): + entity_manager.get_entities_with_component(ComponentType.MARKOV) + return diff --git a/kennel/engine/systems/system.py b/kennel/engine/systems/system.py index e3ddb27..8c577a6 100644 --- a/kennel/engine/systems/system.py +++ b/kennel/engine/systems/system.py @@ -7,6 +7,7 @@ from kennel.engine.entities.entity import EntityManager class SystemType(str, Enum): NETWORK = "NETWORK" WORLD = "WORLD" + MARKOV = "MARKOV" class System: @@ -14,7 +15,7 @@ class System: self.system_type = system_type @abstractmethod - async def update(self, entity_manager: EntityManager, delta_time: float): + async def update(self, entity_manager: EntityManager, delta_time: float) -> None: pass |
