From 0e9d9f8c81c4c9fe2e99a61293125989c53886c8 Mon Sep 17 00:00:00 2001 From: nojhan Date: Tue, 8 Nov 2011 18:40:28 +0100 Subject: [PATCH] added a symetric round repairer around 0.5, plus a rounding at a given precision --- edo/src/edoRepairerRound.h | 43 +++++++++++++++++++++++++++++++++ edo/test/t-dispatcher-round.cpp | 21 +++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/edo/src/edoRepairerRound.h b/edo/src/edoRepairerRound.h index 21dd1cae..dc05716d 100644 --- a/edo/src/edoRepairerRound.h +++ b/edo/src/edoRepairerRound.h @@ -32,6 +32,7 @@ Authors: #include "edoRepairerApply.h" + /** A repairer that calls "floor" on each items of a solution * * Just a proxy to "edoRepairerApplyUnary rep( std::floor);" @@ -45,6 +46,7 @@ public: edoRepairerFloor() : edoRepairerApplyUnary( std::floor ) {} }; + /** A repairer that calls "ceil" on each items of a solution * * @see edoRepairerFloor @@ -59,4 +61,45 @@ public: }; +// FIXME find a way to put this function as a member of edoRepairerRoundDecimals +template< typename ArgType > +ArgType edoRound( ArgType val, ArgType prec = 1.0 ) +{ + return (val > 0.0) ? + floor(val * prec + 0.5) / prec : + ceil(val * prec - 0.5) / prec ; +} + +/** A repairer that round values at a given a precision. + * + * e.g. if prec=10, 8.06 will be rounded to 8.1 + * + * @see edoRepairerFloor + * @see edoRepairerCeil + * + * @ingroup Repairers + */ +template < typename EOT > +class edoRepairerRoundDecimals : public edoRepairerApplyBinary +{ +public: + typedef typename EOT::AtomType ArgType; + + edoRepairerRoundDecimals( ArgType prec ) : edoRepairerApplyBinary( edoRound, prec ) {} +}; + + +/** A repairer that do a rounding around val+0.5 + * + * @see edoRepairerRoundDecimals + * + * @ingroup Repairers + */ +template < typename EOT > +class edoRepairerRound : public edoRepairerRoundDecimals +{ +public: + edoRepairerRound() : edoRepairerRoundDecimals( 1.0 ) {} +}; + #endif // !_edoRepairerRound_h diff --git a/edo/test/t-dispatcher-round.cpp b/edo/test/t-dispatcher-round.cpp index 89fc1644..cfcd9261 100644 --- a/edo/test/t-dispatcher-round.cpp +++ b/edo/test/t-dispatcher-round.cpp @@ -38,10 +38,18 @@ int main(void) sol.push_back(1.1); sol.push_back(3.9); sol.push_back(3.9); - // we expect {1,2,3,4} + sol.push_back(5.4); + sol.push_back(5.6); + sol.push_back(7.011); + sol.push_back(8.09); + sol.push_back(8.21); + + std::cout << "expect: INVALID 9 1 2 3 4 5 6 7 8.1 8.2" << std::endl; edoRepairer* rep1 = new edoRepairerFloor(); edoRepairer* rep2 = new edoRepairerCeil(); + edoRepairer* rep3 = new edoRepairerRound(); + edoRepairer* rep4 = new edoRepairerRoundDecimals( 10 ); std::vector indexes1; indexes1.push_back(0); @@ -51,8 +59,19 @@ int main(void) indexes2.push_back(1); indexes2.push_back(3); + std::vector indexes3; + indexes3.push_back(4); + indexes3.push_back(5); + + std::vector indexes4; + indexes4.push_back(6); + indexes4.push_back(7); + indexes4.push_back(8); + edoRepairerDispatcher repare( indexes1, rep1 ); repare.add( indexes2, rep2 ); + repare.add( indexes3, rep3 ); + repare.add( indexes4, rep4 ); repare(sol);