25 #ifndef INTERRUPTIBLE_ALORITHM_RUNNER_H
26 #define INTERRUPTIBLE_ALORITHM_RUNNER_H
45 #include <boost/bind.hpp>
46 #include <boost/filesystem.hpp>
47 #include <boost/format.hpp>
48 #include <boost/optional.hpp>
49 #include <boost/progress.hpp>
50 #include <boost/property_tree/ptree.hpp>
51 #include <boost/property_tree/json_parser.hpp>
52 #include <boost/signals.hpp>
68 template<
typename Algo,
typename Function>
73 typedef Algo algo_type;
76 typedef typename algo_type::SolutionSetType result_type;
79 typedef Function function_type;
86 const std::string & optimizerName,
87 const std::string & objectiveFunctionName,
89 std::size_t searchSpaceDimension,
90 std::size_t objectiveSpaceDimension,
91 std::size_t evaluationCounter,
117 typedef boost::signal<
120 SHARK_ARGUMENT(
const result_type &,
"Actual optimization results" ),
129 boost::shared_ptr< Algo > algo = boost::shared_ptr< Algo >(
new Algo ),
130 boost::shared_ptr< Function >
function = boost::shared_ptr< Function >(
new Function() ) )
153 void run(
unsigned int seed,
154 unsigned int interval,
158 unsigned int timeLimit,
159 const boost::optional< boost::property_tree::ptree > & configNode = boost::optional< boost::property_tree::ptree >() )
161 shark::Rng::seed( seed );
180 boost::progress_display pd( g, std::clog );
183 std::size_t currentEvaluationCount = 0;
185 while(
mep_function->evaluationCounter() <= g &&
m_pt.elapsed() / 3600 < timeLimit ) {
189 if(
mep_function->evaluationCounter() % interval == 0 ) {
203 pd +=
mep_function->evaluationCounter() - currentEvaluationCount;
204 currentEvaluationCount =
mep_function->evaluationCounter();
226 static int main(
int argc,
char ** argv ) {
233 plaintTextLogHandler->setFormatter(
242 options.
addOption( ReportFitnessFunctionsTag() );
244 if( !options.
parse( argc, argv ) ) {
247 return( EXIT_FAILURE );
250 if( options.
hasValue( ReportFitnessFunctionsTag() ) ) {
251 shark::moo::RealValuedObjectiveFunctionFactory::instance().print( std::cout );
252 return( EXIT_SUCCESS );
255 if(options.
hasValue( shark::moo::Experiment::Options::DefaultAlgorithmUsageTag()) ) {
256 boost::property_tree::ptree pt;
258 boost::property_tree::write_json(std::cout, pt);
259 return( EXIT_SUCCESS );
262 if( options.
value( shark::moo::Experiment::Options::ObjectiveFunctionTag() ).empty() ) {
265 return( EXIT_FAILURE );
268 boost::optional< boost::property_tree::ptree > configurationTree;
270 if( !options.
value( shark::moo::Experiment::Options::AlgorithmConfigFile() ).empty() ) {
272 boost::property_tree::ptree pt;
273 boost::property_tree::read_json( options.
value( shark::moo::Experiment::Options::AlgorithmConfigFile() ), pt );
274 configurationTree = pt;
277 return( EXIT_FAILURE );
281 std::string resultFormat = options.
value( shark::moo::Experiment::Options::ResultFormatTag());
283 std::string objectiveFunction = options.
value( shark::moo::Experiment::Options::ObjectiveFunctionTag() );
290 front_store_type frontStore;
291 frontStore.
m_resultDir = options.
value( shark::moo::Experiment::Options::ResultDirTag() );
292 if(resultFormat ==
"JSON")
293 frontStore.m_format = front_store_type::JSON_FORMAT;
294 else if(resultFormat ==
"RawText")
295 frontStore.m_format = front_store_type::RAW_TEXT_FORMAT;
299 "Storing results to: " + frontStore.m_resultDir,
300 "InterruptibleAlgorithmRunner::main" );
302 runner_type abstractRunner(
310 abstractRunner.signalResultsAvailable().connect(
312 &front_store_type::onNewResult,
313 boost::ref( frontStore ),
319 options.
value( shark::moo::Experiment::Options::SeedTag() ),
320 options.
value( shark::moo::Experiment::Options::StorageIntervalTag() ),
321 options.
value( shark::moo::Experiment::Options::SearchSpaceDimensionTag() ),
322 options.
value( shark::moo::Experiment::Options::ObjectiveSpaceDimensionTag() ),
323 options.
value( shark::moo::Experiment::Options::MaxNoEvaluationsTag() ),
324 options.
value( shark::moo::Experiment::Options::TimeLimitTag() ),
330 return( EXIT_SUCCESS );
405 exit( EXIT_SUCCESS );
421 template<
typename Algo,
typename Function>
426 typedef Algo algo_type;
429 typedef typename algo_type::SolutionSetType result_type;
432 typedef Function function_type;
440 const std::string & optimizerName,
441 const std::string & objectiveFunctionName,
443 std::size_t searchSpaceDimension,
444 std::size_t evaluationCounter,
469 typedef boost::signal<
472 SHARK_ARGUMENT(
const result_type &,
"Actual optimization results" ),
481 boost::shared_ptr< Algo > algo = boost::shared_ptr< Algo >(
new Algo ),
482 boost::shared_ptr< Function >
function = boost::shared_ptr< Function >(
new Function() ) ) :
mep_algorithm( algo ),
496 void run(
unsigned int seed,
497 unsigned int interval,
500 unsigned int timeLimit,
501 double fitnessLimit = 1E-10,
502 const boost::optional< boost::property_tree::ptree > & configNode = boost::optional< boost::property_tree::ptree >()
506 ( boost::format(
"run( seed=%1%, interval=%2%, n=%3%, g=%4%, timeLimit=%5%, fitnessLimit=%6% )" ) % seed % interval % n % g % timeLimit % fitnessLimit ).str(),
507 "shark::soo::InterruptibleAlgorithmRunner::run()"
509 shark::Rng::seed( seed );
526 boost::progress_display pd( g, std::clog );
529 std::size_t currentEvaluationCount = 0;
535 if(
mep_function->evaluationCounter() % interval == 0 ) {
550 pd +=
mep_function->evaluationCounter() - currentEvaluationCount;
551 currentEvaluationCount =
mep_function->evaluationCounter();
573 static int main(
int argc,
char ** argv ) {
578 > plaintTextLogHandler(
581 plaintTextLogHandler->setFormatter(
590 options.
addOption( ReportFitnessFunctionsTag() );
592 if( !options.
parse( argc, argv ) ) {
595 return( EXIT_FAILURE );
598 if( options.
hasValue( ReportFitnessFunctionsTag() ) ) {
599 shark::soo::RealValuedObjectiveFunctionFactory::instance().print( std::cout );
600 return( EXIT_SUCCESS );
604 shark::soo::Experiment::Options::DefaultAlgorithmUsageTag())) {
605 boost::property_tree::ptree pt;
607 boost::property_tree::write_json(std::cout, pt);
608 return( EXIT_SUCCESS );
611 if( options.
value( shark::moo::Experiment::Options::ObjectiveFunctionTag() ).empty() ) {
614 return( EXIT_FAILURE );
617 boost::optional< boost::property_tree::ptree > configurationTree;
619 if( !options.
value( shark::moo::Experiment::Options::AlgorithmConfigFile() ).empty() ) {
621 boost::property_tree::ptree pt;
622 boost::property_tree::read_json( options.
value( shark::moo::Experiment::Options::AlgorithmConfigFile() ), pt );
623 configurationTree = pt;
626 return( EXIT_FAILURE );
631 std::string objectiveFunction = options.
value( shark::moo::Experiment::Options::ObjectiveFunctionTag() );
652 runner_type abstractRunner(
675 options.
value( shark::moo::Experiment::Options::SeedTag() ),
676 options.
value( shark::moo::Experiment::Options::StorageIntervalTag() ),
677 options.
value( shark::moo::Experiment::Options::SearchSpaceDimensionTag() ),
678 options.
value( shark::moo::Experiment::Options::MaxNoEvaluationsTag() ),
679 options.
value( shark::moo::Experiment::Options::TimeLimitTag() ),
680 options.
value( shark::moo::Experiment::Options::FitnessLimitTag() ),
686 return( EXIT_SUCCESS );
761 exit( EXIT_SUCCESS );