config_parser.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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"]
  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. dimension_value_dict = {}
  71. typeMetricDict = {}
  72. for type in typeDimension:
  73. dimension_value_dict.update(dimension_dict[type])
  74. typeMetricDict[type] = list(dimension_dict[type].keys())
  75. df_dimension_value = pd.DataFrame(dimension_value_dict).T
  76. # get metric list
  77. metricDimension = df_dimension_value.index.tolist()
  78. # get name list
  79. nameDimension = df_dimension_value['name'].to_dict()
  80. # nameDimensionList = list(nameDimension.values())
  81. # get unit list
  82. unitDimension = df_dimension_value['unit'].to_dict()
  83. # unitDimensionList = list(unitDimension.values())
  84. # get weight list
  85. weightDimension = df_dimension_value['weight'].astype(float).to_dict()
  86. weightDimensionList = list(weightDimension.values())
  87. # get priority list
  88. priorityDimension = df_dimension_value['priority'].astype(int).to_dict()
  89. priorityDimensionList = list(priorityDimension.values())
  90. # get paramList
  91. paramDimension = df_dimension_value['paramList'].to_dict()
  92. bulitin_first_key = next((key for key in paramDimension if key in self.builtinMetricList), None)
  93. first_key = next(iter(paramDimension)) if not bulitin_first_key else bulitin_first_key
  94. paramNum = len(paramDimension[first_key])
  95. kindDimension = [{} for _ in range(paramNum)]
  96. optimalDimension = [{} for _ in range(paramNum)]
  97. multipleDimension = [{} for _ in range(paramNum)]
  98. spareDimension = [{} for _ in range(paramNum)]
  99. # spare1Dimension = [{} for _ in range(paramNum)]
  100. # spare2Dimension = [{} for _ in range(paramNum)]
  101. customMetricParam = {} # custiom metric paramList
  102. for key, value_list in paramDimension.items():
  103. if key in self.builtinMetricList:
  104. for i in range(len(value_list)):
  105. kindDimension[i][key] = int(value_list[i]['kind'])
  106. optimalDimension[i][key] = float(value_list[i]['optimal'])
  107. multipleDimension[i][key] = [float(x) for x in value_list[i]['multiple']]
  108. spareDimension[i][key] = [item["param"] for item in value_list[i]["spare"]]
  109. # spareDimension[i][key] = [float(item["param"]) for item in value_list[i]["spare"]]
  110. # spare1Dimension[i][key] = (value_list[i]['spare1'])
  111. # spare2Dimension[i][key] = (value_list[i]['spare2'])
  112. else:
  113. customMetricParam[key] = value_list
  114. kindDimensionList = [value for dict_val in kindDimension for value in dict_val.values()]
  115. optimalDimensionList = [value for dict_val in optimalDimension for value in dict_val.values()]
  116. multipleDimensionList = [value for dict_val in multipleDimension for value in dict_val.values()]
  117. spareDimensionList = [value for dict_val in spareDimension for value in dict_val.values()]
  118. # spare1DimensionList = [value for dict_val in spare1Dimension for value in dict_val.values()]
  119. # spare2DimensionList = [value for dict_val in spare2Dimension for value in dict_val.values()]
  120. if paramNum == 1:
  121. kindDimension = kindDimension[0]
  122. optimalDimension = optimalDimension[0]
  123. multipleDimension = multipleDimension[0]
  124. spareDimension = spareDimension[0]
  125. # spare1Dimension = spare1Dimension[0]
  126. # spare2Dimension = spare2Dimension[0]
  127. result = {
  128. "weightDimension": float(dimensionWeight[dimension]),
  129. "weightCustom": flagCustomDimension,
  130. "type": typeDimension,
  131. "typeWeight": typeWeightDimension,
  132. "typeWeightList": typeWeightDimensionList,
  133. "typeName": typeNameDimension,
  134. "customMetricParam": customMetricParam,
  135. "metric": metricDimension,
  136. "typeMetricDict": typeMetricDict,
  137. "name": nameDimension,
  138. # "nameList": nameDimensionList,
  139. "unit": unitDimension,
  140. # "unitList": unitDimensionList,
  141. "weight": weightDimension,
  142. "weightList": weightDimensionList,
  143. "priority": priorityDimension,
  144. "priorityList": priorityDimensionList,
  145. "kind": kindDimension,
  146. "kindList": kindDimensionList,
  147. "optimal": optimalDimension,
  148. "optimalList": optimalDimensionList,
  149. "multiple": multipleDimension,
  150. "multipleList": multipleDimensionList,
  151. "spare": spareDimension,
  152. "spareList": spareDimensionList,
  153. # "spare1": spare1Dimension,
  154. # "spare1List": spare1DimensionList,
  155. # "spare2": spare2Dimension,
  156. # "spare2List": spare2DimensionList
  157. }
  158. return result