Commit d0ef02db authored by cortes_c's avatar cortes_c
Browse files

Merge branch 'master' of gitlab.psi.ch:OPAL/src

Conflicts:
	src/Distribution/Distribution.cpp
	src/Distribution/SigmaGenerator.h
parents e79828a5 c68ab099
......@@ -15,6 +15,7 @@ src/OPALrevision.h
src/opal
tests/tools/gtest
tests/opal_unit_tests
tests/OpalSourcePath.h
doc/user_guide/opal_user_guide.bcf
doc/user_guide/opal_user_guide.idx
doc/user_guide/opal_user_guide.lof
......@@ -24,4 +25,4 @@ doc/user_guide/opal_user_guide.out
doc/user_guide/opal_user_guide.pdf
doc/user_guide/opal_user_guide.run.xml
doc/user_guide/opal_user_guide.synctex.gz
doc/user_guide/opal_user_guide.toc
\ No newline at end of file
doc/user_guide/opal_user_guide.toc
......@@ -4,9 +4,6 @@
#include <set>
#include <vector>
#include "boost/foreach.hpp"
#define foreach BOOST_FOREACH
#include "Comm/Splitter/SplitStrategy.h"
typedef std::vector<int> coordinates_t;
......@@ -52,12 +49,12 @@ public:
}
// 3. Compute centroids of partition and assign master
foreach(region_t & region, regions_) {
for(region_t & region : regions_) {
computeCentroid(region);
}
// 4. Create communicator groups
foreach(region_t & region, regions_) {
for(region_t & region : regions_) {
bool is_worker = false;
coordinates_t iter = region.origin;
......@@ -107,7 +104,7 @@ protected:
int split_in_direction = 0;
int max_ext_dir = 0;
foreach(region_t region, regions_) {
for(region_t region : regions_) {
for(int dim = 0; dim < topology_.getNumDimensions(); dim++) {
if(region.extensions[dim] > max_ext_dir) {
split_in_direction = dim;
......
......@@ -5,9 +5,6 @@
#include "Comm/Splitter/SplitStrategy.h"
#include "boost/foreach.hpp"
#define foreach BOOST_FOREACH
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
......@@ -41,7 +38,7 @@ public:
int num_assigned_masters = 0;
// assign workers uniform at random to each master
foreach(int master_pid, master_pids) {
for(int master_pid : master_pids) {
if(master_pid == rank_) role_ = Role_t.POLLER;
......
......@@ -33,6 +33,7 @@
#include "Expression/RadialPeak.h"
#include "Expression/SumErrSqRadialPeak.h"
#include "Expression/MaxNormRadialPeak.h"
#include "Expression/NumberOfPeaks.h"
#include "Expression/ProbeVariable.h"
//////////////////////////////////////////////////////////////////////////////
......@@ -82,6 +83,9 @@ int main(int argc, char** argv) {
ff = MaxNormRadialPeak();
funcs.insert(std::pair<std::string, client::function::type>
("maxNormRadialPeak", ff));
ff = NumberOfPeaks();
funcs.insert(std::pair<std::string, client::function::type>
("numberOfPeaks", ff));
ff = SumErrSqRadialPeak();
funcs.insert(std::pair<std::string, client::function::type>
("sumErrSqRadialPeak", ff));
......
......@@ -3,6 +3,7 @@ SET (_EXPR_SRCS
SumErrSq.cpp
FromFile.cpp
MaxNormRadialPeak.cpp
NumberOfPeaks.h
RadialPeak.cpp
SumErrSqRadialPeak.cpp
Parser/expression.cpp
......
......@@ -14,7 +14,6 @@
#include "Expression/Parser/skipper.hpp"
#include "Expression/Parser/function.hpp"
#include <boost/foreach.hpp>
#include <boost/function.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/variant/get.hpp>
......
......@@ -11,8 +11,6 @@
#include "boost/variant/get.hpp"
#include "boost/variant/variant.hpp"
#include "boost/smart_ptr.hpp"
#include "boost/foreach.hpp"
#define foreach BOOST_FOREACH
#include "Util/Types.h"
#include "Util/OptPilotException.h"
......@@ -43,7 +41,7 @@ struct FromFile {
return boost::make_tuple(0.0, false);
}
foreach(double obj_value, values_)
for(double obj_value : values_)
sum += obj_value;
return boost::make_tuple(sum, is_valid);
......
#include "Expression/NumberOfPeaks.h"
const std::string name = "NumberOfPeaks";
#ifndef __NUMBER_OF_PEAKS_H__
#define __NUMBER_OF_PEAKS_H__
#include <string>
#include <cmath>
#include "boost/type_traits/remove_cv.hpp"
#include "boost/variant/get.hpp"
#include "boost/variant/variant.hpp"
#include "boost/smart_ptr.hpp"
#include "Util/Types.h"
#include "Util/PeakReader.h"
#include "Expression/Parser/function.hpp"
/**
* A simple expression to check the number of turns in a circular machine. It checks
* probe files (*.peaks) and counts the number of turns.
*/
struct NumberOfPeaks {
static const std::string name;
Expressions::Result_t operator()(client::function::arguments_t args) {
sim_filename_ = boost::get<std::string>(args[0]);
bool is_valid = true;
boost::scoped_ptr<PeakReader> sim_peaks(new PeakReader(sim_filename_));
std::size_t nPeaks = 0;
try {
sim_peaks->parseFile();
nPeaks = sim_peaks->getNumberOfPeaks();
} catch (OptPilotException &ex) {
std::cout << "Caught exception: " << ex.what() << std::endl;
is_valid = false;
}
return boost::make_tuple(nPeaks, is_valid);
}
private:
std::string sim_filename_;
// define a mapping to arguments in argument vector
boost::tuple<std::string> argument_types;
};
#endif
// vi: set et ts=4 sw=4 sts=4:
// Local Variables:
// mode:c
// c-basic-offset: 4
// indent-tabs-mode:nil
// End:
......@@ -4,7 +4,6 @@
=============================================================================*/
#include "evaluator.hpp"
#include <boost/foreach.hpp>
#include <boost/variant/apply_visitor.hpp>
namespace client { namespace code_gen {
......@@ -101,8 +100,7 @@ namespace client { namespace code_gen {
bool StackEvaluator::operator()(ast::function_call const& x) {
BOOST_FOREACH(ast::function_call_argument const& arg, x.args) {
for(ast::function_call_argument const& arg : x.args) {
if (!boost::apply_visitor(*this, arg))
return false;
}
......@@ -135,7 +133,7 @@ namespace client { namespace code_gen {
if (!boost::apply_visitor(*this, x.first))
return false;
BOOST_FOREACH(ast::operation const& oper, x.rest) {
for(ast::operation const& oper : x.rest) {
if (!(*this)(oper))
return false;
}
......
......@@ -60,8 +60,7 @@ namespace client { namespace code_gen
bool operator()(ast::function_call const& x) {
functions_.insert(x.function_name.name);
BOOST_FOREACH(ast::function_call_argument const& arg, x.args) {
for(ast::function_call_argument const& arg: x.args) {
if (!boost::apply_visitor(*this, arg))
return false;
//if (!(*this)(arg))
......@@ -75,7 +74,7 @@ namespace client { namespace code_gen
if (!boost::apply_visitor(*this, x.first))
return false;
BOOST_FOREACH(ast::operation const& oper, x.rest) {
for(ast::operation const& oper: x.rest) {
if (!(*this)(oper))
return false;
}
......
......@@ -10,8 +10,6 @@
#include "boost/variant/get.hpp"
#include "boost/variant/variant.hpp"
#include "boost/smart_ptr.hpp"
#include "boost/foreach.hpp"
#define foreach BOOST_FOREACH
#include "Util/Types.h"
#include "Util/SDDSReader.h"
......@@ -58,7 +56,7 @@ struct SumErrSq {
double sum = 0;
foreach(Measurement measurement, measurements_) {
for(Measurement measurement : measurements_) {
double sim_value = 0.0;
try {
sim_stats->getInterpolatedValue(
......
......@@ -61,11 +61,13 @@ public:
* @param[in] dim number of objectives
* @param[in] comms available to the optimizer
* @param[in] args the user passed on the command line
* @param[in] hypervolRef hypervolume reference point
*/
FixedPisaNsga2(Expressions::Named_t objectives,
Expressions::Named_t constraints,
DVarContainer_t dvars, size_t dim, Comm::Bundle_t comms,
CmdArguments_t args);
CmdArguments_t args,
std::vector<double> hypervolRef);
~FixedPisaNsga2();
......@@ -162,7 +164,7 @@ private:
std::string execAlgo_m;
/// indicating if initial population has been created
bool notInitialized_m;
bool initialized_m;
/// bounds on each specified gene
......@@ -175,10 +177,12 @@ private:
DVarContainer_t dvars_m;
/// command line arguments specified by the user
CmdArguments_t args_;
CmdArguments_t args_m;
/// size of initial population
size_t alpha_m;
/// initial population optimization flag (doubles initial population)
bool initialOptimization_m;
/// number of parents the selector chooses
//size_t mu_m;
/// number of children the variator produces
......@@ -205,6 +209,9 @@ private:
double conv_hvol_progress_;
double hvol_progress_;
/// hypervolume reference point
std::vector<double> hvol_ref_m;
/// file header for result files contains this parameter description
std::string file_param_descr_;
......@@ -222,8 +229,8 @@ private:
/// executes one loop of the PISA state machine
void runStateMachine();
/// passes num_individuals to the selector
void toSelectorAndCommit(int num_individuals);
/// passes finished individuals to the selector
void toSelectorAndCommit();
/// how often do we exchange solutions with other optimizers
size_t exchangeSolStateFreq_m;
......
......@@ -11,8 +11,6 @@
#include <sys/stat.h>
#include "boost/algorithm/string.hpp"
#include "boost/foreach.hpp"
#define foreach BOOST_FOREACH
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
......@@ -32,15 +30,17 @@ FixedPisaNsga2<CO, MO>::FixedPisaNsga2(
Expressions::Named_t constraints,
DVarContainer_t dvars,
size_t dim, Comm::Bundle_t comms,
CmdArguments_t args)
CmdArguments_t args,
std::vector<double> hypervolRef)
: Optimizer(comms.opt)
, statistics_(new Statistics<size_t>("individuals"))
, comms_(comms)
, objectives_m(objectives)
, constraints_m(constraints)
, dvars_m(dvars)
, args_(args)
, args_m(args)
, dim_m(dim)
, hvol_ref_m(hypervolRef)
{
my_local_pid_ = 0;
MPI_Comm_rank(comms_.opt, &my_local_pid_);
......@@ -48,10 +48,10 @@ FixedPisaNsga2<CO, MO>::FixedPisaNsga2(
//FIXME: proper rand gen initialization (use boost?!)
srand(time(NULL) + comms_.island_id);
dump_freq_ = args->getArg<int>("dump-freq", 1, false);
dump_freq_ = args->getArg<int>("dump-freq", 1, false);
maxGenerations_m = args->getArg<int>("maxGenerations", true);
resultFile_m = args->getArg<std::string>("outfile", "-th_generation.dat", false);
resultDir_m = args->getArg<std::string>("outdir", "generations", false);
resultFile_m = args->getArg<std::string>("outfile", "-th_generation.dat", false);
resultDir_m = args->getArg<std::string>("outdir", "generations", false);
// create output directory if it does not exists
struct stat dirInfo;
......@@ -75,6 +75,7 @@ FixedPisaNsga2<CO, MO>::FixedPisaNsga2(
alpha_m = args->getArg<int>("initialPopulation", true);
lambda_m = num_ind_in_generation;
//mu_m = num_ind_in_generation;
initialOptimization_m = args->getArg<bool>("initial-optimization", false);
file_param_descr_ = "%ID,";
......@@ -86,7 +87,7 @@ FixedPisaNsga2<CO, MO>::FixedPisaNsga2(
DVarContainer_t::iterator itr;
std::vector<std::string> dNames;
for(itr = dvars_m.begin(); itr != dvars_m.end(); itr++) {
std::string dName = boost::get<VAR_NAME>(itr->second);
file_param_descr_ += '%' + dName + ',';
......@@ -101,8 +102,7 @@ FixedPisaNsga2<CO, MO>::FixedPisaNsga2(
// setup variator
variator_m.reset(new Variator_t(alpha_m, dNames, dVarBounds_m, constraints_m,
args));
variator_m.reset(new Variator_t(dNames, dVarBounds_m, constraints_m, args));
// Traces and statistics
......@@ -140,17 +140,18 @@ template<
void FixedPisaNsga2<CO, MO>::initialize() {
curState_m = Initialize;
notInitialized_m = true;
initialized_m = false;
// start poll loop
run_clock_start_ = boost::chrono::system_clock::now();
last_clock_ = boost::chrono::system_clock::now();
last_clock_ = boost::chrono::system_clock::now();
run();
// run has ended
bool compHyvol = (objectives_m.size() > (hyper_opt / 2 + 1));
if (compHyvol)
current_hvol_ =
variator_m->population()->computeHypervolume(comms_.island_id);
variator_m->population()->computeHypervolume(comms_.island_id, hvol_ref_m);
boost::chrono::duration<double> total =
boost::chrono::system_clock::now() - run_clock_start_;
......@@ -206,7 +207,7 @@ bool FixedPisaNsga2<CO, MO>::onMessage(MPI_Status status, size_t length) {
delete[] buffer;
std::set<unsigned int> new_state_ids;
foreach(individual ind, new_states) {
for (individual ind : new_states) {
// only insert individual if not already in population
if(variator_m->population()->isRepresentedInPopulation(ind.genes))
......@@ -262,9 +263,8 @@ bool FixedPisaNsga2<CO, MO>::onMessage(MPI_Status status, size_t length) {
ind->objectives.clear();
//XXX: check order of genes
reqVarContainer_t::iterator itr;
std::map<std::string, double> vars;
for(itr = res.begin(); itr != res.end(); itr++) {
reqVarContainer_t::iterator itr = res.begin();
for(; itr != res.end(); ++itr) {
// mark invalid if expression could not be evaluated or constraint does not hold
if(!itr->second.is_valid || (itr->second.value.size() > 1 && !itr->second.value[0])) {
std::ostringstream dump;
......@@ -321,7 +321,7 @@ void FixedPisaNsga2<CO, MO>::postPoll() {
bool compHyvol = (objectives_m.size() > (hyper_opt / 2 + 1));
if (compHyvol) {
double hvol =
variator_m->population()->computeHypervolume(comms_.island_id);
variator_m->population()->computeHypervolume(comms_.island_id, hvol_ref_m);
hvol_progress_ = fabs(current_hvol_ - hvol) / current_hvol_;
current_hvol_ = hvol;
}
......@@ -337,7 +337,7 @@ void FixedPisaNsga2<CO, MO>::postPoll() {
stats << "dt = " << dt.count() << "s, total = " << total.count()
<< "s" << std::endl;
if (compHyvol)
stats << "Hypervolume = " << current_hvol_ << std::endl;
stats << "Hypervolume = " << current_hvol_ << std::endl;
stats << "__________________________________________" << std::endl;
progress_->log(stats);
......@@ -347,9 +347,9 @@ void FixedPisaNsga2<CO, MO>::postPoll() {
dumpPopulationToJSON();
}
//XXX we can only use lambda_m here (selector does not support
// variable size). Change selector?
toSelectorAndCommit(lambda_m);
// we can only send all finished individuals (selector does not support
// variable size).
toSelectorAndCommit();
exchangeSolutionStates();
......@@ -370,7 +370,7 @@ void FixedPisaNsga2<CO, MO>::exchangeSolutionStates() {
typedef typename FixedPisaNsga2::Individual_t individual;
size_t num_masters = args_->getArg<size_t>("num-masters", 1, false);
size_t num_masters = args_m->getArg<size_t>("num-masters", 1, false);
if(num_masters <= 1 ||
exchangeSolStateFreq_m == 0 ||
......@@ -419,7 +419,7 @@ void FixedPisaNsga2<CO, MO>::exchangeSolutionStates() {
template< template <class> class CO, template <class> class MO >
void FixedPisaNsga2<CO, MO>::toSelectorAndCommit(int num_individuals) {
void FixedPisaNsga2<CO, MO>::toSelectorAndCommit() {
to_selector_.clear();
selector_mu_ = finishedBuffer_m.size();
......@@ -535,10 +535,15 @@ void FixedPisaNsga2<CO, MO>::runStateMachine() {
// State 0 of the FSM: generate initial population and write
// information about initial population to ini file.
case Initialize: {
if(notInitialized_m) {
variator_m->initial_population();
if(initialized_m == false) {
if (initialOptimization_m == true) {
// double population such that workers keep busy until full initial population is found
variator_m->initial_population(2*alpha_m);
} else {
variator_m->initial_population(alpha_m);
}
dispatch_forward_solves();
notInitialized_m = false;
initialized_m = true;
}
//XXX: wait till the first alpha_m individuals are ready then start
......@@ -546,12 +551,14 @@ void FixedPisaNsga2<CO, MO>::runStateMachine() {
if(finishedBuffer_m.size() >= alpha_m) {
act_gen = 1;
toSelectorAndCommit(alpha_m);
toSelectorAndCommit();
curState_m = InitializeSelector;
//FIXME: and double the population again to have all workers busy
variator_m->initial_population();
dispatch_forward_solves();
if (initialOptimization_m == false) {
//FIXME: and double the population again to have all workers busy
variator_m->initial_population(alpha_m);
dispatch_forward_solves();
}
}
break;
}
......@@ -562,7 +569,8 @@ void FixedPisaNsga2<CO, MO>::runStateMachine() {
dumpPopulationToFile();
dumpPopulationToJSON();
variator_m->population()->clean_population();
// don't clean population otherwise final hypervolume calculation can't be done
//variator_m->population()->clean_population();
curState_m = VariatorStopped;
// notify pilot that we have converged
......@@ -660,7 +668,7 @@ template< template <class> class CO, template <class> class MO >
void FixedPisaNsga2<CO, MO>::dumpPopulationToFile() {
// only dump old data format if the user requests it
if(! args_->getArg<bool>("dump-dat", false, false)) return;
if(! args_m->getArg<bool>("dump-dat", false, false)) return;
typedef typename FixedPisaNsga2::Individual_t individual;
boost::shared_ptr<individual> temp;
......@@ -750,9 +758,9 @@ void FixedPisaNsga2<CO, MO>::dumpPopulationToJSON() {
for ( Expressions::Named_t::iterator it = constraints_m.begin();
it != constraints_m.end(); ++it )
{
std::string s = it->second->toString();
/// cleanup string to make json reader happy
s.erase(std::remove(s.begin(), s.end(), '"'), s.end());
std::string s = it->second->toString();
/// cleanup string to make json reader happy
s.erase(std::remove(s.begin(), s.end(), '"'), s.end());
file << "\t\t\"" << s << "\"";
......
......@@ -11,8 +11,6 @@
#include <fstream>
#include "boost/smart_ptr.hpp"
#include "boost/foreach.hpp"
#define foreach BOOST_FOREACH
#include "extlib/wfgHypervolume/hypervolume.h"
......@@ -33,12 +31,9 @@ class Population {
public:
Population() {
last_identity = 0;
hypervolume_ = 0.0;
}
~Population() {
clean_population();
}
~Population() {}
typedef typename Individual_t::genes_t genes_t;
typedef boost::shared_ptr<Individual_t> individual;
......@@ -119,7 +114,7 @@ public:
void commit_individuals(std::set<unsigned int> ids) {
foreach(unsigned int id, ids) {
for (unsigned int id : ids) {
//std::cout << "--+ committing id = " << id << "\xd";
individual ind = get_staging(id);
individuals.insert(ind_t(id, ind));
......@@ -128,9 +123,9 @@ public:
}
/**
* Remove all non-surviving individuals from the population and put ID's
* back in pool of free ID's.
* @param surviors to keep for next generation
* Remove all non-surviving individuals from the population and put IDs
* back in pool of free IDs.
* @param survivors to keep for next generation
*/
void keepSurvivors(std::set<unsigned int> survivors) {
......@@ -153,7 +148,7 @@ public:
//XXX: currently O(n): add a fast look-up table?
bool isRepresentedInPopulation(genes_t ind_genes) {
foreach(ind_t ind, individuals) {
for(ind_t ind : individuals) {
if( ind_genes == ind.second->genes )
return true;
}
......@@ -162,7 +157,9 @@ public:
}
double computeHypervolume(size_t island_id) {
double computeHypervolume(size_t island_id, const std::vector<double>& referencePoint) {
// protection check
if (individuals.empty() == true) return -1;
std::ofstream file;
std::ostringstream filename;
......@@ -186,8 +183,7 @@ public:
file.flush();
file.close();
hypervolume_ = Hypervolume::FromFile(filename.str());
return hypervolume_;
return Hypervolume::FromFile(filename.str(), referencePoint);
}
......@@ -214,12 +210,12 @@ public:
/// iterator end on population container
indItr_t end() { return individuals.end(); }
/// Remove (and cleanup) all individuals in the population
void clean_population() {
/* /// Remove (and cleanup) all individuals in the population */
/* void clean_population() { */
stagingArea.clear();
individuals.clear();
}
/* stagingArea.clear(); */
/* individuals.clear(); */
/* } */
private:
......@@ -229,16 +225,14 @@ private:
/// staging area for individuals probably joining population
std::map<unsigned int, individual > stagingArea;
/// queue to handle free individual ID's
/// queue to handle free individual IDs
std::queue<unsigned int> freeids;
/// last used (= next free) ID
unsigned int last_identity;