def apply_trace_net(petri_net, initial_marking, final_marking, trace_net, trace_im, trace_fm, parameters=None): """ Performs the basic alignment search, given a trace net and a net. Parameters ---------- trace: :class:`list` input trace, assumed to be a list of events (i.e. the code will use the activity key to get the attributes) petri_net: :class:`pm4py.objects.petri.net.PetriNet` the Petri net to use in the alignment initial_marking: :class:`pm4py.objects.petri.net.Marking` initial marking in the Petri net final_marking: :class:`pm4py.objects.petri.net.Marking` final marking in the Petri net parameters: :class:`dict` (optional) dictionary containing one of the following: Parameters.PARAM_TRACE_COST_FUNCTION: :class:`list` (parameter) mapping of each index of the trace to a positive cost value Parameters.PARAM_MODEL_COST_FUNCTION: :class:`dict` (parameter) mapping of each transition in the model to corresponding model cost Parameters.PARAM_SYNC_COST_FUNCTION: :class:`dict` (parameter) mapping of each transition in the model to corresponding synchronous costs Parameters.ACTIVITY_KEY: :class:`str` (parameter) key to use to identify the activity described by the events Parameters.PARAM_TRACE_NET_COSTS: :class:`dict` (parameter) mapping between transitions and costs Returns ------- dictionary: `dict` with keys **alignment**, **cost**, **visited_states**, **queued_states** and **traversed_arcs** """ if parameters is None: parameters = {} ret_tuple_as_trans_desc = exec_utils.get_param_value(Parameters.PARAM_ALIGNMENT_RESULT_IS_SYNC_PROD_AWARE, parameters, False) trace_cost_function = exec_utils.get_param_value(Parameters.PARAM_TRACE_COST_FUNCTION, parameters, None) model_cost_function = exec_utils.get_param_value(Parameters.PARAM_MODEL_COST_FUNCTION, parameters, None) sync_cost_function = exec_utils.get_param_value(Parameters.PARAM_SYNC_COST_FUNCTION, parameters, None) trace_net_costs = exec_utils.get_param_value(Parameters.PARAM_TRACE_NET_COSTS, parameters, None) if trace_cost_function is None or model_cost_function is None or sync_cost_function is None: sync_prod, sync_initial_marking, sync_final_marking = petri.synchronous_product.construct(trace_net, trace_im, trace_fm, petri_net, initial_marking, final_marking, utils.SKIP) cost_function = utils.construct_standard_cost_function(sync_prod, utils.SKIP) else: revised_sync = dict() for t_trace in trace_net.transitions: for t_model in petri_net.transitions: if t_trace.label == t_model.label: revised_sync[(t_trace, t_model)] = sync_cost_function[t_model] sync_prod, sync_initial_marking, sync_final_marking, cost_function = construct_cost_aware( trace_net, trace_im, trace_fm, petri_net, initial_marking, final_marking, utils.SKIP, trace_net_costs, model_cost_function, revised_sync) max_align_time_trace = exec_utils.get_param_value(Parameters.PARAM_MAX_ALIGN_TIME_TRACE, parameters, sys.maxsize) return apply_sync_prod(sync_prod, sync_initial_marking, sync_final_marking, cost_function, utils.SKIP, ret_tuple_as_trans_desc=ret_tuple_as_trans_desc, max_align_time_trace=max_align_time_trace)
def apply_trace_net(petri_net, initial_marking, final_marking, trace_net, trace_im, trace_fm, parameters=None): if parameters is None: parameters = {} ret_tuple_as_trans_desc = parameters[ PARAM_ALIGNMENT_RESULT_IS_SYNC_PROD_AWARE] if PARAM_ALIGNMENT_RESULT_IS_SYNC_PROD_AWARE in parameters else False if parameters is None or PARAM_TRACE_COST_FUNCTION not in parameters or PARAM_MODEL_COST_FUNCTION not in parameters or PARAM_SYNC_COST_FUNCTION not in parameters: sync_prod, sync_initial_marking, sync_final_marking = petri.synchronous_product.construct(trace_net, trace_im, trace_fm, petri_net, initial_marking, final_marking, utils.SKIP) cost_function = utils.construct_standard_cost_function(sync_prod, utils.SKIP) else: revised_sync = dict() for t_trace in trace_net.transitions: for t_model in petri_net.transitions: if t_trace.label == t_model.label: revised_sync[(t_trace, t_model)] = parameters[PARAM_SYNC_COST_FUNCTION][t_model] sync_prod, sync_initial_marking, sync_final_marking, cost_function = construct_cost_aware( trace_net, trace_im, trace_fm, petri_net, initial_marking, final_marking, utils.SKIP, parameters[PARAM_TRACE_NET_COSTS], parameters[PARAM_MODEL_COST_FUNCTION], revised_sync) max_align_time_trace = parameters[ PARAM_MAX_ALIGN_TIME_TRACE] if PARAM_MAX_ALIGN_TIME_TRACE in parameters else DEFAULT_MAX_ALIGN_TIME_TRACE return apply_sync_prod(sync_prod, sync_initial_marking, sync_final_marking, cost_function, utils.SKIP, ret_tuple_as_trans_desc=ret_tuple_as_trans_desc, max_align_time_trace=max_align_time_trace)
def apply(trace, petri_net, initial_marking, final_marking, find_all_opt_alignments=False, dijkstra=False, parameters=None): """ Performs the basic alignment search, given a trace and a net. Parameters ---------- trace: :class:`list` input trace, assumed to be a list of events (i.e. the code will use the activity key to get the attributes) petri_net: :class:`pm4py.objects.petri.net.PetriNet` the Petri net to use in the alignment initial_marking: :class:`pm4py.objects.petri.net.Marking` initial marking in the Petri net final_marking: :class:`pm4py.objects.petri.net.Marking` final marking in the Petri net parameters: :class:`dict` (optional) dictionary containing one of the following: PARAM_TRACE_COST_FUNCTION: :class:`list` (parameter) mapping of each index of the trace to a positive cost value PARAM_MODEL_COST_FUNCTION: :class:`dict` (parameter) mapping of each transition in the model to corresponding model cost PARAM_SYNC_COST_FUNCTION: :class:`dict` (parameter) mapping of each transition in the model to corresponding synchronous costs PARAM_ACTIVITY_KEY: :class:`str` (parameter) key to use to identify the activity described by the events Returns ------- dictionary: `dict` with keys **alignment**, **cost**, **visited_states**, **queued_states** and **traversed_arcs** """ activity_key = DEFAULT_NAME_KEY if parameters is None or PARAMETER_CONSTANT_ACTIVITY_KEY not in parameters else \ parameters[ pm4pyutil.constants.PARAMETER_CONSTANT_ACTIVITY_KEY] if parameters is None or PARAM_TRACE_COST_FUNCTION not in parameters or PARAM_MODEL_COST_FUNCTION not in parameters or PARAM_SYNC_COST_FUNCTION not in parameters: trace_net, trace_im, trace_fm = petri.utils.construct_trace_net(trace, activity_key=activity_key) sync_prod, sync_initial_marking, sync_final_marking = petri.synchronous_product.construct(trace_net, trace_im, trace_fm, petri_net, initial_marking, final_marking, alignments.utils.SKIP) cost_function = alignments.utils.construct_standard_cost_function(sync_prod, alignments.utils.SKIP) else: trace_net, trace_im, trace_fm, trace_net_costs = construct_trace_net_cost_aware(trace, parameters[ PARAM_TRACE_COST_FUNCTION], activity_key=activity_key) revised_sync = dict() for t_trace in trace_net.transitions: for t_model in petri_net.transitions: if t_trace.label == t_model.label: revised_sync[(t_trace, t_model)] = parameters[PARAM_SYNC_COST_FUNCTION][t_model] sync_prod, sync_initial_marking, sync_final_marking, cost_function = construct_cost_aware( trace_net, trace_im, trace_fm, petri_net, initial_marking, final_marking, alignments.utils.SKIP, trace_net_costs, parameters[PARAM_MODEL_COST_FUNCTION], revised_sync) # view synchronous product net # gviz = pn_vis_factory.apply(sync_prod, sync_initial_marking, sync_final_marking, # parameters={"debug": True, "format": "svg"}) # pn_vis_factory.view(gviz) return apply_sync_prod(sync_prod, sync_initial_marking, sync_final_marking, cost_function, alignments.utils.SKIP, find_all_opt_alignments, dijkstra)
def construct_sync_prod_net(trace, net, im, fm, parameters=None): """ Constructs the synchronous product net Parameters --------------- trace Trace net Petri net im Initial marking fm Final marking parameters Parameters Returns ---------------- sync_prod_net Synchronous product net """ if parameters is None: parameters = {} sync_cost = exec_utils.get_param_value(Parameters.PARAM_STD_SYNC_COST, parameters, align_utils.STD_SYNC_COST) activity_key = exec_utils.get_param_value(Parameters.ACTIVITY_KEY, parameters, DEFAULT_NAME_KEY) trace_cost_function = exec_utils.get_param_value(Parameters.PARAM_TRACE_COST_FUNCTION, parameters, None) trace_net_cost_aware_constr_function = exec_utils.get_param_value(Parameters.TRACE_NET_COST_AWARE_CONSTR_FUNCTION, parameters, construct_trace_net_cost_aware) model_cost_function = exec_utils.get_param_value(Parameters.PARAM_MODEL_COST_FUNCTION, parameters, None) trace_net_costs = exec_utils.get_param_value(Parameters.PARAM_TRACE_NET_COSTS, parameters, None) trace_net, trace_im, trace_fm, parameters[ Parameters.PARAM_TRACE_NET_COSTS] = trace_net_cost_aware_constr_function(trace, trace_cost_function, activity_key=activity_key) if trace_net_costs is None: trace_net_costs = {} trans = sorted([(t, int(t.name.split("_")[-1])) for t in trace_net.transitions], key=lambda x: x[-1]) for index, t in enumerate(trans): trace_net_costs[t[0]] = trace_cost_function[index] revised_sync = dict() for t_trace in trace_net.transitions: for t_model in net.transitions: if t_trace.label == t_model.label: revised_sync[(t_trace, t_model)] = sync_cost sync_prod, sync_initial_marking, sync_final_marking, cost_function = construct_cost_aware( trace_net, trace_im, trace_fm, net, im, fm, utils.SKIP, trace_net_costs, model_cost_function, revised_sync) return sync_prod, sync_final_marking, sync_final_marking, cost_function
def construct_sync_prod_net(trace, net, im, fm, parameters=None): """ Constructs the synchronous product net Parameters --------------- trace Trace net Petri net im Initial marking fm Final marking parameters Parameters Returns ---------------- sync_prod_net Synchronous product net """ if parameters is None: parameters = {} sync_cost = exec_utils.get_param_value(Parameters.PARAM_STD_SYNC_COST, parameters, align_utils.STD_SYNC_COST) activity_key = exec_utils.get_param_value(Parameters.ACTIVITY_KEY, parameters, DEFAULT_NAME_KEY) trace_cost_function = exec_utils.get_param_value( Parameters.PARAM_TRACE_COST_FUNCTION, parameters, None) labels = sorted(list(set(x[activity_key] for x in trace))) if trace_cost_function is None: trace_cost_function = list( map(lambda e: utils.STD_MODEL_LOG_MOVE_COST, trace)) parameters[Parameters.PARAM_TRACE_COST_FUNCTION] = trace_cost_function trace_net_cost_aware_constr_function = exec_utils.get_param_value( Parameters.TRACE_NET_COST_AWARE_CONSTR_FUNCTION, parameters, construct_trace_net_cost_aware) model_cost_function = exec_utils.get_param_value( Parameters.PARAM_MODEL_COST_FUNCTION, parameters, None) if model_cost_function is None: # reset variables value model_cost_function = dict() sync_cost_function = dict() for t in net.transitions: if t.label is not None: model_cost_function[t] = align_utils.STD_MODEL_LOG_MOVE_COST else: preset_t = Marking() for a in t.in_arcs: preset_t[a.source] = a.weight # optimization 12/08/2020 # # instead of giving undiscriminately weight 1 to # invisible transitions, assign weight 0 to the ones # for which no 'sync' transition is enabled in their # activation markings. # # this requires to modify the state of the alignment, keeping track # of the length of the alignment, to avoid loops. en_t = enabled_transitions(net, preset_t) vis_t_trace = [t for t in en_t if t.label in labels] if len(vis_t_trace) == 0: model_cost_function[t] = 0 else: model_cost_function[t] = align_utils.STD_TAU_COST parameters[Parameters.PARAM_MODEL_COST_FUNCTION] = model_cost_function parameters[Parameters.PARAM_SYNC_COST_FUNCTION] = sync_cost_function trace_net, trace_im, trace_fm, parameters[ Parameters. PARAM_TRACE_NET_COSTS] = trace_net_cost_aware_constr_function( trace, trace_cost_function, activity_key=activity_key) trace_net_costs = exec_utils.get_param_value( Parameters.PARAM_TRACE_NET_COSTS, parameters, None) if trace_net_costs is None: trace_net_costs = {} trans = sorted([(t, int(t.name.split("_")[-1])) for t in trace_net.transitions], key=lambda x: x[-1]) for index, t in enumerate(trans): trace_net_costs[t[0]] = trace_cost_function[index] revised_sync = dict() for t_trace in trace_net.transitions: for t_model in net.transitions: if t_trace.label == t_model.label: revised_sync[(t_trace, t_model)] = sync_cost sync_prod, sync_initial_marking, sync_final_marking, cost_function = construct_cost_aware( trace_net, trace_im, trace_fm, net, im, fm, utils.SKIP, trace_net_costs, model_cost_function, revised_sync) return sync_prod, sync_final_marking, sync_final_marking, cost_function