utils.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import requests, csv
  2. from pathlib import Path
  3. from enum import Enum
  4. SCHEDULER_BASE_URL = "http://localhost:5000"
  5. BACKEND_BASE_URL = "http://localhost:8000/api"
  6. BASE_DIR = Path(__file__).resolve().parent
  7. class TaskState(Enum):
  8. INIT = 0
  9. CALCULATING = 1
  10. DONE = 2
  11. # 从配置文件中读取可用的算法
  12. algoList = []
  13. algoConfig = csv.reader(open('./algorithms.config', 'r'))
  14. for algo in algoConfig:
  15. algoList.append({
  16. 'name': algo[0],
  17. 'path': BASE_DIR / algo[1],
  18. 'command': algo[2],
  19. })
  20. class Store:
  21. missions = []
  22. activeTasks = []
  23. def addActiveTask(self, missionId: int, planId: int):
  24. self.activeTasks.append({
  25. 'missionId': missionId,
  26. 'planId': planId,
  27. 'state': TaskState.INIT,
  28. })
  29. def checkActiveTask(self, missionId: int, planId: int, state: TaskState):
  30. for task in self.activeTasks:
  31. if task['missionId'] == missionId and task['planId'] == planId:
  32. if task['state'] == state:
  33. return True
  34. break
  35. return False
  36. def updateActiveTask(self, missionId: int, planId: int, state: TaskState):
  37. for task in self.activeTasks:
  38. if task['missionId'] == missionId and task['planId'] == planId:
  39. # 已经DONE的task不应该再被修改状态
  40. if task['state'] != TaskState.DONE:
  41. task['state'] = state
  42. return True
  43. break
  44. return False
  45. def removeActiveTask(self, missionId: int, planId: int):
  46. originLen = len(self.activeTasks)
  47. self.activeTasks = [task for task in self.activeTasks if task['missionId'] != missionId and task['planId'] != planId]
  48. if originLen != (len(self.activeTasks) + 1):
  49. # 没有删除或者删除多于一个?
  50. print("没有删除Task或删除多于一个Task")
  51. return False
  52. return True
  53. # 添加任务时仅放入第一级待计算plans,后续每个plan完成计算后根据children列表寻找下一个plan继续计算
  54. def addMission(self, mission: dict, plans: list):
  55. # 判断是否存在重复mission
  56. if [m for m in self.missions if m['id'] == mission['id']]:
  57. print("存在重复Mission,无法新建mission")
  58. return False
  59. # 寻找初始并行任务, 默认第一个是根plan,后续所有都是它的子节点
  60. originPlans = []
  61. root = plans.pop(0)
  62. for childId in root['children']:
  63. for p in [plan for plan in plans if plan['id'] == childId]:
  64. # 找到匹配项则从plans中弹出,放入originPlans中
  65. originPlans.append(p)
  66. break
  67. tasks = []
  68. # 第一级plans
  69. tasks.extend([p['id'] for p in originPlans])
  70. self.missions.append({
  71. 'id': mission['id'],
  72. 'plans': plans,
  73. 'tasks': tasks,
  74. })
  75. return True
  76. # mission中的某项任务完成计算
  77. def solveMission(self, missionId: int, planId: int, result: dict):
  78. mission = [m for m in self.missions if m['id'] == missionId]
  79. if not mission:
  80. print("未找到mission,是否错误传入更新请求")
  81. return []
  82. else:
  83. mission = mission[0]
  84. if planId in mission['tasks']:
  85. # 从tasks中弹出当前task
  86. mission['tasks'].remove(planId)
  87. # 在plans中找到对用ID的plan
  88. taskP = [plan for plan in mission['plans'] if plan['id'] == planId][0]
  89. children = taskP['children']
  90. # 如果已经是叶子,则不需要继续调用处理程序
  91. if not children:
  92. return []
  93. # 将完成的task的子节点压入tasks
  94. mission['tasks'].extend(children)
  95. for plan in [p for p in mission['plans'] if p['id'] in children]:
  96. plan['nodes'] = result['nodes']
  97. plan['edges'] = result['edges']
  98. # 把已完成的plan从plans中删除
  99. mission['plans'] = [p for p in mission['plans'] if p['id'] != planId]
  100. else:
  101. print("给出的不是task列表中计算任务?")
  102. return []
  103. # 返回下一轮需要调用的任务,如果存在并行,则列表长度大于1
  104. return [plan for plan in mission['plans'] if plan['id'] in children]
  105. def prepareTasks(self, missionId: int):
  106. mission = [m for m in self.missions if m['id'] == missionId]
  107. if not mission:
  108. print("未找到mission,是否错误传入更新请求")
  109. return []
  110. else:
  111. mission = mission[0]
  112. preparedTasks = []
  113. for plan in [plan for plan in mission['plans'] if plan['id'] in mission['tasks']]:
  114. algorithm = [algo for algo in algoList if algo['name'] == plan['algorithm']]
  115. if not algorithm:
  116. print("未找到选择的算法,是否需要更新算法列表?")
  117. return []
  118. else:
  119. algorithm = algorithm[0]
  120. preparedTasks.append({
  121. 'plan': plan,
  122. 'cwd': str(algorithm['path']),
  123. 'command': algorithm['command'],
  124. })
  125. return preparedTasks