From a39e06cf190bf0be4e95cf79337aab7be8852f38 Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Mon, 9 May 2011 16:42:30 +0200 Subject: [PATCH] [Positioning] Stock::closest_calibration_request() Add CalibrationRequest Stock::closest_calibration_request(Request). --- owlps-positioning/src/stock.cc | 32 ++++++++++++++++++++++++++++++-- owlps-positioning/src/stock.hh | 4 ++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/owlps-positioning/src/stock.cc b/owlps-positioning/src/stock.cc index 7fd735e..497dba7 100644 --- a/owlps-positioning/src/stock.cc +++ b/owlps-positioning/src/stock.cc @@ -256,8 +256,9 @@ const ReferencePoint& Stock:: closest_reference_point(const Request &request) { if (reference_points.empty()) - throw element_not_found("Cannot search for the closest reference \ -point: reference point list is empty!") ; + throw element_not_found( + "Cannot search for the closest reference point: reference points'" + " list is empty!") ; unordered_set::const_iterator i = reference_points.begin() ; @@ -289,3 +290,30 @@ find_create_calibration_request(const CalibrationRequest &request) calibration_requests.insert(request) ; return *ret.first ; } + + +const CalibrationRequest& Stock:: +closest_calibration_request(const Request &request) +{ + if (calibration_requests.empty()) + throw element_not_found( + "Cannot search for the closest calibration request: calibration" + " requests' list is empty!") ; + + unordered_set::const_iterator i = + calibration_requests.begin() ; + float distance = i->ss_square_distance(request) ; + unordered_set::const_iterator closest = i ; + + for (++i ; i != calibration_requests.end() ; ++i) + { + float tmp_distance = i->ss_square_distance(request) ; + if (tmp_distance < distance) + { + distance = tmp_distance ; + closest = i ; + } + } + + return *closest ; +} diff --git a/owlps-positioning/src/stock.hh b/owlps-positioning/src/stock.hh index f030bfa..d8abaa5 100644 --- a/owlps-positioning/src/stock.hh +++ b/owlps-positioning/src/stock.hh @@ -101,6 +101,10 @@ public: /// Search for a CalibrationRequest and add it if it does not exist static const CalibrationRequest& find_create_calibration_request(const CalibrationRequest &request) ; + /// \brief Search for the closest CalibrationRequest (in the signal + /// strength space) to a given Request + static const CalibrationRequest& + closest_calibration_request(const Request &request) ; //@} /// Deletes all elements in all attributes