From 35212ccc906586f68b574947756bbf57aee74dab Mon Sep 17 00:00:00 2001 From: Lionel Parreaux Date: Mon, 6 May 2013 15:27:19 +0200 Subject: [PATCH 01/28] adapted eoLogger for redirecting to ostreams --- eo/src/utils/eoLogger.cpp | 48 +++++++++++++++++++++++++++------------ eo/src/utils/eoLogger.h | 31 ++++++++++++++----------- eo/test/t-eoLogger.cpp | 24 ++++++++++++++++++-- 3 files changed, 73 insertions(+), 30 deletions(-) diff --git a/eo/src/utils/eoLogger.cpp b/eo/src/utils/eoLogger.cpp index 1330c5323..3a9b20098 100644 --- a/eo/src/utils/eoLogger.cpp +++ b/eo/src/utils/eoLogger.cpp @@ -40,6 +40,11 @@ Caner Candan #include "eoLogger.h" +/* TODO? +- changer oprateurs +- virer la structure "file" +*/ + void eoLogger::_init() { _standard_io_streams[&std::cout] = 1; @@ -55,6 +60,8 @@ void eoLogger::_init() addLevel("logging", eo::logging); addLevel("debug", eo::debug); addLevel("xdebug", eo::xdebug); + + //outStream = &std::cout; } eoLogger::eoLogger() : @@ -66,13 +73,12 @@ eoLogger::eoLogger() : _selectedLevel(eo::progress), _contextLevel(eo::quiet), - _fd(2), - _obuf(_fd, _contextLevel, _selectedLevel) + _obuf(_contextLevel, _selectedLevel) { std::ostream::init(&_obuf); _init(); } - +/* eoLogger::eoLogger(eo::file file) : std::ostream(NULL), @@ -88,11 +94,11 @@ eoLogger::eoLogger(eo::file file) : std::ostream::init(&_obuf); _init(); *this << file; -} +}*/ eoLogger::~eoLogger() { - if (_fd > 2) { ::close(_fd); } + //if (_fd > 2) { ::close(_fd); } } void eoLogger::_createParameters( eoParser& parser ) @@ -112,11 +118,14 @@ void eoLogger::_createParameters( eoParser& parser ) //------------------------------------------------------------------ // we're gonna redirect the log to the given filename if -o is used. //------------------------------------------------------------------ - +/* if ( ! _output.value().empty() ) { eo::log << eo::file( _output.value() ); } +*/ +// TODO with a stream + //------------------------------------------------------------------ @@ -162,12 +171,12 @@ eoLogger& operator<<(eoLogger& l, const eo::Levels lvl) l._contextLevel = lvl; return l; } - +/* eoLogger& operator<<(eoLogger& l, eo::file f) { l._fd = ::open(f._f.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0644); return l; -} +}*/ eoLogger& operator<<(eoLogger& l, eo::setlevel v) { @@ -177,26 +186,35 @@ eoLogger& operator<<(eoLogger& l, eo::setlevel v) eoLogger& operator<<(eoLogger& l, std::ostream& os) { +/* if (l._standard_io_streams.find(&os) != l._standard_io_streams.end()) { l._fd = l._standard_io_streams[&os]; } +*/ + l._obuf.outStream = &os; return l; } -eoLogger::outbuf::outbuf(const int& fd, - const eo::Levels& contexlvl, +void eoLogger::redirectTo(std::ostream& os) +{ + _obuf.outStream = &os; +} + + +eoLogger::outbuf::outbuf(const eo::Levels& contexlvl, const eo::Levels& selectedlvl) - : _fd(fd), _contextLevel(contexlvl), _selectedLevel(selectedlvl) + : outStream(&std::cout), /*ownedFileStream(NULL),*/ _contextLevel(contexlvl), _selectedLevel(selectedlvl) {} int eoLogger::outbuf::overflow(int_type c) { if (_selectedLevel >= _contextLevel) { - if (_fd >= 0 && c != EOF) + if (outStream && c != EOF) { - ::write(_fd, &c, 1); + //::write(_fd, &c, 1); + (*outStream) << (char) c; } } return c; @@ -204,9 +222,9 @@ int eoLogger::outbuf::overflow(int_type c) namespace eo { - file::file(const std::string f) + /*file::file(const std::string f) : _f(f) - {} + {}*/ setlevel::setlevel(const std::string v) : _v(v), _lvl((Levels)-1) diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index 9ac1c2115..99bafa001 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -91,6 +91,7 @@ Caner Candan #include #include #include +#include #include "eoObject.h" #include "eoParser.h" @@ -113,12 +114,12 @@ namespace eo /** * file * this structure combined with the friend operator<< below is an easy way to select a file as output. - */ + * struct file { explicit file(const std::string f); const std::string _f; - }; + };*/ /** * setlevel @@ -146,7 +147,7 @@ public: eoLogger(); //! overidded ctor in order to instanciate a logger with a file define in parameter - eoLogger(eo::file file); + //eoLogger(eo::file file); //! dtor ~eoLogger(); @@ -189,11 +190,12 @@ private: class outbuf : public std::streambuf { public: - outbuf(const int& fd, const eo::Levels& contexlvl, const eo::Levels& selectedlvl); + outbuf(const eo::Levels& contexlvl, const eo::Levels& selectedlvl); + std::ostream * outStream; protected: virtual int overflow(int_type c); private: - const int& _fd; + //std::ofstream * ownedFileStream; const eo::Levels& _contextLevel; const eo::Levels& _selectedLevel; }; @@ -215,7 +217,7 @@ public: * operator<< used there to set a filename through the class file. */ //! in order to use stream style to define a file to dump instead the standart output - friend eoLogger& operator<<(eoLogger&, eo::file); + //friend eoLogger& operator<<(eoLogger&, eo::file); /** * operator<< used there to set a verbose level through the class setlevel. @@ -224,12 +226,21 @@ public: friend eoLogger& operator<<(eoLogger&, eo::setlevel); /** + * DEPRECATED: Use instead the redirectTo method * operator<< used there to be able to use std::cout to say that we wish to redirect back the buffer to a standard output. */ //! in order to use stream style to go back to a standart output defined by STL //! and to get retro-compatibility +#warning deprecated friend eoLogger& operator<<(eoLogger&, std::ostream&); + /** + * Redirects the logger to a given output stream. Closing the stream and returning its memory is at the charge of the caller, + * but should not be done while the log is still redirected to it. + */ + void redirectTo(std::ostream&); + + private: friend void make_verbose(eoParser&); @@ -244,13 +255,7 @@ private: eo::Levels _contextLevel; /** - * _fd in storing the file descriptor at this place we can disable easily the buffer in - * changing the value at -1. It is used by operator <<. - */ - int _fd; - - /** - * _obuf std::ostream mandates to use a buffer. _obuf is a outbuf inheriting of std::streambuf. + * _obuf std::ostream mandates to use a buffer. _obuf is a outbuf inheriting from std::streambuf. */ outbuf _obuf; diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index 198a88720..65f9df603 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -3,6 +3,10 @@ //----------------------------------------------------------------------------- #include +//#include +#include +#include +#include //----------------------------------------------------------------------------- @@ -25,8 +29,24 @@ int main(int ac, char** av) eo::log << "We are writing on the default output stream" << std::endl; - eo::log << eo::file("test.txt") << "In FILE" << std::endl; - eo::log << std::cout << "on COUT" << std::endl; + //eo::log << eo::file("test.txt") << "In FILE" << std::endl; + + std::ofstream ofs("test.txt"); + //eo::log << ofs << "In FILE" << std::endl; + eo::log.redirectTo(ofs); + eo::log << "In FILE" << std::endl; + + std::ostringstream oss; + //eo::log << oss << "In STRINGSTREAM"; + eo::log.redirectTo(oss); + eo::log << oss << "In STRINGSTREAM"; + + //ofs << oss; + std::cout << "Content of ostringstream: " << oss.str() << std::endl; + + //eo::log << std::cout << "on COUT" << std::endl; + eo::log.redirectTo(std::cout); + eo::log << "on COUT" << std::endl; eo::log << eo::setlevel("errors"); eo::log << eo::setlevel(eo::errors); From 002e4a196469f301e0dbb7fa0215ca85f9da88a5 Mon Sep 17 00:00:00 2001 From: Lionel Parreaux Date: Mon, 6 May 2013 17:33:36 +0200 Subject: [PATCH 02/28] added possibility to open files and close them automatically --- eo/src/utils/eoLogger.cpp | 87 ++++++++++++++++----------------------- eo/src/utils/eoLogger.h | 18 ++++---- eo/test/t-eoLogger.cpp | 11 +++-- 3 files changed, 52 insertions(+), 64 deletions(-) diff --git a/eo/src/utils/eoLogger.cpp b/eo/src/utils/eoLogger.cpp index 3a9b20098..79813137c 100644 --- a/eo/src/utils/eoLogger.cpp +++ b/eo/src/utils/eoLogger.cpp @@ -47,9 +47,6 @@ Caner Candan void eoLogger::_init() { - _standard_io_streams[&std::cout] = 1; - _standard_io_streams[&std::clog] = 2; - _standard_io_streams[&std::cerr] = 2; // /!\ If you want to add a level dont forget to add it at the header file in the enumerator Levels @@ -61,7 +58,6 @@ void eoLogger::_init() addLevel("debug", eo::debug); addLevel("xdebug", eo::xdebug); - //outStream = &std::cout; } eoLogger::eoLogger() : @@ -78,27 +74,13 @@ eoLogger::eoLogger() : std::ostream::init(&_obuf); _init(); } -/* -eoLogger::eoLogger(eo::file file) : - std::ostream(NULL), - - _verbose("quiet", "verbose", "Set the verbose level", 'v'), - _printVerboseLevels(false, "print-verbose-levels", "Print verbose levels", 'l'), - _output("", "output", "Redirect a standard output to a file", 'o'), - - _selectedLevel(eo::progress), - _contextLevel(eo::quiet), - _fd(2), - _obuf(_fd, _contextLevel, _selectedLevel) -{ - std::ostream::init(&_obuf); - _init(); - *this << file; -}*/ eoLogger::~eoLogger() { - //if (_fd > 2) { ::close(_fd); } + //redirect(NULL); + if (_obuf._ownedFileStream != NULL) { + delete _obuf._ownedFileStream; + } } void eoLogger::_createParameters( eoParser& parser ) @@ -116,22 +98,21 @@ void eoLogger::_createParameters( eoParser& parser ) //------------------------------------------------------------------ - // we're gonna redirect the log to the given filename if -o is used. + // we redirect the log to the given filename if -o is used. //------------------------------------------------------------------ -/* + if ( ! _output.value().empty() ) { - eo::log << eo::file( _output.value() ); + redirect(_output.value()); } -*/ -// TODO with a stream + //------------------------------------------------------------------ //------------------------------------------------------------------ - // we're gonna print the list of levels if -l parameter is used. + // we print the list of levels if -l parameter is used. //------------------------------------------------------------------ if ( _printVerboseLevels.value() ) @@ -171,12 +152,6 @@ eoLogger& operator<<(eoLogger& l, const eo::Levels lvl) l._contextLevel = lvl; return l; } -/* -eoLogger& operator<<(eoLogger& l, eo::file f) -{ - l._fd = ::open(f._f.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0644); - return l; -}*/ eoLogger& operator<<(eoLogger& l, eo::setlevel v) { @@ -186,35 +161,49 @@ eoLogger& operator<<(eoLogger& l, eo::setlevel v) eoLogger& operator<<(eoLogger& l, std::ostream& os) { -/* - if (l._standard_io_streams.find(&os) != l._standard_io_streams.end()) - { - l._fd = l._standard_io_streams[&os]; - } -*/ - l._obuf.outStream = &os; + l._obuf._outStream = &os; return l; } -void eoLogger::redirectTo(std::ostream& os) +void eoLogger::redirect(std::ostream& os) { - _obuf.outStream = &os; + if (_obuf._ownedFileStream != NULL) { + delete _obuf._ownedFileStream; + _obuf._ownedFileStream = NULL; + } + _obuf._outStream = &os; +} + +void eoLogger::redirect(const char * filename) +{ + std::ofstream * os; + if (filename == NULL) { + os = NULL; + } else { + os = new std::ofstream(filename); + } + redirect(*os); + _obuf._ownedFileStream = os; +} + +void eoLogger::redirect(const std::string& filename) +{ + redirect(filename.c_str()); } eoLogger::outbuf::outbuf(const eo::Levels& contexlvl, const eo::Levels& selectedlvl) - : outStream(&std::cout), /*ownedFileStream(NULL),*/ _contextLevel(contexlvl), _selectedLevel(selectedlvl) + : _outStream(&std::cout), _ownedFileStream(NULL), _contextLevel(contexlvl), _selectedLevel(selectedlvl) {} int eoLogger::outbuf::overflow(int_type c) { if (_selectedLevel >= _contextLevel) { - if (outStream && c != EOF) + if (_outStream && c != EOF) { - //::write(_fd, &c, 1); - (*outStream) << (char) c; + (*_outStream) << (char) c; } } return c; @@ -222,10 +211,6 @@ int eoLogger::outbuf::overflow(int_type c) namespace eo { - /*file::file(const std::string f) - : _f(f) - {}*/ - setlevel::setlevel(const std::string v) : _v(v), _lvl((Levels)-1) {} diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index 99bafa001..e655848c7 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -191,11 +191,11 @@ private: { public: outbuf(const eo::Levels& contexlvl, const eo::Levels& selectedlvl); - std::ostream * outStream; + std::ostream * _outStream; + std::ofstream * _ownedFileStream; protected: virtual int overflow(int_type c); private: - //std::ofstream * ownedFileStream; const eo::Levels& _contextLevel; const eo::Levels& _selectedLevel; }; @@ -213,12 +213,6 @@ public: //! in order to use stream style to define the context verbose level where the following logs will be saved friend eoLogger& operator<<(eoLogger&, const eo::Levels); - /** - * operator<< used there to set a filename through the class file. - */ - //! in order to use stream style to define a file to dump instead the standart output - //friend eoLogger& operator<<(eoLogger&, eo::file); - /** * operator<< used there to set a verbose level through the class setlevel. */ @@ -238,8 +232,14 @@ public: * Redirects the logger to a given output stream. Closing the stream and returning its memory is at the charge of the caller, * but should not be done while the log is still redirected to it. */ - void redirectTo(std::ostream&); + void redirect(std::ostream&); + /** + * Redirects the logger to a file using a filename. + * Closing the file will be done automatically when the logger is redirected again or destroyed. + */ + void redirect(const char * filename); + void redirect(const std::string& filename); private: friend void make_verbose(eoParser&); diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index 65f9df603..a1ea4b60c 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -31,21 +31,24 @@ int main(int ac, char** av) //eo::log << eo::file("test.txt") << "In FILE" << std::endl; - std::ofstream ofs("test.txt"); + std::ofstream ofs("logtest.txt"); //eo::log << ofs << "In FILE" << std::endl; - eo::log.redirectTo(ofs); + eo::log.redirect(ofs); eo::log << "In FILE" << std::endl; + + eo::log.redirect("logtest2.txt"); + eo::log << "In FILE 2" << std::endl; std::ostringstream oss; //eo::log << oss << "In STRINGSTREAM"; - eo::log.redirectTo(oss); + eo::log.redirect(oss); eo::log << oss << "In STRINGSTREAM"; //ofs << oss; std::cout << "Content of ostringstream: " << oss.str() << std::endl; //eo::log << std::cout << "on COUT" << std::endl; - eo::log.redirectTo(std::cout); + eo::log.redirect(std::cout); eo::log << "on COUT" << std::endl; eo::log << eo::setlevel("errors"); From 1c8ff46848dd9856eab6c43419a885ec3404c188 Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 5 Jun 2013 15:46:33 +0200 Subject: [PATCH 03/28] cooling schedule changes --- mo/src/coolingSchedule/moCoolingSchedule.h | 3 +- .../moDynSpanCoolingSchedule.h | 39 ++++++++++--------- .../coolingSchedule/moSimpleCoolingSchedule.h | 6 ++- mo/src/explorer/moSAexplorer.h | 2 +- mo/test/t-moDynSpanCoolingSchedule.cpp | 18 ++++----- mo/test/t-moSimpleCoolingSchedule.cpp | 18 ++++----- 6 files changed, 45 insertions(+), 41 deletions(-) diff --git a/mo/src/coolingSchedule/moCoolingSchedule.h b/mo/src/coolingSchedule/moCoolingSchedule.h index 9b65cf1b5..b9863b02f 100644 --- a/mo/src/coolingSchedule/moCoolingSchedule.h +++ b/mo/src/coolingSchedule/moCoolingSchedule.h @@ -55,8 +55,9 @@ public: * update the temperature * @param _temp current temperature to update * @param _acceptedMove true when the move is accepted, false otherwise + * @param _currentSolution the current solution */ - virtual void update(double& _temp, bool _acceptedMove) = 0; + virtual void update(double& _temp, bool _acceptedMove, EOT & _currentSolution) = 0; }; diff --git a/mo/src/coolingSchedule/moDynSpanCoolingSchedule.h b/mo/src/coolingSchedule/moDynSpanCoolingSchedule.h index 34b386312..4e6216ad5 100644 --- a/mo/src/coolingSchedule/moDynSpanCoolingSchedule.h +++ b/mo/src/coolingSchedule/moDynSpanCoolingSchedule.h @@ -80,26 +80,27 @@ public: * update the temperature by a factor * @param _temp current temperature to update * @param _acceptedMove true when the move is accepted, false otherwise + * @param _currentSolution the current solution */ - virtual void update(double& _temp, bool _acceptedMove) { - spanTries++; - - if (_acceptedMove) - spanMove++; - - if (spanTries >= spanTriesMax || spanMove >= spanMoveMax) { - _temp *= alpha; - - if (spanMove == 0) // no move during this span ? - nbSpan++; - else - nbSpan = 0; - - spanTries = 0; - spanMove = 0; - } - } - + virtual void update(double& _temp, bool _acceptedMove, EOT & _currentSolution) { + spanTries++; + + if (_acceptedMove) + spanMove++; + + if (spanTries >= spanTriesMax || spanMove >= spanMoveMax) { + _temp *= alpha; + + if (spanMove == 0) // no move during this span ? + nbSpan++; + else + nbSpan = 0; + + spanTries = 0; + spanMove = 0; + } + } + /** * compare the number of span with no move * @param _temp current temperature diff --git a/mo/src/coolingSchedule/moSimpleCoolingSchedule.h b/mo/src/coolingSchedule/moSimpleCoolingSchedule.h index 5ff4f4920..aa8f1138f 100644 --- a/mo/src/coolingSchedule/moSimpleCoolingSchedule.h +++ b/mo/src/coolingSchedule/moSimpleCoolingSchedule.h @@ -52,7 +52,8 @@ public: * @param _span number of iteration with equal temperature * @param _finalT final temperature, threshold of the stopping criteria */ - moSimpleCoolingSchedule(double _initT, double _alpha, unsigned _span, double _finalT) : initT(_initT), alpha(_alpha), span(_span), finalT(_finalT) {} + moSimpleCoolingSchedule(double _initT, double _alpha, unsigned _span, double _finalT) + : initT(_initT), alpha(_alpha), span(_span), finalT(_finalT) {} /** * Getter on the initial temperature @@ -70,8 +71,9 @@ public: * update the temperature by a factor * @param _temp current temperature to update * @param _acceptedMove true when the move is accepted, false otherwise + * @param _currentSolution the current solution */ - virtual void update(double& _temp, bool _acceptedMove) { + virtual void update(double& _temp, bool _acceptedMove, EOT & _currentSolution) { if (step >= span) { _temp *= alpha; step = 0; diff --git a/mo/src/explorer/moSAexplorer.h b/mo/src/explorer/moSAexplorer.h index 3d9f477ee..37fa57955 100644 --- a/mo/src/explorer/moSAexplorer.h +++ b/mo/src/explorer/moSAexplorer.h @@ -96,7 +96,7 @@ public: * @param _solution unused solution */ virtual void updateParam(EOT & _solution) { - coolingSchedule.update(temperature, this->moveApplied()); + coolingSchedule.update(temperature, this->moveApplied(), _solution); }; /** diff --git a/mo/test/t-moDynSpanCoolingSchedule.cpp b/mo/test/t-moDynSpanCoolingSchedule.cpp index 7bef4ad59..da67008ea 100755 --- a/mo/test/t-moDynSpanCoolingSchedule.cpp +++ b/mo/test/t-moDynSpanCoolingSchedule.cpp @@ -48,38 +48,38 @@ int main() { assert(temperature == 100); //temperature must not changed 2* - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 100); assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 100); assert(test(temperature)); //then temperature must be /10 - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 10); assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 10); assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 10); assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 1); std::cout << "\n"; assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); std::cout << "\n"; assert(temperature == 1); assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); std::cout << "\n"; assert(temperature == 1); assert(test(temperature)); - test.update(temperature, 0); + test.update(temperature, 0, sol); assert(temperature == 0.1); assert(!test(temperature)); diff --git a/mo/test/t-moSimpleCoolingSchedule.cpp b/mo/test/t-moSimpleCoolingSchedule.cpp index b2f8cca17..dc78c6870 100644 --- a/mo/test/t-moSimpleCoolingSchedule.cpp +++ b/mo/test/t-moSimpleCoolingSchedule.cpp @@ -48,38 +48,38 @@ int main() { assert(temperature==100); //temperature must not changed 2* - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature==100); assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature==100); assert(test(temperature)); //then temperature must be /10 - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature==10); assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature==10); assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature==10); assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature == 1); std::cout<< "\n"; assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); std::cout<< "\n"; assert(temperature==1); assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); std::cout<< "\n"; assert(temperature==1); assert(test(temperature)); - test.update(temperature,0); + test.update(temperature,0,sol); assert(temperature==0.1); assert(!test(temperature)); From b66c38ce2cb39933db411c7cdf543e358008a5d3 Mon Sep 17 00:00:00 2001 From: LPTK Date: Mon, 10 Jun 2013 18:34:57 +0200 Subject: [PATCH 04/28] minor fixes --- eo/src/utils/eoLogger.cpp | 4 +-- eo/src/utils/eoLogger.h | 57 +++------------------------------------ eo/test/t-eoLogger.cpp | 6 ----- 3 files changed, 6 insertions(+), 61 deletions(-) diff --git a/eo/src/utils/eoLogger.cpp b/eo/src/utils/eoLogger.cpp index 79813137c..cd80ba67e 100644 --- a/eo/src/utils/eoLogger.cpp +++ b/eo/src/utils/eoLogger.cpp @@ -41,8 +41,8 @@ Caner Candan #include "eoLogger.h" /* TODO? -- changer oprateurs -- virer la structure "file" +add a possibility to redirect to several streams +add_redirect/remove_redirect */ void eoLogger::_init() diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index e655848c7..6c2599eb6 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -30,56 +30,7 @@ Caner Candan Global logger for EO. - Here's an example explaning how to use eoLogger: -\code - #include - - int main(int ac, char** av) - { - // We are declaring the usual eoParser class - eoParser parser(ac, av); - - // This call is important to allow -v parameter to change user level. - make_verbose(parser); - - // At this time we are switching to warning message and messages - // which are going to follow it are going to be warnings message too. - // These messages can be displayed only if the user level (sets with - // eo::setlevel function) is set to eo::warnings. - eo::log << eo::warnings; - - // With the following eo::file function we are defining that - // all future logs are going to this new file resource which is - // test.txt - eo::log << eo::file("test.txt") << "In FILE" << std::endl; - - // Now we are changing again the resources destination to cout which - // is the standard output. - eo::log << std::cout << "In COUT" << std::endl; - - // Here are 2 differents examples of how to set the errors user level - // in using either a string or an identifier. - eo::log << eo::setlevel("errors"); - eo::log << eo::setlevel(eo::errors); - - // Now we are writting a message, that will be displayed only if we are above the "quiet" level - eo::log << eo::quiet << "1) Must be in quiet mode to see that" << std::endl; - - // And so on... - eo::log << eo::setlevel(eo::warnings) << eo::warnings << "2) Must be in warnings mode to see that" << std::endl; - - eo::log << eo::setlevel(eo::logging); - - eo::log << eo::errors; - eo::log << "3) Must be in errors mode to see that"; - eo::log << std::endl; - - eo::log << eo::debug << 4 << ')' - << " Must be in debug mode to see that\n"; - - return 0; - } -\endcode + For an example explaning of how to use eoLogger, see paradiseo/eo/test/t-eoLogger.cpp @{ */ @@ -220,7 +171,7 @@ public: friend eoLogger& operator<<(eoLogger&, eo::setlevel); /** - * DEPRECATED: Use instead the redirectTo method + * DEPRECATED: Use instead the redirect method * operator<< used there to be able to use std::cout to say that we wish to redirect back the buffer to a standard output. */ //! in order to use stream style to go back to a standart output defined by STL @@ -230,7 +181,7 @@ public: /** * Redirects the logger to a given output stream. Closing the stream and returning its memory is at the charge of the caller, - * but should not be done while the log is still redirected to it. + * but should not be done while the logger is still redirected to it. */ void redirect(std::ostream&); @@ -249,7 +200,7 @@ private: eoValueParam _output; /** - * _selectedLevel is the member storing verbose level setted by the user thanks to operator() + * _selectedLevel is the member storing verbose level set by the user thanks to operator() */ eo::Levels _selectedLevel; eo::Levels _contextLevel; diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index a1ea4b60c..67a06c8e3 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -29,10 +29,7 @@ int main(int ac, char** av) eo::log << "We are writing on the default output stream" << std::endl; - //eo::log << eo::file("test.txt") << "In FILE" << std::endl; - std::ofstream ofs("logtest.txt"); - //eo::log << ofs << "In FILE" << std::endl; eo::log.redirect(ofs); eo::log << "In FILE" << std::endl; @@ -40,14 +37,11 @@ int main(int ac, char** av) eo::log << "In FILE 2" << std::endl; std::ostringstream oss; - //eo::log << oss << "In STRINGSTREAM"; eo::log.redirect(oss); eo::log << oss << "In STRINGSTREAM"; - //ofs << oss; std::cout << "Content of ostringstream: " << oss.str() << std::endl; - //eo::log << std::cout << "on COUT" << std::endl; eo::log.redirect(std::cout); eo::log << "on COUT" << std::endl; From de9af0ba21e221ca096520754b124b6acc6b6477 Mon Sep 17 00:00:00 2001 From: LPTK Date: Tue, 11 Jun 2013 14:08:06 +0200 Subject: [PATCH 05/28] new logger interface --- eo/src/utils/eoLogger.h | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index 6c2599eb6..97cc73467 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -30,7 +30,7 @@ Caner Candan Global logger for EO. - For an example explaning of how to use eoLogger, see paradiseo/eo/test/t-eoLogger.cpp + For an example explaning how to use eoLogger, please refer to paradiseo/eo/test/t-eoLogger.cpp @{ */ @@ -171,7 +171,7 @@ public: friend eoLogger& operator<<(eoLogger&, eo::setlevel); /** - * DEPRECATED: Use instead the redirect method + * DEPRECATED: Use instead the redirectTo method * operator<< used there to be able to use std::cout to say that we wish to redirect back the buffer to a standard output. */ //! in order to use stream style to go back to a standart output defined by STL @@ -180,11 +180,27 @@ public: friend eoLogger& operator<<(eoLogger&, std::ostream&); /** - * Redirects the logger to a given output stream. Closing the stream and returning its memory is at the charge of the caller, - * but should not be done while the logger is still redirected to it. + * Redirects the logger to a given output stream. + * Closing the stream and returning its memory is at the charge of the caller, + * but should not be done while the log is still redirected to it. + * This resets all previous redirections set up with redirect and add_redirect. */ void redirect(std::ostream&); + /** + * Adds a redirection from the logger to a given output stream. + * Closing the stream and returning its memory is at the charge of the caller, + * but should not be done while the log is still redirected to it. + * This does not reset previous redirections, which remain active. + */ + void addRedirect(std::ostream&); + + /** + * Removes a redirection from the logger to the given output stream. + * This only resets the redirection to the stream passed in argument. + */ + void removeRedirect(std::ostream&); + /** * Redirects the logger to a file using a filename. * Closing the file will be done automatically when the logger is redirected again or destroyed. @@ -200,7 +216,7 @@ private: eoValueParam _output; /** - * _selectedLevel is the member storing verbose level set by the user thanks to operator() + * _selectedLevel is the member storing verbose level setted by the user thanks to operator() */ eo::Levels _selectedLevel; eo::Levels _contextLevel; From b30a15b746047fe6789ca32ff406a4598656a971 Mon Sep 17 00:00:00 2001 From: LPTK Date: Tue, 11 Jun 2013 16:04:42 +0200 Subject: [PATCH 06/28] logger tests with assertions --- eo/test/t-eoLogger.cpp | 46 +++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index 67a06c8e3..355870671 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -7,6 +7,9 @@ #include #include #include +#include + +// TODO test multiple redirection //----------------------------------------------------------------------------- @@ -15,10 +18,10 @@ int main(int ac, char** av) eoParser parser(ac, av); if (parser.userNeedsHelp()) - { - parser.printHelp(std::cout); - exit(1); - } + { + parser.printHelp(std::cout); + exit(1); + } make_help(parser); make_verbose(parser); @@ -29,18 +32,37 @@ int main(int ac, char** av) eo::log << "We are writing on the default output stream" << std::endl; - std::ofstream ofs("logtest.txt"); - eo::log.redirect(ofs); - eo::log << "In FILE" << std::endl; - - eo::log.redirect("logtest2.txt"); - eo::log << "In FILE 2" << std::endl; + { + std::ofstream ofs("logtest.txt"); + eo::log.redirect(ofs); + eo::log << "In FILE" << std::endl; + eo::log.redirect("logtest2.txt"); + eo::log << "In FILE 2" << std::endl; + } + + std::ifstream ifs("logtest.txt"); + //ifs >> str; + std::string line; + assert(std::getline(ifs, line)); + assert(line == "In FILE"); + //std::cout << (line == "In FILE") << std::endl; + assert(!std::getline(ifs, line)); std::ostringstream oss; eo::log.redirect(oss); - eo::log << oss << "In STRINGSTREAM"; + //eo::log << oss << "In STRINGSTREAM"; + eo::log << "In STRINGSTREAM"; std::cout << "Content of ostringstream: " << oss.str() << std::endl; + assert(oss.str() == "In STRINGSTREAM"); + + ifs.close(); + ifs.open("logtest2.txt"); + assert(std::getline(ifs, line)); + assert(line == "In FILE 2"); + assert(!std::getline(ifs, line)); + //assert(false); + eo::log.redirect(std::cout); eo::log << "on COUT" << std::endl; @@ -59,7 +81,7 @@ int main(int ac, char** av) eo::log << std::endl; eo::log << eo::debug << 4 << ')' - << "4) in debug mode\n"; + << "4) in debug mode\n"; return 0; } From 11c32bb5f1388081b715c13a31c666f0802d99ce Mon Sep 17 00:00:00 2001 From: LPTK Date: Tue, 11 Jun 2013 17:01:52 +0200 Subject: [PATCH 07/28] performance tests map/vector --- eo/src/utils/eoLogger.cpp | 143 ++++++++++++++++++++++++++++++-------- eo/src/utils/eoLogger.h | 30 ++++++-- eo/test/t-eoLogger.cpp | 53 +++++++++++--- 3 files changed, 182 insertions(+), 44 deletions(-) diff --git a/eo/src/utils/eoLogger.cpp b/eo/src/utils/eoLogger.cpp index cd80ba67e..8a2c37831 100644 --- a/eo/src/utils/eoLogger.cpp +++ b/eo/src/utils/eoLogger.cpp @@ -37,6 +37,7 @@ Caner Candan #include // used to define EOF #include +#include // std::find #include "eoLogger.h" @@ -45,6 +46,13 @@ add a possibility to redirect to several streams add_redirect/remove_redirect */ +#ifdef USE_SET +typedef std::set::iterator StreamIter; +#else +typedef std::vector::iterator StreamIter; +#endif + + void eoLogger::_init() { @@ -61,7 +69,7 @@ void eoLogger::_init() } eoLogger::eoLogger() : - std::ostream(NULL), + std::ostream(NULL), _verbose("quiet", "verbose", "Set the verbose level", 'v'), _printVerboseLevels(false, "print-verbose-levels", "Print verbose levels", 'l'), @@ -71,16 +79,16 @@ eoLogger::eoLogger() : _contextLevel(eo::quiet), _obuf(_contextLevel, _selectedLevel) { - std::ostream::init(&_obuf); + std::ostream::init(&_obuf); _init(); } eoLogger::~eoLogger() { - //redirect(NULL); - if (_obuf._ownedFileStream != NULL) { - delete _obuf._ownedFileStream; - } + //redirect(NULL); + if (_obuf._ownedFileStream != NULL) { + delete _obuf._ownedFileStream; + } } void eoLogger::_createParameters( eoParser& parser ) @@ -161,29 +169,97 @@ eoLogger& operator<<(eoLogger& l, eo::setlevel v) eoLogger& operator<<(eoLogger& l, std::ostream& os) { - l._obuf._outStream = &os; +#warning deprecated + l.addRedirect(os); return l; } void eoLogger::redirect(std::ostream& os) { - if (_obuf._ownedFileStream != NULL) { - delete _obuf._ownedFileStream; - _obuf._ownedFileStream = NULL; - } - _obuf._outStream = &os; + doRedirect(&os); +} + +void eoLogger::doRedirect(std::ostream* os) +{ + if (_obuf._ownedFileStream != NULL) { + delete _obuf._ownedFileStream; + _obuf._ownedFileStream = NULL; + } + _obuf._outStreams.clear(); + if (os != NULL) + //_obuf._outStreams.push_back(os); + #ifdef USE_SET + _obuf._outStreams.insert(os); + #else + _obuf._outStreams.push_back(os); + #endif +} + +void eoLogger::addRedirect(std::ostream& os) +{ + /* + if (tryRemoveRedirect(&os)) + //throw eoWrongParamTypeException("Cannot redirect the logger to a stream it is already redirected to"); + //eo::log << eo::warnings << "Cannot redirect the logger to a stream it is already redirected to."; + { eo::log << eo::warnings << "Cannot redirect the logger to a stream it is already redirected to."; std::cout << "OK!!!" << std::endl; }*/ + bool already_there = tryRemoveRedirect(&os); + //_obuf._outStreams.push_back(&os); +#ifdef USE_SET + _obuf._outStreams.insert(&os); +#else + _obuf._outStreams.push_back(&os); +#endif + if (already_there) + eo::log << eo::warnings << "Cannot redirect the logger to a stream it is already redirected to." << std::endl; +} + +void eoLogger::removeRedirect(std::ostream& os) +{ + if (!tryRemoveRedirect(&os)) + //throw eoWrongParamTypeException("Cannot remove from the logger a stream it was not redirected to"); + //throw eoWrongParamTypeException(std::string("Cannot remove from the logger a stream it was not redirected to")); + eo::log << eo::warnings << "Cannot remove from the logger a stream it was not redirected to."; +} + +bool eoLogger::tryRemoveRedirect(std::ostream* os) +{ + /* + std::vector::iterator it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); + //std::cout << _obuf._outStreams.size() << " " << (void*)&*_obuf._outStreams.begin() << " " << (void*)&*_obuf._outStreams.end() << std::endl; + //std::cout << "it: " << (void*)&*it << " " << (void*)os << std::endl; + if (it == _obuf._outStreams.end()) + return false; + _obuf._outStreams.erase(it); + return true;*/ + /* +#ifdef USE_SET + std::set::iterator it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); + if (it == _obuf._outStreams.end()) + return false; + _obuf._outStreams.erase(it); +#else + std::vector::iterator it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); + if (it == _obuf._outStreams.end()) + return false; + _obuf._outStreams.erase(it); +#endif*/ + StreamIter it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); + if (it == _obuf._outStreams.end()) + return false; + _obuf._outStreams.erase(it); + return true; } void eoLogger::redirect(const char * filename) { - std::ofstream * os; - if (filename == NULL) { - os = NULL; - } else { - os = new std::ofstream(filename); - } - redirect(*os); - _obuf._ownedFileStream = os; + std::ofstream * os; + if (filename == NULL) { + os = NULL; + } else { + os = new std::ofstream(filename); + } + doRedirect(os); + _obuf._ownedFileStream = os; } void eoLogger::redirect(const std::string& filename) @@ -194,18 +270,29 @@ void eoLogger::redirect(const std::string& filename) eoLogger::outbuf::outbuf(const eo::Levels& contexlvl, const eo::Levels& selectedlvl) - : _outStream(&std::cout), _ownedFileStream(NULL), _contextLevel(contexlvl), _selectedLevel(selectedlvl) -{} + : +#ifndef USE_SET + _outStreams(1, &std::cout), +#endif + _ownedFileStream(NULL), _contextLevel(contexlvl), _selectedLevel(selectedlvl) +{ +#ifdef USE_SET + _outStreams.insert(&std::cout); +#endif +} int eoLogger::outbuf::overflow(int_type c) { if (_selectedLevel >= _contextLevel) - { - if (_outStream && c != EOF) - { - (*_outStream) << (char) c; - } - } + { + for (StreamIter it = _outStreams.begin(); it != _outStreams.end(); it++) + { + if (c != EOF) + { + (**it) << (char) c; + } + } + } return c; } diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index 97cc73467..81ce0da8e 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -1,6 +1,7 @@ // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- /* + (c) Thales group, 2010 This library is free software; you can redistribute it and/or @@ -47,6 +48,14 @@ Caner Candan #include "eoObject.h" #include "eoParser.h" +#define USE_SET +#undef USE_SET + +#ifdef USE_SET +#include +#endif + + namespace eo { /** @@ -133,6 +142,12 @@ private: //! used by the set of ctors to initiate some useful variables void _init(); + //! helper function regrouping redirection operations; takes a pointer because can be given NULL + void doRedirect(std::ostream*); + + //! helper function searching for a stream and removing it, returning true if successful, false otherwise + bool tryRemoveRedirect(std::ostream*); + private: /** * outbuf @@ -142,7 +157,14 @@ private: { public: outbuf(const eo::Levels& contexlvl, const eo::Levels& selectedlvl); - std::ostream * _outStream; + //std::ostream * _outStream; + + #ifdef USE_SET + std::set _outStreams; + #else + std::vector _outStreams; + #endif + std::ofstream * _ownedFileStream; protected: virtual int overflow(int_type c); @@ -171,12 +193,8 @@ public: friend eoLogger& operator<<(eoLogger&, eo::setlevel); /** - * DEPRECATED: Use instead the redirectTo method - * operator<< used there to be able to use std::cout to say that we wish to redirect back the buffer to a standard output. + * DEPRECATED: Use instead the redirect or addRedirect method; has the same effect as addRedirect */ - //! in order to use stream style to go back to a standart output defined by STL - //! and to get retro-compatibility -#warning deprecated friend eoLogger& operator<<(eoLogger&, std::ostream&); /** diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index 355870671..f030c2de3 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -13,6 +13,19 @@ //----------------------------------------------------------------------------- +static void test(); + +static void test2() +{ + #define NB 100 + std::ostream* os = (std::ostream*) 1; + eo::log.redirect(*os); + for (int i = 0; i < NB; i++) + eo::log.addRedirect(*(++os)); + for (int i = 0; i < NB; i++) + eo::log.removeRedirect(*(os--)); +} + int main(int ac, char** av) { eoParser parser(ac, av); @@ -26,6 +39,15 @@ int main(int ac, char** av) make_help(parser); make_verbose(parser); + for (int i = 0; i < 10000; i++) + //test(); + test2(); + + return 0; +} + +static void test() +{ eo::log << eo::setlevel(eo::debug); eo::log << eo::warnings; @@ -33,40 +55,52 @@ int main(int ac, char** av) eo::log << "We are writing on the default output stream" << std::endl; { - std::ofstream ofs("logtest.txt"); + /*std::ofstream ofs("logtest.txt"); eo::log.redirect(ofs); eo::log << "In FILE" << std::endl; eo::log.redirect("logtest2.txt"); + eo::log << "In FILE 2" << std::endl;*/ + eo::log.redirect("logtest.txt"); + eo::log << "In FILE" << std::endl; + std::ofstream ofs("logtest2.txt"); + eo::log.addRedirect(ofs); eo::log << "In FILE 2" << std::endl; + eo::log.removeRedirect(ofs); } - std::ifstream ifs("logtest.txt"); + std::ifstream ifs("logtest2.txt"); //ifs >> str; std::string line; assert(std::getline(ifs, line)); - assert(line == "In FILE"); + //std::cout << line << std::endl; + assert(line == "In FILE 2"); //std::cout << (line == "In FILE") << std::endl; assert(!std::getline(ifs, line)); std::ostringstream oss; - eo::log.redirect(oss); + eo::log.addRedirect(oss); //eo::log << oss << "In STRINGSTREAM"; eo::log << "In STRINGSTREAM"; std::cout << "Content of ostringstream: " << oss.str() << std::endl; assert(oss.str() == "In STRINGSTREAM"); + eo::log.redirect(std::cout); + eo::log << "on COUT" << std::endl; + + ifs.close(); - ifs.open("logtest2.txt"); + ifs.open("logtest.txt"); + assert(std::getline(ifs, line)); + assert(line == "In FILE"); assert(std::getline(ifs, line)); assert(line == "In FILE 2"); + assert(std::getline(ifs, line)); + assert(line == "In STRINGSTREAM"); assert(!std::getline(ifs, line)); //assert(false); - eo::log.redirect(std::cout); - eo::log << "on COUT" << std::endl; - eo::log << eo::setlevel("errors"); eo::log << eo::setlevel(eo::errors); @@ -82,8 +116,7 @@ int main(int ac, char** av) eo::log << eo::debug << 4 << ')' << "4) in debug mode\n"; - - return 0; + } //----------------------------------------------------------------------------- From 9fc61f5a3b3c7f8515d2c20de3b8980f073e9007 Mon Sep 17 00:00:00 2001 From: LPTK Date: Tue, 11 Jun 2013 17:11:20 +0200 Subject: [PATCH 08/28] performance tests adjusted --- eo/src/utils/eoLogger.h | 2 +- eo/test/t-eoLogger.cpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index 81ce0da8e..e5fd34b34 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -49,7 +49,7 @@ Caner Candan #include "eoParser.h" #define USE_SET -#undef USE_SET +//#undef USE_SET #ifdef USE_SET #include diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index f030c2de3..431920ebe 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -22,8 +22,12 @@ static void test2() eo::log.redirect(*os); for (int i = 0; i < NB; i++) eo::log.addRedirect(*(++os)); + /* for (int i = 0; i < NB; i++) - eo::log.removeRedirect(*(os--)); + eo::log.removeRedirect(*(os--));*/ + os = (std::ostream*) 1; + for (int i = 0; i < NB; i++) + eo::log.removeRedirect(*(++os)); } int main(int ac, char** av) From a0464934cbe6810d0e73273b1fdda0344c07ca89 Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 11:58:38 +0200 Subject: [PATCH 09/28] cleaning & doc --- eo/src/utils/eoLogger.cpp | 34 ---------------------------------- eo/src/utils/eoLogger.h | 18 ++++++------------ eo/test/t-eoLogger.cpp | 39 +++++---------------------------------- 3 files changed, 11 insertions(+), 80 deletions(-) diff --git a/eo/src/utils/eoLogger.cpp b/eo/src/utils/eoLogger.cpp index 8a2c37831..10371b0a0 100644 --- a/eo/src/utils/eoLogger.cpp +++ b/eo/src/utils/eoLogger.cpp @@ -41,10 +41,6 @@ Caner Candan #include "eoLogger.h" -/* TODO? -add a possibility to redirect to several streams -add_redirect/remove_redirect -*/ #ifdef USE_SET typedef std::set::iterator StreamIter; @@ -85,7 +81,6 @@ eoLogger::eoLogger() : eoLogger::~eoLogger() { - //redirect(NULL); if (_obuf._ownedFileStream != NULL) { delete _obuf._ownedFileStream; } @@ -187,7 +182,6 @@ void eoLogger::doRedirect(std::ostream* os) } _obuf._outStreams.clear(); if (os != NULL) - //_obuf._outStreams.push_back(os); #ifdef USE_SET _obuf._outStreams.insert(os); #else @@ -197,13 +191,7 @@ void eoLogger::doRedirect(std::ostream* os) void eoLogger::addRedirect(std::ostream& os) { - /* - if (tryRemoveRedirect(&os)) - //throw eoWrongParamTypeException("Cannot redirect the logger to a stream it is already redirected to"); - //eo::log << eo::warnings << "Cannot redirect the logger to a stream it is already redirected to."; - { eo::log << eo::warnings << "Cannot redirect the logger to a stream it is already redirected to."; std::cout << "OK!!!" << std::endl; }*/ bool already_there = tryRemoveRedirect(&os); - //_obuf._outStreams.push_back(&os); #ifdef USE_SET _obuf._outStreams.insert(&os); #else @@ -216,33 +204,11 @@ void eoLogger::addRedirect(std::ostream& os) void eoLogger::removeRedirect(std::ostream& os) { if (!tryRemoveRedirect(&os)) - //throw eoWrongParamTypeException("Cannot remove from the logger a stream it was not redirected to"); - //throw eoWrongParamTypeException(std::string("Cannot remove from the logger a stream it was not redirected to")); eo::log << eo::warnings << "Cannot remove from the logger a stream it was not redirected to."; } bool eoLogger::tryRemoveRedirect(std::ostream* os) { - /* - std::vector::iterator it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); - //std::cout << _obuf._outStreams.size() << " " << (void*)&*_obuf._outStreams.begin() << " " << (void*)&*_obuf._outStreams.end() << std::endl; - //std::cout << "it: " << (void*)&*it << " " << (void*)os << std::endl; - if (it == _obuf._outStreams.end()) - return false; - _obuf._outStreams.erase(it); - return true;*/ - /* -#ifdef USE_SET - std::set::iterator it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); - if (it == _obuf._outStreams.end()) - return false; - _obuf._outStreams.erase(it); -#else - std::vector::iterator it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); - if (it == _obuf._outStreams.end()) - return false; - _obuf._outStreams.erase(it); -#endif*/ StreamIter it = find(_obuf._outStreams.begin(), _obuf._outStreams.end(), os); if (it == _obuf._outStreams.end()) return false; diff --git a/eo/src/utils/eoLogger.h b/eo/src/utils/eoLogger.h index e5fd34b34..98ba09660 100644 --- a/eo/src/utils/eoLogger.h +++ b/eo/src/utils/eoLogger.h @@ -48,8 +48,12 @@ Caner Candan #include "eoObject.h" #include "eoParser.h" -#define USE_SET -//#undef USE_SET +#define USE_SET // defines if a set is to be used instead of a vector for storing streams the logger is redirected to +#undef USE_SET +/* expriments have shown that here a vector is by far faster than a set even if O(n), + * because it needs less dynamic allocations, uses less memory and less instructions + */ + #ifdef USE_SET #include @@ -71,16 +75,6 @@ namespace eo debug, xdebug}; - /** - * file - * this structure combined with the friend operator<< below is an easy way to select a file as output. - * - struct file - { - explicit file(const std::string f); - const std::string _f; - };*/ - /** * setlevel * this structure combined with the friend operator<< below is an easy way to set a verbose level. diff --git a/eo/test/t-eoLogger.cpp b/eo/test/t-eoLogger.cpp index 431920ebe..0406cb6b1 100644 --- a/eo/test/t-eoLogger.cpp +++ b/eo/test/t-eoLogger.cpp @@ -9,27 +9,10 @@ #include #include -// TODO test multiple redirection - //----------------------------------------------------------------------------- static void test(); -static void test2() -{ - #define NB 100 - std::ostream* os = (std::ostream*) 1; - eo::log.redirect(*os); - for (int i = 0; i < NB; i++) - eo::log.addRedirect(*(++os)); - /* - for (int i = 0; i < NB; i++) - eo::log.removeRedirect(*(os--));*/ - os = (std::ostream*) 1; - for (int i = 0; i < NB; i++) - eo::log.removeRedirect(*(++os)); -} - int main(int ac, char** av) { eoParser parser(ac, av); @@ -43,9 +26,7 @@ int main(int ac, char** av) make_help(parser); make_verbose(parser); - for (int i = 0; i < 10000; i++) - //test(); - test2(); + test(); return 0; } @@ -59,37 +40,28 @@ static void test() eo::log << "We are writing on the default output stream" << std::endl; { - /*std::ofstream ofs("logtest.txt"); - eo::log.redirect(ofs); - eo::log << "In FILE" << std::endl; - eo::log.redirect("logtest2.txt"); - eo::log << "In FILE 2" << std::endl;*/ eo::log.redirect("logtest.txt"); eo::log << "In FILE" << std::endl; - std::ofstream ofs("logtest2.txt"); + std::ofstream ofs("logtest2.txt"); // closed and destroyed at the en of the scope eo::log.addRedirect(ofs); eo::log << "In FILE 2" << std::endl; - eo::log.removeRedirect(ofs); + eo::log.removeRedirect(ofs); // must be removed because the associated stream is closed } - std::ifstream ifs("logtest2.txt"); - //ifs >> str; + std::ifstream ifs("logtest2.txt"); // stream to logtest2.txt is closed, we can start reading std::string line; assert(std::getline(ifs, line)); - //std::cout << line << std::endl; assert(line == "In FILE 2"); - //std::cout << (line == "In FILE") << std::endl; assert(!std::getline(ifs, line)); std::ostringstream oss; eo::log.addRedirect(oss); - //eo::log << oss << "In STRINGSTREAM"; eo::log << "In STRINGSTREAM"; std::cout << "Content of ostringstream: " << oss.str() << std::endl; assert(oss.str() == "In STRINGSTREAM"); - eo::log.redirect(std::cout); + eo::log.redirect(std::cout); // removes all previously redirected streams; closes the file logtest.txt eo::log << "on COUT" << std::endl; @@ -102,7 +74,6 @@ static void test() assert(std::getline(ifs, line)); assert(line == "In STRINGSTREAM"); assert(!std::getline(ifs, line)); - //assert(false); eo::log << eo::setlevel("errors"); From 23a7482f1c3fc7a6700e253da5ea35116e563e3c Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 15:19:32 +0200 Subject: [PATCH 10/28] files for trikisa --- mo/src/continuator/moFitnessMomentsStat.h | 119 ++++++ mo/src/continuator/moStdDevEstimator.h | 143 +++++++ .../coolingSchedule/moTrikiCoolingSchedule.h | 363 ++++++++++++++++++ mo/src/neighborhood/moRealNeighbor.h | 87 +++++ mo/src/neighborhood/moRealNeighborhood.h | 78 ++++ mo/src/trikisa | 22 ++ mo/test/t-moTriki.cpp | 0 mo/test/t-moTrikiReal.cpp | 0 8 files changed, 812 insertions(+) create mode 100644 mo/src/continuator/moFitnessMomentsStat.h create mode 100644 mo/src/continuator/moStdDevEstimator.h create mode 100644 mo/src/coolingSchedule/moTrikiCoolingSchedule.h create mode 100644 mo/src/neighborhood/moRealNeighbor.h create mode 100644 mo/src/neighborhood/moRealNeighborhood.h create mode 100644 mo/src/trikisa create mode 100644 mo/test/t-moTriki.cpp create mode 100644 mo/test/t-moTrikiReal.cpp diff --git a/mo/src/continuator/moFitnessMomentsStat.h b/mo/src/continuator/moFitnessMomentsStat.h new file mode 100644 index 000000000..794d113b8 --- /dev/null +++ b/mo/src/continuator/moFitnessMomentsStat.h @@ -0,0 +1,119 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + + Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can use, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + As a counterpart to the access to the source code and rights to copy, + modify and redistribute granted by the license, users are provided only + with a limited warranty and the software's author, the holder of the + economic rights, and the successive licensors have only limited liability. + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + ParadisEO WebSite : http://paradiseo.gforge.inria.fr + Contact: paradiseo-help@lists.gforge.inria.fr +*/ + +#ifndef moFitnessMomentsStat_h +#define moFitnessMomentsStat_h + +#include +#include + +/** + * Statistic that saves the standard deviation of the fitness of the solutions during the search + */ +template +//class moFitnessMomentsStat : public moStat > +class moFitnessMomentsStat : public moStat > +{ +public : + typedef typename EOT::Fitness Fitness; + //typedef std::pair Pair; + typedef std::pair Pair; + using moStat::value; + + /** + * Default Constructor + * @param _reInitSol when true the best so far is reinitialized + */ + moFitnessMomentsStat(bool _reInitSol = true) + : moStat(Pair(Fitness(), 0.0), "moments (average and stdev)"), + reInitSol(_reInitSol), firstTime(true), + nbSolutionsEncountered(0), currentAvg(0), currentVar(0) + { } + + /** + * Initialization of the best solution on the first one + * @param _sol the first solution + */ + virtual void init(EOT & _sol) { + if (reInitSol || firstTime) + { + value() = Pair(0.0,0.0); + nbSolutionsEncountered = currentAvg = currentVar = 0; + firstTime = false; + } + /*else if (firstTime) + { + value() = 0.0; + firstTime = false; + }*/ + operator()(_sol); + } + + /** + * Update the best solution + * @param _sol the current solution + */ + virtual void operator()(EOT & _sol) { + ++nbSolutionsEncountered; + double x = _sol.fitness(); + double oldAvg = currentAvg; + currentAvg = oldAvg + (x - oldAvg)/nbSolutionsEncountered; + if (nbSolutionsEncountered > 1) // <- not really necessary + { + //value() = (value()/nbSolutionsEncountered + _sol.fitness())/(nbSolutionsEncountered+1); + double oldVar = currentVar; + currentVar = oldVar + (x - oldAvg) * (x - currentAvg); + value() = Pair(currentAvg, currentVar/nbSolutionsEncountered); + } + } + + /** + * @return name of the class + */ + virtual std::string className(void) const { + return "moFitnessVarianceStat"; + } + +protected: + bool reInitSol; + bool firstTime; + double + nbSolutionsEncountered + , currentAvg + , currentVar // actually the var * n + ; + +}; + +#endif // moFitnessMomentsStat_h diff --git a/mo/src/continuator/moStdDevEstimator.h b/mo/src/continuator/moStdDevEstimator.h new file mode 100644 index 000000000..4d8902055 --- /dev/null +++ b/mo/src/continuator/moStdDevEstimator.h @@ -0,0 +1,143 @@ +#ifndef __moStdDevEstimator_h__ +#define __moStdDevEstimator_h__ + +#include +#include + +#include // TODO rm +#include // TODO rm + // TODO make tests + + +template< class T > +class eoOptional { +public: + static const eoOptional null; // = eoOptional(); + + eoOptional (T& init) + : _val(&init) + { } + + bool hasValue() const + { + return _val != NULL; + } + + T& get () const + { + if (!hasValue()) + throw std::runtime_error("Cannot get a reference from a eoOptional wrapper with no value"); + return *_val; + } + +protected: + eoOptional () + : _val(NULL) + { } + +private: + T* _val; +}; + +template< class T > +const eoOptional eoOptional::null = eoOptional(); + + +template< class EOT, class Neighbor > +class moStdDevEstimator : public eoUF +{ +public: + + /** + * General constructor for the estimator + * @param continuator a user-defined continuator + * @param neighborhood the neighborhood + * @param fullEval the full evaluation function + * @param eval neighbor's evaluation function + * @param walker a local search algorithm + */ + moStdDevEstimator ( + moContinuator& continuator, + moNeighborhood < Neighbor > & neighborhood, + eoEvalFunc& fullEval, + + /* The following should be read: + moEval >& eval = _default_eval + * (which is not possible to achieve as is in C++) */ + const eoOptional< moEval >& eval = eoOptional< moEval >::null, + + const eoOptional< moLocalSearch >& walker = eoOptional< moLocalSearch >::null + ) + : _default_eval ( fullEval ), + _eval(eval.hasValue()? eval.get(): _default_eval), + _default_continuator( 0 ), + _continuator( _continuator ), + _checkpoint( _continuator ), + _default_walker( neighborhood, fullEval, _eval, _checkpoint ), + _walker( walker.hasValue()? walker.get(): _default_walker ) + { + _checkpoint.add( _varStat ); + } + + /** + * Simpler constructor for the estimator + * @param max_iters the number of steps the default moIterContinuator should perform + * @param neighborhood the neighborhood + * @param fullEval the full evaluation function + * @param eval neighbor's evaluation function + * @param walker a local search algorithm + */ + moStdDevEstimator ( + unsigned int max_iters, + moNeighborhood < Neighbor > & neighborhood, + eoEvalFunc& fullEval, + const eoOptional< moEval >& eval = eoOptional< moEval >::null, + const eoOptional< moLocalSearch >& walker = eoOptional< moLocalSearch >::null + ) + : _default_eval ( fullEval ), + _eval(eval.hasValue()? eval.get(): _default_eval), + _default_continuator( max_iters, false ), + _continuator( _default_continuator ), + _checkpoint( _continuator ), + _default_walker( neighborhood, fullEval, _eval, _checkpoint ), + _walker( walker.hasValue()? walker.get(): _default_walker ) + { + _checkpoint.add( _varStat ); + } + + /** + * Evaluates the estimator with the walker algorithm and returns the standard deviation + * @param solution the solution from where to start the walk + */ + double operator()( EOT & solution ) + { + _walker(solution); + return sqrt(_varStat.value()); + } + + /** + * @return the class name + */ + virtual std::string className(void) const { + return "moStdDevEstimator"; + } + +private: + + moFullEvalByCopy _default_eval; + moEval& _eval; + + moIterContinuator _default_continuator; + moContinuator & _continuator; + + moCheckpoint _checkpoint; + + moRandomWalk _default_walker; + moLocalSearch _walker; + + moFitnessVarianceStat _varStat; +}; + +#endif // __moStdDevEstimator_h__ + + diff --git a/mo/src/coolingSchedule/moTrikiCoolingSchedule.h b/mo/src/coolingSchedule/moTrikiCoolingSchedule.h new file mode 100644 index 000000000..259f1747c --- /dev/null +++ b/mo/src/coolingSchedule/moTrikiCoolingSchedule.h @@ -0,0 +1,363 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2008 + (C) OPAC Team, LIFL, 2002-2008 + + Sébastien Cahon, Jean-Charles Boisson (Jean-Charles.Boisson@lifl.fr) + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can use, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + As a counterpart to the access to the source code and rights to copy, + modify and redistribute granted by the license, users are provided only + with a limited warranty and the software's author, the holder of the + economic rights, and the successive licensors have only limited liability. + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + ParadisEO WebSite : http://paradiseo.gforge.inria.fr + Contact: paradiseo-help@lists.gforge.inria.fr + */ + +#ifndef _moTrikiCoolingSchedule_h +#define _moTrikiCoolingSchedule_h + +#include + +#include +#include +#include +#include +#include + + +/* +#include + +#include +#include +#include +#include + */ + +#include +using namespace std; + + +//! +/*! + */ +template< class EOT, class Neighbor > //, class Neighborhood > +class moTrikiCoolingSchedule: public moCoolingSchedule< EOT > +{ +public: + //typedef typename Neighbor::EOT EOT ; + typedef moNeighborhood Neighborhood ; + + //! Constructor + /*! + */ + + moTrikiCoolingSchedule (Neighborhood& _neighborhood, moEval& _eval, double _initTemp) + : initTemp(_initTemp), + mu2(10), // mu2 typically belongs to [1; 20] + K1(2), // K1 in [1; 4], the number of chains without reaching equilibrium before we raise the temperature + K2(5), // ??? + lambda1(2), // the increase in temperature, typically in [1.5; 4] + lambda2(.7), // lambda2 in [0.5; 0.99] + mu1(10), // target decrease in cost factor, in [2; 20] + xi(1.05), // xi typically belongs to [1; 1.1] + max_accepted(50), // depends on pb/neighborhood + max_generated(100), // depends on pb/neighborhood + theta(10), // theta is typically set to 10 + statIsInitialized(false), + outf("out.data") + { } + + moTrikiCoolingSchedule ( + Neighborhood& _neighborhood, moEval& _eval, double _initTemp, + double _max_accepted, + double _max_generated + ) + : initTemp(_initTemp), + mu2(10), // mu2 typically belongs to [1; 20] + K1(2), // K1 in [1; 4], the number of chains without reaching equilibrium before we raise the temperature + K2(5), // ??? + lambda1(2), // the increase in temperature, typically in [1.5; 4] + lambda2(.7), // lambda2 in [0.5; 0.99] + mu1(10), // target decrease in cost factor, in [2; 20] + xi(1.05), // xi typically belongs to [1; 1.1] + max_accepted(_max_accepted), // depends on pb/neighborhood + max_generated(_max_generated), // depends on pb/neighborhood + theta(10), // theta is typically set to 10 + statIsInitialized(false), + outf("out.data") + { } + + /** + * Initial temperature + * @param _solution initial solution + */ + double init(EOT & _solution) { + + accepted = generated = costs_sum = 0; + + negative_temp = equilibrium_not_reached = frozen = 0; + + reinitializing = false; + terminated = false; + statIsInitialized = false; + + /// + cout << "INIT T=" << initTemp << endl; + /// + + //outf.open("out"); + //outf << "ok"; + //outf.close(); + + + return initTemp; + } + + /** + * update the temperature by a factor + * @param _temp current temperature to update + * @param _acceptedMove true when the move is accepted, false otherwise + */ + void update(double& _temp, bool _acceptedMove, EOT & _solution) { + + //cout << _temp << " g " << generated << endl; + + generated++; + + if (_acceptedMove) + { + accepted++; + //costs_sum += _solution.fitness(); + //varStat(_solution); + if (statIsInitialized) + momStat(_solution); + else momStat.init(_solution), statIsInitialized = true; + + //cout << _solution.fitness() << " avgCost=" << momStat.value().first << endl; + } + + + if (accepted > max_accepted || generated > max_generated) { + + if (accepted == 0) // ADDED! Otherwise the computed std dev is null; we're probably at equilibrium + { + /// + cout << "Stopping: no accepted solution" << endl; + /// + + terminated = true; + return; + } + + /// + cout << (accepted > max_accepted? "MAXACC ": "MAXGEN "); + /// + + //double avgCost = costs_sum/(double)accepted; + //double stdDev = sqrt(varStat.value()); // WARNING: IT'S NO MORE THE AVG COST, NOW IT'S THE STD DEV! + //double variance = varStat.value(); + double avgCost = momStat.value().first; + double variance = momStat.value().second; + double stdDev = sqrt(variance); + double sigma = stdDev; + double delta = sigma/mu2; + + + //outf << avgCost << endl; + //outf << _temp << endl; + outf << prevAvgCost-delta << endl; + + + accepted = generated = costs_sum = 0; + //varStat.init(_solution);//TODON use next chain's first sol + //momStat.init(_solution);//TODONE use next chain's first sol + statIsInitialized = false; + + /// + cout << "T=" << _temp << " avgCost=" << avgCost << " stdDev=" << stdDev << " currCost=" << _solution.fitness() << endl; + /// + + double alpha; + double oldprevAvgCost = prevAvgCost; + + /// + cout << "negTemp: " << negative_temp << " / " << K2 << endl; + /// + + if (negative_temp < K2) + { + if (!reinitializing) + { + /// + if (avgCost/(prevAvgCost-delta) > xi) cout << "/!\\ eq not reached!" << endl; + /// + + if (avgCost/(prevAvgCost-delta) > xi) + equilibrium_not_reached++; + else equilibrium_not_reached = 0; + } + if (equilibrium_not_reached > K1) + { + /// + cout << "/!\\ Reinitializing (eq not reached)" << endl; + /// + + reinitializing = true; + alpha = lambda1; + delta = sigma/mu1; + equilibrium_not_reached = 0; // ADDED! Otherwise the algo gets trapped here! + } + else if (_temp*delta/(sigma*sigma) >= 1) + { + /// + cout << "/!\\ neg temp!" << endl; + /// + + negative_temp++; + reinitializing = true; + if (negative_temp < K2) + { + alpha = lambda1; + delta = sigma/mu1; + } else + alpha = lambda2; + } + + // First interpretation of the pseudocode indentation: (seems obviously false because it makes the above code unreachable) + /* + } + else + { + cout << "ccc" << endl; + reinitializing = false; + prevAvgCost = avgCost; + alpha = 1-_temp*delta/(sigma*sigma); + } + */ + + // Second interpretation of the pseudocode indentation: + else + { + /// + cout << "[normal decrease]" << endl; + /// + + reinitializing = false; + prevAvgCost = avgCost; + //alpha = 1-_temp*delta/(sigma*sigma); + alpha = 1-_temp*delta/variance; + + //alpha = (sigma==0? 1: 1-_temp*delta/(sigma*sigma)); // ADDED! but removed + + if (sigma == 0) // ADDED! When std dev is null, the solution is probably at eq, and the algo can't go on anyways + terminated = true, cout << "Stopping: null std dev" << endl; + } + } + // FIXME: else what? alpha=? + + + + /// + cout << "*=" << alpha << endl; + /// + + _temp *= alpha; + + + // Never seems to be used + if (avgCost == oldprevAvgCost) // use a neighborhood to approximate double equality? + frozen++; + else frozen = 0; + + + + //exit(0); + //cin.get(); + + + } + + } + + //! Function which proceeds to the cooling + /*! + */ + bool operator() (double temperature) + { + /// + if (terminated) cout << "TERMINATED" << endl; + /// + + return frozen < theta + && !terminated ; // ADDED! because 'frozen' doesn't terminate anything + } + +private: + //moNeighborhoodStat nhStat; + //moStdFitnessNeighborStat stdDevStat; + const double + // parameters of the algorithm + //currentTemp, + initTemp, + //ratio, + //threshold, + mu2, // mu2 typically belongs to [1; 20] + K1, // K1 in [1; 4], the number of chains without reaching equilibrium before we raise the temperature + K2, + lambda1, // the increase in temperature, typically in [1.5; 4] + lambda2, // lambda2 in [0.5; 0.99] + mu1, // target decrease in cost factor, in [2; 20] + xi // xi typically belongs to [1; 1.1] + // private variables + ; + double + stdDev, + prevAvgCost, + expectedDecreaseInCost, // delta + costs_sum + ; + const int + max_accepted, + max_generated, + theta // theta is typically set to 10 + ; + int + accepted, + generated, + equilibrium_not_reached, + negative_temp, + frozen + ; + bool reinitializing, terminated; + + //moFitnessVarianceStat varStat; + moFitnessMomentsStat momStat; + bool statIsInitialized; + + ofstream outf; + +}; + +#endif + diff --git a/mo/src/neighborhood/moRealNeighbor.h b/mo/src/neighborhood/moRealNeighbor.h new file mode 100644 index 000000000..4af8924f2 --- /dev/null +++ b/mo/src/neighborhood/moRealNeighbor.h @@ -0,0 +1,87 @@ +#ifndef __moRealNeighbor_h__ +#define __moRealNeighbor_h__ + +#include +#include +#include + +//! A neighbor as produced by a moRealNeighborhood +/*! + * In a real neighborhood, the move is just a translation vector, of the same type than a solution. + */ + +template +class moRealNeighbor : public moNeighbor +{ +protected: + //! The move to be applied + EOT _translation; + + edoBounder * _bounder; + + +public: + + moRealNeighbor() : _bounder( NULL ) { } + + //! Returns the solution attached to this neighbor + EOT translation() { return _translation; } + + //! Set the translation + void translation( EOT translation ) { _translation = translation; } + + + void bounder( edoBounder * bounder ) { _bounder = bounder; } + + /** + * Assignment operator + * @param _neighbor the neighbor to assign + * @return a neighbor equal to the other + */ + virtual moNeighbor& operator=(const moNeighbor& _neighbor) { + fitness( _neighbor.fitness() ); + return (*this); + } + + /*! + * Move a solution to the solution of this neighbor + * @param _solution the related solution + */ + virtual void move(EOT & _solution) + { + assert( _solution.size() == _translation.size() ); + + for( unsigned int i=0, size= _solution.size(); i& _neighbor) { + return _neighbor.translation() == _translation; + } + + /** + * Return the class Name + * @return the class name as a std::string + */ + virtual std::string className() const { + return "moRealNeighbor"; + } +}; + + +#endif // __moRealNeighbor_h__ + diff --git a/mo/src/neighborhood/moRealNeighborhood.h b/mo/src/neighborhood/moRealNeighborhood.h new file mode 100644 index 000000000..7e0a4a738 --- /dev/null +++ b/mo/src/neighborhood/moRealNeighborhood.h @@ -0,0 +1,78 @@ + +#ifndef __moRealNeighborhood_h__ +#define __moRealNeighborhood_h__ + +#include +#include // FIXME: Why don't we use eoFunctorBase on the mother classes +#include "moRealNeighbor.h" + +template +class moRealNeighborhood : public moRndNeighborhood< Neighbor >, public eoFunctorBase +{ +public: + typedef typename Distrib::EOType EOT; + +protected: + Distrib & _distrib; + edoSampler & _sampler; + edoBounder & _bounder; + +public: + + moRealNeighborhood( Distrib & distrib, edoSampler & sampler, edoBounder & bounder ) : _distrib(distrib), _sampler(sampler), _bounder(bounder) {} + + /** + * It alway remains at least a solution in an infinite neighborhood + * @param _solution the related solution + * @return true + */ + virtual bool hasNeighbor(EOT &) + { + return true; + } + + /** + * Draw the next neighbor + * @param _solution the solution to explore + * @param _current the next neighbor + */ + virtual void next(EOT &, Neighbor & _current) + { + _current.bounder( &_bounder ); + + // Draw a translation in the distrib, using the sampler + _current.translation( _sampler( _distrib ) ); + } + + + /** + * Initialization of the neighborhood + * @param _solution the solution to explore + * @param _current the first neighbor + */ + virtual void init(EOT & _solution, Neighbor & _current) + { + // there is no difference between an init and a random draw + next( _solution, _current ); + } + /** + * There is always a solution in an infinite neighborhood + * @param _solution the solution to explore + * @return true + */ + virtual bool cont(EOT &) + { + return true; + } + + /** + * Return the class Name + * @return the class name as a std::string + */ + virtual std::string className() const { + return "moRealNeighborhood"; + } + +}; + +#endif // __moRealNeighborhood_h__ diff --git a/mo/src/trikisa b/mo/src/trikisa new file mode 100644 index 000000000..63f59ff9a --- /dev/null +++ b/mo/src/trikisa @@ -0,0 +1,22 @@ +// (c) Thales group, 2010 +/* + Authors: + Johann Dreo + Caner Candan +*/ + +#ifndef _trikisa_ +#define _trikisa_ + +#include "moRealNeighbor.h" +#include "moRealNeighborhood.h" +#include "moStdDevEstimator.h" +#include "moTrikiCoolingSchedule.h" +#include "moFitnessVarianceStat.h" // TODO rm +#include "moFitnessMomentsStat.h" + +#endif // !_trikisa_ + +// Local Variables: +// mode: C++ +// End: diff --git a/mo/test/t-moTriki.cpp b/mo/test/t-moTriki.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/mo/test/t-moTrikiReal.cpp b/mo/test/t-moTrikiReal.cpp new file mode 100644 index 000000000..e69de29bb From 122b7442c1012167eddc78f378fe15f22aefc572 Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 15:26:27 +0200 Subject: [PATCH 11/28] created eoOptional --- eo/src/eoOptional.h | 79 ++++++++++++++++++++++++++ mo/src/continuator/moStdDevEstimator.h | 34 ----------- 2 files changed, 79 insertions(+), 34 deletions(-) create mode 100644 eo/src/eoOptional.h diff --git a/eo/src/eoOptional.h b/eo/src/eoOptional.h new file mode 100644 index 000000000..d3cdbff80 --- /dev/null +++ b/eo/src/eoOptional.h @@ -0,0 +1,79 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +/* +(c) Thales group, 2013 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ + +/** @defgroup Logging Logging + * @ingroup Utilities + + + +@{ +*/ + +#ifndef _EOOPTIONAL_H +#define _EOOPTIONAL_H + +#include + + +template< class T > +class eoOptional { +public: + static const eoOptional null; // = eoOptional(); + + eoOptional (T& init) + : _val(&init) + { } + + bool hasValue() const + { + return _val != NULL; + } + + T& get () const + { + if (!hasValue()) + throw std::runtime_error("Cannot get a reference from a eoOptional wrapper with no value"); + return *_val; + } + +protected: + eoOptional () + : _val(NULL) + { } + +private: + T* _val; +}; + +template< class T > +const eoOptional eoOptional::null = eoOptional(); + + +#endif // _EOOPTIONAL_H + + +/** @} */ + diff --git a/mo/src/continuator/moStdDevEstimator.h b/mo/src/continuator/moStdDevEstimator.h index 4d8902055..ff3b645d2 100644 --- a/mo/src/continuator/moStdDevEstimator.h +++ b/mo/src/continuator/moStdDevEstimator.h @@ -9,40 +9,6 @@ // TODO make tests -template< class T > -class eoOptional { -public: - static const eoOptional null; // = eoOptional(); - - eoOptional (T& init) - : _val(&init) - { } - - bool hasValue() const - { - return _val != NULL; - } - - T& get () const - { - if (!hasValue()) - throw std::runtime_error("Cannot get a reference from a eoOptional wrapper with no value"); - return *_val; - } - -protected: - eoOptional () - : _val(NULL) - { } - -private: - T* _val; -}; - -template< class T > -const eoOptional eoOptional::null = eoOptional(); - - template< class EOT, class Neighbor > class moStdDevEstimator : public eoUF { From 3f817db6d47b6ef4f836100bc334810f1baf03dd Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 15:38:40 +0200 Subject: [PATCH 12/28] doc --- eo/src/eoOptional.h | 48 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/eo/src/eoOptional.h b/eo/src/eoOptional.h index d3cdbff80..905da51d4 100644 --- a/eo/src/eoOptional.h +++ b/eo/src/eoOptional.h @@ -24,11 +24,48 @@ Lionel Parreaux */ -/** @defgroup Logging Logging - * @ingroup Utilities - +/** + +A utility class for wrapping non-const references and use them as default arguments in functions. + +For example, this is not valid C++98 code: + +\code +struct MyClass { + MyClass(T& my_T = default_T) + : actual_T(my_T) + { } +private: + T default_T; + T& actual_T; +} +\endcode + +This is the same code using eoOptional, which is valid: + +\code +struct MyClass { + MyClass(eoOptional my_T = NULL) + : actual_T(my_T.getOr(default_T)) + { } +private: + T default_T; + T& actual_T; +} +\endcode + +And from the point of view of the user, it is transparent: + +\code +// Three ways of using MyClass: +MyClass mc1; +MyClass mc2(NULL); +T t; +MyClass mc3(t); +\endcode +@ingroup Utilities @{ */ @@ -46,6 +83,11 @@ public: eoOptional (T& init) : _val(&init) { } + + // used mainly for converting NULL to this + eoOptional (T* init) + : _val(init) + { } bool hasValue() const { From 95a6e7a231dbcd0e38bfc758f55a6728e8fc9158 Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 15:44:59 +0200 Subject: [PATCH 13/28] added a test and a method --- eo/src/eoOptional.h | 83 ++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/eo/src/eoOptional.h b/eo/src/eoOptional.h index 905da51d4..5c7bc58c7 100644 --- a/eo/src/eoOptional.h +++ b/eo/src/eoOptional.h @@ -32,26 +32,26 @@ For example, this is not valid C++98 code: \code struct MyClass { - MyClass(T& my_T = default_T) - : actual_T(my_T) - { } + MyClass(T& my_T = default_T) + : actual_T(my_T) + { } private: - T default_T; - T& actual_T; -} + T default_T; + T& actual_T; +}; \endcode This is the same code using eoOptional, which is valid: \code struct MyClass { - MyClass(eoOptional my_T = NULL) - : actual_T(my_T.getOr(default_T)) - { } + MyClass(eoOptional my_T = NULL) + : actual_T(my_T.getOr(default_T)) + { } private: - T default_T; - T& actual_T; -} + T default_T; + T& actual_T; +}; \endcode And from the point of view of the user, it is transparent: @@ -78,36 +78,41 @@ MyClass mc3(t); template< class T > class eoOptional { public: - static const eoOptional null; // = eoOptional(); - - eoOptional (T& init) - : _val(&init) - { } + static const eoOptional null; // = eoOptional(); + + eoOptional (T& init) + : _val(&init) + { } - // used mainly for converting NULL to this - eoOptional (T* init) - : _val(init) - { } - - bool hasValue() const - { - return _val != NULL; - } - - T& get () const - { - if (!hasValue()) - throw std::runtime_error("Cannot get a reference from a eoOptional wrapper with no value"); - return *_val; - } - + // used mainly for converting NULL to this class + eoOptional (T* init) + : _val(init) + { } + + bool hasValue() const + { + return _val != NULL; + } + + T& get () const + { + if (!hasValue()) + throw std::runtime_error("Cannot get a reference from a eoOptional wrapper with no value"); + return *_val; + } + + T& getOr (T& default) const + { + return hasValue()? *_val: default; + } + protected: - eoOptional () - : _val(NULL) - { } - + eoOptional () + : _val(NULL) + { } + private: - T* _val; + T* _val; }; template< class T > From eaa3960373c0d4356621699c71c28bbd47cdf1bb Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 15:45:10 +0200 Subject: [PATCH 14/28] added a test --- eo/test/t-eoOptional.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 eo/test/t-eoOptional.cpp diff --git a/eo/test/t-eoOptional.cpp b/eo/test/t-eoOptional.cpp new file mode 100644 index 000000000..e22781a24 --- /dev/null +++ b/eo/test/t-eoOptional.cpp @@ -0,0 +1,27 @@ +//----------------------------------------------------------------------------- +// t-eoOptional.cpp +//----------------------------------------------------------------------------- + +#include "eoOptional.h" + +//----------------------------------------------------------------------------- + +typedef T int; + +struct MyClass { + MyClass(eoOptional my_T = NULL) + : actual_T(my_T.getOr(default_T)) + { } +private: + T default_T; + T& actual_T; +}; + +int main(int ac, char** av) +{ + // Three ways of using MyClass: + MyClass mc1; + MyClass mc2(NULL); + T t; + MyClass mc3(t); +} From d317cc2ea74f7de4e5bccdf1ddb2a9f4f09af2f2 Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 15:59:07 +0200 Subject: [PATCH 15/28] fixed test & impl --- eo/src/eoOptional.h | 8 ++++++-- eo/test/CMakeLists.txt | 1 + eo/test/t-eoOptional.cpp | 10 ++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/eo/src/eoOptional.h b/eo/src/eoOptional.h index 5c7bc58c7..9143be3cd 100644 --- a/eo/src/eoOptional.h +++ b/eo/src/eoOptional.h @@ -27,6 +27,7 @@ Lionel Parreaux /** A utility class for wrapping non-const references and use them as default arguments in functions. +This especially is useful for avoiding constructor multiplication. For example, this is not valid C++98 code: @@ -72,7 +73,9 @@ MyClass mc3(t); #ifndef _EOOPTIONAL_H #define _EOOPTIONAL_H +#include #include +//#include template< class T > @@ -98,12 +101,13 @@ public: { if (!hasValue()) throw std::runtime_error("Cannot get a reference from a eoOptional wrapper with no value"); + //throw eoEx; return *_val; } - T& getOr (T& default) const + T& getOr (T& defaultValue) const { - return hasValue()? *_val: default; + return hasValue()? *_val: defaultValue; } protected: diff --git a/eo/test/CMakeLists.txt b/eo/test/CMakeLists.txt index 15fd22464..e283ab958 100644 --- a/eo/test/CMakeLists.txt +++ b/eo/test/CMakeLists.txt @@ -69,6 +69,7 @@ set (TEST_LIST #t-openmp # does not work anymore since functions used in this test were removed from EO #t-eoDualFitness t-eoParser + t-eoOptional ) diff --git a/eo/test/t-eoOptional.cpp b/eo/test/t-eoOptional.cpp index e22781a24..bee58957c 100644 --- a/eo/test/t-eoOptional.cpp +++ b/eo/test/t-eoOptional.cpp @@ -6,12 +6,14 @@ //----------------------------------------------------------------------------- -typedef T int; +typedef int T; struct MyClass { MyClass(eoOptional my_T = NULL) - : actual_T(my_T.getOr(default_T)) - { } + : default_T(42), actual_T(my_T.getOr(default_T)) + { + std::cout << "Value " << actual_T << " was used for construction" << std::endl; + } private: T default_T; T& actual_T; @@ -22,6 +24,6 @@ int main(int ac, char** av) // Three ways of using MyClass: MyClass mc1; MyClass mc2(NULL); - T t; + T t(666); MyClass mc3(t); } From 930c21f46590403bdcf27c9e6089445be54fa4f4 Mon Sep 17 00:00:00 2001 From: LPTK Date: Wed, 12 Jun 2013 16:05:41 +0200 Subject: [PATCH 16/28] added test files --- mo/src/continuator/moStdDevEstimator.h | 2 +- mo/test/CMakeLists.txt | 4 ++++ mo/test/t-moStdDevEstimator.cpp | 0 mo/test/t-moStdFitnessNeighborStat.cpp | 12 ++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 mo/test/t-moStdDevEstimator.cpp create mode 100644 mo/test/t-moStdFitnessNeighborStat.cpp diff --git a/mo/src/continuator/moStdDevEstimator.h b/mo/src/continuator/moStdDevEstimator.h index ff3b645d2..e517240db 100644 --- a/mo/src/continuator/moStdDevEstimator.h +++ b/mo/src/continuator/moStdDevEstimator.h @@ -28,7 +28,7 @@ public: eoEvalFunc& fullEval, /* The following should be read: - moEval >& eval = _default_eval + moEval& eval = _default_eval * (which is not possible to achieve as is in C++) */ const eoOptional< moEval >& eval = eoOptional< moEval >::null, diff --git a/mo/test/CMakeLists.txt b/mo/test/CMakeLists.txt index 652b66be3..2cb8d97c6 100644 --- a/mo/test/CMakeLists.txt +++ b/mo/test/CMakeLists.txt @@ -94,7 +94,11 @@ set (TEST_LIST t-moStatistics t-moIndexedVectorTabuList # t-moRndIndexedVectorTabuList + t-moStdFitnessNeighborStat + t-moStdDevEstimator.cpp t-moDynSpanCoolingSchedule + t-moTriki.cpp + t-moTrikiReal.cpp ) ###################################################################################### diff --git a/mo/test/t-moStdDevEstimator.cpp b/mo/test/t-moStdDevEstimator.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/mo/test/t-moStdFitnessNeighborStat.cpp b/mo/test/t-moStdFitnessNeighborStat.cpp new file mode 100644 index 000000000..bd5ce0de0 --- /dev/null +++ b/mo/test/t-moStdFitnessNeighborStat.cpp @@ -0,0 +1,12 @@ +//----------------------------------------------------------------------------- +// t-moFitnessNeighborStat.cpp +//----------------------------------------------------------------------------- + +#include ".h" + +//----------------------------------------------------------------------------- + +int main(int ac, char** av) +{ + +} From aacba6f8138b4eb0b3f94f41ccfd8259395ff25a Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 11:26:15 +0200 Subject: [PATCH 17/28] stddev test --- mo/src/continuator/moStdFitnessNeighborStat.h | 2 +- mo/src/neighborhood/moRealNeighborhood.h | 2 +- mo/test/CMakeLists.txt | 7 ++++--- mo/test/t-moStdFitnessNeighborStat.cpp | 16 ++++++++++++++-- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/mo/src/continuator/moStdFitnessNeighborStat.h b/mo/src/continuator/moStdFitnessNeighborStat.h index b9a547954..4c058c8ee 100644 --- a/mo/src/continuator/moStdFitnessNeighborStat.h +++ b/mo/src/continuator/moStdFitnessNeighborStat.h @@ -42,7 +42,7 @@ * From moNeighborhoodStat, to compute the average and the standard deviation of fitness in the neighborhood */ template< class Neighbor > -class moStdFitnessNeighborStat : public moStat +class moStdFitnessNeighborStat : public moStat { public : typedef typename Neighbor::EOT EOT ; diff --git a/mo/src/neighborhood/moRealNeighborhood.h b/mo/src/neighborhood/moRealNeighborhood.h index 7e0a4a738..7cac43735 100644 --- a/mo/src/neighborhood/moRealNeighborhood.h +++ b/mo/src/neighborhood/moRealNeighborhood.h @@ -4,7 +4,7 @@ #include #include // FIXME: Why don't we use eoFunctorBase on the mother classes -#include "moRealNeighbor.h" +#include "neighbor/moRealNeighbor.h" template class moRealNeighborhood : public moRndNeighborhood< Neighbor >, public eoFunctorBase diff --git a/mo/test/CMakeLists.txt b/mo/test/CMakeLists.txt index 2cb8d97c6..6e8846be9 100644 --- a/mo/test/CMakeLists.txt +++ b/mo/test/CMakeLists.txt @@ -4,6 +4,7 @@ include_directories(${EO_SRC_DIR}/src) include_directories(${MO_SRC_DIR}/src) +include_directories(${EDO_SRC_DIR}/src) include_directories(${PROBLEMS_SRC_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) @@ -95,10 +96,10 @@ set (TEST_LIST t-moIndexedVectorTabuList # t-moRndIndexedVectorTabuList t-moStdFitnessNeighborStat - t-moStdDevEstimator.cpp + t-moStdDevEstimator t-moDynSpanCoolingSchedule - t-moTriki.cpp - t-moTrikiReal.cpp + t-moTriki + t-moTrikiReal ) ###################################################################################### diff --git a/mo/test/t-moStdFitnessNeighborStat.cpp b/mo/test/t-moStdFitnessNeighborStat.cpp index bd5ce0de0..d562dffa9 100644 --- a/mo/test/t-moStdFitnessNeighborStat.cpp +++ b/mo/test/t-moStdFitnessNeighborStat.cpp @@ -2,11 +2,23 @@ // t-moFitnessNeighborStat.cpp //----------------------------------------------------------------------------- -#include ".h" +#include +//#include "eoReal.h" +#include "continuator/moStdFitnessNeighborStat.h" +#include "neighborhood/moRealNeighbor.h" +#include "neighborhood/moRealNeighborhood.h" //----------------------------------------------------------------------------- +typedef eoReal< eoMinimizingFitness > EOT; +typedef moRealNeighbor< EOT > Neighbor; + int main(int ac, char** av) { - + moNeighborhoodStat nhStat + moStdFitnessNeighborStat stat(nhStat); + EOT solution(2, 5); + stat(solution); + //assert(stat.value() == 1); + std::cout << "ok " << stat.value() << endl; } From 716abe4610f67f1f7a7350fec8dc2a7b2aa1e2a2 Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 14:16:07 +0200 Subject: [PATCH 18/28] wrong file replaced with the right version --- mo/src/continuator/moFitnessVarianceStat.h | 115 ++++++++++++++++++ mo/test/CMakeLists.txt | 2 +- ...orStat.cpp => t-moFitnessVarianceStat.cpp} | 6 +- 3 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 mo/src/continuator/moFitnessVarianceStat.h rename mo/test/{t-moStdFitnessNeighborStat.cpp => t-moFitnessVarianceStat.cpp} (81%) diff --git a/mo/src/continuator/moFitnessVarianceStat.h b/mo/src/continuator/moFitnessVarianceStat.h new file mode 100644 index 000000000..3769c5983 --- /dev/null +++ b/mo/src/continuator/moFitnessVarianceStat.h @@ -0,0 +1,115 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + + Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau + + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can use, + modify and/ or redistribute the software under the terms of the CeCILL + license as circulated by CEA, CNRS and INRIA at the following URL + "http://www.cecill.info". + + As a counterpart to the access to the source code and rights to copy, + modify and redistribute granted by the license, users are provided only + with a limited warranty and the software's author, the holder of the + economic rights, and the successive licensors have only limited liability. + + In this respect, the user's attention is drawn to the risks associated + with loading, using, modifying and/or developing or reproducing the + software by the user in light of its specific status of free software, + that may mean that it is complicated to manipulate, and that also + therefore means that it is reserved for developers and experienced + professionals having in-depth computer knowledge. Users are therefore + encouraged to load and test the software's suitability as regards their + requirements in conditions enabling the security of their systems and/or + data to be ensured and, more generally, to use and operate it in the + same conditions as regards security. + The fact that you are presently reading this means that you have had + knowledge of the CeCILL license and that you accept its terms. + + ParadisEO WebSite : http://paradiseo.gforge.inria.fr + Contact: paradiseo-help@lists.gforge.inria.fr +*/ + +#ifndef moFitnessVarianceStat_h +#define moFitnessVarianceStat_h + +#include + +/** + * Statistic that incrementally computes the variance of the fitness of the solutions during the search + */ +template +class moFitnessVarianceStat : public moStat +{ +public : + typedef typename EOT::Fitness Fitness; + using moStat< EOT , typename EOT::Fitness >::value; + + /** + * Default Constructor + * @param _reInitSol when true the best so far is reinitialized + */ + moFitnessVarianceStat(bool _reInitSol = true) + : moStat(Fitness(), "var"), + reInitSol(_reInitSol), firstTime(true), + nbSolutionsEncountered(0), currentAvg(0), currentVar(0) + { } + + /** + * Initialization of the best solution on the first one + * @param _sol the first solution + */ + virtual void init(EOT & _sol) { + if (reInitSol || firstTime) + { + value() = 0.0; + nbSolutionsEncountered = currentAvg = currentVar = 0; + firstTime = false; + } + /*else if (firstTime) + { + value() = 0.0; + firstTime = false; + }*/ + operator()(_sol); + } + + /** + * Update the best solution + * @param _sol the current solution + */ + virtual void operator()(EOT & _sol) { + ++nbSolutionsEncountered; + double x = _sol.fitness(); + double oldAvg = currentAvg; + currentAvg = oldAvg + (x - oldAvg)/nbSolutionsEncountered; + if (nbSolutionsEncountered > 1) // <- not really necessary + { + //value() = (value()/nbSolutionsEncountered + _sol.fitness())/(nbSolutionsEncountered+1); + double oldVar = currentVar; + currentVar = oldVar + (x - oldAvg) * (x - currentAvg); + value() = currentVar/nbSolutionsEncountered; + } + } + + /** + * @return name of the class + */ + virtual std::string className(void) const { + return "moFitnessVarianceStat"; + } + +protected: + bool reInitSol; + bool firstTime; + double + nbSolutionsEncountered + , currentAvg + , currentVar // actually the var * n + ; + +}; + +#endif // moFitnessVarianceStat_h diff --git a/mo/test/CMakeLists.txt b/mo/test/CMakeLists.txt index 6e8846be9..319ffb0c9 100644 --- a/mo/test/CMakeLists.txt +++ b/mo/test/CMakeLists.txt @@ -95,7 +95,7 @@ set (TEST_LIST t-moStatistics t-moIndexedVectorTabuList # t-moRndIndexedVectorTabuList - t-moStdFitnessNeighborStat + t-moFitnessVarianceStat t-moStdDevEstimator t-moDynSpanCoolingSchedule t-moTriki diff --git a/mo/test/t-moStdFitnessNeighborStat.cpp b/mo/test/t-moFitnessVarianceStat.cpp similarity index 81% rename from mo/test/t-moStdFitnessNeighborStat.cpp rename to mo/test/t-moFitnessVarianceStat.cpp index d562dffa9..f1082864d 100644 --- a/mo/test/t-moStdFitnessNeighborStat.cpp +++ b/mo/test/t-moFitnessVarianceStat.cpp @@ -4,7 +4,7 @@ #include //#include "eoReal.h" -#include "continuator/moStdFitnessNeighborStat.h" +#include "continuator/moFitnessVarianceStat.h" #include "neighborhood/moRealNeighbor.h" #include "neighborhood/moRealNeighborhood.h" @@ -15,8 +15,8 @@ typedef moRealNeighbor< EOT > Neighbor; int main(int ac, char** av) { - moNeighborhoodStat nhStat - moStdFitnessNeighborStat stat(nhStat); + //moNeighborhoodStat nhStat + moFitnessVarianceStat stat(); EOT solution(2, 5); stat(solution); //assert(stat.value() == 1); From b1067a05259354492bd9b58e824f4f974da2f32d Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 14:55:01 +0200 Subject: [PATCH 19/28] minor fixes --- mo/src/neighborhood/moRealNeighborhood.h | 2 +- mo/test/t-moFitnessVarianceStat.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mo/src/neighborhood/moRealNeighborhood.h b/mo/src/neighborhood/moRealNeighborhood.h index 7cac43735..5efa3ec6f 100644 --- a/mo/src/neighborhood/moRealNeighborhood.h +++ b/mo/src/neighborhood/moRealNeighborhood.h @@ -4,7 +4,7 @@ #include #include // FIXME: Why don't we use eoFunctorBase on the mother classes -#include "neighbor/moRealNeighbor.h" +#include "neighborhood/moRealNeighbor.h" template class moRealNeighborhood : public moRndNeighborhood< Neighbor >, public eoFunctorBase diff --git a/mo/test/t-moFitnessVarianceStat.cpp b/mo/test/t-moFitnessVarianceStat.cpp index f1082864d..3975338cc 100644 --- a/mo/test/t-moFitnessVarianceStat.cpp +++ b/mo/test/t-moFitnessVarianceStat.cpp @@ -3,7 +3,7 @@ //----------------------------------------------------------------------------- #include -//#include "eoReal.h" +#include "es/eoReal.h" #include "continuator/moFitnessVarianceStat.h" #include "neighborhood/moRealNeighbor.h" #include "neighborhood/moRealNeighborhood.h" @@ -16,9 +16,9 @@ typedef moRealNeighbor< EOT > Neighbor; int main(int ac, char** av) { //moNeighborhoodStat nhStat - moFitnessVarianceStat stat(); + moFitnessVarianceStat stat; EOT solution(2, 5); stat(solution); //assert(stat.value() == 1); - std::cout << "ok " << stat.value() << endl; + std::cout << "ok " << stat.value() << std::endl; } From 93b4e2568c8921f66cdc2a054b091656b3a3e7b4 Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 15:05:17 +0200 Subject: [PATCH 20/28] fixed test --- mo/test/t-moFitnessVarianceStat.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mo/test/t-moFitnessVarianceStat.cpp b/mo/test/t-moFitnessVarianceStat.cpp index 3975338cc..6bb5faf8e 100644 --- a/mo/test/t-moFitnessVarianceStat.cpp +++ b/mo/test/t-moFitnessVarianceStat.cpp @@ -13,11 +13,25 @@ typedef eoReal< eoMinimizingFitness > EOT; typedef moRealNeighbor< EOT > Neighbor; +double objective_function(const EOT & sol) +{ + double sum = 0; + + for ( size_t i = 0; i < sol.size(); ++i ) + { + sum += sol[i] * sol[i]; + } + + return sum; +} + int main(int ac, char** av) { //moNeighborhoodStat nhStat moFitnessVarianceStat stat; + eoEvalFuncPtr< EOT, double > eval( objective_function ); EOT solution(2, 5); + eval(solution); stat(solution); //assert(stat.value() == 1); std::cout << "ok " << stat.value() << std::endl; From 737cae0469dda1a48cb6cc1d6a9d4f6fd1c6dd30 Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 15:19:18 +0200 Subject: [PATCH 21/28] finished test for var stat --- mo/test/t-moFitnessVarianceStat.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mo/test/t-moFitnessVarianceStat.cpp b/mo/test/t-moFitnessVarianceStat.cpp index 6bb5faf8e..b90070254 100644 --- a/mo/test/t-moFitnessVarianceStat.cpp +++ b/mo/test/t-moFitnessVarianceStat.cpp @@ -19,6 +19,7 @@ double objective_function(const EOT & sol) for ( size_t i = 0; i < sol.size(); ++i ) { + //std::cout << sol[i] << std::endl; sum += sol[i] * sol[i]; } @@ -33,6 +34,11 @@ int main(int ac, char** av) EOT solution(2, 5); eval(solution); stat(solution); + solution[0] = solution[1] = 0; + solution.invalidate(); + eval(solution); + stat(solution); //assert(stat.value() == 1); - std::cout << "ok " << stat.value() << std::endl; + std::cout << "var: " << stat.value() << std::endl; + assert(stat.value() == 625); } From a1ce594a38695ccd04d452250e7c84f387e758e7 Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 15:37:47 +0200 Subject: [PATCH 22/28] cleaning --- mo/src/continuator/moFitnessVarianceStat.h | 15 +++------------ mo/test/t-moFitnessVarianceStat.cpp | 3 --- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/mo/src/continuator/moFitnessVarianceStat.h b/mo/src/continuator/moFitnessVarianceStat.h index 3769c5983..1d4c7f4b6 100644 --- a/mo/src/continuator/moFitnessVarianceStat.h +++ b/mo/src/continuator/moFitnessVarianceStat.h @@ -68,11 +68,6 @@ public : nbSolutionsEncountered = currentAvg = currentVar = 0; firstTime = false; } - /*else if (firstTime) - { - value() = 0.0; - firstTime = false; - }*/ operator()(_sol); } @@ -85,13 +80,9 @@ public : double x = _sol.fitness(); double oldAvg = currentAvg; currentAvg = oldAvg + (x - oldAvg)/nbSolutionsEncountered; - if (nbSolutionsEncountered > 1) // <- not really necessary - { - //value() = (value()/nbSolutionsEncountered + _sol.fitness())/(nbSolutionsEncountered+1); - double oldVar = currentVar; - currentVar = oldVar + (x - oldAvg) * (x - currentAvg); - value() = currentVar/nbSolutionsEncountered; - } + double oldVar = currentVar; + currentVar = oldVar + (x - oldAvg) * (x - currentAvg); + value() = currentVar/nbSolutionsEncountered; } /** diff --git a/mo/test/t-moFitnessVarianceStat.cpp b/mo/test/t-moFitnessVarianceStat.cpp index b90070254..8f343a6ac 100644 --- a/mo/test/t-moFitnessVarianceStat.cpp +++ b/mo/test/t-moFitnessVarianceStat.cpp @@ -19,7 +19,6 @@ double objective_function(const EOT & sol) for ( size_t i = 0; i < sol.size(); ++i ) { - //std::cout << sol[i] << std::endl; sum += sol[i] * sol[i]; } @@ -28,7 +27,6 @@ double objective_function(const EOT & sol) int main(int ac, char** av) { - //moNeighborhoodStat nhStat moFitnessVarianceStat stat; eoEvalFuncPtr< EOT, double > eval( objective_function ); EOT solution(2, 5); @@ -38,7 +36,6 @@ int main(int ac, char** av) solution.invalidate(); eval(solution); stat(solution); - //assert(stat.value() == 1); std::cout << "var: " << stat.value() << std::endl; assert(stat.value() == 625); } From ef34af74938eb0a54ce8fd9454003dce233da5ca Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 16:06:14 +0200 Subject: [PATCH 23/28] test for stddevest --- eo/src/eo | 1 + .../moStdDevEstimator.h | 2 +- mo/test/t-moStdDevEstimator.cpp | 76 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) rename mo/src/{continuator => sampling}/moStdDevEstimator.h (98%) diff --git a/eo/src/eo b/eo/src/eo index 8196e2b14..5057371d3 100644 --- a/eo/src/eo +++ b/eo/src/eo @@ -35,6 +35,7 @@ // general purpose #include #include +#include #include #include #include diff --git a/mo/src/continuator/moStdDevEstimator.h b/mo/src/sampling/moStdDevEstimator.h similarity index 98% rename from mo/src/continuator/moStdDevEstimator.h rename to mo/src/sampling/moStdDevEstimator.h index e517240db..338984f3b 100644 --- a/mo/src/continuator/moStdDevEstimator.h +++ b/mo/src/sampling/moStdDevEstimator.h @@ -4,7 +4,7 @@ #include #include -#include // TODO rm +#include // TODO rm #include // TODO rm // TODO make tests diff --git a/mo/test/t-moStdDevEstimator.cpp b/mo/test/t-moStdDevEstimator.cpp index e69de29bb..43f51cb8c 100644 --- a/mo/test/t-moStdDevEstimator.cpp +++ b/mo/test/t-moStdDevEstimator.cpp @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// t-moStdDevEstimator.cpp +//----------------------------------------------------------------------------- + +#include +#include "es/eoReal.h" +#include "continuator/moFitnessVarianceStat.h" +#include "neighborhood/moRealNeighbor.h" +#include "neighborhood/moRealNeighborhood.h" + +//Representation and initializer +#include +#include +#include + +// fitness function +#include +#include +#include + +//Neighbors and Neighborhoods +#include +#include + +//Algorithm and its components +#include +#include + +//comparator +#include + + +#include + + +//----------------------------------------------------------------------------- +// Define types of the representation solution, different neighbors and neighborhoods +//----------------------------------------------------------------------------- +typedef eoInt Queen; //Permutation (Queen's problem representation) + +typedef moShiftNeighbor shiftNeighbor; //shift Neighbor +typedef moRndWithReplNeighborhood rndShiftNeighborhood; //rnd shift Neighborhood (Indexed) + +//----------------------------------------------------------------------------- + +typedef eoReal< eoMinimizingFitness > EOT; +typedef moRealNeighbor< EOT > Neighbor; + +int main(int ac, char** av) +{ + + + unsigned vecSize = 8; + + + queenEval fullEval; + + + eoInitPermutation init(vecSize); + + //moFullEvalByCopy shiftEval(fullEval); /// by default + + rndShiftNeighborhood rndShiftNH((vecSize-1) * (vecSize-1)); + + Queen solution; + + init(solution); + + fullEval(solution); + + moStdDevEstimator initTemp (500, rndShiftNH, fullEval); + + + std::cout << "temp: " << initTemp(solution) << std::endl; + //assert(stat.value() == 625); +} From 78a793284672e8af32fb925ad3e71fafe2ffc72e Mon Sep 17 00:00:00 2001 From: LPTK Date: Thu, 13 Jun 2013 16:29:34 +0200 Subject: [PATCH 24/28] test cleaning --- mo/test/t-moStdDevEstimator.cpp | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/mo/test/t-moStdDevEstimator.cpp b/mo/test/t-moStdDevEstimator.cpp index 43f51cb8c..a3a6d4e77 100644 --- a/mo/test/t-moStdDevEstimator.cpp +++ b/mo/test/t-moStdDevEstimator.cpp @@ -4,32 +4,21 @@ #include #include "es/eoReal.h" -#include "continuator/moFitnessVarianceStat.h" #include "neighborhood/moRealNeighbor.h" -#include "neighborhood/moRealNeighborhood.h" //Representation and initializer #include -#include +//#include #include // fitness function #include -#include -#include //Neighbors and Neighborhoods #include #include -//Algorithm and its components -#include -#include - -//comparator -#include - - +//Sampling #include @@ -48,18 +37,12 @@ typedef moRealNeighbor< EOT > Neighbor; int main(int ac, char** av) { - - unsigned vecSize = 8; - queenEval fullEval; - eoInitPermutation init(vecSize); - //moFullEvalByCopy shiftEval(fullEval); /// by default - rndShiftNeighborhood rndShiftNH((vecSize-1) * (vecSize-1)); Queen solution; @@ -70,7 +53,9 @@ int main(int ac, char** av) moStdDevEstimator initTemp (500, rndShiftNH, fullEval); + double temp = initTemp(solution); - std::cout << "temp: " << initTemp(solution) << std::endl; - //assert(stat.value() == 625); + std::cout << "temp: " << temp << std::endl; + + assert(temp >= 0); } From 34dcdb181c91a0b966f0f5f1192d3bd2616005d1 Mon Sep 17 00:00:00 2001 From: LPTK Date: Fri, 14 Jun 2013 17:03:55 +0200 Subject: [PATCH 25/28] minor changes --- mo/src/continuator/moFitnessVarianceStat.h | 43 +++++++---------- .../coolingSchedule/moTrikiCoolingSchedule.h | 46 ++++++++----------- mo/src/explorer/moMetropolisHastingExplorer.h | 14 +++++- mo/src/sampling/moStdDevEstimator.h | 25 ++++++++++ mo/test/t-moFitnessVarianceStat.cpp | 25 ++++++++++ mo/test/t-moStdDevEstimator.cpp | 25 ++++++++++ 6 files changed, 122 insertions(+), 56 deletions(-) diff --git a/mo/src/continuator/moFitnessVarianceStat.h b/mo/src/continuator/moFitnessVarianceStat.h index 1d4c7f4b6..3415ab3ea 100644 --- a/mo/src/continuator/moFitnessVarianceStat.h +++ b/mo/src/continuator/moFitnessVarianceStat.h @@ -1,35 +1,26 @@ /* - - Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 - Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau +(c) Thales group, 2010 - This software is governed by the CeCILL license under French law and - abiding by the rules of distribution of free software. You can use, - modify and/ or redistribute the software under the terms of the CeCILL - license as circulated by CEA, CNRS and INRIA at the following URL - "http://www.cecill.info". + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. - As a counterpart to the access to the source code and rights to copy, - modify and redistribute granted by the license, users are provided only - with a limited warranty and the software's author, the holder of the - economic rights, and the successive licensors have only limited liability. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - In this respect, the user's attention is drawn to the risks associated - with loading, using, modifying and/or developing or reproducing the - software by the user in light of its specific status of free software, - that may mean that it is complicated to manipulate, and that also - therefore means that it is reserved for developers and experienced - professionals having in-depth computer knowledge. Users are therefore - encouraged to load and test the software's suitability as regards their - requirements in conditions enabling the security of their systems and/or - data to be ensured and, more generally, to use and operate it in the - same conditions as regards security. - The fact that you are presently reading this means that you have had - knowledge of the CeCILL license and that you accept its terms. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux - ParadisEO WebSite : http://paradiseo.gforge.inria.fr - Contact: paradiseo-help@lists.gforge.inria.fr */ #ifndef moFitnessVarianceStat_h diff --git a/mo/src/coolingSchedule/moTrikiCoolingSchedule.h b/mo/src/coolingSchedule/moTrikiCoolingSchedule.h index 259f1747c..d98baa74c 100644 --- a/mo/src/coolingSchedule/moTrikiCoolingSchedule.h +++ b/mo/src/coolingSchedule/moTrikiCoolingSchedule.h @@ -1,37 +1,27 @@ /* - - Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2008 - (C) OPAC Team, LIFL, 2002-2008 - Sébastien Cahon, Jean-Charles Boisson (Jean-Charles.Boisson@lifl.fr) +(c) Thales group, 2010 - This software is governed by the CeCILL license under French law and - abiding by the rules of distribution of free software. You can use, - modify and/ or redistribute the software under the terms of the CeCILL - license as circulated by CEA, CNRS and INRIA at the following URL - "http://www.cecill.info". + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. - As a counterpart to the access to the source code and rights to copy, - modify and redistribute granted by the license, users are provided only - with a limited warranty and the software's author, the holder of the - economic rights, and the successive licensors have only limited liability. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - In this respect, the user's attention is drawn to the risks associated - with loading, using, modifying and/or developing or reproducing the - software by the user in light of its specific status of free software, - that may mean that it is complicated to manipulate, and that also - therefore means that it is reserved for developers and experienced - professionals having in-depth computer knowledge. Users are therefore - encouraged to load and test the software's suitability as regards their - requirements in conditions enabling the security of their systems and/or - data to be ensured and, more generally, to use and operate it in the - same conditions as regards security. - The fact that you are presently reading this means that you have had - knowledge of the CeCILL license and that you accept its terms. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - ParadisEO WebSite : http://paradiseo.gforge.inria.fr - Contact: paradiseo-help@lists.gforge.inria.fr - */ +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ #ifndef _moTrikiCoolingSchedule_h #define _moTrikiCoolingSchedule_h diff --git a/mo/src/explorer/moMetropolisHastingExplorer.h b/mo/src/explorer/moMetropolisHastingExplorer.h index 3123c4914..ee6169d99 100644 --- a/mo/src/explorer/moMetropolisHastingExplorer.h +++ b/mo/src/explorer/moMetropolisHastingExplorer.h @@ -68,7 +68,17 @@ public: * @param _solNeighborComparator a solution vs neighbor comparator * @param _nbStep maximum number of step to do */ - moMetropolisHastingExplorer(Neighborhood& _neighborhood, moEval& _eval, moNeighborComparator& _neighborComparator, moSolNeighborComparator& _solNeighborComparator, unsigned int _nbStep) : moNeighborhoodExplorer(_neighborhood, _eval), neighborComparator(_neighborComparator), solNeighborComparator(_solNeighborComparator), nbStep(_nbStep) { + moMetropolisHastingExplorer( + Neighborhood& _neighborhood, + moEval& _eval, + moNeighborComparator& _neighborComparator, + moSolNeighborComparator& _solNeighborComparator, + unsigned int _nbStep + ): moNeighborhoodExplorer(_neighborhood, _eval), + neighborComparator(_neighborComparator), + solNeighborComparator(_solNeighborComparator), + nbStep(_nbStep) + { isAccept = false; if (!neighborhood.isRandom()) { std::cout << "moMetropolisHastingExplorer::Warning -> the neighborhood used is not random" << std::endl; @@ -140,7 +150,7 @@ public: virtual bool accept(EOT & _solution) { double alpha=0.0; if (neighborhood.hasNeighbor(_solution)) { - if (solNeighborComparator(_solution, selectedNeighbor)) + if (solNeighborComparator(_solution, selectedNeighbor)) isAccept = true; else { if (_solution.fitness() != 0) { diff --git a/mo/src/sampling/moStdDevEstimator.h b/mo/src/sampling/moStdDevEstimator.h index 338984f3b..d39b88f9d 100644 --- a/mo/src/sampling/moStdDevEstimator.h +++ b/mo/src/sampling/moStdDevEstimator.h @@ -1,3 +1,28 @@ +/* + +(c) Thales group, 2010 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ + #ifndef __moStdDevEstimator_h__ #define __moStdDevEstimator_h__ diff --git a/mo/test/t-moFitnessVarianceStat.cpp b/mo/test/t-moFitnessVarianceStat.cpp index 8f343a6ac..a1510a831 100644 --- a/mo/test/t-moFitnessVarianceStat.cpp +++ b/mo/test/t-moFitnessVarianceStat.cpp @@ -1,3 +1,28 @@ +/* + +(c) Thales group, 2010 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ + //----------------------------------------------------------------------------- // t-moFitnessNeighborStat.cpp //----------------------------------------------------------------------------- diff --git a/mo/test/t-moStdDevEstimator.cpp b/mo/test/t-moStdDevEstimator.cpp index a3a6d4e77..6473ffceb 100644 --- a/mo/test/t-moStdDevEstimator.cpp +++ b/mo/test/t-moStdDevEstimator.cpp @@ -1,3 +1,28 @@ +/* + +(c) Thales group, 2010 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ + //----------------------------------------------------------------------------- // t-moStdDevEstimator.cpp //----------------------------------------------------------------------------- From 10e024b6a19fff8e4954acfac392c4dc058f64a8 Mon Sep 17 00:00:00 2001 From: LPTK Date: Fri, 14 Jun 2013 17:21:08 +0200 Subject: [PATCH 26/28] removed useless inheritance --- mo/src/neighborhood/moRealNeighbor.h | 25 +++++++++++++++++ mo/src/neighborhood/moRealNeighborhood.h | 35 ++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/mo/src/neighborhood/moRealNeighbor.h b/mo/src/neighborhood/moRealNeighbor.h index 4af8924f2..e4a4a18d6 100644 --- a/mo/src/neighborhood/moRealNeighbor.h +++ b/mo/src/neighborhood/moRealNeighbor.h @@ -1,3 +1,28 @@ +/* + +(c) Thales group, 2010 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ + #ifndef __moRealNeighbor_h__ #define __moRealNeighbor_h__ diff --git a/mo/src/neighborhood/moRealNeighborhood.h b/mo/src/neighborhood/moRealNeighborhood.h index 5efa3ec6f..e839d16fa 100644 --- a/mo/src/neighborhood/moRealNeighborhood.h +++ b/mo/src/neighborhood/moRealNeighborhood.h @@ -1,3 +1,27 @@ +/* + +(c) Thales group, 2010 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ #ifndef __moRealNeighborhood_h__ #define __moRealNeighborhood_h__ @@ -7,7 +31,7 @@ #include "neighborhood/moRealNeighbor.h" template -class moRealNeighborhood : public moRndNeighborhood< Neighbor >, public eoFunctorBase +class moRealNeighborhood : public moRndNeighborhood< Neighbor > { public: typedef typename Distrib::EOType EOT; @@ -19,7 +43,14 @@ protected: public: - moRealNeighborhood( Distrib & distrib, edoSampler & sampler, edoBounder & bounder ) : _distrib(distrib), _sampler(sampler), _bounder(bounder) {} + moRealNeighborhood( + Distrib& distrib, + edoSampler& sampler, + edoBounder& bounder + ): _distrib(distrib), + _sampler(sampler), + _bounder(bounder) + { } /** * It alway remains at least a solution in an infinite neighborhood From 270add8a97a155a98c2c5299946e5a455b766db8 Mon Sep 17 00:00:00 2001 From: LPTK Date: Mon, 17 Jun 2013 14:28:50 +0200 Subject: [PATCH 27/28] triki tests --- .../coolingSchedule/moTrikiCoolingSchedule.h | 2 +- mo/src/sampling/moStdDevEstimator.h | 2 +- mo/test/t-moTrikiReal.cpp | 188 ++++++++++++++++++ 3 files changed, 190 insertions(+), 2 deletions(-) diff --git a/mo/src/coolingSchedule/moTrikiCoolingSchedule.h b/mo/src/coolingSchedule/moTrikiCoolingSchedule.h index d98baa74c..e120f9440 100644 --- a/mo/src/coolingSchedule/moTrikiCoolingSchedule.h +++ b/mo/src/coolingSchedule/moTrikiCoolingSchedule.h @@ -32,7 +32,7 @@ Lionel Parreaux #include #include #include -#include +#include /* diff --git a/mo/src/sampling/moStdDevEstimator.h b/mo/src/sampling/moStdDevEstimator.h index d39b88f9d..63afb6d24 100644 --- a/mo/src/sampling/moStdDevEstimator.h +++ b/mo/src/sampling/moStdDevEstimator.h @@ -49,7 +49,7 @@ public: */ moStdDevEstimator ( moContinuator& continuator, - moNeighborhood < Neighbor > & neighborhood, + moNeighborhood& neighborhood, eoEvalFunc& fullEval, /* The following should be read: diff --git a/mo/test/t-moTrikiReal.cpp b/mo/test/t-moTrikiReal.cpp index e69de29bb..9b8038ba7 100644 --- a/mo/test/t-moTrikiReal.cpp +++ b/mo/test/t-moTrikiReal.cpp @@ -0,0 +1,188 @@ +/* + +(c) Thales group, 2010 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; + version 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact: http://eodev.sourceforge.net + +Authors: +Lionel Parreaux + +*/ + +#include +#include +#include +#include + +//#include + +#include + +#include "neighborhood/moRealNeighbor.h" +#include "neighborhood/moRealNeighborhood.h" + +#include "sampling/moStdDevEstimator.h" + +#include "coolingSchedule/moTrikiCoolingSchedule.h" + + +//#include "moRealInitTemperature.h" + +//#include "do/make_real_init_temperature.h" + +typedef eoReal< eoMinimizingFitness > EOT; +typedef moRealNeighbor< EOT > Neighbor; + +double objective_function(const EOT & sol) +{ + double sum = 0; + + for ( size_t i = 0; i < sol.size(); ++i ) + { + sum += sol[i] * sol[i]; + } + + return sum; +} + +int main( int ac, char** av ) +{ + eoParser parser( ac, av ); + + eoState state; + + eoEvalFuncPtr< EOT, double > eval( objective_function ); + moFullEvalByCopy< Neighbor > fullEval( eval ); + + //moNeighborhood< Neighbor >* neighborhood; + + int dimSize = 20; + + //moRealInitTemperature< EOT >& real_init = do_make_real_init_temperature( parser, state, eval ); + //moInitTemperature< EOT, Neighbor >& real_init = do_make_real_init_temperature( parser, state, eval, neval ); + //moInitTemperature< EOT, Neighbor >& real_init = do_make_init_temperature( parser, state, eval, neval, neighborhood ); + //moStdDevEstimator< EOT, Neighbor >& real_init = do_make_init_temperature( parser, state, eval, neval, neighborhood, dimSize ); + + + //------------------------------------------------------- + // Parameters + //------------------------------------------------------- + + std::string section( "Temperature initialization paramaters" ); + + unsigned int dimension_size = parser.getORcreateParam( (unsigned int)dimSize, "dimension-size", "Dimension size", 'd', section ).value(); + double jump_bound = parser.getORcreateParam( (double)1, "jump-bound", "Bound of jump", '\0', section ).value(); + unsigned int maxiter = parser.getORcreateParam( (unsigned int)10, "max-iter", "Maximum number of iterations", '\0', section ).value(); + //unsigned int ratio = parser.getORcreateParam( (unsigned int)1, "ratio", "Bounder ratio", '\0', section ).value(); // not used + + //------------------------------------------------------- + + + //------------------------------------------------------- + // Instanciate needed classes + //------------------------------------------------------- + + edoUniform< EOT > distrib( EOT(dimension_size, -1 * jump_bound), EOT(dimension_size, 1 * jump_bound) ); + + edoBounder< EOT > bounder_search( EOT(dimension_size, -10), EOT(dimension_size, 10) ); + + edoSamplerUniform< EOT > sampler( bounder_search ); + + //moRealNeighborhood< edoUniform< EOT >, Neighbor >* neighborhood = new moRealNeighborhood< edoUniform< EOT >, Neighbor >( *distrib, *sampler, *bounder_search ); + moRealNeighborhood< edoUniform< EOT >, Neighbor > neighborhood( distrib, sampler, bounder_search ); + //state.storeFunctor(neighborhood);state.storeFunctor(neighborhood); + + //moStdDevEstimator< EOT, Neighbor >* init = new moStdDevEstimator< EOT, Neighbor >( *neighborhood, fullEval, eval, maxiter ); + //moStdDevEstimator< EOT, Neighbor > init( maxiter, neighborhood, fullEval, eval ); + moStdDevEstimator< EOT, Neighbor > init( maxiter, neighborhood, fullEval ); + + //------------------------------------------------------- + + + + + //------------------------------------------------------- + // Help + Verbose routines + //------------------------------------------------------- + + if (parser.userNeedsHelp()) + { + parser.printHelp(std::cout); + exit(1); + } + + make_help(parser); + + //------------------------------------------------------- + + + //EOT solution(2, 5); + EOT solution(dimSize, 5); + /* + real_init( solution ); + + std::cout << "do_make_real_init_temperature( parser, eval ): " + << real_init.value() + << std::endl; + */ + + std::cout << "do_make_real_init_temperature( parser, eval ): " + << init( solution ) + << std::endl; + + + + + moTrueContinuator continuator; + moCheckpoint checkpoint(continuator); + moFitnessStat fitStat; + checkpoint.add(fitStat); + eoFileMonitor monitor("triki.out", ""); + //eoGnuplot1DMonitor monitor2("trikignu.out", true); + moCounterMonitorSaver countMon(1, monitor); + checkpoint.add(countMon); + //moCounterMonitorSaver gnuMon (1, monitor2); + //checkpoint.add(gnuMon); + monitor.add(fitStat); + //monitor2.add(fitStat); + + + + moTrikiCoolingSchedule coolingSchedule ( + neighborhood, neval, init( solution ), + //50, + 200, //150, + //100 + 350 // 250 + ); + moSA localSearch(*neighborhood, eval, fullEval, coolingSchedule, checkpoint); + + std::cout << "#########################################" << std::endl; + std::cout << "initial solution1: " << solution << std::endl ; + + localSearch(solution); + + std::cout << "final solution1: " << solution << std::endl ; + std::cout << "#########################################" << std::endl; + + //delete neighborhood; + + return 0; +} + + + From 7f9b8fe6070d864ac29ab7ff05cae05b82b0aa58 Mon Sep 17 00:00:00 2001 From: LPTK Date: Mon, 17 Jun 2013 17:15:07 +0200 Subject: [PATCH 28/28] changelog update --- eo/NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/eo/NEWS b/eo/NEWS index 6657f36b8..4161ff613 100644 --- a/eo/NEWS +++ b/eo/NEWS @@ -1,4 +1,5 @@ * current release: + - added an EOT& parameter to the moCoolingSchedule::update interface because some cooling schedules need it * release 1.3.1 (2012-07-27) - the eo::mpi modules is no longer dependent from boost::mpi