From 9ce3271a28df35268f4f283c35404c1017bfb8b6 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Thu, 25 Jan 2018 10:39:13 +0100
Subject: [PATCH] Make iteration order of vectorization strategies
 deterministic

---
 python/dune/perftool/sumfact/vectorization.py | 12 ++++++++----
 python/dune/perftool/tools.py                 |  8 ++++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/python/dune/perftool/sumfact/vectorization.py b/python/dune/perftool/sumfact/vectorization.py
index 3cecd962..05a69b36 100644
--- a/python/dune/perftool/sumfact/vectorization.py
+++ b/python/dune/perftool/sumfact/vectorization.py
@@ -20,7 +20,7 @@ from dune.perftool.sumfact.tabulation import (BasisTabulationMatrixArray,
                                               )
 from dune.perftool.error import PerftoolVectorizationError
 from dune.perftool.options import get_option
-from dune.perftool.tools import add_to_frozendict, round_to_multiple
+from dune.perftool.tools import add_to_frozendict, round_to_multiple, list_diff
 
 from pytools import product
 from frozendict import frozendict
@@ -260,12 +260,16 @@ def fixed_quad_vectorization_opportunity_generator(sumfacts, width, qp, already=
         yield already
         return
 
+    # Ensure a deterministic order of the given sumfact kernels. This is necessary for the
+    # fromlist strategy to pick correct strategies across different program runs
+    sumfacts = sorted(sumfacts, key=lambda sf: repr(sf))
+
     # Otherwise we pick a random sum factorization kernel and construct all the vectorization
     # opportunities realizing this particular kernel and go into recursion.
-    sf_to_decide = next(iter(sumfacts))
+    sf_to_decide = sumfacts[0]
 
     # Have "unvectorized" as an option, although it is not good
-    for opp in fixed_quad_vectorization_opportunity_generator(sumfacts.difference({sf_to_decide}),
+    for opp in fixed_quad_vectorization_opportunity_generator(list_diff(sumfacts, [sf_to_decide]),
                                                               width,
                                                               qp,
                                                               add_to_frozendict(already,
@@ -298,7 +302,7 @@ def fixed_quad_vectorization_opportunity_generator(sumfacts, width, qp, already=
                 continue
 
             # Go into recursion to also vectorize all kernels not in this combo
-            for opp in fixed_quad_vectorization_opportunity_generator(sumfacts.difference(combo),
+            for opp in fixed_quad_vectorization_opportunity_generator(list_diff(sumfacts, combo),
                                                                       width,
                                                                       qp,
                                                                       add_to_frozendict(already, vecdict),
diff --git a/python/dune/perftool/tools.py b/python/dune/perftool/tools.py
index d358f3ab..e302f28c 100644
--- a/python/dune/perftool/tools.py
+++ b/python/dune/perftool/tools.py
@@ -74,3 +74,11 @@ def add_to_frozendict(fd, valdict):
     t = dict(fd)
     t.update(valdict)
     return frozendict.frozendict(t)
+
+
+def list_diff(l1, l2):
+        l = []
+        for item in l1:
+            if item not in l2:
+                l.append(item)
+        return l
-- 
GitLab