Log In | Get Help   
Home My Page Projects Code Snippets Project Openings Mareframe
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files
[mareframe] View of /trunk/paramin-beta/netdatacontrol.cc
[mareframe] / trunk / paramin-beta / netdatacontrol.cc Repository:
ViewVC logotype

View of /trunk/paramin-beta/netdatacontrol.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (download) (annotate)
Mon Feb 10 17:09:07 2014 UTC (10 years, 3 months ago) by agomez
File size: 7649 byte(s)
Initial version based on Gadget 2.2.00
#include "netdatacontrol.h"

NetInfo::NetInfo() {
  set = 0;
  sent = 0;
  received = 0;
  numPendingAnswers = 0;
}

NetInfo::~NetInfo() {
}

int NetInfo::hasSet() {
  return set;
}

int NetInfo::hasReceived() {
  return (sent && received);
}

int NetInfo::hasSent() {
  return sent;
}

int NetInfo::numCopiesSent() {
  return numPendingAnswers;
}

Coordinates::Coordinates() {
  y = 0.0;
}

Coordinates::~Coordinates() {
}

double Coordinates::getY() {
  return y;
}

const DoubleVector& Coordinates::getX() {
  return x;
}

double Coordinates::getParameter(int num) {
  assert(num >= 0);
  if (x.Size() <= 0) {
    cerr << "Error in coordinates - vector has not been initialised\n";
    exit(EXIT_FAILURE);
  }
  return x[num];
}

void Coordinates::setX(const DoubleVector& x1) {
  x = x1;
}

void Coordinates::setParameter(double p, int num) {
  if ((num < 0) || (num >= x.Size())) {
    cerr << "Error in coordinates - number is out of bounds\n";
    exit(EXIT_FAILURE);
  }
  x[num] = p;
}

void Coordinates::setY(double y1) {
  y = y1;
}

int Coordinates::getNumParameters() {
  return x.Size();
}

NetDataControl::NetDataControl(int numx, int numberOfParameters, int t) {
  numberOfx = 0;
  totalNumx = numx;
  numberSent = 0;
  numberAnswers = 0;
  resendID = -1;
  tag = t;
  numPar = numberOfParameters;
  xyCoord = new Coordinates*[numx];
  nInfo = new NetInfo*[numx];
  int i;
  for (i = 0; i < numx; i++) {
    xyCoord[i] = new Coordinates();
    nInfo[i] = new NetInfo;
  }
}

NetDataControl::~NetDataControl() {
  int i;
  for (i = 0; i < totalNumx; i++) {
    delete xyCoord[i];
    xyCoord[i] = NULL;
    delete nInfo[i];
    nInfo[i] = NULL;
  }
  delete[] xyCoord;
  delete[] nInfo;
}

// ----------------------------------------------------------------------------
// Functions for setting data
void NetDataControl::setX(const DoubleVector& x1) {
  if (numberOfx < 0 || numberOfx >= totalNumx) {
    cerr << "Error in netdatacontrol - cannot store vector\n";
    exit(EXIT_FAILURE);
  }
  if ((x1.Size()) != numPar) {
    cerr << "Error in netdatacontrol - wrong number of parameters\n";
    exit(EXIT_FAILURE);
  }
  xyCoord[numberOfx]->setX(x1);
  nInfo[numberOfx]->set = 1;
  numberOfx++;
}

int NetDataControl::getIDToSetNext() {
  // might change
  if (numberOfx == totalNumx)
    return -1;
  else
    return numberOfx;
}

void NetDataControl::setY(int id, double fx) {
  if (id < 0 || id >= totalNumx) {
    cerr << "Error in netdatacontrol - invalid id\n";
    exit(EXIT_FAILURE);
  }
  if (!nInfo[id]->hasReceived()) {
    // have not received an answer yet
    xyCoord[id]->setY(fx);
    nInfo[id]->received = 1;
    numberAnswers++;
  }
  nInfo[id]->numPendingAnswers--;

  if (nInfo[id]->sent == 0)
    cerr << "Warning in netdatacontrol - setting f(x) but have not sent x with identity: " << id << endl;
}

void NetDataControl::setDataPair(const DoubleVector& x1, double fx) {
  setX(x1);
  sentOne(numberOfx-1);
  setY(numberOfx-1, fx);
}

// ----------------------------------------------------------------------------
// Functions for getting data
const DoubleVector& NetDataControl::getX(int id) {
  if (id < 0 || id >= numberOfx) {
    cerr << "Error in netdatacontrol - have not set vector with id " << id << endl;
    exit(EXIT_FAILURE);
  }
  return xyCoord[id]->getX();
}

const DoubleVector& NetDataControl::getNextXToSend() {
  int i = 0;
  int FOUND = 0;

  if (allSent()) {
    cerr << "Error in netdatacontrol - no vector to send\n";
    exit(EXIT_FAILURE);
  }
  if (numberSent < 0 || numberSent >= numberOfx) {
    cerr << "Error in netdatacontrol - number ot send out of bounds\n";
    exit(EXIT_FAILURE);
  }
  while (i < totalNumx && FOUND == 0) {
    if (nInfo[i]->hasSet() == 1 && nInfo[i]->hasSent() == 0)
      FOUND = 1;
    i++;
  }
  return xyCoord[i - 1]->getX();
}

double NetDataControl::getY(int id) {
  if (id < 0 || id >= totalNumx) {
    cerr << "Error in netdatacontrol - invalid id\n";
    exit(EXIT_FAILURE);
  }
  if (!nInfo[id]->hasSet())
    cerr << "Warning in netdatacontrol - x has not been set yet\n";
  if (!nInfo[id]->hasReceived())
    cerr << "Warning in netdatacontrol - y has not been set yet\n";
  return xyCoord[id]->getY();
}

const DoubleVector& NetDataControl::getNextAnsweredX() {
  if (numberAnswers == 0) {
    cerr << "Error in netdatacontrol - no answers received\n";
    exit(EXIT_FAILURE);
  }
  if (nextAns >= numberOfx) {
    cerr << "Error in netdatacontrol - invalid answer received\n";
    exit(EXIT_FAILURE);
  }

  while (!nInfo[nextAns]->received)
    nextAns++;

  int temp = nextAns;
  nextAns++;
  return xyCoord[temp]->getX();
}

double NetDataControl::getNextAnsweredY() {
  int temp = nextAns - 1;
  if (temp < 0 || temp >= numberOfx) {
    cerr << "Error in netdatacontrol - invalid answer received\n";
    exit(EXIT_FAILURE);
  }
  return xyCoord[temp]->getY();
}

// ----------------------------------------------------------------------------
// Functions concerning sending data
int NetDataControl::getNextSendID() {
  int i = 0;
  int FOUND = 0;
  if (allSent()) {
    cerr << "Error in netdatacontrol - no more vectors to send\n";
    exit(EXIT_FAILURE);
  }
  while (i < numberOfx && FOUND == 0) {
    if (nInfo[i]->hasSet() == 1 && nInfo[i]->hasSent() == 0)
      FOUND = 1;
    i++;
  }
  return (i - 1);
}

int NetDataControl::getNextXToResend() {
  int numPending = 1;
  int counter = 0;
  if (allReceived()) {
    cerr << "Error in netdatacontrol - no data to resend\n";
    exit(EXIT_FAILURE);
  }
  resendID++;
  if (resendID == totalNumx)
    resendID = 0;
  while ((nInfo[resendID]->hasReceived() || !nInfo[resendID]->hasSent()
      || nInfo[resendID]->numPendingAnswers > numPending)) {
    counter++;
    resendID++;
    if (resendID == totalNumx)
      resendID = 0;
    if (counter == totalNumx)
      numPending++;
  }
  return resendID;
}

void NetDataControl::sentOne(int id) {
  if ((id < 0) || (id >= numberOfx)) {
    cerr << "Error in netdatacontrol - invalid id\n";
    exit(EXIT_FAILURE);
  }
  if (nInfo[id]->sent == 1)
    cerr << "Warning in netdatacontrol - already sent data with identity: " << id << endl;
  else {
    nInfo[id]->sent = 1;
    nInfo[id]->numPendingAnswers++;
    numberSent++;
  }
}

void NetDataControl::resentOne(int id) {
  if ((id < 0) || (id >= numberOfx)) {
    cerr << "Error in netdatacontrol - invalid id\n";
    exit(EXIT_FAILURE);
  }
  nInfo[id]->numPendingAnswers++;
}

// ----------------------------------------------------------------------------
// Functions for getting general information about state of datagroup
int NetDataControl::allSent() {
  assert(numberOfx >= numberSent);
  return (numberOfx == numberSent);
}

int NetDataControl:: getNumNotAnswered() {
  return (numberSent - numberAnswers);
}

int NetDataControl::getTotalReceived() {
  return numberAnswers;
}

int NetDataControl::getTotalSet() {
  return numberOfx;
}

void NetDataControl::setFirstAnswered() {
  nextAns = 0;
}

int NetDataControl::allReceived() {
  return (numberSent == numberAnswers);
}

int NetDataControl::getNumAnswered() {
  return numberAnswers;
}

int NetDataControl::getNumLeftToSend() {
  return (numberOfx - numberSent);
}

int NetDataControl::getTag() {
  return tag;
}

int NetDataControl::getLastSetID() {
  return numberOfx - 1;
}

int NetDataControl::getMaxNumData() {
  return totalNumx;
}

int NetDataControl::hasAnswer(int id) {
  if (id < 0 || id >= totalNumx) {
    cerr << "Error in netdatacontrol - id out of bounds\n";
    exit(EXIT_FAILURE);
  }
  return nInfo[id]->hasReceived();
}

int NetDataControl::isFull() {
  return (getMaxNumData() == getTotalSet());
}

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge