config_parser.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ##################################################################
  4. #
  5. # Copyright (c) 2023 CICV, Inc. All Rights Reserved
  6. #
  7. ##################################################################
  8. """
  9. @Authors: yangzihao(yangzihao@china-icv.cn)
  10. @Data: 2023/11/02
  11. @Last Modified: 2023/11/02
  12. @Summary: This module provides the function to parse the config json file.
  13. """
  14. import pandas as pd
  15. from common import json2dict
  16. class ConfigParse(object):
  17. """
  18. """
  19. def __init__(self, json_file):
  20. # weight info
  21. self.scoreModel = "builtin"
  22. self.dimension_weight = {}
  23. self.dimension_list = []
  24. self.dimension_name = {}
  25. self.type_weight = {}
  26. self.type_list = []
  27. self.type_name = {}
  28. self.metric_list = []
  29. self.metric_dict = {}
  30. self.name_dict = {}
  31. self.unit_dict = {}
  32. self.builtinDimensionList = ["accurate", "comfort", "safe"]
  33. self.builtinTypeList = []
  34. self.builtinMetricList = ["zigzag", "shake", "cadence", "slamBrake", "slamAccelerate", "speedInstructionJump",
  35. "collisionCount", "collisionRisk", "collisionSeverity", "overSpeed",
  36. "positionError", "executeAccurateError", "averageSpeed", "stopDuration", "obstaclestopDuration"]
  37. # score info
  38. self.config = {}
  39. # initialization
  40. self.config_dict = json2dict(json_file)
  41. self._config_parse(self.config_dict)
  42. def _config_parse(self, config_dict):
  43. # dimension info
  44. dimensionWeight = config_dict['dimensionWeight']
  45. self.dimension_weight = dimensionWeight
  46. self.dimension_name = config_dict['dimensionName']
  47. self.dimension_list = list(self.dimension_weight.keys())
  48. # type info
  49. typeWeight = config_dict['typeWeight']
  50. self.type_weight = typeWeight
  51. self.type_name = config_dict["typeName"]
  52. for dimension in self.dimension_list:
  53. self.config[dimension] = self._dimension_config_parse(dimension, config_dict, typeWeight, dimensionWeight)
  54. self.name_dict.update(self.config[dimension]['name'])
  55. self.unit_dict.update(self.config[dimension]['unit'])
  56. self.metric_dict[dimension] = self.config[dimension]['typeMetricDict']
  57. self.metric_list.extend(self.config[dimension]['metric'])
  58. self.type_list.extend(self.config[dimension]['type'])
  59. print()
  60. def _dimension_config_parse(self, dimension, config_dict, typeWeight, dimensionWeight):
  61. # get weight type
  62. typeWeightDimension = typeWeight[dimension]
  63. typeDimension = list(typeWeightDimension.keys()) # get type list
  64. typeWeightDimensionList = list(typeWeightDimension.values())
  65. flagCustomDimension = not all(x is None for x in typeWeightDimensionList)
  66. # get type name
  67. typeNameDimension = self.type_name[dimension]
  68. # Dimension
  69. dimension_dict = config_dict[dimension]
  70. print("dimension_dict is", dimension_dict)
  71. dimension_value_dict = {}
  72. typeMetricDict = {}
  73. for type in typeDimension:
  74. dimension_value_dict.update(dimension_dict[type])
  75. typeMetricDict[type] = list(dimension_dict[type].keys())
  76. df_dimension_value = pd.DataFrame(dimension_value_dict).T
  77. print("df_dimension_value is", df_dimension_value)
  78. # get metric list
  79. metricDimension = df_dimension_value.index.tolist()
  80. # get name list
  81. nameDimension = df_dimension_value['name'].to_dict()
  82. # nameDimensionList = list(nameDimension.values())
  83. # get unit list
  84. unitDimension = df_dimension_value['unit'].to_dict()
  85. # unitDimensionList = list(unitDimension.values())
  86. # get weight list
  87. weightDimension = df_dimension_value['weight'].astype(float).to_dict()
  88. weightDimensionList = list(weightDimension.values())
  89. # get priority list
  90. priorityDimension = df_dimension_value['priority'].astype(int).to_dict()
  91. priorityDimensionList = list(priorityDimension.values())
  92. # get paramList
  93. paramDimension = df_dimension_value['paramList'].to_dict()
  94. print("paramDimension is", paramDimension)
  95. bulitin_first_key = next((key for key in paramDimension if key in self.builtinMetricList), None)
  96. first_key = next(iter(paramDimension)) if not bulitin_first_key else bulitin_first_key
  97. paramNum = len(paramDimension[first_key])
  98. kindDimension = [{} for _ in range(paramNum)]
  99. optimalDimension = [{} for _ in range(paramNum)]
  100. multipleDimension = [{} for _ in range(paramNum)]
  101. spareDimension = [{} for _ in range(paramNum)]
  102. # spare1Dimension = [{} for _ in range(paramNum)]
  103. # spare2Dimension = [{} for _ in range(paramNum)]
  104. customMetricParam = {} # custiom metric paramList
  105. print("paramDimension.items() is", paramDimension.items())
  106. for key, value_list in paramDimension.items():
  107. print("key is", key)
  108. print("len(value_list) is", len(value_list))
  109. if key in self.builtinMetricList:
  110. for i in range(len(value_list)):
  111. print("i is", i)
  112. kindDimension[i][key] = int(value_list[i]['kind'])
  113. print("kindDimension[i][key] is", kindDimension[i][key])
  114. optimalDimension[i][key] = float(value_list[i]['optimal'])
  115. print("optimalDimension[i][key] is", key, optimalDimension[i][key])
  116. multipleDimension[i][key] = [float(x) for x in value_list[i]['multiple']]
  117. spareDimension[i][key] = [item["param"] for item in value_list[i]["spare"]]
  118. # spareDimension[i][key] = [float(item["param"]) for item in value_list[i]["spare"]]
  119. # spare1Dimension[i][key] = (value_list[i]['spare1'])
  120. # spare2Dimension[i][key] = (value_list[i]['spare2'])
  121. else:
  122. customMetricParam[key] = value_list
  123. kindDimensionList = [value for dict_val in kindDimension for value in dict_val.values()]
  124. optimalDimensionList = [value for dict_val in optimalDimension for value in dict_val.values()]
  125. multipleDimensionList = [value for dict_val in multipleDimension for value in dict_val.values()]
  126. spareDimensionList = [value for dict_val in spareDimension for value in dict_val.values()]
  127. # spare1DimensionList = [value for dict_val in spare1Dimension for value in dict_val.values()]
  128. # spare2DimensionList = [value for dict_val in spare2Dimension for value in dict_val.values()]
  129. if paramNum == 1:
  130. kindDimension = kindDimension[0]
  131. optimalDimension = optimalDimension[0]
  132. multipleDimension = multipleDimension[0]
  133. spareDimension = spareDimension[0]
  134. # spare1Dimension = spare1Dimension[0]
  135. # spare2Dimension = spare2Dimension[0]
  136. result = {
  137. "weightDimension": float(dimensionWeight[dimension]),
  138. "weightCustom": flagCustomDimension,
  139. "type": typeDimension,
  140. "typeWeight": typeWeightDimension,
  141. "typeWeightList": typeWeightDimensionList,
  142. "typeName": typeNameDimension,
  143. "customMetricParam": customMetricParam,
  144. "metric": metricDimension,
  145. "typeMetricDict": typeMetricDict,
  146. "name": nameDimension,
  147. # "nameList": nameDimensionList,
  148. "unit": unitDimension,
  149. # "unitList": unitDimensionList,
  150. "weight": weightDimension,
  151. "weightList": weightDimensionList,
  152. "priority": priorityDimension,
  153. "priorityList": priorityDimensionList,
  154. "kind": kindDimension,
  155. "kindList": kindDimensionList,
  156. "optimal": optimalDimension,
  157. "optimalList": optimalDimensionList,
  158. "multiple": multipleDimension,
  159. "multipleList": multipleDimensionList,
  160. "spare": spareDimension,
  161. "spareList": spareDimensionList,
  162. # "spare1": spare1Dimension,
  163. # "spare1List": spare1DimensionList,
  164. # "spare2": spare2Dimension,
  165. # "spare2List": spare2DimensionList
  166. }
  167. return result