def lsa_solve_scipy(costs): """Solves the LSA problem using the scipy library.""" from scipy.optimize import linear_sum_assignment as scipy_solve # scipy (1.3.3) does not support nan or inf values finite_costs = add_expensive_edges(costs) rids, cids = scipy_solve(finite_costs) rids, cids = _exclude_missing_edges(costs, rids, cids) return rids, cids
def lsa_solve_scipy(costs): """Solves the LSA problem using the scipy library.""" from scipy.optimize import linear_sum_assignment as scipy_solve # Note there is an issue in scipy.optimize.linear_sum_assignment where # it runs forever if an entire row/column is infinite or nan. We therefore # make a copy of the distance matrix and compute a safe value that indicates # 'cannot assign'. Also note + 1 is necessary in below inv-dist computation # to make invdist bigger than max dist in case max dist is zero. inv = ~np.isfinite(costs) if inv.any(): costs = costs.copy() valid = costs[~inv] INVDIST = 2 * valid.max() + 1 if valid.shape[0] > 0 else 1. costs[inv] = INVDIST return scipy_solve(costs)