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