diff --git a/eo/src/do/make_checkpoint.h b/eo/src/do/make_checkpoint.h index 74145d844..8e5295115 100644 --- a/eo/src/do/make_checkpoint.h +++ b/eo/src/do/make_checkpoint.h @@ -59,6 +59,24 @@ eoCheckPoint& do_make_checkpoint(eoParser& _parser, eoState& _state, eoValu _state.storeFunctor(checkpoint); + //////////////////// + // Signal monitoring + //////////////////// + +#ifndef _MSC_VER + // the CtrlC monitoring interception + eoSignal *mon_ctrlCCont; + eoValueParam& mon_ctrlCParam = _parser.createParam(false, "monitor-with-CtrlC", "Monitor current generation upon Ctrl C",0, "Stopping criterion"); + if (mon_ctrlCParam.value()) + { + mon_ctrlCCont = new eoSignal; + // store + _state.storeFunctor(mon_ctrlCCont); + // add to checkpoint + checkpoint->add(*mon_ctrlCCont); + } +#endif + /////////////////// // Counters ////////////////// @@ -117,18 +135,24 @@ eoCheckPoint& do_make_checkpoint(eoParser& _parser, eoState& _state, eoValu _state.storeFunctor(bestStat); // add it to the checkpoint checkpoint->add(*bestStat); + // check if monitoring with signal + if ( mon_ctrlCParam.value() ) + mon_ctrlCCont->add(*bestStat); } // Average fitness alone //---------------------- eoAverageStat *averageStat = NULL; // do we need averageStat? - if ( plotBestParam.value() ) // we need it for gnuplot output + if ( printBestParam.value() || plotBestParam.value() || fileBestParam.value() ) // we need it for gnuplot output { averageStat = new eoAverageStat; // store it _state.storeFunctor(averageStat); // add it to the checkpoint checkpoint->add(*averageStat); + // check if monitoring with signal + if ( mon_ctrlCParam.value() ) + mon_ctrlCCont->add(*averageStat); } // Second moment stats: average and stdev @@ -141,6 +165,9 @@ eoCheckPoint& do_make_checkpoint(eoParser& _parser, eoState& _state, eoValu _state.storeFunctor(secondStat); // add it to the checkpoint checkpoint->add(*secondStat); + // check if monitoring with signal + if ( mon_ctrlCParam.value() ) + mon_ctrlCCont->add(*secondStat); } // Dump of the whole population @@ -155,6 +182,9 @@ eoCheckPoint& do_make_checkpoint(eoParser& _parser, eoState& _state, eoValu _state.storeFunctor(popStat); // add it to the checkpoint checkpoint->add(*popStat); + // check if monitoring with signal + if ( mon_ctrlCParam.value() ) + mon_ctrlCCont->add(*popStat); } // do we wnat some histogram of fitnesses snpashots? @@ -175,7 +205,11 @@ eoCheckPoint& do_make_checkpoint(eoParser& _parser, eoState& _state, eoValu _state.storeFunctor(monitor); // when called by the checkpoint (i.e. at every generation) - checkpoint->add(*monitor); + // check if monitoring with signal + if ( ! mon_ctrlCParam.value() ) + checkpoint->add(*monitor); + else + mon_ctrlCCont->add(*monitor); // the monitor will output a series of parameters: add them monitor->add(*generationCounter); @@ -186,7 +220,11 @@ eoCheckPoint& do_make_checkpoint(eoParser& _parser, eoState& _state, eoValu { tCounter = new eoTimeCounter; _state.storeFunctor(tCounter); - checkpoint->add(*tCounter); + // check if monitoring with signal + if ( ! mon_ctrlCParam.value() ) + checkpoint->add(*tCounter); + else + mon_ctrlCCont->add(*tCounter); monitor->add(*tCounter); } diff --git a/eo/src/utils/checkpointing b/eo/src/utils/checkpointing index 7e3c34a68..f7fd0e55b 100644 --- a/eo/src/utils/checkpointing +++ b/eo/src/utils/checkpointing @@ -36,6 +36,7 @@ #include #endif #include +#include #include #include #include diff --git a/eo/src/utils/eoSignal.h b/eo/src/utils/eoSignal.h index 7eeafe3ce..9a89cb196 100644 --- a/eo/src/utils/eoSignal.h +++ b/eo/src/utils/eoSignal.h @@ -52,13 +52,23 @@ public : eoSignal( int sig = SIGINT ) : eoCheckPoint( _dummyContinue ), _sig( sig ) { ::signals_called[_sig] = false; + +#ifndef _WINDOWS +#ifdef SIGQUIT ::signal( _sig, handler ); +#endif // !SIGQUIT +#endif // !_WINDOWS } eoSignal( eoContinue& _cont, int sig = SIGINT ) : eoCheckPoint( _cont ), _sig( sig ) { ::signals_called[_sig] = false; + +#ifndef _WINDOWS +#ifdef SIGQUIT ::signal( _sig, handler ); +#endif // !SIGQUIT +#endif // !_WINDOWS } bool operator()( const eoPop& _pop )