39 lines
1.5 KiB
Python
39 lines
1.5 KiB
Python
"""Core of the PrimAITE Simulator."""
|
|
from abc import abstractmethod
|
|
from typing import Dict, List
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class SimComponent(BaseModel):
|
|
"""Extension of pydantic BaseModel with additional methods that must be defined by all classes in the simulator."""
|
|
|
|
@abstractmethod
|
|
def describe_state(self) -> Dict:
|
|
"""
|
|
Return a dictionary describing the state of this object and any objects managed by it.
|
|
|
|
This is similar to pydantic ``model_dump()``, but it only outputs information about the objects owned by this
|
|
object. If there are objects referenced by this object that are owned by something else, it is not included in
|
|
this output.
|
|
"""
|
|
return {}
|
|
|
|
@abstractmethod
|
|
def apply_action(self, action: List[str]) -> None:
|
|
"""
|
|
Apply an action to a simulation component. Action data is passed in as a 'namespaced' list of strings.
|
|
|
|
If the list only has one element, the action is intended to be applied directly to this object. If the list has
|
|
multiple entries, the action is passed to the child of this object specified by the first one or two entries.
|
|
This is essentially a namespace.
|
|
|
|
For example, ["turn_on",] is meant to apply an action of 'turn on' to this component.
|
|
|
|
However, ["services", "email_client", "turn_on"] is meant to 'turn on' this component's email client service.
|
|
|
|
:param action: List describing the action to apply to this object.
|
|
:type action: List[str]
|
|
"""
|
|
return
|