Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
further split the kernel/resource module in separate files
[simgrid.git] / src / surf / surf_interface.cpp
index f5a6a34..222720f 100644 (file)
@@ -348,388 +348,3 @@ void surf_exit()
 
   NOW = 0;                      /* Just in case the user plans to restart the simulation afterward */
 }
-
-/*********
- * Model *
- *********/
-
-namespace simgrid {
-namespace surf {
-
-Model::Model()
-  : maxminSystem_(nullptr)
-{
-  readyActionSet_ = new ActionList();
-  runningActionSet_ = new ActionList();
-  failedActionSet_ = new ActionList();
-  doneActionSet_ = new ActionList();
-
-  modifiedSet_ = nullptr;
-  updateMechanism_ = UM_UNDEFINED;
-  selectiveUpdate_ = 0;
-}
-
-Model::~Model(){
-  delete readyActionSet_;
-  delete runningActionSet_;
-  delete failedActionSet_;
-  delete doneActionSet_;
-  delete modifiedSet_;
-  delete maxminSystem_;
-}
-
-Action* Model::actionHeapPop()
-{
-  Action* action = actionHeap_.top().second;
-  actionHeap_.pop();
-  action->clearHeapHandle();
-  return action;
-}
-
-double Model::nextOccuringEvent(double now)
-{
-  //FIXME: set the good function once and for all
-  if (updateMechanism_ == UM_LAZY)
-    return nextOccuringEventLazy(now);
-  else if (updateMechanism_ == UM_FULL)
-    return nextOccuringEventFull(now);
-  else
-    xbt_die("Invalid cpu update mechanism!");
-}
-
-double Model::nextOccuringEventLazy(double now)
-{
-  XBT_DEBUG("Before share resources, the size of modified actions set is %zu", modifiedSet_->size());
-  lmm_solve(maxminSystem_);
-  XBT_DEBUG("After share resources, The size of modified actions set is %zu", modifiedSet_->size());
-
-  while (not modifiedSet_->empty()) {
-    Action *action = &(modifiedSet_->front());
-    modifiedSet_->pop_front();
-    bool max_dur_flag = false;
-
-    if (action->getStateSet() != runningActionSet_)
-      continue;
-
-    /* bogus priority, skip it */
-    if (action->getPriority() <= 0 || action->getType() == Action::Type::LATENCY)
-      continue;
-
-    action->updateRemainingLazy(now);
-
-    double min = -1;
-    double share = action->getVariable()->get_value();
-
-    if (share > 0) {
-      double time_to_completion;
-      if (action->getRemains() > 0) {
-        time_to_completion = action->getRemainsNoUpdate() / share;
-      } else {
-        time_to_completion = 0.0;
-      }
-      min = now + time_to_completion; // when the task will complete if nothing changes
-    }
-
-    if ((action->getMaxDuration() > NO_MAX_DURATION) &&
-        (min <= -1 || action->getStartTime() + action->getMaxDuration() < min)) {
-      // when the task will complete anyway because of the deadline if any
-      min          = action->getStartTime() + action->getMaxDuration();
-      max_dur_flag = true;
-    }
-
-    XBT_DEBUG("Action(%p) corresponds to variable %d", action, action->getVariable()->id_int);
-
-    XBT_DEBUG("Action(%p) Start %f. May finish at %f (got a share of %f). Max_duration %f", action,
-        action->getStartTime(), min, share,
-        action->getMaxDuration());
-
-    if (min > -1) {
-      action->heapUpdate(actionHeap_, min, max_dur_flag ? Action::Type::MAX_DURATION : Action::Type::NORMAL);
-      XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min, now);
-    } else
-      DIE_IMPOSSIBLE;
-  }
-
-  //hereafter must have already the min value for this resource model
-  if (not actionHeapIsEmpty()) {
-    double min = actionHeapTopDate() - now;
-    XBT_DEBUG("minimum with the HEAP %f", min);
-    return min;
-  } else {
-    XBT_DEBUG("The HEAP is empty, thus returning -1");
-    return -1;
-  }
-}
-
-double Model::nextOccuringEventFull(double /*now*/) {
-  maxminSystem_->solve_fun(maxminSystem_);
-
-  double min = -1;
-
-  for (Action& action : *getRunningActionSet()) {
-    double value = action.getVariable()->get_value();
-    if (value > 0) {
-      if (action.getRemains() > 0)
-        value = action.getRemainsNoUpdate() / value;
-      else
-        value = 0.0;
-      if (min < 0 || value < min) {
-        min = value;
-        XBT_DEBUG("Updating min (value) with %p: %f", &action, min);
-      }
-    }
-    if ((action.getMaxDuration() >= 0) && (min < 0 || action.getMaxDuration() < min)) {
-      min = action.getMaxDuration();
-      XBT_DEBUG("Updating min (duration) with %p: %f", &action, min);
-    }
-  }
-  XBT_DEBUG("min value : %f", min);
-
-  return min;
-}
-
-void Model::updateActionsState(double now, double delta)
-{
-  if (updateMechanism_ == UM_FULL)
-    updateActionsStateFull(now, delta);
-  else if (updateMechanism_ == UM_LAZY)
-    updateActionsStateLazy(now, delta);
-  else
-    xbt_die("Invalid cpu update mechanism!");
-}
-
-void Model::updateActionsStateLazy(double /*now*/, double /*delta*/)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-void Model::updateActionsStateFull(double /*now*/, double /*delta*/)
-{
-  THROW_UNIMPLEMENTED;
-}
-
-}
-}
-
-/************
- * Resource *
- ************/
-
-/**********
- * Action *
- **********/
-
-namespace simgrid {
-namespace surf {
-
-Action::Action(simgrid::surf::Model* model, double cost, bool failed) : Action(model, cost, failed, nullptr)
-{
-}
-
-Action::Action(simgrid::surf::Model* model, double cost, bool failed, kernel::lmm::Variable* var)
-    : remains_(cost), start_(surf_get_clock()), cost_(cost), model_(model), variable_(var)
-{
-  if (failed)
-    stateSet_ = getModel()->getFailedActionSet();
-  else
-    stateSet_ = getModel()->getRunningActionSet();
-
-  stateSet_->push_back(*this);
-}
-
-Action::~Action() {
-  xbt_free(category_);
-}
-
-void Action::finish(Action::State state)
-{
-  finishTime_ = surf_get_clock();
-  setState(state);
-}
-
-Action::State Action::getState() const
-{
-  if (stateSet_ == model_->getReadyActionSet())
-    return Action::State::ready;
-  if (stateSet_ == model_->getRunningActionSet())
-    return Action::State::running;
-  if (stateSet_ == model_->getFailedActionSet())
-    return Action::State::failed;
-  if (stateSet_ == model_->getDoneActionSet())
-    return Action::State::done;
-  return Action::State::not_in_the_system;
-}
-
-void Action::setState(Action::State state)
-{
-  simgrid::xbt::intrusive_erase(*stateSet_, *this);
-  switch (state) {
-  case Action::State::ready:
-    stateSet_ = model_->getReadyActionSet();
-    break;
-  case Action::State::running:
-    stateSet_ = model_->getRunningActionSet();
-    break;
-  case Action::State::failed:
-    stateSet_ = model_->getFailedActionSet();
-    break;
-  case Action::State::done:
-    stateSet_ = model_->getDoneActionSet();
-    break;
-  default:
-    stateSet_ = nullptr;
-    break;
-  }
-  if (stateSet_)
-    stateSet_->push_back(*this);
-}
-
-double Action::getBound() const
-{
-  return variable_ ? variable_->get_bound() : 0;
-}
-
-void Action::setBound(double bound)
-{
-  XBT_IN("(%p,%g)", this, bound);
-  if (variable_)
-    getModel()->getMaxminSystem()->update_variable_bound(variable_, bound);
-
-  if (getModel()->getUpdateMechanism() == UM_LAZY && getLastUpdate() != surf_get_clock())
-    heapRemove(getModel()->getActionHeap());
-  XBT_OUT();
-}
-
-void Action::setCategory(const char *category)
-{
-  category_ = xbt_strdup(category);
-}
-
-void Action::ref(){
-  refcount_++;
-}
-
-void Action::setMaxDuration(double duration)
-{
-  maxDuration_ = duration;
-  if (getModel()->getUpdateMechanism() == UM_LAZY)      // remove action from the heap
-    heapRemove(getModel()->getActionHeap());
-}
-
-void Action::setSharingWeight(double weight)
-{
-  XBT_IN("(%p,%g)", this, weight);
-  sharingWeight_ = weight;
-  getModel()->getMaxminSystem()->update_variable_weight(getVariable(), weight);
-
-  if (getModel()->getUpdateMechanism() == UM_LAZY)
-    heapRemove(getModel()->getActionHeap());
-  XBT_OUT();
-}
-
-void Action::cancel(){
-  setState(Action::State::failed);
-  if (getModel()->getUpdateMechanism() == UM_LAZY) {
-    if (modifiedSetHook_.is_linked())
-      simgrid::xbt::intrusive_erase(*getModel()->getModifiedSet(), *this);
-    heapRemove(getModel()->getActionHeap());
-  }
-}
-
-int Action::unref(){
-  refcount_--;
-  if (not refcount_) {
-    if (stateSetHook_.is_linked())
-      simgrid::xbt::intrusive_erase(*stateSet_, *this);
-    if (getVariable())
-      getModel()->getMaxminSystem()->variable_free(getVariable());
-    if (getModel()->getUpdateMechanism() == UM_LAZY) {
-      /* remove from heap */
-      heapRemove(getModel()->getActionHeap());
-      if (modifiedSetHook_.is_linked())
-        simgrid::xbt::intrusive_erase(*getModel()->getModifiedSet(), *this);
-    }
-    delete this;
-    return 1;
-  }
-  return 0;
-}
-
-void Action::suspend()
-{
-  XBT_IN("(%p)", this);
-  if (suspended_ != SuspendStates::sleeping) {
-    getModel()->getMaxminSystem()->update_variable_weight(getVariable(), 0.0);
-    if (getModel()->getUpdateMechanism() == UM_LAZY){
-      heapRemove(getModel()->getActionHeap());
-      if (getModel()->getUpdateMechanism() == UM_LAZY && stateSet_ == getModel()->getRunningActionSet() &&
-          sharingWeight_ > 0) {
-        //If we have a lazy model, we need to update the remaining value accordingly
-        updateRemainingLazy(surf_get_clock());
-      }
-    }
-    suspended_ = SuspendStates::suspended;
-  }
-  XBT_OUT();
-}
-
-void Action::resume()
-{
-  XBT_IN("(%p)", this);
-  if (suspended_ != SuspendStates::sleeping) {
-    getModel()->getMaxminSystem()->update_variable_weight(getVariable(), getPriority());
-    suspended_ = SuspendStates::not_suspended;
-    if (getModel()->getUpdateMechanism() == UM_LAZY)
-      heapRemove(getModel()->getActionHeap());
-  }
-  XBT_OUT();
-}
-
-bool Action::isSuspended()
-{
-  return suspended_ == SuspendStates::suspended;
-}
-/* insert action on heap using a given key and a hat (heap_action_type)
- * a hat can be of three types for communications:
- *
- * NORMAL = this is a normal heap entry stating the date to finish transmitting
- * LATENCY = this is a heap entry to warn us when the latency is payed
- * MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached
- */
-void Action::heapInsert(heap_type& heap, double key, Action::Type hat)
-{
-  type_       = hat;
-  heapHandle_ = heap.emplace(std::make_pair(key, this));
-}
-
-void Action::heapRemove(heap_type& heap)
-{
-  type_ = Action::Type::NOTSET;
-  if (heapHandle_) {
-    heap.erase(*heapHandle_);
-    clearHeapHandle();
-  }
-}
-
-void Action::heapUpdate(heap_type& heap, double key, Action::Type hat)
-{
-  type_ = hat;
-  if (heapHandle_) {
-    heap.update(*heapHandle_, std::make_pair(key, this));
-  } else {
-    heapHandle_ = heap.emplace(std::make_pair(key, this));
-  }
-}
-
-double Action::getRemains()
-{
-  XBT_IN("(%p)", this);
-  /* update remains before return it */
-  if (getModel()->getUpdateMechanism() == UM_LAZY)      /* update remains before return it */
-    updateRemainingLazy(surf_get_clock());
-  XBT_OUT();
-  return remains_;
-}
-
-}
-}