Skip to content

swarmrl.force_functions.force_fn Module API Reference

Espresso interaction model capable of handling a neural network as a function.

ForceFunction

Class to bridge agents with an engine.

Source code in swarmrl/force_functions/force_fn.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class ForceFunction:
    """
    Class to bridge agents with an engine.
    """

    _kill_switch: bool = False

    def __init__(
        self,
        agents: dict,
    ):
        """
        Constructor for the NNModel.

        Parameters
        ----------
        agents : dict
            Agents used in the simulations.
        """
        super().__init__()
        self.agents = agents

        # Used in the data saving.
        self.particle_types = [type_ for type_ in self.agents]

    @property
    def kill_switch(self):
        """
        If true, kill the simulation.
        """
        return self._kill_switch

    @kill_switch.setter
    def kill_switch(self, value):
        """
        Set the kill switch.
        """
        self._kill_switch = value

    def calc_action(self, colloids: typing.List[Colloid]) -> typing.List[Action]:
        """
        Compute the state of the system based on the current colloid position.

        In the case of the ML models, this method undertakes the following steps:

        1. Compute observable
        2. Compute action probabilities
        3. Compute action

        Returns
        -------
        action: Action
                Return the action the colloid should take.
        kill_switch : bool
                Flag capable of ending simulation.
        """
        # Prepare the data storage.
        actions = {int(np.copy(colloid.id)): Action() for colloid in colloids}
        switches = []

        # Loop over particle types and compute actions.
        for agent in self.agents:
            computed_actions = self.agents[agent].calc_action(colloids=colloids)
            switches.append(self.agents[agent].kill_switch)

            count = 0  # Count the colloids of a specific species.
            for colloid in colloids:
                if str(colloid.type) == agent:
                    actions[colloid.id] = computed_actions[count]
                    count += 1

        self.kill_switch = any(switches)

        return list(actions.values())

kill_switch property writable

If true, kill the simulation.

__init__(agents)

Constructor for the NNModel.

Parameters

agents : dict Agents used in the simulations.

Source code in swarmrl/force_functions/force_fn.py
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def __init__(
    self,
    agents: dict,
):
    """
    Constructor for the NNModel.

    Parameters
    ----------
    agents : dict
        Agents used in the simulations.
    """
    super().__init__()
    self.agents = agents

    # Used in the data saving.
    self.particle_types = [type_ for type_ in self.agents]

calc_action(colloids)

Compute the state of the system based on the current colloid position.

In the case of the ML models, this method undertakes the following steps:

  1. Compute observable
  2. Compute action probabilities
  3. Compute action
Returns

action: Action Return the action the colloid should take. kill_switch : bool Flag capable of ending simulation.

Source code in swarmrl/force_functions/force_fn.py
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
def calc_action(self, colloids: typing.List[Colloid]) -> typing.List[Action]:
    """
    Compute the state of the system based on the current colloid position.

    In the case of the ML models, this method undertakes the following steps:

    1. Compute observable
    2. Compute action probabilities
    3. Compute action

    Returns
    -------
    action: Action
            Return the action the colloid should take.
    kill_switch : bool
            Flag capable of ending simulation.
    """
    # Prepare the data storage.
    actions = {int(np.copy(colloid.id)): Action() for colloid in colloids}
    switches = []

    # Loop over particle types and compute actions.
    for agent in self.agents:
        computed_actions = self.agents[agent].calc_action(colloids=colloids)
        switches.append(self.agents[agent].kill_switch)

        count = 0  # Count the colloids of a specific species.
        for colloid in colloids:
            if str(colloid.type) == agent:
                actions[colloid.id] = computed_actions[count]
                count += 1

    self.kill_switch = any(switches)

    return list(actions.values())