PheromonesManager.py 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. current_check = point_pheromones
  15. for prepare_key in prepare:
  16. if prepare_key not in current_check:
  17. current_check[prepare_key] = {}
  18. current_check = current_check[prepare_key]
  19. return point_pheromones
  20. def set_flavour(self, position, flavour):
  21. self._context.metas.value.set(PHEROMON_INFOS, position, flavour.get_raw_data())
  22. def get_pheromone(self, position, category, type, allow_empty=False, empty_value=None):
  23. # TODO: empty_value as du sens ?
  24. flavour = self.get_flavour(position)
  25. try:
  26. return flavour.get_pheromone(category, type)
  27. except NoPheromone:
  28. if allow_empty:
  29. return Pheromone()
  30. raise
  31. pheromone = pheromones
  32. for key in address[:-1]:
  33. pheromone = pheromone[key]
  34. if address[-1] not in pheromone:
  35. if allow_empty:
  36. pheromone[address[-1]] = empty_value
  37. else:
  38. raise KeyError()
  39. return pheromone[address[-1]]
  40. def increment_with_pheromone(self, position, apposed_pheromone):
  41. flavour = self.get_flavour(position)
  42. try:
  43. position_pheromone = flavour.get_pheromone(apposed_pheromone.get_category(), apposed_pheromone.get_type())
  44. except NoPheromone:
  45. position_pheromone = Pheromone(apposed_pheromone.get_category(),
  46. apposed_pheromone.get_type(),
  47. distance=apposed_pheromone.get_distance())
  48. position_pheromone.increment_intensity(apposed_pheromone.get_intensity())
  49. if apposed_pheromone.get_distance() < position_pheromone.get_distance():
  50. position_pheromone.set_distance(apposed_pheromone.get_distance())
  51. flavour.set_pheromone(position_pheromone)
  52. self.set_flavour(position, flavour)
  53. if apposed_pheromone.get_distance() > position_pheromone.get_distance():
  54. raise BestPheromoneHere(position_pheromone.get_distance())