diff --git a/Mesh/mwis.hpp b/Mesh/mwis.hpp
index 507916e48e32ad98981527ea7dfab8cdeb729b40..aacd94bdbd86ffb1e1e2857d566b5a09ceee2e6a 100644
--- a/Mesh/mwis.hpp
+++ b/Mesh/mwis.hpp
@@ -91,9 +91,10 @@ public:
     size_t i = 0;
     for (CliqueIterator it = clique_begin; it != clique_end; it++, i++) {
       std::vector<vertex> to_add;
-      for (const vertex &v : *it) {
-        to_add.push_back(v);
-        get(_cliques, v).push_back(i);
+      for (typename std::vector<vertex>::const_iterator v_it = it->begin();
+           v_it != it->end(); v_it++) {
+        to_add.push_back(*v_it);
+        get(_cliques, *v_it).push_back(i);
       }
       _clique_contents.push_back(to_add);
     }
@@ -101,7 +102,8 @@ public:
     _lambda.resize(_clique_contents.size());
     _gradient.resize(_clique_contents.size());
 
-    for (weight &v : _lambda) v = weight(0);
+    for (std::size_t i = 0; i < _lambda.size(); i++)
+      _lambda[i] = weight(0);
   }
 
   /**
@@ -179,7 +181,8 @@ public:
       const std::vector<size_t> &cliques_v = get(_cliques, v);
       const std::vector<size_t> &cliques_w = get(_cliques, w);
 
-      for (size_t clique : cliques_v) {
+      for (std::size_t i = 0; i < cliques_v.size(); i++) {
+        std::size_t clique = cliques_v[i];
         if (std::find(cliques_w.begin(), cliques_w.end(), clique) !=
             cliques_w.end()) {
           found = true;
@@ -193,10 +196,13 @@ public:
       }
     }
 
-    for (const std::vector<vertex> &clique : _clique_contents) {
-      for (vertex v : clique) {
-        for (vertex w : clique) {
-          if (v == w) continue;
+    for (std::size_t i = 0; i < _clique_contents.size(); i++) {
+      const std::vector<vertex> &clique = _clique_contents[i];
+
+      for (std::size_t j = 0; j < clique.size(); j++) {
+        vertex v = clique[j];
+        for (std::size_t k = j+1; k < clique.size(); k++) {
+          vertex w = clique[k];
 
           if (!edge(v, w, _graph).second) {
             std::cout << "no edge between " << v << " and " <<
@@ -214,8 +220,10 @@ private:
   void compute_gradient(Iterator cliques_begin, Iterator cliques_end) {
     for (Iterator it = cliques_begin; it != cliques_end; it++) {
       weight sum{1};
-      for (const vertex &v : _clique_contents[*it]) {
-        sum -= weight(get(_selected, v) ? 1 : 0);
+
+      const std::vector<vertex> &clique = _clique_contents[*it];
+      for (std::size_t i = 0; i < clique.size(); i++) {
+        sum -= weight(get(_selected, clique[i]) ? 1 : 0);
       }
 
       _gradient[*it] = sum;
@@ -230,8 +238,10 @@ private:
     for (Iterator it = begin; it != end; it++) {
       weight result(get(_weight, *it));
 
-      for (size_t clique : get(_cliques, *it))
-        result -= _lambda[clique];
+      const std::vector<std::size_t> &vertex_cliques = get(_cliques, *it);
+      for (std::size_t i = 0; i < vertex_cliques.size(); i++) {
+        result -= _lambda[vertex_cliques[i]];
+      }
 
       put(_effective_weight, *it, result);
     }
@@ -284,14 +294,14 @@ private:
       put(_selected, v, false);
     }
 
-    for (vertex v : largest) {
+    for (std::size_t i = 0; i < largest.size(); i++) {
+      vertex v = largest[i];
       if (get(_effective_weight, v) <= weight(0))
         break;
       put(_selected, v, true);
     }
   }
 
-
   /**
    * Calculates the upper bound for the current values of the Lagrange
    * multipliers and the current selection of nodes.
@@ -375,9 +385,12 @@ struct state {
         clique_sizes[i] = cliques[i].size();
 
       size_t id = 0;
-      for (std::vector<vertex> &clique : cliques) {
-        for (vertex v : clique)
-          get(clique_map, v).push_back(id);
+
+      for (std::size_t i = 0; i < cliques.size(); i++) {
+        std::vector<vertex> &clique = cliques[i];
+
+        for (std::size_t j = 0; j < clique.size(); j++)
+          get(clique_map, clique[j]).push_back(id);
 
         std::sort(clique.begin(), clique.end(), [&](vertex a, vertex b) {
           return get(weight_map, a) > get(weight_map, b);
@@ -428,12 +441,16 @@ public:
         }
       }
 
-      for (size_t i : get(state.clique_map, _vertex)) {
-        if (!state.assigned[i]) assigned.push_back(i);
+      const std::vector<std::size_t> &clique_ids = get(state.clique_map, _vertex);
+      for (std::size_t i = 0; i < clique_ids.size(); i++) {
+        std::size_t c_id = clique_ids[i];
+        if (!state.assigned[c_id]) assigned.push_back(c_id);
       }
     }
     else {
-      for (vertex v : state.cliques[_id]) {
+      const std::vector<vertex> &clique = state.cliques[_id];
+      for (std::size_t i = 0; i < clique.size(); i++) {
+        vertex v = clique[i];
         if (state.selectable.find(v) != state.selectable.end())
           removed.push_back(v);
       }
@@ -442,8 +459,13 @@ public:
     }
 
     std::map<size_t, size_t> size_delta;
-    for (vertex v : removed) {
-      for (size_t clique : get(state.clique_map, v)) {
+    for (std::size_t i = 0; i < removed.size(); i++) {
+      vertex v = removed[i];
+
+      const std::vector<std::size_t> &cliques = get(state.clique_map, v);
+      for (std::size_t j = 0; j < cliques.size(); j++) {
+        std::size_t clique = cliques[j];
+
         size_delta[clique]++;
         if (size_delta[clique] == state.clique_sizes[clique]) {
           if (!state.assigned[clique])
@@ -485,44 +507,47 @@ public:
     {}
 
   void apply(state<Graph, WeightMap> &state) const {
-    for (size_t i : _assigned_id)
-      state.assigned[i] = true;
+    for (size_t i = 0; i < _assigned_id.size(); i++)
+      state.assigned[_assigned_id[i]] = true;
 
     size_t old_size = state.solution.size();
     state.solution.resize(state.solution.size() + _selected.size());
     std::copy(_selected.begin(), _selected.end(),
               state.solution.begin() + old_size);
 
-    for (vertex v : _selected)
-      state.selectable.erase(v);
+    for (std::size_t i = 0; i < _selected.size(); i++)
+      state.selectable.erase(_selected[i]);
 
     state.solution_value = _new_weight;
 
-    for (vertex v : _invalidated) {
-      state.selectable.erase(v);
+    for (std::size_t i = 0; i < _invalidated.size(); i++) {
+      state.selectable.erase(_invalidated[i]);
     }
 
-    for (auto pair : _size_delta)
-      state.clique_sizes[pair.first] -= pair.second;
+    for (std::map<std::size_t, std::size_t>::const_iterator it = _size_delta.begin();
+         it != _size_delta.end(); it++) {
+      state.clique_sizes[it->first] -= it->second;
+    }
   }
 
   void reverse(state<Graph, WeightMap> &state) const {
-    for (size_t i : _assigned_id)
-      state.assigned[i] = false;
+    for (size_t i = 0; i < _assigned_id.size(); i++)
+      state.assigned[_assigned_id[i]] = false;
 
     state.solution.resize(state.solution.size() - _selected.size());
 
-    for (vertex v : _selected)
-      state.selectable.insert(v);
+    for (std::size_t i = 0; i < _selected.size(); i++)
+      state.selectable.insert(_selected[i]);
 
     state.solution_value = _old_weight;
 
-    for (vertex v : _invalidated) {
-      state.selectable.insert(v);
-    }
+    for (std::size_t i = 0; i < _invalidated.size(); i++)
+      state.selectable.insert(_invalidated[i]);
 
-    for (auto pair : _size_delta)
-      state.clique_sizes[pair.first] += pair.second;
+    for (std::map<std::size_t, std::size_t>::const_iterator it = _size_delta.begin();
+         it != _size_delta.end(); it++) {
+      state.clique_sizes[it->first] += it->second;
+    }
   }
 };
 
@@ -595,7 +620,10 @@ public:
 
     std::vector<vertex> vertices;
     size_t id = *clique_it;
-    for (vertex v : state.cliques[id]) {
+
+    const std::vector<vertex> &clique = state.cliques[id];
+    for (std::size_t i = 0; i < clique.size(); i++) {
+      vertex v = clique[i];
       if (state.selectable.find(v) != state.selectable.end()) {
         vertices.push_back(v);
       }
@@ -614,8 +642,10 @@ public:
                 return vertex_regret(state, a) < vertex_regret(state, b);
               });
 
-    for (vertex v : vertices)
-      *it++ = clique_assignment<Graph, WeightMap>(id, v);
+
+    for (std::size_t i = 0; i < vertices.size(); i++) {
+      *it++ = clique_assignment<Graph, WeightMap>(id, vertices[i]);
+    }
 
     *it++ = clique_assignment<Graph, WeightMap>(id);
   }
@@ -845,7 +875,9 @@ public:
 
     weight new_weight(0);
 
-    for (vertex v : l_state.solution) {
+    for (std::size_t i = 0; i < l_state.solution.size(); i++) {
+      vertex v = l_state.solution[i];
+
       if (fragment.vertices.find(v) != fragment.vertices.end())
         continue;
 
@@ -859,8 +891,9 @@ public:
         removed.insert(other);
       }
 
-      for (size_t i : get(search_state.clique_map, v))
-        assigned.insert(i);
+      const std::vector<std::size_t> &clique = get(search_state.clique_map, v);
+      for (size_t i = 0; i < clique.size(); i++)
+        assigned.insert(clique[i]);
     }
 
     auto vs = boost::vertices(l_state.graph);
@@ -871,8 +904,14 @@ public:
     }
 
     std::map<size_t, size_t> size_delta;
-    for (vertex v : removed) {
-      for (size_t clique : get(search_state.clique_map, v)) {
+    for (typename std::set<vertex>::const_iterator it = removed.begin();
+         it != removed.end(); it++) {
+      vertex v = *it;
+
+      const std::vector<vertex> &cliques = get(search_state.clique_map, v);
+      for (std::size_t i = 0; i < cliques.size(); i++) {
+        std::size_t clique = cliques[i];
+
         size_delta[clique]++;
         if (size_delta[clique] == search_state.clique_sizes[clique]) {
           assigned.insert(clique);
@@ -897,8 +936,8 @@ public:
     visit_state<Graph, WeightMap> visitor;
     visitor.best_solution = l_state.solution;
     visitor.best_value = weight(0);
-    for (vertex v : visitor.best_solution)
-      visitor.best_value += get(l_state.weight_map, v);
+    for (std::size_t i = 0; i < visitor.best_solution.size(); i++)
+      visitor.best_value += get(l_state.weight_map, visitor.best_solution[i]);
 
     successor<Graph, WeightMap, decltype(bound)> successor(
       bound, visitor.best_value);
@@ -906,7 +945,8 @@ public:
     search::depth_first_search(search_state, visitor, successor);
 
     std::vector<vertex> newly_selected;
-    for (vertex v : visitor.best_solution) {
+    for (std::size_t i = 0; i < visitor.best_solution.size(); i++) {
+      vertex v = visitor.best_solution[i];
       if (fragment.vertices.find(v) != fragment.vertices.end())
         newly_selected.push_back(v);
     }
@@ -1011,10 +1051,6 @@ void maximum_weight_independent_set(const Graph &graph, WeightMap weight_map,
     graph, weight_map,
     cliques.begin(), cliques.end());
 
-  // search::depth_first_search(state, visitor, successor);
-  // for (vertex v : visitor.best_solution)
-  //   *out++ = v;
-
 #ifdef MWIS_MCTS
   auto vs = vertices(graph);
   weight root_bound(bound(vs.second, vs.second, vs.first, vs.second));
@@ -1028,8 +1064,8 @@ void maximum_weight_independent_set(const Graph &graph, WeightMap weight_map,
   search::monte_carlo_tree_search(state, max_successor, direct_eval);
   std::cout << "\n";
 
-  for (vertex v : state.solution)
-    *out++ = v;
+  for (std::size_t i = 0; i < state.solution.size(); i++)
+    *out++ = state.solution[i];
 #else
   mwis::evaluator<Graph, WeightMap> eval(cliques.begin(), cliques.end(), 5);
 
@@ -1044,7 +1080,7 @@ void maximum_weight_independent_set(const Graph &graph, WeightMap weight_map,
   search::large_neighborhood_search(l_state, l_selector, l_search, 300);
   std::cout << "\n";
 
-  for (vertex v : l_state.solution)
-    *out++ = v;
+  for (std::size_t i = 0; i < l_state.solution.size(); i++)
+    *out++ = l_state.solution[i];
 #endif
 }