PheromonesManager.py 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from intelligine.core.exceptions import BestPheromoneHere, NoPheromone
  2. from intelligine.cst import PHEROMON_INFOS
  3. from intelligine.simulation.pheromone.PheromoneFlavour import PheromoneFlavour
  4. from intelligine.simulation.pheromone.Pheromone import Pheromone
  5. class PheromonesManager():
  6. def __init__(self, context):
  7. self._context = context
  8. def get_flavour(self, position):
  9. point_pheromones = self._context.metas.value.get(PHEROMON_INFOS,
  10. position,
  11. allow_empty=True,
  12. empty_value={})
  13. return PheromoneFlavour.new_from_raw_data(point_pheromones)
  14. def set_flavour(self, position, flavour):
  15. self._context.metas.value.set(PHEROMON_INFOS, position, flavour.get_raw_data())
  16. def get_pheromone(self, position, category, type, allow_empty=False):
  17. flavour = self.get_flavour(position)
  18. try:
  19. return flavour.get_pheromone(category, type)
  20. except NoPheromone:
  21. if allow_empty:
  22. return Pheromone()
  23. raise
  24. def increment_with_pheromone(self, position, apposed_pheromone):
  25. flavour = self.get_flavour(position)
  26. try:
  27. position_pheromone = flavour.get_pheromone(apposed_pheromone.get_category(), apposed_pheromone.get_type())
  28. except NoPheromone:
  29. position_pheromone = Pheromone(apposed_pheromone.get_category(),
  30. apposed_pheromone.get_type(),
  31. distance=apposed_pheromone.get_distance())
  32. position_pheromone.increment_intensity(apposed_pheromone.get_intensity())
  33. if apposed_pheromone.get_distance() < position_pheromone.get_distance():
  34. position_pheromone.set_distance(apposed_pheromone.get_distance())
  35. flavour.set_pheromone(position_pheromone)
  36. self.set_flavour(position, flavour)
  37. if apposed_pheromone.get_distance() > position_pheromone.get_distance():
  38. raise BestPheromoneHere(position_pheromone.get_distance())