Source code for pm4py.objects.petri.reduction

'''
    This file is part of PM4Py (More Info: https://pm4py.fit.fraunhofer.de).

    PM4Py is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    PM4Py is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with PM4Py.  If not, see <https://www.gnu.org/licenses/>.
'''
from pm4py.objects.petri.utils import remove_transition, remove_place, add_arc_from_to


[docs]def reduce_single_entry_transitions(net): """ Reduces the number of the single entry transitions in the Petri net Parameters ---------------- net Petri net """ cont = True while cont: cont = False single_entry_transitions = [t for t in net.transitions if t.label is None and len(t.in_arcs) == 1] for i in range(len(single_entry_transitions)): t = single_entry_transitions[i] source_place = list(t.in_arcs)[0].source target_places = [a.target for a in t.out_arcs] if len(source_place.in_arcs) == 1 and len(source_place.out_arcs) == 1: source_transition = list(source_place.in_arcs)[0].source remove_transition(net, t) remove_place(net, source_place) for p in target_places: add_arc_from_to(source_transition, p, net) cont = True break return net
[docs]def reduce_single_exit_transitions(net): """ Reduces the number of the single exit transitions in the Petri net Parameters -------------- net Petri net """ cont = True while cont: cont = False single_exit_transitions = [t for t in net.transitions if t.label is None and len(t.out_arcs) == 1] for i in range(len(single_exit_transitions)): t = single_exit_transitions[i] target_place = list(t.out_arcs)[0].target source_places = [a.source for a in t.in_arcs] if len(target_place.in_arcs) == 1 and len(target_place.out_arcs) == 1: target_transition = list(target_place.out_arcs)[0].target remove_transition(net, t) remove_place(net, target_place) for p in source_places: add_arc_from_to(p, target_transition, net) cont = True break return net
[docs]def apply_simple_reduction(net): """ Apply a simple reduction to the Petri net Parameters -------------- net Petri net """ reduce_single_entry_transitions(net) reduce_single_exit_transitions(net) return net