Fix getSsSquareDistance(), radar_exp() parameters

* server.cc: adjusted radar_exp due to parameters (suppr. pre-processing
  with #ifdef PEREGRINATION and changed output)
* referencepoint.cc: fixed getSsSquareDistance by replacing missing values
  by -90 dBm signal
Performs better than previous versions, however, RADAR remains the best.

git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@68 785a6c6c-259e-4ff1-8b91-dc31627914f0
This commit is contained in:
Frédéric Lassabe 2008-08-18 16:19:02 +00:00 committed by Matteo Cypriani
parent a831e2fb8e
commit 0bc8e3c955
4 changed files with 137 additions and 149 deletions

View File

@ -17,7 +17,12 @@ int main(int argc, char ** argv)
ofstream output_file;
string read_file;
if(argc != 4)
cout << "Called guinumo with args: ";
for(int i = 1 ; i < argc ; i++)
cout << argv[i] << " ";
cout << endl;
if(argc != 5)
cout << "Usage: guinumo AP_file Ref_Pt_file Test_file logfile" << endl;
else
{

View File

@ -4,103 +4,140 @@
float ReferencePoint::getSsSquareDistance(const vector<Measurement> &m)const
{
unsigned int i, j;
float ret = 0;
bool found;
for (i = 0 ; i < m.size() ; i++)
{
j = 0;
found = false;
while((j < measurement_list.size())&&(found == false))
{
if(measurement_list[j].getMacAddr() == m[i].getMacAddr())
{
found = true;
ret += measurement_list[j].getSsSquareDistance(m[i].getAverage());
}
j++;
}
}
unsigned int i, j;
float ret = 0;
bool found;
vector<Measurement> ref_m = measurement_list;
vector<Measurement> test_m = m;
Measurement new_meas;
return ret;
new_meas.addSsValue(-95);
/* Complete measurement vector with unexisting ap (from ref point) */
for(i = 0 ; i < ref_m.size() ; i++)
{
found = false;
for(j = 0 ; j < test_m.size() && !found ; j++)
if(test_m[j].getMacAddr() == ref_m[i].getMacAddr())
found = true;
if(!found)
{
new_meas.setMacAddr(measurement_list[i].getMacAddr());
test_m.push_back(new_meas);
}
}
/* Now, complete ref. point meas. */
for(i = 0 ; i < test_m.size() ; i++)
{
found = false;
for(j = 0 ; j < ref_m.size() && !found ; j++)
if(test_m[i].getMacAddr() == ref_m[j].getMacAddr())
found = true;
if(!found)
{
new_meas.setMacAddr(test_m[i].getMacAddr());
ref_m.push_back(new_meas);
}
}
/* Now, compute SS distance */
for (i = 0 ; i < test_m.size() ; i++)
{
j = 0;
found = false;
while((j < ref_m.size())&&(found == false))
{
if(ref_m[j].getMacAddr() == test_m[i].getMacAddr())
{
found = true;
ret += ref_m[j].getSsSquareDistance(test_m[i].getAverage());
}
j++;
}
}
ref_m.clear();
test_m.clear();
return ret;
}
void ReferencePoint::addMeasurement(const string &mac_a, const int &value)
{
unsigned int i;
Measurement m;
bool inserted = false;
for (i = 0 ; i < measurement_list.size() ; i++)
if(measurement_list[i].getMacAddr() == mac_a)
{
measurement_list[i].addSsValue(value);
inserted = true;
break;
}
if(inserted == false)
{
m.setMacAddr(mac_a);
m.addSsValue(value);
measurement_list.push_back(m);
}
unsigned int i;
Measurement m;
bool inserted = false;
for (i = 0 ; i < measurement_list.size() ; i++)
if(measurement_list[i].getMacAddr() == mac_a)
{
measurement_list[i].addSsValue(value);
inserted = true;
break;
}
if(inserted == false)
{
m.setMacAddr(mac_a);
m.addSsValue(value);
measurement_list.push_back(m);
}
}
bool ReferencePoint::getPowerForAp(const string &ap_mac, float *p)const
{
unsigned int i;
string str;
string macLowerCase;
str=ap_mac;
//Pour convertir les majuscules en miniscules
const int length=str.length();
for(int j=0; j < length; ++j)
{
str[j] = std::tolower(str[j]);
}
unsigned int i;
string str;
string macLowerCase;
for (i = 0 ; i < measurement_list.size() ; i++)
if(measurement_list[i].getMacAddr() == str)
{
*p = measurement_list[i].getAverage();
return true;
}
return false;
str=ap_mac;
//Pour convertir les majuscules en miniscules
const int length=str.length();
for(int j=0; j < length; ++j)
{
str[j] = std::tolower(str[j]);
}
for (i = 0 ; i < measurement_list.size() ; i++)
if(measurement_list[i].getMacAddr() == str)
{
*p = measurement_list[i].getAverage();
return true;
}
return false;
}
ReferencePoint ReferencePoint::operator=(const ReferencePoint &rp)
{
if(this == &rp)
return *this;
coordinates = rp.coordinates;
measurement_list = rp.measurement_list;
return *this;
if(this == &rp)
return *this;
coordinates = rp.coordinates;
measurement_list = rp.measurement_list;
return *this;
}
ostream &operator<<(ostream &os, ReferencePoint &rp)
{
unsigned int i;
os << rp.coordinates << endl;
if(rp.measurement_list.size() == 0)
os << "No measurements" << endl;
else
for (i = 0 ; i < rp.measurement_list.size() ; i++)
os << rp.measurement_list[i] << endl;
return os;
unsigned int i;
os << rp.coordinates << endl;
if(rp.measurement_list.size() == 0)
os << "No measurements" << endl;
else
for (i = 0 ; i < rp.measurement_list.size() ; i++)
os << rp.measurement_list[i] << endl;
return os;
}
@ -108,5 +145,5 @@ ostream &operator<<(ostream &os, ReferencePoint &rp)
/* Opérateur de cast en Point */
ReferencePoint::operator Point() const
{
return coordinates ;
return coordinates ;
}

View File

@ -13,7 +13,7 @@ class ReferencePoint
protected:
Point coordinates;
vector<Measurement> measurement_list;
public:
ReferencePoint(const float &x = 0, const float &y = 0, const float &z = 0) { coordinates.setX(x); coordinates.setY(y); coordinates.setZ(z); };
ReferencePoint(const ReferencePoint &rp) { coordinates = rp.coordinates; measurement_list = rp.measurement_list; };

View File

@ -1144,22 +1144,24 @@ Point Server::fbcm_friis( const vector<Measurement> &m, const vector<float> frii
unsigned int i, j, ap_idx;
float constant_term, minmax_res, minmax_max;
float x = MINMAX_X_START, y = MINMAX_Y_START ;
vector<Measurement> vm = m; //Used when filtering 3 strongest APs
vector<float> friis_idx = friis_idx_list; //Used when filtering 3 strongest APs
i = 0;
//cout << "FBCM: ";
cout << "Received " << m.size() << " measurements." << endl;
for (i = 0 ; i < m.size() ; i++)
cout << "Received " << vm.size() << " measurements." << endl;
for (i = 0 ; i < vm.size() ; i++)
{
if (apExists(m[i].getMacAddr()))
if (apExists(vm[i].getMacAddr()))
{
ap_idx = apIndex(m[i].getMacAddr());
cout << "AP " << m[i].getMacAddr() << " was found at position " << ap_idx << endl;
ap_idx = apIndex(vm[i].getMacAddr());
cout << "AP " << vm[i].getMacAddr() << " was found at position " << ap_idx << endl;
constant_term = access_point_list[ap_idx].getOutputPower() + access_point_list[ap_idx].getAntennaGain() + 2;
constant_term += 20 * log10((300000000.0 / (float) access_point_list[ap_idx].getFrequency()) / (4*M_PI));
if(friis_idx_list[i] != -1)
if(friis_idx[i] != -1)
{
centres.push_back(access_point_list[ap_idx].getCoordinates());
dist_vect.push_back(pow(10, (constant_term - m[i].getAverage()) / (10 * friis_idx_list[i])));
dist_vect.push_back(pow(10, (constant_term - vm[i].getAverage()) / (10 * friis_idx[i])));
}
}
}
@ -2465,9 +2467,6 @@ void Server::radar_exp(const string &outfile, const string &testfile)
createClient() ;
}
/* Open a log file */
/*fname = filename + ".out";
logfile.open(fname.c_str());*/
logfile.open(outfile.c_str());
if (logfile.fail())
{
@ -2480,70 +2479,14 @@ void Server::radar_exp(const string &outfile, const string &testfile)
\tInterlink\t(Error)\
\tRADAR\t(Error)\
\tFBCM\t(Error)\
\t1 NSS + FBCM\t(Error)\
\t2 NSS\t(Error)\
\t3 NSS\t(Error)\
\t5 NSS\t(Error)" << endl ;
\tFRBHM\t(Error)" << endl ;
cout << reference_point_list.size() << " reference points." << endl ;
//#define PEREGRINATION // À décommenter pour utiliser les points du fichier DEFAULT_TRACKING_FILE plutôt que les points de référence.
#ifdef PEREGRINATION
/* *** Code pour utiliser les points de prérégrination : *** */
vector<ReferencePoint> peregrination_point_list ;
makePointListFromFile(peregrination_point_list, DEFAULT_TRACKING_FILE, false) ;
cout << peregrination_point_list.size() << " peregrination points to test." << endl ;
for (i = 0 ; i < peregrination_point_list.size() ; i++)
{
/* Get point measurements */
vm = peregrination_point_list[i].getMeasurementList();
ref_coords = peregrination_point_list[i].getCoordinates();
/* Print point coordinates */
logfile << ref_coords << "\t";
/* Interlink Networks */
solution = interlink(vm, 0) ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
/* RADAR */
solution = getkClosestInSs(vm, 1, NULL)[0] ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
/* FBCM */
solution = fbcm(vm, 0) ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
/* 1-NSS + FBCM */
solution = getkClosestInSs(vm, 1, NULL)[0] ;
solution = fbcm_friis(vm, computeFriisFromRefList(solution, vm), solution.getZ()) ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
/* 2-NSS */
solution = getkWeightedInSs(vm, 2, NULL);
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";
/* 3-NSS */
solution = getkWeightedInSs(vm, 3, NULL);
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";
/* 5-NSS */
solution = getkWeightedInSs(vm, 5, NULL);
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";
logfile << endl ;
vm.clear() ;
}
#else // PEREGRINATION
/* *** Code pour utiliser les points de référence : *** */
vector<ReferencePoint> test_point_list ;
makePointListFromFile(test_point_list, DEFAULT_REF_POINT_FILE_1M, true) ;
cout << test_point_list.size() << " reference points to test." << endl ;
float radar_error = 0, in_error = 0, fbcm_error = 0, frbhm_error = 0;
for (i = 0 ; i < test_point_list.size() ; i++)
{
@ -2560,38 +2503,41 @@ void Server::radar_exp(const string &outfile, const string &testfile)
/* Interlink Networks */
solution = interlink(vm, 0) ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
in_error += solution.distance(ref_coords);
/* RADAR */
solution = getkClosestInSs(vm, 1, &ref_coords)[0] ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
radar_error += solution.distance(ref_coords);
/* FBCM */
solution = fbcm(vm, 0) ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
fbcm_error += solution.distance(ref_coords);
/* 1-NSS + FBCM */
solution = getkClosestInSs(vm, 1, &ref_coords)[0] ;
solution = fbcm_friis(vm, computeFriisFromRefList(solution, vm), solution.getZ()) ;
logfile << solution << "\t" << solution.distance(ref_coords) << "\t" ;
frbhm_error += solution.distance(ref_coords);
/* 2-NSS */
/* 2-NSS
solution = getkWeightedInSs(vm, 2, &ref_coords);
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";
/* 3-NSS */
/* 3-NSS
solution = getkWeightedInSs(vm, 3, &ref_coords);
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";
/* 5-NSS */
/* 5-NSS
solution = getkWeightedInSs(vm, 5, &ref_coords);
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";
logfile << solution << "\t" << solution.distance(ref_coords) << "\t";*/
logfile << endl ;
vm.clear() ;
}
#endif // PEREGRINATION
/* Mean values formulas names */
unsigned int oocalc_line = test_point_list.size() + 1;
logfile << "\t\t=moyenne(C2:C" << oocalc_line << ")\t\t=moyenne(E2:E" << oocalc_line << ")\t\t=moyenne(G2:G" << oocalc_line << ")\t\t=moyenne(I2:I" << oocalc_line << ")\t\t=moyenne(K2:K" << oocalc_line << ")\t\t=moyenne(M2:M" << oocalc_line << ")\t\t=moyenne(O2:O" << oocalc_line << ")" << endl ;
float nb = (float) test_point_list.size();
logfile << "\t\t" << (in_error / nb) << "\t\t" << (radar_error / nb) << "\t\t" << (fbcm_error / nb) << "\t\t" << (frbhm_error / nb) << endl ;
logfile.close();
}