Evaporation.py 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from intelligine.cst import MOLECULES, MOLECULES_DIRECTION
  2. from intelligine.synergy.stigmergy.MoleculesManager import MoleculesManager
  3. class Evaporation:
  4. def __init__(self, context,
  5. intensity_decrement=1,
  6. molecule_minimum_age=0,
  7. molecules_exclude_types=None,
  8. molecules_include_types=None):
  9. self._context = context
  10. self._intensity_decrement = intensity_decrement
  11. self._molecules_manager = MoleculesManager(context)
  12. self._molecule_minimum_age = molecule_minimum_age
  13. self._molecules_exclude_types = molecules_exclude_types
  14. self._molecules_include_types = molecules_include_types
  15. def evaporate(self):
  16. for position, flavour in self._get_flavours():
  17. self._decrease_flavour(flavour)
  18. self._molecules_manager.set_flavour(position, flavour)
  19. def remove(self):
  20. for position, flavour in self._get_flavours():
  21. self._remove_molecule(flavour)
  22. self._molecules_manager.set_flavour(position, flavour)
  23. def _get_flavours(self):
  24. molecules_points = self._context.metas.list.get(MOLECULES, MOLECULES, allow_empty=True)
  25. for molecule_point in molecules_points:
  26. yield molecule_point, self._molecules_manager.get_flavour(molecule_point)
  27. def _decrease_flavour(self, flavour):
  28. for direction_molecule in self._get_molecules_from_flavour(flavour):
  29. direction_molecule.increment_intensity(-self._intensity_decrement)
  30. flavour.set_molecule(direction_molecule)
  31. def _get_molecules_from_flavour(self, flavour):
  32. molecules = []
  33. for direction_molecule in flavour.get_molecules(MOLECULES_DIRECTION):
  34. if not self._is_recent_molecule(direction_molecule) \
  35. and not self._is_excluded_molecule_type(direction_molecule):
  36. molecules.append(direction_molecule)
  37. return molecules
  38. def _remove_molecule(self, flavour):
  39. for direction_molecule in self._get_molecules_from_flavour(flavour):
  40. flavour.remove_molecule(direction_molecule)
  41. def _is_recent_molecule(self, molecule):
  42. return (self._context.get_cycle() - molecule.get_cycle_age()) < self._molecule_minimum_age
  43. def _is_excluded_molecule_type(self, molecule):
  44. if not self._molecules_exclude_types and not self._molecules_include_types:
  45. return False
  46. if self._molecules_exclude_types and not self._molecules_include_types:
  47. return molecule.get_type() in self._molecules_exclude_types
  48. if not self._molecules_exclude_types and self._molecules_include_types:
  49. return molecule.get_type() not in self._molecules_include_types