Example #1
0
/***
* Nudge the state towards the observed number of infected
* keeping the proportions of sub-states within both
* infected and uninfected sets roughly the same.
***/
void Population::nudge(int obsInfected) {
  const double obsMix = 1.0;
  double targetInfected, infectedMultiplier, uninfectedMultiplier;
  std::array<double,11> frequencies = getFrequencies();
  double pInfected = frequencies[1] + frequencies[2] + frequencies[3];


  targetInfected = obsInfected*obsMix/N_AGENTS + pInfected*(1.0-obsMix);
  infectedMultiplier = targetInfected/pInfected;
  uninfectedMultiplier = (1.0-targetInfected)/(1.0-pInfected);

  frequencies[0] *= uninfectedMultiplier;
  frequencies[1] *= infectedMultiplier;
  frequencies[2] *= infectedMultiplier;
  frequencies[3] *= infectedMultiplier;
  frequencies[4] *= uninfectedMultiplier;
  frequencies[5] *= uninfectedMultiplier;
  frequencies[6] *= uninfectedMultiplier;
  frequencies[7] *= uninfectedMultiplier;
  frequencies[8] *= uninfectedMultiplier;
  frequencies[9] *= uninfectedMultiplier;
  frequencies[10]*= uninfectedMultiplier;

  setFrequencies(frequencies);
}
void
DistributedDVFSManager::receiveKernelMessage(KernelMessage* kMsg) {
  UsefulWorkMessage* msg = dynamic_cast<UsefulWorkMessage*>(kMsg);
  ASSERT(msg);

  std::vector<double> dat;
  UsefulWorkMessage::MessageRound round = msg->getRound();
  bool idxsChanged = false;
  msg->getData(dat);
  if(round == UsefulWorkMessage::COLLECT) {
    fillUsefulWork(dat);
    if(isMaster()) {
      for(int i = 0; i < dat.size(); i++)
        myUtilFilters[i].update(dat[i]);

      if(!isDummy())
        idxsChanged = updateFrequencyIdxs();

      if(debugPrint())
        for(int i = 0; i < dat.size(); i++)
          writeCSVRow(i, 
                      myUtilFilters[i].getData(), 
                      myAvailableFreqs[myFrequencyIdxs[i]]);
    }
  }
  else if(round == UsefulWorkMessage::SETFREQ && !isDummy())
    setFrequencies(static_cast<int>(dat[mySimulationManagerID]));

  // forward message to next node unless we're the master and either
  // we just received a set frequency message or the frequencies haven't changed
  if(!(isMaster() && (round == UsefulWorkMessage::SETFREQ || !idxsChanged))) {
    int dest = (mySimulationManagerID + 1) % myNumSimulationManagers;
    UsefulWorkMessage::MessageRound newRound =
        isMaster() ? UsefulWorkMessage::SETFREQ : round;

    UsefulWorkMessage* newMsg = new UsefulWorkMessage(mySimulationManagerID,
                                                        dest,
                                                        myNumSimulationManagers,
                                                        newRound);

    if(isMaster())
      for(int i=0; i < myFrequencyIdxs.size(); i++)
        dat[i] = static_cast<double>(myFrequencyIdxs[i]);

    newMsg->setData(dat);
    myCommunicationManager->sendMessage(newMsg, dest);
  }
  else
    myWaitingForMessage = false;

  delete kMsg;
}
void
DistributedDVFSManager::configure(SimulationConfiguration &config) {
  DVFSManagerImplementationBase::configure(config);
  
  // initialize the frequency index array now that we know how many
  // frequencies are available
  int maxidx = myAvailableFreqs.size() - 1;

  // build the frequency index array based on the number of P states available
  initializeFrequencyIdxs(maxidx);

  // initialize my frequency to the median frequency
  char hostname[32];
  gethostname(hostname, 32);
  int freqIdx = maxidx / 2;
  cout << "DVFSManager on " << hostname << " here. " 
       << "initializing all frequencies to " 
       << myAvailableFreqs[freqIdx] << endl;
  setGovernors("userspace");
  setFrequencies(freqIdx);
}
DistributedDVFSManager::~DistributedDVFSManager() {
  // if we set the governor back to ondemand, we'll lose our write privileges 
  // on scaling_setspeed
  //setGovernors("ondemand");
  setFrequencies(0);
}