Auxiliary class for coord calculation. More...
#include <Nps.h>
Public Member Functions | |
CoordCalcFunction (const std::vector< LandmarkDataEntry > myLandmarks) | |
double | f (const Vec_DP &initCoordinates) const |
Static Public Member Functions | |
static double | simplex_min (CoordCalcFunction *functionObject, Vec_DP &init) |
Private Member Functions | |
double | endnodeDistance (const Vec_DP &nodeCoordinates, LandmarkDataEntry landmark) const |
Private Attributes | |
std::vector< LandmarkDataEntry > | landmarks |
Auxiliary class for coord calculation.
Definition at line 62 of file Nps.h.
CoordCalcFunction::CoordCalcFunction | ( | const std::vector< LandmarkDataEntry > | myLandmarks | ) | [inline] |
double CoordCalcFunction::endnodeDistance | ( | const Vec_DP & | nodeCoordinates, | |
LandmarkDataEntry | landmark | |||
) | const [private] |
Definition at line 739 of file Nps.cc.
Referenced by f().
{ double sum_of_squares = 0.0; for (int i = 0; i < nodeCoordinates.size(); i++) { sum_of_squares += pow(landmark.coordinates[i] - nodeCoordinates[i], 2); } double result = sqrt(sum_of_squares); return result; }
double CoordCalcFunction::f | ( | const Vec_DP & | initCoordinates | ) | const |
Definition at line 719 of file Nps.cc.
Referenced by Simplex::high(), Simplex::low(), and simplex_min().
{ double sum = 0; double rel_diff = 0; for (uint i = 0; i < landmarks.size(); i++) { // Distance = RTT in ms / 2 double diff = SIMTIME_DBL(landmarks[i].rtt) / 2 * 1000 - endnodeDistance(initCoordinates, landmarks[i]); if (SIMTIME_DBL(landmarks[i].rtt) != 0) { rel_diff = diff / (SIMTIME_DBL(landmarks[i].rtt) / 2 * 1000); } else { opp_error("[CBR] RTT == 0. Node is landmark? This shouldn't happen."); } sum += rel_diff * rel_diff; } return sum; }
double CoordCalcFunction::simplex_min | ( | CoordCalcFunction * | functionObject, | |
Vec_DP & | init | |||
) | [static] |
Definition at line 648 of file Nps.cc.
Referenced by Nps::computeOwnCoordinates().
{ double accf = 0.0000001; double accx = 0.0000001; uint32_t nmax = 30001; uint8_t dim = init.size(); Simplex spx(dim); int ihi; // Index of highest point at start of each iteration Vec_DP phi(dim); // Highest point at start of each iteration. double vhi; // Function value at highest point at start of each iteration. double vre; // Function value at reflected point. double vlo, diff; // for checking convergence. uint32_t count; // Initialize Simplex Vec_DP tmp(dim); spx.functionObject = functionObject; spx[0] = init; for (uint8_t i = 0; i < dim; i++) { tmp[i] = 1; spx[i+1] = init + tmp; tmp[i] = 0; } Vec_DP debugCoords(dim); for (count = 1; count <= nmax; count++) { /* if ((count % 10000) == 0) { std::cout << "running loop #" << count << " of " << nmax << endl; std::cout << "diff: " << diff << std::endl; std::cout << "vhi: " << vhi << std::endl; std::cout << "vlo: " << vlo << std::endl; debugCoords = spx[spx.low()]; std::cout << "Coords: " << debugCoords << std::endl; } */ ihi = spx.high(&vhi); phi = spx[ihi]; spx.reflect(); vre = functionObject->f(spx[ihi]); if (vre < functionObject->f(spx[spx.low()])) { spx[ihi] = phi; // Undo reflection. spx.reflect_exp(); vre = functionObject->f(spx[ihi]); if (vre > functionObject->f(spx[spx.low()])) { spx[ihi] = phi; spx.reflect(); } } else if (vre >= vhi) { // Equal sign important! spx[ihi] = phi; // Undo reflection. spx.contract(); if (functionObject->f(spx[ihi]) > vhi) { spx[ihi] = phi; // Undo contraction. spx.reduce(); } // else contraction ok. } // else reflection ok spx.high(&vhi); spx.low(&vlo); diff = vhi - vlo; if (diff < accf) if (spx.size() < accx) break; } init = spx[spx.low()]; return vlo; }
std::vector<LandmarkDataEntry> CoordCalcFunction::landmarks [private] |