Source code for mapof.marriages.distances.main_distances
from mapof.core.matchings import *
[docs]
def compute_retrospective_distance(
instance_1,
instance_2,
inner_distance
) -> (float, list | None):
""" Computes Retrospective distance between marriages instances
Parameters
----------
instance_1 : Marriage
First marriage instance.
instance_2 : Marriage
Second marriage instance.
inner_distance : callable
Inner distance.
Returns
-------
float
Retrospective distance.
"""
results = []
for crossing in [False, True]:
cost_table_1, cost_table_2 = _get_matching_cost_retrospective(
instance_1, instance_2, inner_distance, crossing=crossing)
a, _ = solve_matching_vectors(cost_table_1)
b, _ = solve_matching_vectors(cost_table_2)
results.append(a+b)
return min(results), None
def _get_matching_cost_retrospective(
instance_1,
instance_2,
inner_distance: callable,
crossing=False
):
""" Return: Cost table """
vectors_1 = instance_1.get_retrospective_vectors()
vectors_2 = instance_2.get_retrospective_vectors()
size = instance_1.num_agents
if crossing:
return [[inner_distance(vectors_1[0][i], vectors_2[1][j])
for i in range(size)] for j in range(size)], \
[[inner_distance(vectors_1[1][i], vectors_2[0][j])
for i in range(size)] for j in range(size)]
else:
return [[inner_distance(vectors_1[0][i], vectors_2[0][j])
for i in range(size)] for j in range(size)], \
[[inner_distance(vectors_1[1][i], vectors_2[1][j])
for i in range(size)] for j in range(size)]