+// TODO, it would make sense to use std::set instead
+template<class T>
+int get_search_interval(std::vector<std::unique_ptr<T>> const& list, T *ref, int *min, int *max)
+{
+ int nb_processes = ref->nb_processes;
+ int heap_bytes_used = ref->heap_bytes_used;
+
+ int cursor = 0;
+ int start = 0;
+ int end = list.size() - 1;
+ while (start <= end) {
+ cursor = (start + end) / 2;
+ int nb_processes_test = list[cursor]->nb_processes;
+ int heap_bytes_used_test = list[cursor]->heap_bytes_used;
+
+ if (nb_processes_test < nb_processes)
+ start = cursor + 1;
+ else if (nb_processes_test > nb_processes)
+ end = cursor - 1;
+ else if (heap_bytes_used_test < heap_bytes_used)
+ start = cursor + 1;
+ else if (heap_bytes_used_test > heap_bytes_used)
+ end = cursor - 1;
+ else {
+ *min = *max = cursor;
+ int previous_cursor = cursor - 1;
+ while (previous_cursor >= 0) {
+ nb_processes_test = list[previous_cursor]->nb_processes;
+ heap_bytes_used_test = list[previous_cursor]->heap_bytes_used;
+ if (nb_processes_test != nb_processes || heap_bytes_used_test != heap_bytes_used)
+ break;
+ *min = previous_cursor;
+ previous_cursor--;
+ }
+ size_t next_cursor = cursor + 1;
+ while (next_cursor < list.size()) {
+ nb_processes_test = list[next_cursor]->nb_processes;
+ heap_bytes_used_test = list[next_cursor]->heap_bytes_used;
+ if (nb_processes_test != nb_processes || heap_bytes_used_test != heap_bytes_used)
+ break;
+ *max = next_cursor;
+ next_cursor++;
+ }
+ return -1;
+ }
+ }
+ return cursor;
+}
+
+static
+bool some_communications_are_not_finished()
+{
+ for (size_t current_process = 1; current_process < MC_smx_get_maxpid(); current_process++) {
+ xbt_dynar_t pattern = xbt_dynar_get_as(
+ incomplete_communications_pattern, current_process, xbt_dynar_t);
+ if (!xbt_dynar_is_empty(pattern)) {
+ XBT_DEBUG("Some communications are not finished, cannot stop the exploration ! State not visited.");
+ return true;
+ }
+ }
+ return false;
+}
+
+namespace simgrid {
+namespace mc {