Blame view

src/core/pyros_django/agent/AgentA.py 6.83 KB
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
1
#!/usr/bin/env python3
997d4b8e   Etienne Pallier   AgentA et AgentX ...
2

997d4b8e   Etienne Pallier   AgentA et AgentX ...
3

a7887020   Etienne Pallier   GROSSE OPTIM : pl...
4
5
import sys
##import utils.Logger as L
997d4b8e   Etienne Pallier   AgentA et AgentX ...
6

a7887020   Etienne Pallier   GROSSE OPTIM : pl...
7
##from .Agent import Agent
5fd52e37   Etienne Pallier   bugfix import Age...
8
9
sys.path.append("..")
from agent.Agent import Agent, extract_parameters
997d4b8e   Etienne Pallier   AgentA et AgentX ...
10
11


a7887020   Etienne Pallier   GROSSE OPTIM : pl...
12
##log = L.setupLogger("AgentXTaskLogger", "AgentX")
997d4b8e   Etienne Pallier   AgentA et AgentX ...
13
14
15
16
17



class AgentA(Agent):

ff0550d2   Etienne Pallier   Multi-agents : Ag...
18
19
    # FOR TEST ONLY
    # Run this agent in simulator mode
c7318a4a   Etienne Pallier   Nouveau mode test...
20
    SIMULATOR_MODE = False
ff0550d2   Etienne Pallier   Multi-agents : Ag...
21
    # Run the assertion tests at the end
31e31f3b   Etienne Pallier   pyros.py peut lan...
22
    SIMULATOR_WITH_TEST = True
c7318a4a   Etienne Pallier   Nouveau mode test...
23
    #SIMULATOR_MAX_DURATION_SEC = None
d7c72772   Etienne Pallier   routine_process()...
24
    SIMULATOR_MAX_DURATION_SEC = 100
ff0550d2   Etienne Pallier   Multi-agents : Ag...
25
26
    # Who should I send commands to ?
    #SIMULATOR_COMMANDS_DEST = "myself"
1c18151d   Etienne Pallier   Multi-agents : Ag...
27
    SIMULATOR_COMMANDS_DEST = "AgentB"
ff0550d2   Etienne Pallier   Multi-agents : Ag...
28
    # Scenario to be executed
31e31f3b   Etienne Pallier   pyros.py peut lan...
29
30
31
32
    SIMULATOR_COMMANDS_LIST = [
        # Ask receiver to delete all its previous commands 
        "flush_commands",

ff0550d2   Etienne Pallier   Multi-agents : Ag...
33
        "go_active",
1c18151d   Etienne Pallier   Multi-agents : Ag...
34

454ecf1f   Etienne Pallier   bugfix flush_comm...
35
36
37
        # Because of this command, the receiver agent :
        # - will no more send any new command
        # - will only execute "generic" commands (and not the "specific" ones)
ff0550d2   Etienne Pallier   Multi-agents : Ag...
38
        "go_idle",
db13d8ac   Etienne Pallier   updates: go_idle ...
39

454ecf1f   Etienne Pallier   bugfix flush_comm...
40
        # Not executed (skipped) because receiver agent is now "idle"
1c18151d   Etienne Pallier   Multi-agents : Ag...
41
42
        #"specific0",

db13d8ac   Etienne Pallier   updates: go_idle ...
43
44
        # Because of this command, the receiver agent
        # will now be able to send new commands
ff0550d2   Etienne Pallier   Multi-agents : Ag...
45
        "go_active",
31e31f3b   Etienne Pallier   pyros.py peut lan...
46

03161a45   Etienne Pallier   Implémenté le "ab...
47
        # Executed because recipient agent is now "active"
31e31f3b   Etienne Pallier   pyros.py peut lan...
48
        "specific1",
03161a45   Etienne Pallier   Implémenté le "ab...
49
        # should abort previous command (specific1)
31e31f3b   Etienne Pallier   pyros.py peut lan...
50
51
        "abort",

03161a45   Etienne Pallier   Implémenté le "ab...
52
53
54
        # Executed completely because no abort
        "specific2",

31e31f3b   Etienne Pallier   pyros.py peut lan...
55
        # fully executed, result is 7
7d679ea0   Etienne Pallier   Commande EVAL ok
56
        "eval 4+3",
1c18151d   Etienne Pallier   Multi-agents : Ag...
57

ff0550d2   Etienne Pallier   Multi-agents : Ag...
58
59
60
61
        "go_idle",
        "exit",
    ]

997d4b8e   Etienne Pallier   AgentA et AgentX ...
62

1c18151d   Etienne Pallier   Multi-agents : Ag...
63

997d4b8e   Etienne Pallier   AgentA et AgentX ...
64
65
66
67
68
69
70
    """
    =================================================================
        FUNCTIONS RUN INSIDE MAIN THREAD
    =================================================================
    """

    # @override
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
71
    def __init__(self, name:str=None, config_filename=None, RUN_IN_THREAD=True):
997d4b8e   Etienne Pallier   AgentA et AgentX ...
72
        if name is None: name = self.__class__.__name__
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
73
        super().__init__(name, config_filename, RUN_IN_THREAD)
d467c6d8   Etienne Pallier   Optimisation log_...
74
        self._log.print(f"init done for {name}")
997d4b8e   Etienne Pallier   AgentA et AgentX ...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180

    # @override
    def init(self):
        super().init()
        # --- Set the mode according the startmode value
        ##agent_alias = self.__class__.__name__
        ##self.set_mode_from_config(agent_alias)

    '''
    # @override
    def load_config(self):
        super().load_config()
    '''

    '''
    # @override
    def update_survey(self):
        super().update_survey()
    '''

    '''
    # @override
    def get_next_command(self):
        return super().get_next_command()
    '''

    # @override
    def do_log(self):
        super().do_log()



    """
    =================================================================
        FUNCTIONS RUN INSIDE A SUB-THREAD (OR A PROCESS) (thread_*())
    =================================================================
    """

    # Define your own command step(s) here
    def cmd_step1(self, step:int):
        cmd = self._current_specific_cmd
        cmd.result = f"in step #{step}/{self._thread_total_steps_number}"
        cmd.save()
        """
        if self.RUN_IN_THREAD:
            print("(save from thread)")
            cmd.save()
        else:
            #@transaction.atomic
            print("(save from process)")
            with transaction.atomic():
                cmd.save()
                #Command.objects.select_for_update()
        """

    def cmd_step2(self, step:int):
        self.cmd_step1(step)
    def cmd_step3(self, step:int):
        self.cmd_step1(step)
    def cmd_step4(self, step:int):
        self.cmd_step1(step)

    """
    # @override
    def thread_exec_specific_cmd_step(self, step:int, sleep_time:float=1.0):
        self.thread_stop_if_asked()
        cmd = self._current_specific_cmd
        print(f">>>>> Thread (cmd {cmd.name}): step #{step}/5")
        self.sleep(sleep_time)
    """

    '''
    # @override
    def exec_specific_cmd_start(self, cmd:Command, from_thread=True):
        super().exec_specific_cmd_start(cmd, from_thread)
    '''


    # @override
    def thread_exec_specific_cmd_main(self):
        # This is optional
        self.thread_set_total_steps_number(5)

        # HERE, write your own scenario

        # scenario OK
        self.thread_exec_specific_cmd_step(1, self.cmd_step1, 1)
        self.thread_exec_specific_cmd_step(2, self.cmd_step2, 3)
        self.thread_exec_specific_cmd_step(3, self.cmd_step1, 5)
        self.thread_exec_specific_cmd_step(4, self.cmd_step3, 10)
        self.thread_exec_specific_cmd_step(5, self.cmd_step1, 4)
        # ... as many as you need

        """ autre scenario
        self.thread_exec_specific_cmd_step(1, self.cmd_step1, 1)
        self.thread_exec_specific_cmd_step(2, self.cmd_step2, 2)
        self.thread_exec_specific_cmd_step(3, self.cmd_step1, 2)
        self.thread_exec_specific_cmd_step(4, self.cmd_step3, 2)
        self.thread_exec_specific_cmd_step(5, self.cmd_step1, 3)
        """

    '''
    # @override
    def exec_specific_cmd_end(self, cmd:Command, from_thread=True):
        super().exec_specific_cmd_end(cmd, from_thread)
    '''
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
181

31e31f3b   Etienne Pallier   pyros.py peut lan...
182
    # @override
454ecf1f   Etienne Pallier   bugfix flush_comm...
183
    def simulator_test_results_main(self, commands):
31e31f3b   Etienne Pallier   pyros.py peut lan...
184
185
186
187
188
189
190
191
192
193
194
195
196
        nb_asserted = 0
        for cmd in commands:
            if cmd.name == "flush_commands":
                assert cmd.is_executed()
                nb_asserted+=1
            # 2 times
            if cmd.name == "go_active":
                assert cmd.is_executed()
                nb_asserted+=1
            # 2 times
            if cmd.name == "go_idle":
                assert cmd.is_executed()
                nb_asserted+=1
454ecf1f   Etienne Pallier   bugfix flush_comm...
197
198
199
200
201
202
            """
            if cmd.name == "specific0":
                assert cmd.is_skipped()
                assert cmd.result == "in step #5/5"
                nb_asserted+=1
            """
31e31f3b   Etienne Pallier   pyros.py peut lan...
203
            if cmd.name == "specific1":
03161a45   Etienne Pallier   Implémenté le "ab...
204
205
206
                assert cmd.is_killed()
                nb_asserted+=1
            if cmd.name == "specific2":
31e31f3b   Etienne Pallier   pyros.py peut lan...
207
208
209
210
211
212
213
214
215
216
217
218
219
                assert cmd.is_executed()
                assert cmd.result == "in step #5/5"
                nb_asserted+=1
            if cmd.name == "eval 4+3":
                assert cmd.is_executed()
                assert cmd.get_result() == "7"
                nb_asserted+=1
            if cmd.name in ("abort"):
                assert cmd.is_executed()
                nb_asserted+=1
            if cmd.name in ("exit"):
                assert cmd.is_executed()
                nb_asserted+=1
454ecf1f   Etienne Pallier   bugfix flush_comm...
220
        return nb_asserted
31e31f3b   Etienne Pallier   pyros.py peut lan...
221
222
223
224
225
226
227


"""
=================================================================
    MAIN FUNCTION
=================================================================
"""
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
228
if __name__ == "__main__":
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
229
230
231
    # with thread
    RUN_IN_THREAD=True
    # with process
31e31f3b   Etienne Pallier   pyros.py peut lan...
232
    #RUN_IN_THREAD=False
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
233

c7318a4a   Etienne Pallier   Nouveau mode test...
234
235
    TEST_MODE, configfile = extract_parameters()
    """
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
236
    configfile = None
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
237
238
239
    # arg 1 : config file
    if len(sys.argv) == 2:
        configfile = sys.argv[1]
c7318a4a   Etienne Pallier   Nouveau mode test...
240
    """
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
241
242
    #agent = AgentX()
    agent = AgentA("AgentA", configfile, RUN_IN_THREAD)
c7318a4a   Etienne Pallier   Nouveau mode test...
243
    agent.setSimulatorMode(TEST_MODE)
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
244
245
    print(agent)
    agent.run()