Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : remove unused argument in functions for heap comparison algorithm
[simgrid.git] / src / surf / surf.c
index dba895c..64b50d0 100644 (file)
@@ -12,6 +12,7 @@
 #include "surf/surf_resource.h"
 #include "xbt/xbt_os_thread.h"
 
+XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
                                 "Logging specific to SURF (kernel)");
 
@@ -288,9 +289,81 @@ double generic_maxmin_share_resources(xbt_swag_t running_actions,
   return min;
 }
 
+double generic_share_resources_lazy(double now, surf_model_t model)
+{
+  surf_action_lmm_t action = NULL;
+  double min = -1;
+  double value;
+
+  XBT_DEBUG
+      ("Before share resources, the size of modified actions set is %d",
+       xbt_swag_size(model->model_private->modified_set));
+
+  lmm_solve(model->model_private->maxmin_system);
+
+  XBT_DEBUG
+      ("After share resources, The size of modified actions set is %d",
+       xbt_swag_size(model->model_private->modified_set));
+
+  while((action = xbt_swag_extract(model->model_private->modified_set))) {
+    int max_dur_flag = 0;
+
+    if (action->generic_action.state_set !=
+        model->states.running_action_set)
+      continue;
+
+    /* bogus priority, skip it */
+    if (action->generic_action.priority <= 0)
+      continue;
+
+    generic_update_action_remaining_lazy(action,now);
+
+    min = -1;
+    value = lmm_variable_getvalue(action->variable);
+    if (value > 0) {
+      if (action->generic_action.remains > 0) {
+        value = action->generic_action.remains / value;
+        min = now + value;
+      } else {
+        value = 0.0;
+        min = now;
+      }
+    }
+
+    if ((action->generic_action.max_duration != NO_MAX_DURATION)
+        && (min == -1
+            || action->generic_action.start +
+            action->generic_action.max_duration < min)) {
+      min = action->generic_action.start +
+          action->generic_action.max_duration;
+      max_dur_flag = 1;
+    }
+
+    XBT_DEBUG("Action(%p) Start %lf Finish %lf Max_duration %lf", action,
+        action->generic_action.start, now + value,
+        action->generic_action.max_duration);
+
+    if (min != -1) {
+      surf_action_lmm_heap_remove(model->model_private->action_heap,action);
+      surf_action_lmm_heap_insert(model->model_private->action_heap,action, min, max_dur_flag ? MAX_DURATION : NORMAL);
+      XBT_DEBUG("Insert at heap action(%p) min %lf now %lf", action, min,
+                now);
+    } else DIE_IMPOSSIBLE;
+  }
+
+  //hereafter must have already the min value for this resource model
+  if (xbt_heap_size(model->model_private->action_heap) > 0)
+    min = xbt_heap_maxkey(model->model_private->action_heap) - now;
+  else
+    min = -1;
+
+  XBT_DEBUG("The minimum with the HEAP %lf", min);
+
+  return min;
+}
 static XBT_INLINE void routing_asr_host_free(void *p)
 {
-  network_element_t elm = p;
+  sg_routing_edge_t elm = p;
   free(elm->name);
   xbt_free(elm);
 }
@@ -307,33 +380,11 @@ void surf_init(int *argc, char **argv)
   XBT_DEBUG("ADD ROUTING LEVEL");
   ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
   ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
-  ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free);
-  ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib,routing_storage_host_free);
-  ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib,routing_storage_type_free);
 
   XBT_DEBUG("ADD SURF LEVELS");
   SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
-  SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_resource_free);
-
-  /* Connect our log channels: that must be done manually under windows */
-  XBT_LOG_CONNECT(surf_config, surf);
-  XBT_LOG_CONNECT(surf_cpu, surf);
-  XBT_LOG_CONNECT(surf_kernel, surf);
-
-  XBT_LOG_CONNECT(surf_lagrange, surf);
-  XBT_LOG_CONNECT(surf_lagrange_dichotomy, surf_lagrange);
-
-  XBT_LOG_CONNECT(surf_maxmin, surf);
-  XBT_LOG_CONNECT(surf_network, surf);
-#ifdef HAVE_GTNETS
-  XBT_LOG_CONNECT(surf_network_gtnets, surf);
-#endif
-  XBT_LOG_CONNECT(surf_parse, surf);
-  XBT_LOG_CONNECT(surf_route, surf);
-  XBT_LOG_CONNECT(surf_trace, surf);
-  XBT_LOG_CONNECT(surf_workstation, surf);
 
   xbt_init(argc, argv);
   if (!model_list)
@@ -474,6 +525,8 @@ double surf_solve(double max_date)
     /* parallel version */
 #ifdef CONTEXT_THREADS
     xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_share_resources, model_list);
+#else
+    xbt_die("Asked to run in parallel, but no thread at hand...");
 #endif
   }
   else {
@@ -491,7 +544,7 @@ double surf_solve(double max_date)
     }
   }
 
-  XBT_DEBUG("Min for resources (remember that NS3 dont update that value) : %f", min);
+  XBT_DEBUG("Min for resources (remember that NS3 don't update that value) : %f", min);
 
   XBT_DEBUG("Looking for next trace event");