[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:
parent
4752198ce7
commit
a898af4389
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5,5 +5,5 @@
|
|||
Result CartographyAlgorithm::compute(const Request &request)
|
||||
{
|
||||
Point3D position(select_point(request)) ;
|
||||
return Result(&request, position, name) ;
|
||||
return Result(position, name) ;
|
||||
}
|
||||
|
|
|
@ -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) ;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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) ;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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) ;
|
||||
}
|
||||
|
|
|
@ -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 ;
|
||||
//@}
|
||||
} ;
|
||||
|
||||
|
|
|
@ -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() ;
|
||||
}
|
||||
|
|
|
@ -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') ;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 ;
|
||||
//@}
|
||||
} ;
|
||||
|
||||
|
|
|
@ -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' ;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ public:
|
|||
output_stream(_output_stream) {}
|
||||
|
||||
void write(const Result &result) ;
|
||||
void write(const ResultList &results) ;
|
||||
} ;
|
||||
|
||||
#endif // _OWLPS_POSITIONING_OUTPUTTERMINAL_HH_
|
||||
|
|
|
@ -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) ;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) ;
|
||||
}
|
||||
|
|
|
@ -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 ;
|
||||
}
|
||||
|
|
|
@ -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 *** */
|
||||
|
||||
|
|
|
@ -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 ;
|
||||
}
|
|
@ -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_
|
Loading…
Reference in New Issue