Additions/changes in server & clientinfo
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
This commit is contained in:
parent
4844c58cd0
commit
1b222af80c
|
@ -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=
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -4,10 +4,13 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <boost/multi_array.hpp>
|
||||
|
||||
#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, 2> 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<Point> viterbi_Ecurrent; // Last vector
|
||||
vector<Point> 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<Point>& getRef_viterbi_Ecurrent() { return viterbi_Ecurrent; } ;
|
||||
vector<Point>& 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_
|
||||
|
|
|
@ -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_
|
|
@ -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<string> 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<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, false) ;
|
||||
#else // TEST
|
||||
float **V = client_list[id_client].get_viterbi_V() ;
|
||||
float_array V = client_list[id_client].getRef_viterbi_V() ;
|
||||
vector<Point>
|
||||
&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
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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<ReferencePoint> &point_list, const float &x, const float &y, const float &z) const ;
|
||||
|
@ -95,14 +102,16 @@ public:
|
|||
|
||||
void printReferencePointList();
|
||||
void printPointList(vector<ReferencePoint> &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();
|
||||
|
|
|
@ -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) ;
|
||||
|
|
Loading…
Reference in New Issue