config_parser.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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 = ""
  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 = ["safe", "function", "compliance", "comfort", "efficient"]
  33. self.builtinTypeList = []
  34. self.builtinMetricList = ["TTC", "MTTC", "THW", "LatSD", "LonSD", "DRAC", "BTN", "STN", "collisionRisk",
  35. "collisionSeverity", "followSpeedDeviation", "followDistanceDeviation",
  36. "followStopDistance", "followResponseTime", 'laneDistance',
  37. 'centerDistanceExpectation', 'centerDistanceStandardDeviation',
  38. 'centerDistanceMax', 'centerDistanceMin', 'centerDistanceFrequency',
  39. 'centerDistanceRange', "zigzag", "shake", "cadence", "slamBrake", "slamAccelerate",
  40. "averageSpeed", "stopDuration", "stopCount", "overspeed10", "overspeed10_20",
  41. "pressSolidLine", "runRedLight", "overspeed20_50", "overspeed50"]
  42. # score info
  43. self.config = {}
  44. # initialization
  45. self.config_dict = json2dict(json_file)
  46. self.parse_dict = self._config_parse(self.config_dict)
  47. def _config_parse(self, config_dict):
  48. # score
  49. if 'scoreModel' in list(config_dict.keys()):
  50. self.scoreModel = config_dict['scoreModel']
  51. else:
  52. self.scoreModel = "builtin"
  53. # dimension info
  54. dimensionWeight = config_dict['dimensionWeight']
  55. self.dimension_weight = dimensionWeight
  56. self.dimension_name = config_dict['dimensionName']
  57. self.dimension_list = list(self.dimension_weight.keys())
  58. # type info
  59. typeWeight = config_dict['typeWeight']
  60. self.type_weight = typeWeight
  61. self.type_name = config_dict["typeName"]
  62. for dimension in self.dimension_list:
  63. if dimension == 'compliance':
  64. self.config[dimension] = self._compliance_config_parse(config_dict, typeWeight, dimensionWeight)
  65. else:
  66. self.config[dimension] = self._dimension_config_parse(dimension, config_dict, typeWeight,
  67. dimensionWeight)
  68. # self.name_dict[dimension] = self.config[dimension]['name']
  69. # self.unit_dict[dimension] = self.config[dimension]['unit']
  70. self.name_dict.update(self.config[dimension]['name'])
  71. self.unit_dict.update(self.config[dimension]['unit'])
  72. self.metric_dict[dimension] = self.config[dimension]['typeMetricDict']
  73. self.metric_list.extend(self.config[dimension]['metric'])
  74. self.type_list.extend(self.config[dimension]['type'])
  75. print()
  76. def _dimension_config_parse(self, dimension, config_dict, typeWeight, dimensionWeight):
  77. # get weight type
  78. typeWeightDimension = typeWeight[dimension]
  79. typeDimension = list(typeWeightDimension.keys()) # get type list
  80. typeWeightDimensionList = list(typeWeightDimension.values())
  81. flagCustomDimension = not all(x is None for x in typeWeightDimensionList)
  82. # get type name
  83. typeNameDimension = self.type_name[dimension]
  84. # Dimension
  85. dimension_dict = config_dict[dimension]
  86. dimension_value_dict = {}
  87. typeMetricDict = {}
  88. for type in typeDimension:
  89. dimension_value_dict.update(dimension_dict[type])
  90. typeMetricDict[type] = list(dimension_dict[type].keys())
  91. df_dimension_value = pd.DataFrame(dimension_value_dict).T
  92. # get metric list
  93. metricDimension = df_dimension_value.index.tolist()
  94. # get name list
  95. nameDimension = df_dimension_value['name'].to_dict()
  96. # nameDimensionList = list(nameDimension.values())
  97. # get unit list
  98. unitDimension = df_dimension_value['unit'].to_dict()
  99. # unitDimensionList = list(unitDimension.values())
  100. # get weight list
  101. weightDimension = df_dimension_value['weight'].to_dict()
  102. weightDimensionList = list(weightDimension.values())
  103. # get priority list
  104. priorityDimension = df_dimension_value['priority'].to_dict()
  105. priorityDimensionList = list(priorityDimension.values())
  106. # get paramList
  107. paramDimension = df_dimension_value['paramList'].to_dict()
  108. bulitin_first_key = next((key for key in paramDimension if key in self.builtinMetricList), None)
  109. first_key = next(iter(paramDimension)) if not bulitin_first_key else bulitin_first_key
  110. paramNum = len(paramDimension[first_key])
  111. kindDimension = [{} for _ in range(paramNum)]
  112. optimalDimension = [{} for _ in range(paramNum)]
  113. multipleDimension = [{} for _ in range(paramNum)]
  114. spareDimension = [{} for _ in range(paramNum)]
  115. # spare1Dimension = [{} for _ in range(paramNum)]
  116. # spare2Dimension = [{} for _ in range(paramNum)]
  117. customMetricParam = {} # custiom metric paramList
  118. for key, value_list in paramDimension.items():
  119. if key in self.builtinMetricList:
  120. for i in range(len(value_list)):
  121. kindDimension[i][key] = int(value_list[i]['kind'])
  122. optimalDimension[i][key] = (value_list[i]['optimal'])
  123. multipleDimension[i][key] = [float(x) for x in value_list[i]['multiple']]
  124. spareDimension[i][key] = [item["param"] for item in value_list[i]["spare"]]
  125. # spareDimension[i][key] = [float(item["param"]) for item in value_list[i]["spare"]]
  126. # spare1Dimension[i][key] = (value_list[i]['spare1'])
  127. # spare2Dimension[i][key] = (value_list[i]['spare2'])
  128. else:
  129. customMetricParam[key] = value_list
  130. kindDimensionList = [value for dict_val in kindDimension for value in dict_val.values()]
  131. optimalDimensionList = [value for dict_val in optimalDimension for value in dict_val.values()]
  132. multipleDimensionList = [value for dict_val in multipleDimension for value in dict_val.values()]
  133. spareDimensionList = [value for dict_val in spareDimension for value in dict_val.values()]
  134. # spare1DimensionList = [value for dict_val in spare1Dimension for value in dict_val.values()]
  135. # spare2DimensionList = [value for dict_val in spare2Dimension for value in dict_val.values()]
  136. if paramNum == 1:
  137. kindDimension = kindDimension[0]
  138. optimalDimension = optimalDimension[0]
  139. multipleDimension = multipleDimension[0]
  140. spareDimension = spareDimension[0]
  141. # spare1Dimension = spare1Dimension[0]
  142. # spare2Dimension = spare2Dimension[0]
  143. result = {
  144. "weightDimension": float(dimensionWeight[dimension]),
  145. "weightCustom": flagCustomDimension,
  146. "type": typeDimension,
  147. "typeWeight": typeWeightDimension,
  148. "typeWeightList": typeWeightDimensionList,
  149. "typeName": typeNameDimension,
  150. "customMetricParam": customMetricParam,
  151. "metric": metricDimension,
  152. "typeMetricDict": typeMetricDict,
  153. "name": nameDimension,
  154. # "nameList": nameDimensionList,
  155. "unit": unitDimension,
  156. # "unitList": unitDimensionList,
  157. "weight": weightDimension,
  158. "weightList": weightDimensionList,
  159. "priority": priorityDimension,
  160. "priorityList": priorityDimensionList,
  161. "kind": kindDimension,
  162. "kindList": kindDimensionList,
  163. "optimal": optimalDimension,
  164. "optimalList": optimalDimensionList,
  165. "multiple": multipleDimension,
  166. "multipleList": multipleDimensionList,
  167. "spare": spareDimension,
  168. "spareList": spareDimensionList,
  169. # "spare1": spare1Dimension,
  170. # "spare1List": spare1DimensionList,
  171. # "spare2": spare2Dimension,
  172. # "spare2List": spare2DimensionList
  173. }
  174. return result
  175. def _compliance_config_parse(self, config_dict, typeWeight, dimensionWeight):
  176. # get weight type
  177. typeWeightCompliance = typeWeight['compliance']
  178. typeCompliance = list(typeWeightCompliance.keys())
  179. typeWeightComplianceList = list(typeWeightCompliance.values())
  180. flagCustomCompliance = not all(x is None for x in typeWeightComplianceList)
  181. # get type name
  182. typeNameCompliance = self.type_name["compliance"]
  183. # compliance
  184. compliance_dict = config_dict['compliance']
  185. compliance_value_dict = {}
  186. typeMetricDict = {}
  187. for type in typeCompliance:
  188. compliance_value_dict.update(compliance_dict[type])
  189. typeMetricDict[type] = list(compliance_dict[type].keys())
  190. df_compliance_value = pd.DataFrame(compliance_value_dict).T
  191. # get metric list
  192. metricCompliance = df_compliance_value.index.tolist()
  193. # get weight type
  194. typeWeightCompliance = typeWeight['compliance']
  195. typeWeightComplianceList = list(typeWeightCompliance.values())
  196. # get name list
  197. nameCompliance = df_compliance_value['name'].to_dict()
  198. # get unit list
  199. unitCompliance = df_compliance_value['unit'].to_dict()
  200. # get weight list
  201. weightCompliance = df_compliance_value['weight'].to_dict()
  202. weightComplianceList = list(weightCompliance.values())
  203. compliance = {
  204. "weightDimension": float(dimensionWeight['compliance']),
  205. "weightCustom": flagCustomCompliance,
  206. "type": typeCompliance,
  207. "typeWeight": typeWeightCompliance,
  208. "typeWeightList": typeWeightComplianceList,
  209. "typeName": typeNameCompliance,
  210. "typeMetricDict": typeMetricDict,
  211. "metric": metricCompliance,
  212. "name": nameCompliance,
  213. "unit": unitCompliance,
  214. "weight": weightCompliance,
  215. "weightList": weightComplianceList
  216. }
  217. return compliance