Commit-sauvegarde de modifs sur server.cc

/!\ Cette révision est présente uniquement pour sauvegarde de
    modifications. Certains des changements apportés seront annulés à la
    prochaine révision.
/!\ Bogue connu de cette révision : la lecture du fichier de
    pérégrination est faite grâce à la fonction makePointListFromFile(),
    donc tous les points vont dans la même entrée de la liste. Nécessité
    de créer une fonction adaptée.

server.cc/hh :
* Modifications pour lire un fichier de pérégrination et effectuer les
  calculs de position.
* getkClosestInSs() : correction du sens de la comparaison pour
  récupérer la distance maximale.
*	makeReferencePointListFromFile(const string &filename) : remplacement
 	par un appel à la nouvelle fonction générique :
 	makePointListFromFile(vector<ReferencePoint> &dest_point_list, const
 	string &filename).
* makePointListFromFile() : suppression de variables inutiles.
  printReferencePointList() : remplacement par un appel à la nouvelle
  fonction générique : printPointList(vector<ReferencePoint>
  &point_list).

git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@30 785a6c6c-259e-4ff1-8b91-dc31627914f0
This commit is contained in:
Matteo Cypriani 2008-05-05 11:59:55 +00:00
parent ae11d3a2c3
commit 54d788586f
2 changed files with 78 additions and 34 deletions

View File

@ -357,7 +357,7 @@ vector<Point> Server::getkClosestInSs(const vector<Measurement> &m, const unsign
{
distances_vector.push_back(tmp_distance);
points_vector.push_back(reference_point_list[i].getCoordinates());
dist_max = (dist_max > tmp_distance) ? tmp_distance : dist_max;
dist_max = (dist_max < tmp_distance) ? tmp_distance : dist_max;
}
else
{
@ -405,6 +405,15 @@ vector<Point> Server::getkClosestInSs(const vector<Measurement> &m, const unsign
}
}
#ifdef DEBUG
cout << "getkClosestInSs() : Points sélectionnés :" << endl ;
if (distances_vector.size() != points_vector.size())
cout << "Erreur ! distances_vector.size()=" << distances_vector.size() << " != points_vector.size()=" << points_vector.size() << endl ;
else
for (i = 0 ; i < distances_vector.size() - 1 ; i++)
cout << distances_vector[i] << " : " << points_vector[i] << endl ;
#endif
return points_vector;
}
@ -606,17 +615,26 @@ Point Server::interlink(const vector<Measurement> &m, const int &client_idx)cons
/* FONCTION POUR RÉTRO-COMPATIBILITÉ.
* Crée la liste des points de référence dans la liste reference_point_list. */
void Server::makeReferencePointListFromFile(const string &filename)
{
ifstream input_file;
char buffer[BUFFER_LENGTH];
string lecture_fichier;
makePointListFromFile(reference_point_list, filename) ;
}
/* Lit le fichier de mesures (CSV) nommé "filename", et place les informations dans la liste "dest_point_list". */
void Server::makePointListFromFile(vector<ReferencePoint> &dest_point_list, const string &filename)
{
ifstream input_file ; // Flux d'entrée du fichier.
char buffer[BUFFER_LENGTH]; // Buffer lu dans le fichier.
string cpp_buffer ; // Buffer au format string.
ReferencePoint rp;
Point tmp_point;
float x, y, z ; // Coordonnées des points
unsigned int i, pt_idx;
string cpp_buffer, tmp_mes;
vector<string> infos;
float x, y, z ; // Coordonnées des points.
unsigned int pt_idx ; // Position du point lu dans la liste.
vector<string> infos ; // Liste des informations lues dans une ligne du fichier.
input_file.open(filename.c_str()) ;
@ -667,9 +685,11 @@ void Server::makeReferencePointListFromFile(const string &filename)
if (!pointExists(tmp_point))
{
rp.setCoordinates(tmp_point);
reference_point_list.push_back(rp);
#ifdef DEBUG_2
dest_point_list.push_back(rp);
#ifdef DEBUG
npoints++ ;
#endif
#ifdef DEBUG_2
cout << tmp_point << " : ajouté." << endl ;
}
else
@ -681,18 +701,18 @@ void Server::makeReferencePointListFromFile(const string &filename)
#ifdef FRED_CSV_FORMAT
vector<int> measures_vector = extractValues(infos[4]) ;
for (i = 0 ; i < measures_vector.size() ; i++)
reference_point_list[pt_idx].addMeasurement(infos[3], measures_vector[i]);
for (unsigned int i = 0 ; i < measures_vector.size() ; i++)
dest_point_list[pt_idx].addMeasurement(infos[3], measures_vector[i]);
measures_vector.clear();
#else
for (i = 4 ; i < infos.size() ; i++)
for (unsigned int i = 4 ; i < infos.size() ; i++)
{
#ifdef DEBUG_2
cout << "Lecture de la valeur : " << infos[i] << "... " ;
#endif
if (i + 1 < infos.size())
{
reference_point_list[pt_idx].addMeasurement(infos[i], string2int(infos[i+1])) ;
dest_point_list[pt_idx].addMeasurement(infos[i], string2int(infos[i+1])) ;
#ifdef DEBUG_2
cout << "Mesure ajoutée : AP = " << infos[i] << " | SS = " << string2int(infos[i+1]) << endl ;
#endif
@ -769,21 +789,27 @@ void Server::makeApListFromFile(const string &filename)
/* FONCTION POUR RÉTRO-COMPATIBILITÉ
* Affiche la liste des points de référence (reference_point_list). */
void Server::printReferencePointList()
{
unsigned int i;
printPointList(reference_point_list) ;
}
for (i = 0 ; i < reference_point_list.size() ; i++)
cout << reference_point_list[i] << endl;
/* Affiche une liste de points (point_list). */
void Server::printPointList(vector<ReferencePoint> &point_list)
{
for (unsigned int i = 0 ; i < point_list.size() ; i++)
cout << point_list[i] << endl ;
}
void Server::printAccessPointList()
{
unsigned int i;
for (i = 0 ; i < access_point_list.size() ; i++)
for (unsigned int i = 0 ; i < access_point_list.size() ; i++)
cout << access_point_list[i] << endl;
}
@ -791,14 +817,13 @@ void Server::printAccessPointList()
void Server::computeFriisFromRefList()
{
unsigned int i, j;
vector<float> friis_idx_list;
Point pt_coords, ap_coords;
float ap_power, ap_gain, calib_gain = 2, const_term, mes_power, friis_sum;
unsigned int ap_freq;
string ap_mac;
for (i = 0 ; i < access_point_list.size() ; i++)
for (unsigned int i = 0 ; i < access_point_list.size() ; i++)
{
ap_power = access_point_list[i].getOutputPower();
ap_coords = access_point_list[i].getCoordinates();
@ -812,18 +837,21 @@ void Server::computeFriisFromRefList()
const_term += 20 * log10 (300000000.0 / ap_freq) + ap_power;
/* Compute an index for each ref point. List stored in friis_idx_list */
for (j = 0 ; j < reference_point_list.size() ; j++)
for (unsigned int j = 0 ; j < reference_point_list.size() ; j++)
{
pt_coords = reference_point_list[j].getCoordinates();
if (reference_point_list[i].getPowerForAp(ap_mac, &mes_power))
friis_idx_list.push_back((const_term - mes_power) / (10 * log10(ap_coords.distance(pt_coords))));
}
/* Now, compute avg value */
friis_sum = 0;
for (j = 0 ; j < friis_idx_list.size() ; j++)
for (unsigned int j = 0 ; j < friis_idx_list.size() ; j++)
friis_sum += friis_idx_list[j];
access_point_list[i].setFriisIndex(friis_sum / friis_idx_list.size());
cout << access_point_list[i].getApAddr() << " -> " << (friis_sum / friis_idx_list.size()) << endl;
friis_idx_list.clear();
}
}
@ -844,6 +872,8 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c
vector<Point>
&E_current = cl.getRef_viterbi_Ecurrent(),
&E_previous = cl.getRef_viterbi_Eprevious() ;
vector<ReferencePoint> peregrination_point_list ;
makePointListFromFile(peregrination_point_list, DEFAULT_TRACKING_FILE) ;
#else
float **V = client_list[id_client].get_viterbi_V() ;
vector<Point>
@ -860,27 +890,35 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c
}
#ifdef TEST
int pt = 0 ;
#ifdef DEBUG
cout << reference_point_list.size() << " points à traiter." << endl ;
#endif
while (pt < reference_point_list.size())
unsigned int pt = 0 ;
#ifdef DEBUG
cout << reference_point_list.size() << " points de référence, " << peregrination_point_list.size() << " points de pérégrination." << endl ;
cout << "***** Liste : *****" << endl ;
for (int c = 0 ; c < peregrination_point_list.size() ; c++)
cout << peregrination_point_list[c] << endl ;
cout << "*******************" << endl ;
#endif
while (pt < peregrination_point_list.size())
#else
while (true)
#endif
{
vector<Measurement> vm ;
Point *ref_coords = NULL ; // Coordonnées de référence (à ignorer).
#ifdef TEST
/* Get point measurements */
vm.clear();
vm = reference_point_list[pt].getMeasurementList();
// *ref_coords = reference_point_list[i].getCoordinates();
//vm.clear();
vm = peregrination_point_list[pt].getMeasurementList();
#endif
E_previous = E_current ;
E_current = getkClosestInSs(vm, K, ref_coords) ; // Création de l'ensemble des K points les plus proches dans l'espace des puissances.
E_current = getkClosestInSs(vm, K) ; // Création de l'ensemble des K points les plus proches dans l'espace des puissances.
#ifdef DEBUG
cout << "Point courant : " << peregrination_point_list[pt] ;
#endif
if (i > 1) // Si on n'est plus à la première itération
{
@ -923,7 +961,9 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c
}
}
#ifdef DEBUG
// cout << "(N=" << N << ") - 1 - (i=" << i << ") = " << N-1-i << endl ;
cout << "V :" << endl ;
for (int n=0 ; n < N-1 ; n++)
{
for (int k=0 ; k < K ; k++)
@ -931,6 +971,7 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c
cout << endl ;
}
cout << "\n--------------------------" << endl ;
#endif
if (i < N-1)
i++ ;

View File

@ -68,11 +68,14 @@ public:
Point fbcm(const vector<Measurement> &m, const int &client_idx)const;
Point interlink(const vector<Measurement> &m, const int &client_idx)const;
void makeReferencePointListFromFile(const string &filename);
void makePointListFromFile(vector<ReferencePoint> &dest_point_list, const string &filename) ;
void makeApListFromFile(const string &filename);
void printReferencePointList();
void printPointList(vector<ReferencePoint> &point_list) ;
void printAccessPointList();
void computeFriisFromRefList();
unsigned int getNbReferencePoints()const { return reference_point_list.size(); };
/* For experimentation purpose only ! */
void radar_exp();