Commit a8cce62b86263ecbc7ee1f6c05fe3da641dd9bfe

Authored by Alain Klotz
1 parent 0e1d4d92
Exists in dev

Json bdd and scheduler

src/core/pyros_django/scheduling/A_Scheduler.py
@@ -39,6 +39,7 @@ for short_path in short_paths: @@ -39,6 +39,7 @@ for short_path in short_paths:
39 from src.core.pyros_django.majordome.agent.Agent import Agent, build_agent, log, parse_args 39 from src.core.pyros_django.majordome.agent.Agent import Agent, build_agent, log, parse_args
40 from seq_submit.models import Sequence 40 from seq_submit.models import Sequence
41 from user_mgmt.models import Period, ScientificProgram, SP_Period 41 from user_mgmt.models import Period, ScientificProgram, SP_Period
  42 +from scheduling.models import PredictiveSchedule, EffectiveSchedule
42 # = Specials 43 # = Specials
43 import glob 44 import glob
44 import shutil 45 import shutil
@@ -85,7 +86,7 @@ class A_Scheduler(Agent): @@ -85,7 +86,7 @@ class A_Scheduler(Agent):
85 _TEST_COMMANDS_LIST = [ 86 _TEST_COMMANDS_LIST = [
86 # Format : ("self cmd_name cmd_args", timeout, "expected_result", expected_status), 87 # Format : ("self cmd_name cmd_args", timeout, "expected_result", expected_status),
87 (True, "self do_create_seq_1 6", 200, '', Agent.CMD_STATUS.CMD_EXECUTED), 88 (True, "self do_create_seq_1 6", 200, '', Agent.CMD_STATUS.CMD_EXECUTED),
88 - (True, "self do_stop asap", 500, "STOPPING", Agent.CMD_STATUS.CMD_EXECUTED), 89 + #(True, "self do_stop asap", 500, "STOPPING", Agent.CMD_STATUS.CMD_EXECUTED),
89 ] 90 ]
90 91
91 """ 92 """
@@ -232,6 +233,35 @@ class A_Scheduler(Agent): @@ -232,6 +233,35 @@ class A_Scheduler(Agent):
232 schedule_order = np.zeros(86400, dtype=int) -1 233 schedule_order = np.zeros(86400, dtype=int) -1
233 schedule_jd = np.zeros(86400, dtype=float) 234 schedule_jd = np.zeros(86400, dtype=float)
234 schedule_scientific_programm_id = np.zeros(86400, dtype=int) -1 235 schedule_scientific_programm_id = np.zeros(86400, dtype=int) -1
  236 + # ---
  237 + # --- Get the numpy matrix in database (via Json)
  238 + # --- Get the effective schedule matrix
  239 + print("STEP 2000")
  240 + time.sleep(5)
  241 + input_matrix = EffectiveSchedule.objects.last().conv_numpy()
  242 + # input_matrix = EffectiveSchedule.objects.get(id=10).scheduler_matrix
  243 + print(f"STEP 2500 {type(input_matrix)=}")
  244 + print(f"STEP 2600 {input_matrix=}")
  245 +
  246 + print(f"STEP 3000 {input_matrix.shape=}")
  247 + time.sleep(10)
  248 + # --- Get the effective schedule arrays
  249 + schedule_eff_jd, schedule_eff_binary, schedule_eff_sequence_id, schedule_eff_scientific_programm_id, schedule_eff_order, schedule_eff_visibility = input_matrix
  250 + print(f"{schedule_eff_jd=}")
  251 + # --- Get the index in the night
  252 + night, index = self._fn.date2night("now", 86400)
  253 + print(f"{night=} {index=}")
  254 + schedule_sequence_id[0:index] = schedule_eff_sequence_id[0:index]
  255 + schedule_binary[0:index] = schedule_eff_binary[0:index]
  256 + schedule_visibility[0:index] = schedule_eff_visibility[0:index]
  257 + schedule_order[0:index] = schedule_eff_order[0:index]
  258 + schedule_jd[0:index] = schedule_eff_jd[0:index]
  259 + schedule_scientific_programm_id[0:index] = schedule_eff_scientific_programm_id[0:index]
  260 + try:
  261 + pass
  262 + except:
  263 + pass
  264 + print(f"{schedule_jd=}")
235 265
236 # =================================================================== 266 # ===================================================================
237 # --- Loop over the sequences of the night to extract useful infos 267 # --- Loop over the sequences of the night to extract useful infos
@@ -288,7 +318,10 @@ class A_Scheduler(Agent): @@ -288,7 +318,10 @@ class A_Scheduler(Agent):
288 else: 318 else:
289 sequence_info['error'] = f"File {ephfile} not exists" 319 sequence_info['error'] = f"File {ephfile} not exists"
290 sequence_infos.append(sequence_info) 320 sequence_infos.append(sequence_info)
291 - schedule_jd = eph_info['jd'] 321 + try:
  322 + schedule_jd = eph_info['jd']
  323 + except:
  324 + pass
292 325
293 # =================================================================== 326 # ===================================================================
294 # --- Get informations of priority and quota from scientific programs 327 # --- Get informations of priority and quota from scientific programs
@@ -456,8 +489,21 @@ class A_Scheduler(Agent): @@ -456,8 +489,21 @@ class A_Scheduler(Agent):
456 self.dprint("\n" + "="*70 + "\n=== Save the schedule\n" + "="*70 + "\n") 489 self.dprint("\n" + "="*70 + "\n=== Save the schedule\n" + "="*70 + "\n")
457 self.dprint("Order ID_seq K_start ID_sp Priority Duration Status\n") 490 self.dprint("Order ID_seq K_start ID_sp Priority Duration Status\n")
458 self.dprint(f"{seqs=}") 491 self.dprint(f"{seqs=}")
  492 + # --- Prepare the output matrix
  493 + ouput_matrix = np.array([schedule_jd, schedule_binary, schedule_sequence_id, schedule_scientific_programm_id, schedule_order, schedule_visibility])
  494 + # --- Save the numpy matrix in ASCII
459 fpathname = os.path.join(rootdir, subdir, "scheduler_schedule.txt") 495 fpathname = os.path.join(rootdir, subdir, "scheduler_schedule.txt")
460 - np.savetxt(fpathname, np.array([schedule_jd, schedule_binary, schedule_sequence_id, schedule_scientific_programm_id, schedule_order, schedule_visibility]).T) 496 + np.savetxt(fpathname, ouput_matrix.T)
  497 + # --- Save the numpy matrix in database (via Json)
  498 + v = PredictiveSchedule()
  499 + v.scheduler_matrix = ouput_matrix
  500 + v.save()
  501 + # --- Save the numpy matrix in database (via Json)
  502 + v = EffectiveSchedule()
  503 + v.scheduler_matrix = ouput_matrix
  504 + v.save()
  505 +
  506 + print(f"{schedule_jd=}")
461 # --- Update the running state 507 # --- Update the running state
462 self._routine_running = self.RUNNING_NOTHING 508 self._routine_running = self.RUNNING_NOTHING
463 print(f"_compute_schedule_1 finished in {time.time() - t0:.2f} seconds") 509 print(f"_compute_schedule_1 finished in {time.time() - t0:.2f} seconds")
src/core/pyros_django/scheduling/models.py
@@ -7,6 +7,7 @@ import numpy as np @@ -7,6 +7,7 @@ import numpy as np
7 import json 7 import json
8 from json import JSONEncoder 8 from json import JSONEncoder
9 import numpy 9 import numpy
  10 +import ast
10 11
11 class NumpyArrayEncoder(JSONEncoder): 12 class NumpyArrayEncoder(JSONEncoder):
12 def default(self, obj): 13 def default(self, obj):
@@ -15,40 +16,39 @@ class NumpyArrayEncoder(JSONEncoder): @@ -15,40 +16,39 @@ class NumpyArrayEncoder(JSONEncoder):
15 return JSONEncoder.default(self, obj) 16 return JSONEncoder.default(self, obj)
16 17
17 18
  19 +
18 20
19 class EffectiveSchedule(models.Model): 21 class EffectiveSchedule(models.Model):
20 scheduler_matrix = JSONField(blank=True, null=True) 22 scheduler_matrix = JSONField(blank=True, null=True)
21 - 23 +
  24 +
22 def save(self, *args, **kwargs): 25 def save(self, *args, **kwargs):
23 # Transform numpy matrix to JSON 26 # Transform numpy matrix to JSON
24 - scheduler_matrix_as_json = json.dumps(self.scheduler_matrix, cls=NumpyArrayEncoder) 27 + scheduler_matrix_as_json = json.dumps({"array":self.scheduler_matrix}, cls=NumpyArrayEncoder)
25 self.scheduler_matrix = scheduler_matrix_as_json 28 self.scheduler_matrix = scheduler_matrix_as_json
26 super(EffectiveSchedule, self).save(*args, **kwargs) 29 super(EffectiveSchedule, self).save(*args, **kwargs)
27 30
28 - def get(self, *args, **kwargs): 31 + def conv_numpy(self):
29 # Transform JSON to numpy matrix 32 # Transform JSON to numpy matrix
30 matrix_as_json = json.loads(self.scheduler_matrix) 33 matrix_as_json = json.loads(self.scheduler_matrix)
31 -  
32 - self.scheduler_matrix = numpy.asarray(matrix_as_json["array"])  
33 - return super().get(**kwargs)  
34 - 34 +
  35 + return numpy.array(matrix_as_json)
  36 +
35 class PredictiveSchedule(models.Model): 37 class PredictiveSchedule(models.Model):
36 scheduler_matrix = JSONField(blank=True, null=True) 38 scheduler_matrix = JSONField(blank=True, null=True)
37 - 39 +
38 def save(self, *args, **kwargs): 40 def save(self, *args, **kwargs):
39 # Transform numpy matrix to JSON 41 # Transform numpy matrix to JSON
40 scheduler_matrix_as_json = json.dumps(self.scheduler_matrix, cls=NumpyArrayEncoder) 42 scheduler_matrix_as_json = json.dumps(self.scheduler_matrix, cls=NumpyArrayEncoder)
41 self.scheduler_matrix = scheduler_matrix_as_json 43 self.scheduler_matrix = scheduler_matrix_as_json
42 super(PredictiveSchedule, self).save(*args, **kwargs) 44 super(PredictiveSchedule, self).save(*args, **kwargs)
43 45
44 - def get(self, *args, **kwargs): 46 + def conv_numpy(self, *args, **kwargs):
45 # Transform JSON to numpy matrix 47 # Transform JSON to numpy matrix
46 matrix_as_json = json.loads(self.scheduler_matrix) 48 matrix_as_json = json.loads(self.scheduler_matrix)
47 -  
48 - self.scheduler_matrix = numpy.asarray(matrix_as_json["array"])  
49 - return super().get(**kwargs)  
50 -  
51 - 49 +
  50 + return numpy.array(matrix_as_json)
  51 +
52 class SchedulerHistory(EffectiveSchedule): 52 class SchedulerHistory(EffectiveSchedule):
53 night_datetime = models.DateTimeField(blank=True, null=True) 53 night_datetime = models.DateTimeField(blank=True, null=True)
54 54
55 \ No newline at end of file 55 \ No newline at end of file