Source code for metawards.movers._moverecord

from __future__ import annotations

from array import array as _array

from .._network import PersonType

__all__ = ["MoveRecord"]


[docs]class MoveRecord: """This class holds a record of mover-initiated moves. This could be used, to reverse moves, e.g. to send individuals back from home hospital, or to send individuals back home from holiday """
[docs] def __init__(self): self._record = []
[docs] def add(self, from_stage: int, to_stage: int, from_type: PersonType, to_type: PersonType, from_ward: int, to_ward: int, from_demographic: int = 0, to_demographic: int = 0, number: int = 1): """Record the move from the specified demographic, stage type and ward to the specified demographic, stage, type and ward, recording the number of individuals who made this move. If the type is PLAYER, then the ward is the ward index If the type is WORKER, then the ward is the link index """ r = _array("i", (int(from_demographic), int(from_stage), int(from_type.value), int(from_ward), int(to_demographic), int(to_stage), int(to_type.value), int(to_ward), int(number))) self._record.append(r)
def __len__(self): return len(self._record) def __getitem__(self, i: int) -> _array: return self._record[i]
[docs] def __str__(self): return f"MoveRecord(count={len(self)})"
[docs] def invert(self) -> MoveRecord: """Return a copy of this record with the moves inverted - i.e. a move of X -> Y of 10 individuals will become a move from Y -> X of 10 individuals. Use this, together with MoveGenerator, to reverse moves """ inverted = MoveRecord() for r in self._record: (from_demographic, from_stage, from_type, from_ward, to_demographic, to_stage, to_type, to_ward, number) = r inverted.add(from_demographic=to_demographic, from_stage=to_stage, from_type=PersonType(to_type), from_ward=to_ward, to_demographic=from_demographic, to_stage=from_stage, to_type=PersonType(from_type), to_ward=from_ward, number=number) return inverted