From 1b222af80c327c985befe52acb1cef1dee64789f Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Wed, 11 Jun 2008 15:04:50 +0000 Subject: [PATCH] Additions/changes in server & clientinfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Préparation à la séparation de Server::fastViterbiLike() en deux fonctions : monitorClient() qui contiendra tous les traitements génériques aux algorithmes de calcul de la position, et fastViterbiLike() qui ne contiendra que le calcul en lui-même. Ceci afin de permettre l'ajout aisé d'autres algorithmes. guinumo.hh : fichier d'en-tête global avec les #define de débogage. clientinfo.{hh,cc} : * Ajout d'un constructeur par copie. * Ajout des opérateurs = et ==. * Ajout de viterbi_iteration et son accesseur getRef_viterbi_iteration(). * Ajout de print_viterbi_V(). * Changement du type de viterbi_V : passage d'un tableau classique à un multi_array de la bibliothèque Boost. * Ajout d'informations de débogage (trace). server.{hh,cc} : * Adaptation pour viterbi_V. * Ajout de createClient() pour ajouter un client à client_list. * Ajout d'informations de débogage (trace). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@41 785a6c6c-259e-4ff1-8b91-dc31627914f0 --- GuiNuMo-server/Makefile | 4 +- GuiNuMo-server/clientinfo.cc | 133 +++++++++++++++++++++++++++++++---- GuiNuMo-server/clientinfo.hh | 24 +++++-- GuiNuMo-server/guinumo.hh | 11 +++ GuiNuMo-server/server.cc | 60 +++++++++++----- GuiNuMo-server/server.hh | 13 +++- GuiNuMo-server/test.cc | 10 ++- 7 files changed, 213 insertions(+), 42 deletions(-) create mode 100644 GuiNuMo-server/guinumo.hh diff --git a/GuiNuMo-server/Makefile b/GuiNuMo-server/Makefile index 8b6416f..b30cdc3 100644 --- a/GuiNuMo-server/Makefile +++ b/GuiNuMo-server/Makefile @@ -1,7 +1,7 @@ GXX=g++ -GXXFLAGS=-Wall -O2 +GXXFLAGS=-g -Wall -pedantic -O2 LD=g++ -LDFLAGS=-Wall -lm -O2 +LDFLAGS=-g -Wall -pedantic -lm -O2 HEADER= diff --git a/GuiNuMo-server/clientinfo.cc b/GuiNuMo-server/clientinfo.cc index ff294e0..d152c30 100644 --- a/GuiNuMo-server/clientinfo.cc +++ b/GuiNuMo-server/clientinfo.cc @@ -3,29 +3,138 @@ ClientInfo::ClientInfo(const string &ip, const int &port, const float &antg) { +#ifdef DEBUG_T + cout << "//--> ClientInfo::ClientInfo()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + client_ip = ip; antenna_gain = antg; client_listen_port = port; - int N = VITERBI_N, K = VITERBI_K ; - viterbi_V = new float*[N-1] ; - for (int n=0 ; n < N-1 ; n++) - { - viterbi_V[n] = new float[K] ; - for (int k=0 ; k < K ; k++) - viterbi_V[n][k] = 0 ; - } + viterbi_iteration = 1 ; + int N = VITERBI_N, K = VITERBI_K ; + viterbi_V.resize(boost::extents[N-1][K]) ; // Allocation du tableau à la bonne taille (les cases sont initialisées à 0 automatiquement). + +#ifdef DEBUG_T + cout << "//<-- ClientInfo::ClientInfo()" << endl ; fflush(stdout) ; +#endif // DEBUG_T } + + +ClientInfo::ClientInfo(const ClientInfo &c) +{ +#ifdef DEBUG_T + cout << "//--> ClientInfo::ClientInfo(ClientInfo)" << endl ; fflush(stdout) ; +#endif // DEBUG_T + + client_ip = c.client_ip ; + antenna_gain = c.antenna_gain ; + client_listen_port = c.client_listen_port ; + viterbi_iteration = c.viterbi_iteration ; + + const float_array::size_type *s = c.viterbi_V.shape() ; // Récupération des dimensions de c.viterbi_V. + viterbi_V.resize(boost::extents[s[0]][s[1]]) ; // Redimensionnement de viterbi_V aux dimensions de c.viterbi_V. + viterbi_V = c.viterbi_V ; // Copie du contenu de c.viterbi_V dans viterbi_V. + +#ifdef DEBUG_T + cout << "//<-- ClientInfo::ClientInfo(ClientInfo)" << endl ; fflush(stdout) ; +#endif // DEBUG_T +} + + + ClientInfo::~ClientInfo() { +#ifdef DEBUG_T + cout << "//--> ClientInfo::~ClientInfo()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + viterbi_Eprevious.clear(); viterbi_Ecurrent.clear(); - int N = VITERBI_N ; - for(int n=0; n < N-1 ; n++) - delete[] viterbi_V[n] ; - delete viterbi_V ; +#ifdef DEBUG_T + cout << "//<-- ClientInfo::~ClientInfo()" << endl ; fflush(stdout) ; +#endif // DEBUG_T } + + +ClientInfo ClientInfo::operator=(const ClientInfo &c) +{ +#ifdef DEBUG_T + cout << "//--> ClientInfo::operator=()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + + if (this == &c) + return *this ; + + client_ip = c.client_ip ; + antenna_gain = c.antenna_gain ; + client_listen_port = c.client_listen_port ; + viterbi_iteration = c.viterbi_iteration ; + + const float_array::size_type *s = c.viterbi_V.shape() ; // Récupération des dimensions de c.viterbi_V. + viterbi_V.resize(boost::extents[s[0]][s[1]]) ; // Redimensionnement de viterbi_V aux dimensions de c.viterbi_V. + viterbi_V = c.viterbi_V ; // Copie du contenu de c.viterbi_V dans viterbi_V. + +#ifdef DEBUG_T + cout << "//<-- ClientInfo::operator=()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + + return *this ; +} + + + +bool ClientInfo::operator==(const ClientInfo &c) +{ +#ifdef DEBUG_T + cout << "//--> ClientInfo::operator==()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + + if (this == &c) + return true ; + + if (client_ip != c.client_ip) + return false ; + + if (antenna_gain != c.antenna_gain) + return false ; + + if (client_listen_port != c.client_listen_port) + return false ; + + if (viterbi_iteration != c.viterbi_iteration) + return false ; + + if (viterbi_V != c.viterbi_V) + return false ; + + return true ; + +#ifdef DEBUG_T + cout << "//<-- ClientInfo::operator==()" << endl ; fflush(stdout) ; +#endif // DEBUG_T +} + + + +void ClientInfo::print_viterbi_V() const +{ +#ifdef DEBUG_T + cout << "//--> ClientInfo::print_viterbi_V()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + + for (float_index n=0 ; n < viterbi_V.shape()[0] ; n++) + { + for (float_index k=0 ; k < viterbi_V.shape()[1] ; k++) + cout << "[" << viterbi_V[n][k] << "]" ; + cout << endl ; + } + +#ifdef DEBUG_T + cout << "//<-- ClientInfo::print_viterbi_V()" << endl ; fflush(stdout) ; +#endif // DEBUG_T +} diff --git a/GuiNuMo-server/clientinfo.hh b/GuiNuMo-server/clientinfo.hh index 4e55a24..fbbf5a4 100644 --- a/GuiNuMo-server/clientinfo.hh +++ b/GuiNuMo-server/clientinfo.hh @@ -4,10 +4,13 @@ #include #include #include +#include + +#include "guinumo.hh" #include "point.hh" using namespace std; -using std::string; + #define CLIENT_DEFAULT_PORT 7778 #define CLIENT_DEFAULT_IP "127.0.0.1" @@ -18,6 +21,10 @@ using std::string; class ClientInfo { +public : + typedef boost::multi_array float_array ; // On utilise boost::multi_array pour viterbi_V. + typedef float_array::index float_index ; + protected: string client_ip; float antenna_gain; @@ -25,15 +32,24 @@ protected: vector viterbi_Ecurrent; // Last vector vector viterbi_Eprevious; // Previous vector // float viterbi_distances[5]; - float **viterbi_V ; + float_array viterbi_V ; + unsigned int viterbi_iteration ; // Nombre d'ensembles d'historique qu'on a déjà passés public: ClientInfo(const string &ip = CLIENT_DEFAULT_IP, const int &port = CLIENT_DEFAULT_PORT, const float &antg = CLIENT_DEFAULT_ANTENNA_GAIN); + ClientInfo(const ClientInfo &c) ; ~ClientInfo(); + + ClientInfo operator=(const ClientInfo &c) ; + bool operator==(const ClientInfo &c) ; + float getAntennaGain()const { return antenna_gain; }; vector& getRef_viterbi_Ecurrent() { return viterbi_Ecurrent; } ; vector& getRef_viterbi_Eprevious() { return viterbi_Eprevious; } ; - float** get_viterbi_V() { return viterbi_V; } ; + unsigned int& getRef_viterbi_iteration() { return viterbi_iteration ; } ; + float_array& getRef_viterbi_V() { return viterbi_V; } ; + + void print_viterbi_V() const ; }; -#endif +#endif // _CLIENTINFO_HH_ diff --git a/GuiNuMo-server/guinumo.hh b/GuiNuMo-server/guinumo.hh new file mode 100644 index 0000000..1108af4 --- /dev/null +++ b/GuiNuMo-server/guinumo.hh @@ -0,0 +1,11 @@ +#ifndef _GUINUMO_HH_ +#define _GUINUMO_HH_ + + +#define TEST +#define DEBUG // Décommenter pour avoir de l'affichage en plus. +//#define DEBUG_2 // Décommenter pour avoir encore plus d'affichage. +#define DEBUG_T // Décommenter pour afficher chaque entrée et sortie de méthode (trace). + + +#endif // _GUINUMO_HH_ diff --git a/GuiNuMo-server/server.cc b/GuiNuMo-server/server.cc index 89b392d..9aa5ca8 100644 --- a/GuiNuMo-server/server.cc +++ b/GuiNuMo-server/server.cc @@ -1,10 +1,5 @@ #include "server.hh" -#define TEST -#define DEBUG // Décommenter pour avoir de l'affichage en plus. -//#define DEBUG_2 // Décommenter pour avoir encore plus d'affichage. - - /******* Misc. very usefull functions *******/ @@ -210,6 +205,10 @@ inline vector extractReferencePointInfoFromBuffer(const string &buffer_i //Server::Server(string ip_addr, int listen_port, int send_port) // FIXME : paramètre send_port inutilisé Server::Server(const string &ip_addr, const int &listen_port) { +#ifdef DEBUG_T + cout << "//--> Server::Server()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + /* Open socket */ sockListen = socket(PF_INET, SOCK_DGRAM, 0); sockSend = socket(PF_INET, SOCK_DGRAM, 0); @@ -227,17 +226,29 @@ Server::Server(const string &ip_addr, const int &listen_port) makeApListFromFile(DEFAULT_AP_FILE) ; // Initialisation de "access_point_list". makeTopologyFromFile(DEFAULT_TOPOLOGY_FILE) ; // Initialisation de "area_list". makeWaypointDistancesFromFile(DEFAULT_DISTANCE_FILE) ; // Initialisation de "waypoint_indexes" et "waypoint_matrix". + +#ifdef DEBUG_T + cout << "//<-- Server::Server()" << endl ; fflush(stdout) ; +#endif // DEBUG_T } Server::~Server() { - client_list.clear(); - reference_point_list.clear(); - access_point_list.clear(); +#ifdef DEBUG_T + cout << "//--> Server::~Server()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + close(sockListen); close(sockSend); + reference_point_list.clear(); + access_point_list.clear(); + client_list.clear(); + +#ifdef DEBUG_T + cout << "//<-- Server::~Server()" << endl ; fflush(stdout) ; +#endif // DEBUG_T } @@ -1111,16 +1122,21 @@ void Server::computeFriisFromRefList() */ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, const unsigned int &id_client) { +#ifdef DEBUG_T + cout << "//--> Server::fastViterbiLike()" << endl ; fflush(stdout) ; +#endif // DEBUG_T + #ifdef TEST - ClientInfo cl ; - float **V = cl.get_viterbi_V() ; + client_list.push_back(ClientInfo()) ; + ClientInfo &cl = client_list.back() ; + float_array V = cl.getRef_viterbi_V() ; vector &E_current = cl.getRef_viterbi_Ecurrent(), &E_previous = cl.getRef_viterbi_Eprevious() ; vector peregrination_point_list ; makePointListFromFile(peregrination_point_list, DEFAULT_TRACKING_FILE, false) ; #else // TEST - float **V = client_list[id_client].get_viterbi_V() ; + float_array V = client_list[id_client].getRef_viterbi_V() ; vector &E_current = client_list[id_client].getRef_viterbi_Ecurrent(), &E_previous = client_list[id_client].getRef_viterbi_Eprevious() ; @@ -1135,6 +1151,8 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c return ; } + client_list.back().print_viterbi_V() ; + #ifdef DEBUG cout << reference_point_list.size() << " points de référence" ; #ifdef TEST @@ -1178,11 +1196,11 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c if (i > 1) // Si on n'est plus à la première itération { /* Recalcul des plus courtes distances */ - for (int n = N-1-i ; n < N-2 ; n++) // Pour chaque historique existant (sauf le dernier), - for (int k = 0 ; k < K ; k++) // pour chaque point de l'historique, + for (float_index n = N-1-i ; n < N-2 ; n++) // Pour chaque historique existant (sauf le dernier), + for (float_index k = 0 ; k < K ; k++) // pour chaque point de l'historique, { // on met à jour le chemin minimum entre l'historique précédent et le point : V[n][k] = V[n+1][0] + E_previous[0].distance(E_current[k]) ; - for (int l = 1 ; l < K ; l++) + for (float_index l = 1 ; l < K ; l++) { float f = V[n+1][l] + E_previous[l].distance(E_current[k]) ; if (f < V[n][k]) @@ -1191,10 +1209,10 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c } /* Traitement du dernier historique */ - for (int k = 0 ; k < K ; k++) // Pour chaque point, + for (float_index k = 0 ; k < K ; k++) // Pour chaque point, { // on récupère le chemin minimum entre l'historique précédent et le point : V[N-2][k] = E_previous[0].distance(E_current[k]) ; - for (int l = 1 ; l < K ; l++) + for (float_index l = 1 ; l < K ; l++) { float f = E_previous[l].distance(E_current[k]) ; if (f < V[N-2][k]) @@ -1210,7 +1228,7 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c float V0_min = V[0][0] ; cout << "V[0][0]=" << V[0][0] << " ; V0_min=" << V0_min << " ; V0_min_k=" << V0_min_k << " -- " ; #endif // DEBUG - for (int k=1 ; k < K ; k++) + for (float_index k=1 ; k < K ; k++) { if (V[0][k] < V0_min) { @@ -1232,9 +1250,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 (float_index n=0 ; n < N-1 ; n++) { - for (int k=0 ; k < K ; k++) + for (float_index k=0 ; k < K ; k++) cout << "[" << V[n][k] << "]" ; cout << endl ; } @@ -1249,6 +1267,10 @@ void Server::fastViterbiLike(const unsigned short &N, const unsigned short &K, c pt++ ; #endif // TEST } + +#ifdef DEBUG_T + cout << "//<-- Server::fastViterbiLike()" << endl ; fflush(stdout) ; +#endif // DEBUG_T } diff --git a/GuiNuMo-server/server.hh b/GuiNuMo-server/server.hh index 1e45007..f647563 100644 --- a/GuiNuMo-server/server.hh +++ b/GuiNuMo-server/server.hh @@ -14,6 +14,8 @@ #include #include #include + +#include "guinumo.hh" #include "clientinfo.hh" #include "referencepoint.hh" #include "accesspoint.hh" @@ -22,7 +24,10 @@ #include "area.hh" using namespace std; -using std::string; + +typedef ClientInfo::float_array float_array ; +typedef ClientInfo::float_index float_index ; + #define DEFAULT_LOGFILE "log/radar_exp.csv" // Fichier de sortie #define DEFAULT_REF_POINT_FILE "csv/agreg/toutes.csv" // Fichier des points de référence @@ -63,6 +68,8 @@ public: void send_to_client(const int &cl); int receive_data(); + ClientInfo& createClient() ; + bool pointExists(const float &x, const float &y, const float &z)const; bool pointExists(const Point &p)const; bool pointExists(const vector &point_list, const float &x, const float &y, const float &z) const ; @@ -95,14 +102,16 @@ public: void printReferencePointList(); void printPointList(vector &point_list) ; - void printAccessPointList(); void computeFriisFromRefList(); unsigned int getNbReferencePoints()const { return reference_point_list.size(); }; + //void monitorClient(const unsigned int &client_id) ; + //Point fastViterbiLike(const unsigned int &id_client, float **distance_matrix) ; void fastViterbiLike(const unsigned short &N, const unsigned short &K, const unsigned int &id_client) ; + void printLastClientV(); /* For experimentation purpose only ! */ void radar_exp(); diff --git a/GuiNuMo-server/test.cc b/GuiNuMo-server/test.cc index 5aaccfc..dbd325a 100644 --- a/GuiNuMo-server/test.cc +++ b/GuiNuMo-server/test.cc @@ -16,10 +16,14 @@ int main(int argc, char ** argv) { ofstream output_file; string read_file; - Server my_server; + Server server ; - // my_server.radar_exp(); - my_server.fastViterbiLike(VITERBI_N, VITERBI_K, 0) ; + server.fastViterbiLike(VITERBI_N, VITERBI_K, 0) ; + /* + server.createClient() ; + server.printLastClientV(); + server.monitorClient(0) ; + */ cout << argv[0] << " : fin." << endl ; fflush(stdout) ;