123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- """
- @Authors: yangzihao(yangzihao@china-icv.cn)
- @Data: 2023/11/02
- @Last Modified: 2023/11/02
- @Summary: This module provides the function to parse the config json file.
- """
- import pandas as pd
- from common import json2dict
- class ConfigParse(object):
- """
- """
- def __init__(self, json_file):
-
- self.scoreModel = ""
- self.dimension_weight = {}
- self.dimension_list = []
- self.dimension_name = {}
- self.type_weight = {}
- self.type_list = []
- self.type_name = {}
- self.metric_list = []
- self.metric_dict = {}
- self.name_dict = {}
- self.unit_dict = {}
- self.builtinDimensionList = ["safe", "function", "compliance", "comfort", "efficient"]
- self.builtinTypeList = []
- self.builtinMetricList = ["TTC", "MTTC", "THW", "LatSD", "LonSD", "DRAC", "BTN", "STN", "collisionRisk",
- "collisionSeverity", "followSpeedDeviation", "followDistanceDeviation",
- "followStopDistance", "followResponseTime", 'laneDistance',
- 'centerDistanceExpectation', 'centerDistanceStandardDeviation',
- 'centerDistanceMax', 'centerDistanceMin', 'centerDistanceFrequency',
- 'centerDistanceRange', "zigzag", "shake", "cadence", "slamBrake", "slamAccelerate",
- "averageSpeed", "stopDuration", "stopCount", "overspeed10", "overspeed10_20",
- "pressSolidLine", "runRedLight", "overspeed20_50", "overspeed50"]
-
- self.config = {}
-
- self.config_dict = json2dict(json_file)
- self.parse_dict = self._config_parse(self.config_dict)
- def _config_parse(self, config_dict):
-
- if 'scoreModel' in list(config_dict.keys()):
- self.scoreModel = config_dict['scoreModel']
- else:
- self.scoreModel = "builtin"
-
- dimensionWeight = config_dict['dimensionWeight']
- self.dimension_weight = dimensionWeight
- self.dimension_name = config_dict['dimensionName']
- self.dimension_list = list(self.dimension_weight.keys())
-
- typeWeight = config_dict['typeWeight']
- self.type_weight = typeWeight
- self.type_name = config_dict["typeName"]
- for dimension in self.dimension_list:
- if dimension == 'compliance':
- self.config[dimension] = self._compliance_config_parse(config_dict, typeWeight, dimensionWeight)
- else:
- self.config[dimension] = self._dimension_config_parse(dimension, config_dict, typeWeight,
- dimensionWeight)
-
-
- self.name_dict.update(self.config[dimension]['name'])
- self.unit_dict.update(self.config[dimension]['unit'])
- self.metric_dict[dimension] = self.config[dimension]['typeMetricDict']
- self.metric_list.extend(self.config[dimension]['metric'])
- self.type_list.extend(self.config[dimension]['type'])
- print()
- def _dimension_config_parse(self, dimension, config_dict, typeWeight, dimensionWeight):
-
- typeWeightDimension = typeWeight[dimension]
- typeDimension = list(typeWeightDimension.keys())
- typeWeightDimensionList = list(typeWeightDimension.values())
- flagCustomDimension = not all(x is None for x in typeWeightDimensionList)
-
- typeNameDimension = self.type_name[dimension]
-
- dimension_dict = config_dict[dimension]
- dimension_value_dict = {}
- typeMetricDict = {}
- for type in typeDimension:
- dimension_value_dict.update(dimension_dict[type])
- typeMetricDict[type] = list(dimension_dict[type].keys())
- df_dimension_value = pd.DataFrame(dimension_value_dict).T
-
- metricDimension = df_dimension_value.index.tolist()
-
- nameDimension = df_dimension_value['name'].to_dict()
-
-
- unitDimension = df_dimension_value['unit'].to_dict()
-
-
- weightDimension = df_dimension_value['weight'].to_dict()
- weightDimensionList = list(weightDimension.values())
-
- priorityDimension = df_dimension_value['priority'].to_dict()
- priorityDimensionList = list(priorityDimension.values())
-
- paramDimension = df_dimension_value['paramList'].to_dict()
- bulitin_first_key = next((key for key in paramDimension if key in self.builtinMetricList), None)
- first_key = next(iter(paramDimension)) if not bulitin_first_key else bulitin_first_key
- paramNum = len(paramDimension[first_key])
- kindDimension = [{} for _ in range(paramNum)]
- optimalDimension = [{} for _ in range(paramNum)]
- multipleDimension = [{} for _ in range(paramNum)]
- spareDimension = [{} for _ in range(paramNum)]
-
-
- customMetricParam = {}
- for key, value_list in paramDimension.items():
- if key in self.builtinMetricList:
- for i in range(len(value_list)):
- kindDimension[i][key] = int(value_list[i]['kind'])
- optimalDimension[i][key] = (value_list[i]['optimal'])
- multipleDimension[i][key] = [float(x) for x in value_list[i]['multiple']]
- spareDimension[i][key] = [item["param"] for item in value_list[i]["spare"]]
-
-
-
- else:
- customMetricParam[key] = value_list
- kindDimensionList = [value for dict_val in kindDimension for value in dict_val.values()]
- optimalDimensionList = [value for dict_val in optimalDimension for value in dict_val.values()]
- multipleDimensionList = [value for dict_val in multipleDimension for value in dict_val.values()]
- spareDimensionList = [value for dict_val in spareDimension for value in dict_val.values()]
-
-
- if paramNum == 1:
- kindDimension = kindDimension[0]
- optimalDimension = optimalDimension[0]
- multipleDimension = multipleDimension[0]
- spareDimension = spareDimension[0]
-
-
- result = {
- "weightDimension": float(dimensionWeight[dimension]),
- "weightCustom": flagCustomDimension,
- "type": typeDimension,
- "typeWeight": typeWeightDimension,
- "typeWeightList": typeWeightDimensionList,
- "typeName": typeNameDimension,
- "customMetricParam": customMetricParam,
- "metric": metricDimension,
- "typeMetricDict": typeMetricDict,
- "name": nameDimension,
-
- "unit": unitDimension,
-
- "weight": weightDimension,
- "weightList": weightDimensionList,
- "priority": priorityDimension,
- "priorityList": priorityDimensionList,
- "kind": kindDimension,
- "kindList": kindDimensionList,
- "optimal": optimalDimension,
- "optimalList": optimalDimensionList,
- "multiple": multipleDimension,
- "multipleList": multipleDimensionList,
- "spare": spareDimension,
- "spareList": spareDimensionList,
-
-
-
-
- }
- return result
- def _compliance_config_parse(self, config_dict, typeWeight, dimensionWeight):
-
- typeWeightCompliance = typeWeight['compliance']
- typeCompliance = list(typeWeightCompliance.keys())
- typeWeightComplianceList = list(typeWeightCompliance.values())
- flagCustomCompliance = not all(x is None for x in typeWeightComplianceList)
-
- typeNameCompliance = self.type_name["compliance"]
-
- compliance_dict = config_dict['compliance']
- compliance_value_dict = {}
- typeMetricDict = {}
- for type in typeCompliance:
- compliance_value_dict.update(compliance_dict[type])
- typeMetricDict[type] = list(compliance_dict[type].keys())
- df_compliance_value = pd.DataFrame(compliance_value_dict).T
-
- metricCompliance = df_compliance_value.index.tolist()
-
- typeWeightCompliance = typeWeight['compliance']
- typeWeightComplianceList = list(typeWeightCompliance.values())
-
- nameCompliance = df_compliance_value['name'].to_dict()
-
- unitCompliance = df_compliance_value['unit'].to_dict()
-
- weightCompliance = df_compliance_value['weight'].to_dict()
- weightComplianceList = list(weightCompliance.values())
- compliance = {
- "weightDimension": float(dimensionWeight['compliance']),
- "weightCustom": flagCustomCompliance,
- "type": typeCompliance,
- "typeWeight": typeWeightCompliance,
- "typeWeightList": typeWeightComplianceList,
- "typeName": typeNameCompliance,
- "typeMetricDict": typeMetricDict,
- "metric": metricCompliance,
- "name": nameCompliance,
- "unit": unitCompliance,
- "weight": weightCompliance,
- "weightList": weightComplianceList
- }
- return compliance
|