-
Notifications
You must be signed in to change notification settings - Fork 6
Open
Labels
questionFurther information is requestedFurther information is requested
Description
Hey, @orlenyslp. It seems like this function produces the outdated JSON format. Is there a new one somewhere I'm missing?
Prosimos/bpdfr_simulation_engine/simulation_properties_parser.py
Lines 151 to 242 in ee59295
| def parse_qbp_simulation_process(qbp_bpmn_path, out_file): | |
| tree = ET.parse(qbp_bpmn_path) | |
| root = tree.getroot() | |
| simod_root = root.find("qbp:processSimulationInfo", simod_ns) | |
| if simod_root is None: | |
| print('PARSING ABORTED: Input BPMN model is not a simulation model, i.e., simulation parameters are missing.') | |
| return | |
| # 1. Extracting gateway branching probabilities | |
| gateways_branching = dict() | |
| reverse_map = dict() | |
| for process in root.findall('xmlns:process', bpmn_element_ns): | |
| for xmlns_key in ['xmlns:exclusiveGateway', 'xmlns:inclusiveGateway']: | |
| for bpmn_element in process.findall(xmlns_key, bpmn_element_ns): | |
| if bpmn_element.attrib["gatewayDirection"] == "Diverging": | |
| gateways_branching[bpmn_element.attrib["id"]] = dict() | |
| for out_flow in bpmn_element.findall("xmlns:outgoing", bpmn_element_ns): | |
| arc_id = out_flow.text.strip() | |
| gateways_branching[bpmn_element.attrib["id"]][arc_id] = 0 | |
| reverse_map[arc_id] = bpmn_element.attrib["id"] | |
| for flow_prob in simod_root.find("qbp:sequenceFlows", simod_ns).findall("qbp:sequenceFlow", simod_ns): | |
| flow_id = flow_prob.attrib["elementId"] | |
| gateways_branching[reverse_map[flow_id]][flow_id] = flow_prob.attrib["executionProbability"] | |
| # 2. Extracting Resource Calendars | |
| resource_pools = dict() | |
| calendars_map = dict() | |
| bpmn_calendars = simod_root.find("qbp:timetables", simod_ns) | |
| arrival_calendar_id = None | |
| for calendar_info in bpmn_calendars: | |
| calendar_id = calendar_info.attrib["id"] | |
| if calendar_id not in calendars_map: | |
| calendars_map[calendar_id] = list() | |
| time_tables = calendar_info.find("qbp:rules", simod_ns).findall("qbp:rule", simod_ns) | |
| if 'ARRIVAL_CALENDAR' in calendar_id or (arrival_calendar_id is None and 'DEFAULT_TIMETABLE' in calendar_id): | |
| arrival_calendar_id = calendar_id | |
| for time_table in time_tables: | |
| calendars_map[calendar_id].append({"from": time_table.attrib["fromWeekDay"], | |
| "to": time_table.attrib["toWeekDay"], | |
| "beginTime": format_date(time_table.attrib["fromTime"]), | |
| "endTime": format_date(time_table.attrib["toTime"])}) | |
| # 3. Extracting Arrival time distribution | |
| arrival_time_dist = extract_dist_params(simod_root.find("qbp:arrivalRateDistribution", simod_ns)) | |
| # 4. Extracting task-resource duration distributions | |
| bpmn_resources = simod_root.find("qbp:resources", simod_ns) | |
| simod_elements = simod_root.find("qbp:elements", simod_ns) | |
| pools_json = dict() | |
| resource_calendars = dict() | |
| for resource in bpmn_resources: | |
| pools_json[resource.attrib["id"]] = {"name": resource.attrib["name"], "resource_list": list()} | |
| resource_pools[resource.attrib["id"]] = list() | |
| calendar_id = resource.attrib["timetableId"] | |
| for i in range(1, int(resource.attrib["totalAmount"]) + 1): | |
| nr_id = "%s_%d" % (resource.attrib["id"], i) | |
| pools_json[resource.attrib["id"]]["resource_list"].append({ | |
| "id": nr_id, | |
| "name": "%s_%d" % (resource.attrib["name"], i), | |
| "cost_per_hour": resource.attrib["costPerHour"], | |
| "amount": 1 | |
| }) | |
| resource_pools[resource.attrib["id"]].append(nr_id) | |
| resource_calendars[nr_id] = calendars_map[calendar_id] | |
| task_resource_dist = dict() | |
| for e_inf in simod_elements: | |
| task_id = e_inf.attrib["elementId"] | |
| rpool_id = e_inf.find("qbp:resourceIds", simod_ns).find("qbp:resourceId", simod_ns).text | |
| dist_info = e_inf.find("qbp:durationDistribution", simod_ns) | |
| t_dist = extract_dist_params(dist_info) | |
| if task_id not in task_resource_dist: | |
| task_resource_dist[task_id] = dict() | |
| for rp_id in resource_pools[rpool_id]: | |
| task_resource_dist[task_id][rp_id] = t_dist | |
| # 5.Saving all in a single JSON file | |
| to_save = { | |
| "resource_profiles": pools_json, | |
| "arrival_time_distribution": arrival_time_dist, | |
| "arrival_time_calendar": calendars_map[arrival_calendar_id], | |
| "gateway_branching_probabilities": gateways_branching, | |
| "task_resource_distribution": task_resource_dist, | |
| "resource_calendars": resource_calendars, | |
| } | |
| with open(out_file, 'w') as file_writter: | |
| json.dump(to_save, file_writter) |
Metadata
Metadata
Assignees
Labels
questionFurther information is requestedFurther information is requested