Source code for pm4py.statistics.util.times_bipartite_matching
from pm4py.util import nx_utils
import sys
[docs]
def exact_match_minimum_average(l1, l2):
"""
Performs an exact matching, having minimum average,
of two lists of times (a timestamp of the first list
is matched with a timestamp of the second list that
is greater or equal). Some timestamps in the two lists
may be left out of the matching.
Parameters
---------------
l1
First list of times
l2
Second list of times
Returns
---------------
exact_matching
Exact matching (list of tuples having as first element
an element of the first list, and as second element
an element of the second list)
"""
G = nx_utils.Graph()
for i in range(len(l1)):
G.add_node(i)
for j in range(len(l2)):
G.add_node(len(l1) + j)
for i in range(len(l1)):
for j in range(len(l2)):
if l1[i] <= l2[j]:
G.add_edge(i, len(l1) + j, weight=(l2[j] - l1[i]))
else:
G.add_edge(i, len(l1) + j, weight=sys.maxsize)
matching0 = {
x: y
for x, y in nx_utils.minimum_weight_full_matching(G).items()
if x < len(l1)
}
matching = []
for k1, k2 in matching0.items():
v1 = l1[k1]
v2 = l2[k2 - len(l1)]
if v2 >= v1:
matching.append((v1, v2))
return matching