Blame view

src/core/pyros_django/agent/AgentA.py 6.91 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
sys.path.append("..")
71b8533d   Etienne Pallier   update agentA, ag...
9
from agent.Agent import Agent, build_agent
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
71b8533d   Etienne Pallier   update agentA, ag...
20
    TEST_MODE = False
ff0550d2   Etienne Pallier   Multi-agents : Ag...
21
    # Run the assertion tests at the end
71b8533d   Etienne Pallier   update agentA, ag...
22
23
24
    TEST_WITH_FINAL_TEST = True
    #TEST_MAX_DURATION_SEC = None
    TEST_MAX_DURATION_SEC = 100
ff0550d2   Etienne Pallier   Multi-agents : Ag...
25
    # Who should I send commands to ?
71b8533d   Etienne Pallier   update agentA, ag...
26
27
    #TEST_COMMANDS_DEST = "myself"
    TEST_COMMANDS_DEST = "AgentB"
ff0550d2   Etienne Pallier   Multi-agents : Ag...
28
    # Scenario to be executed
71b8533d   Etienne Pallier   update agentA, ag...
29
    TEST_COMMANDS_LIST = [
31e31f3b   Etienne Pallier   pyros.py peut lan...
30
31
32
        # 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
71b8533d   Etienne Pallier   update agentA, ag...
71
72
73
74
75
76
77
    #def __init__(self, name:str=None, config_filename=None, RUN_IN_THREAD=True):
    def __init__(self, config_filename=None, RUN_IN_THREAD=True):
        ##if name is None: name = self.__class__.__name__
        #super().__init__(name, config_filename, RUN_IN_THREAD)
        super().__init__(config_filename, RUN_IN_THREAD)
        #self._log.print(f"init done for {name}")
        self._log.print("init done")
997d4b8e   Etienne Pallier   AgentA et AgentX ...
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
181
182
183

    # @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...
184

31e31f3b   Etienne Pallier   pyros.py peut lan...
185
    # @override
454ecf1f   Etienne Pallier   bugfix flush_comm...
186
    def simulator_test_results_main(self, commands):
31e31f3b   Etienne Pallier   pyros.py peut lan...
187
188
189
190
191
192
193
194
195
196
197
198
199
        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...
200
201
202
203
204
205
            """
            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...
206
            if cmd.name == "specific1":
03161a45   Etienne Pallier   Implémenté le "ab...
207
208
209
                assert cmd.is_killed()
                nb_asserted+=1
            if cmd.name == "specific2":
31e31f3b   Etienne Pallier   pyros.py peut lan...
210
211
212
213
214
215
216
217
218
219
220
221
222
                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...
223
        return nb_asserted
31e31f3b   Etienne Pallier   pyros.py peut lan...
224
225
226
227
228
229
230


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

71b8533d   Etienne Pallier   update agentA, ag...
237
238
239
    agent = build_agent(AgentA, RUN_IN_THREAD=RUN_IN_THREAD)

    '''
c7318a4a   Etienne Pallier   Nouveau mode test...
240
    TEST_MODE, configfile = extract_parameters()
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
    print(agent)
71b8533d   Etienne Pallier   update agentA, ag...
245
    '''
a7887020   Etienne Pallier   GROSSE OPTIM : pl...
246
    agent.run()