summaryrefslogtreecommitdiff
path: root/worldalign/match_battery.py
diff options
context:
space:
mode:
Diffstat (limited to 'worldalign/match_battery.py')
-rw-r--r--worldalign/match_battery.py18
1 files changed, 13 insertions, 5 deletions
diff --git a/worldalign/match_battery.py b/worldalign/match_battery.py
index 9035e62..63a4bf1 100644
--- a/worldalign/match_battery.py
+++ b/worldalign/match_battery.py
@@ -142,11 +142,19 @@ def solve_faq_multi(visual, shuffled, **_):
"""FAQ from many random doubly stochastic starts, best by its own objective."""
from scipy.optimize import quadratic_assignment
- result = quadratic_assignment(
- visual, shuffled, method="faq",
- options={"maximize": True, "n_init": 30, "rng": 0},
- )
- return result.col_ind
+ # scipy's FAQ takes no `n_init`; passing one is silently swallowed into
+ # unknown_options, which is why an earlier version of this function
+ # returned bit-identical results to plain FAQ. Restart explicitly.
+ best, best_value = None, -np.inf
+ for seed in range(15):
+ result = quadratic_assignment(
+ visual, shuffled, method="faq",
+ options={"maximize": True, "rng": seed, "P0": "randomized"},
+ )
+ value = float((visual * shuffled[np.ix_(result.col_ind, result.col_ind)]).sum())
+ if value > best_value:
+ best, best_value = result.col_ind, value
+ return best
def solve_2opt(visual, shuffled, **_):