[Positioning] Write all results simultaneously

Write results computed by several algorithms for the same request
simultaneously for a given medium. This allows to have only one CSV line
for a given request.
To achieve that, the class ResultList was created.
This commit is contained in:
Matteo Cypriani 2011-04-05 11:52:06 +02:00
parent 4752198ce7
commit a898af4389
18 changed files with 201 additions and 58 deletions

View File

@ -58,6 +58,7 @@ OBJ_LIST = \
measurement.o \
request.o \
calibrationrequest.o \
resultlist.o \
result.o \
minmax.o \
interlinknetworks.o \
@ -177,6 +178,10 @@ $(OBJ_DIR)/calibrationrequest.o: \
$(OBJ_DIR)/request.o \
$(OBJ_DIR)/referencepoint.o \
$(OBJ_DIR)/direction.o
$(OBJ_DIR)/result.o: \
$(OBJ_DIR)/request.o
$(OBJ_DIR)/resultlist.o: \
$(OBJ_DIR)/result.o
$(OBJ_DIR)/textfilereader.o: \
$(OBJ_DIR)/posexcept.o
$(OBJ_DIR)/csvfilereader.o: \
@ -208,10 +213,12 @@ $(OBJ_DIR)/input.o: \
$(OBJ_DIR)/stock.o
$(OBJ_DIR)/outputterminal.o: \
$(SRC_DIR)/outputmedium.hh \
$(OBJ_DIR)/resultlist.o \
$(OBJ_DIR)/result.o
$(OBJ_DIR)/outputcsv.o: \
$(SRC_DIR)/outputmedium.hh \
$(OBJ_DIR)/textfilewriter.o \
$(OBJ_DIR)/resultlist.o \
$(OBJ_DIR)/result.o
$(OBJ_DIR)/output.o: \
$(OBJ_DIR)/outputterminal.o \
@ -250,6 +257,7 @@ $(OBJ_DIR)/positioning.o: \
$(OBJ_DIR)/frbhmbasic.o \
$(OBJ_DIR)/interlinknetworks.o \
$(OBJ_DIR)/radar.o \
$(OBJ_DIR)/resultlist.o \
$(OBJ_DIR)/output.o \
$(OBJ_DIR)/configuration.o \
$(OBJ_DIR)/posexcept.o

View File

@ -25,14 +25,6 @@
° Compositions : devraient être représentées par des attributs
normaux.
- Positioning
° Pour une requête, la sortie des résultats de tous les algos
devrait se faire simultanément sur le medium de sortie, ce qui
permettrait par exemple de créer un tableau pour l'affichage CSV
(et peut-être d'optimiser les requêtes d'insertion dans la
BDD). Cela implique de modifier les interfaces de Output (write()
devra prendre un vector<Result>) et des différents OutputMedium.
- Building
Dans le destructeur, vérifier qu'il faut bien supprimer les Area et
les Waypoint. Si oui, faut-il aussi les enlever des listes dans

View File

@ -5,5 +5,5 @@
Result CartographyAlgorithm::compute(const Request &request)
{
Point3D position(select_point(request)) ;
return Result(&request, position, name) ;
return Result(position, name) ;
}

View File

@ -12,7 +12,7 @@ Result FRBHMBasic::compute(const Request &_request)
compute_ap_distance_circles() ;
Point3D position(multilaterate_2d(closest_in_ss->get_z())) ;
return Result(request, position, name) ;
return Result(position, name) ;
}

View File

@ -58,7 +58,7 @@ Result MultilaterationAlgorithm::compute(const Request &_request)
compute_ap_distance_circles() ;
Point3D position(multilaterate()) ;
return Result(request, position, name) ;
return Result(position, name) ;
}

View File

@ -78,9 +78,9 @@ void Output::initialise_output_csv()
}
void Output::write(const Result &result) const
void Output::write(const ResultList &results) const
{
for (vector<OutputMedium*>::const_iterator i = output_media.begin() ;
i != output_media.end() ; ++i)
(*i)->write(result) ;
(*i)->write(results) ;
}

View File

@ -2,7 +2,7 @@
#define _OWLPS_POSITIONING_OUTPUT_HH_
class OutputMedium ;
class Result ;
class ResultList ;
#include <vector>
@ -27,7 +27,7 @@ public:
/** @name Operations */
//@{
void write(const Result &result) const ;
void write(const ResultList &results) const ;
//@}
} ;

View File

@ -1,5 +1,6 @@
#include "outputcsv.hh"
#include "request.hh"
#include "resultlist.hh"
#include "mobile.hh"
#include <sstream>
@ -15,7 +16,23 @@ const string OutputCSV::result_to_csv(const Result &result)
{
ostringstream csv_line ;
const Request *const request = result.get_request() ;
csv_line << result.get_algorithm() ;
Point3D position = result.get_position() ;
csv_line
<< ';' << position.get_x()
<< ';' << position.get_y()
<< ';' << position.get_z() ;
return csv_line.str() ;
}
const string OutputCSV::results_to_csv(const ResultList &results)
{
ostringstream csv_line ;
const Request *const request = results.get_request() ;
if (request != NULL)
{
if (request->get_mobile() != NULL)
@ -27,14 +44,10 @@ const string OutputCSV::result_to_csv(const Result &result)
else
csv_line << ";;;" ;
csv_line << ';' << result.get_algorithm() ;
const vector<Result> &res = results.get_results() ;
for (vector<Result>::const_iterator r = res.begin() ; r != res.end() ;
++r)
csv_line << ';' << result_to_csv(*r) ;
Point3D position = result.get_position() ;
csv_line
<< ';' << position.get_x()
<< ';' << position.get_y()
<< ';' << position.get_z() ;
csv_line << '\n' ;
return csv_line.str() ;
}

View File

@ -4,10 +4,10 @@
#include "outputmedium.hh"
#include "textfilewriter.hh"
/// Writes a result to a CSV file
/// Writes results to a CSV file
/**
* CSV format is:
* Mobile_MAC;Timestamp;X;Y;Z
* Mobile_MAC;Timestamp;Algorithm1;X;Y;Z;;AlgorithmN;X;Y;Z
*/
class OutputCSV: public OutputMedium
{
@ -15,12 +15,14 @@ protected:
TextFileWriter file ;
const std::string result_to_csv(const Result &result) ;
const std::string results_to_csv(const ResultList &results) ;
public:
OutputCSV(const std::string &filename):
file(filename) {}
void write(const Result &result) ;
void write(const ResultList &results) ;
} ;
@ -30,7 +32,13 @@ public:
inline void OutputCSV::write(const Result &result)
{
file.write_text(result_to_csv(result)) ;
file.write_text(result_to_csv(result) + '\n') ;
}
inline void OutputCSV::write(const ResultList &results)
{
file.write_text(results_to_csv(results) + '\n') ;
}

View File

@ -1,7 +1,8 @@
#ifndef _OWLPS_POSITIONING_OUTPUTMEDIUM_HH_
#define _OWLPS_POSITIONING_OUTPUTMEDIUM_HH_
#include "result.hh"
class Result ;
class ResultList ;
/// Super class of all output media
/**
@ -18,6 +19,7 @@ public:
/** @name Operations */
//@{
virtual void write(const Result &result) = 0 ;
virtual void write(const ResultList &results) = 0 ;
//@}
} ;

View File

@ -1,4 +1,5 @@
#include "outputterminal.hh"
#include "resultlist.hh"
@ -6,3 +7,10 @@ void OutputTerminal::write(const Result &result)
{
output_stream << result << '\n' ;
}
void OutputTerminal::write(const ResultList &results)
{
output_stream << results << '\n' ;
}

View File

@ -16,6 +16,7 @@ public:
output_stream(_output_stream) {}
void write(const Result &result) ;
void write(const ResultList &results) ;
} ;
#endif // _OWLPS_POSITIONING_OUTPUTTERMINAL_HH_

View File

@ -4,6 +4,7 @@
#include "frbhmbasic.hh"
#include "interlinknetworks.hh"
#include "radar.hh"
#include "resultlist.hh"
#include "configuration.hh"
#include "posexcept.hh"
#include "stock.hh"
@ -86,11 +87,10 @@ void Positioning::loop()
if (! request)
continue ;
ResultList results(&request) ;
for (algo = algorithms.begin() ; algo != algorithms.end() ;
++algo)
{
Result res = (*algo)->compute(request) ;
output.write(res) ;
}
results.add((*algo)->compute(request)) ;
output.write(results) ;
}
}

View File

@ -14,8 +14,8 @@ Result RealPosition::compute(const Request &request)
Point3D *coordinates =
static_cast<Point3D*>(
calibration_request->get_reference_point()) ;
return Result(&request, *coordinates, name) ;
return Result(*coordinates, name) ;
}
return Result(&request, name) ;
return Result(name) ;
}

View File

@ -13,7 +13,6 @@ const Result& Result::operator=(const Result &source)
algorithm = source.algorithm ;
position = source.position ;
request = source.request ;
return *this ;
}
@ -23,20 +22,15 @@ bool Result::operator==(const Result &source) const
{
return
algorithm == source.algorithm &&
position == source.position &&
request == source.request ;
position == source.position ;
}
std::ostream& operator<<(std::ostream &os, const Result &r)
{
if (r.request == NULL)
os << "For an unknown request, the " ;
else
os << "For the following request: " << *(r.request) << "\nThe " ;
os
<< "result of the algorithm " << r.algorithm
<< "The result of the algorithm " << r.algorithm
<< " is: " << r.position ;
return os ;
}

View File

@ -1,8 +1,6 @@
#ifndef _OWLPS_POSITIONING_RESULT_HH_
#define _OWLPS_POSITIONING_RESULT_HH_
class Request ;
#include "point3d.hh"
#include <string>
@ -12,24 +10,19 @@ class Result
{
protected:
Point3D position ;
Request *request ;
std::string algorithm ;
public:
Result(const Request *_request = NULL,
const std::string &_algorithm = "UnknownAlgorithm"):
request(const_cast<Request*>(_request)), algorithm(_algorithm) {}
Result(const Request *_request, const Point3D &_position,
const std::string &_algorithm):
position(_position), request(const_cast<Request*>(_request)),
Result(const std::string &_algorithm = "UnknownAlgorithm"):
algorithm(_algorithm) {}
Result(const Point3D &_position, const std::string &_algorithm):
position(_position), algorithm(_algorithm) {}
~Result(void) {}
/** @name Read accessors */
//@{
const std::string& get_algorithm(void) const ;
const Point3D& get_position(void) const ;
const Request* get_request(void) const ;
//@}
/** @name Operators */
@ -60,12 +53,6 @@ inline const Point3D& Result::get_position() const
}
inline const Request* Result::get_request() const
{
return request ;
}
/* *** Operators *** */

View File

@ -0,0 +1,54 @@
#include "resultlist.hh"
#include "request.hh"
using namespace std ;
/* *** Constructors *** */
ResultList::~ResultList()
{
results.clear() ;
}
/* *** Operators *** */
const ResultList& ResultList::operator=(const ResultList &source)
{
if (this == &source)
return *this ;
request = source.request ;
results = source.results ;
return *this ;
}
bool ResultList::operator==(const ResultList &source) const
{
return
request == source.request &&
results == source.results ;
}
ostream& operator<<(ostream &os, const ResultList &r)
{
if (r.request == NULL)
os << "For an unknown request:\n" ;
else
os << "For the following request: " << *(r.request) << '\n' ;
vector<Result>::const_iterator res ;
for (res = r.results.begin() ; res != r.results.end() ; ++res)
os << *res << '\n' ;
return os ;
}

View File

@ -0,0 +1,76 @@
#ifndef _OWLPS_POSITIONING_RESULTLIST_HH_
#define _OWLPS_POSITIONING_RESULTLIST_HH_
class Request ;
#include "result.hh"
#include <vector>
#include <ostream>
class ResultList
{
protected:
Request *request ;
std::vector<Result> results ;
public:
ResultList(const Request *_request = NULL,
const std::vector<Result> &_results = std::vector<Result>()):
request(const_cast<Request*>(_request)), results(_results) {}
ResultList(const ResultList &source):
request(source.request), results(source.results) {}
~ResultList(void) ;
/** @name Read accessors */
//@{
const Request* get_request(void) const ;
const std::vector<Result>& get_results(void) const ;
//@}
/** @name Write accessors */
//@{
void add(const Result &res) ;
//@}
/** @name Operators */
//@{
const ResultList& operator=(const ResultList &source) ;
bool operator==(const ResultList &source) const ;
bool operator!=(const ResultList &source) const ;
//@}
/// Displays a ResultList
friend std::ostream& operator<<(std::ostream &os,
const ResultList &r) ;
} ;
/* *** Read accessors *** */
inline const Request* ResultList::get_request() const
{
return request ;
}
inline const std::vector<Result>& ResultList::get_results(void) const
{
return results ;
}
/* *** Write accessors *** */
inline void ResultList::add(const Result &res)
{
results.push_back(res) ;
}
#endif // _OWLPS_POSITIONING_RESULTLIST_HH_