9 #include "boost/smart_ptr.hpp"
82 ,
class SolPropagationGraph_t
107 setup(known_expr_funcs);
115 std::vector<double> hypervolRef = {},
116 bool isOptimizerRun =
true)
126 setup(known_expr_funcs);
157 typedef MasterNode<
typename Opt_t::SolutionState_t,
179 typedef std::map<size_t, std::pair<Param_t, reqVarContainer_t> >
Jobs_t;
192 std::cout <<
"\033[01;35m";
194 std::cout <<
" | | (_) | | | " <<
std::endl;
195 std::cout <<
" ___ _ __ | |_ ______ _ __ _| | ___ | |_ " <<
std::endl;
196 std::cout <<
" / _ \\| '_ \\| __|______| '_ \\| | |/ _ \\| __|" <<
std::endl;
197 std::cout <<
"| (_) | |_) | |_ | |_) | | | (_) | |_ " <<
std::endl;
198 std::cout <<
" \\___/| .__/ \\__| | .__/|_|_|\\___/ \\__|" <<
std::endl;
204 std::cout <<
"\e[0m";
208 MPI_Barrier(MPI_COMM_WORLD);
224 std::cout <<
"Could not find 'inputfile' in arguments.. Aborting."
231 "No objectives or dvars specified");
235 std::ostringstream os;
239 if (isOptimizationRun) {
243 os <<
" ✔ " <<
dvars_.size()
247 std::cout << os.str() << std::flush;
250 MPI_Barrier(MPI_COMM_WORLD);
256 std::ostringstream os;
257 os <<
"\033[01;35m" <<
" " <<
global_rank_ <<
" (PID: " << getpid() <<
") ▶ Opt"
259 std::cout << os.str() << std::flush;
261 boost::scoped_ptr<Opt_t> opt(
272 std::ostringstream os;
273 os <<
"\033[01;35m" <<
" " <<
global_rank_ <<
" (PID: " << getpid() <<
") ▶ Worker"
275 std::cout << os.str() << std::flush;
279 if(pos != std::string::npos)
281 pos = tmplfile.find(
".");
282 std::string simName = tmplfile.substr(0,pos);
284 boost::scoped_ptr< Worker<Sim_t> > w(
288 std::cout <<
"Stop Worker.." <<
std::endl;
294 std::ostringstream os;
295 os <<
"\033[01;35m" <<
" " <<
global_rank_ <<
" (PID: " << getpid() <<
") ▶ Pilot"
297 std::cout << os.str() << std::flush;
300 std::ostringstream trace_filename;
301 trace_filename <<
"pilot.trace." <<
comm_->getBundle().island_id;
304 boost::shared_ptr<TraceComponent>(
new FileSink(trace_filename.str())));
328 size_t upperbound_buffer_size =
329 sizeof(double) * alpha * (1 + opt_size) * 1000
332 new MasterNode<
typename Opt_t::SolutionState_t,
333 SolPropagationGraph_t >(
335 comm_->getBundle().island_id));
342 std::cout <<
"Stop Pilot.." <<
std::endl;
362 bool all_worker_idle =
true;
382 MPI_Isend(&dummy, 1, MPI_INT, worker,
396 size_t jid = job->first;
398 Param_t job_params = job->second.first;
406 std::pair<Param_t, reqVarContainer_t> >(job->first, job->second));
410 std::ostringstream dump;
411 dump <<
"sent job with ID " << jid <<
" to worker " << worker
426 size_t job_id = recv_value;
429 MPI_Send(&dummy, 1, MPI_UNSIGNED_LONG, status.MPI_SOURCE,
438 std::ostringstream dump;
439 dump <<
"worker finished job with ID " << job_id <<
std::endl;
446 int opt_master_rank =
comm_->getLeader();
447 MPI_Send(&job_id, 1, MPI_UNSIGNED_LONG, opt_master_rank,
461 size_t job_id = recv_value;
462 int opt_master_rank =
comm_->getLeader();
470 std::pair<Param_t, reqVarContainer_t> job =
471 std::pair<Param_t, reqVarContainer_t>(job_params, reqVars);
473 std::pair<
size_t, std::pair<Param_t, reqVarContainer_t> >(
476 std::ostringstream dump;
477 dump <<
"new opt job with ID " << job_id <<
std::endl;
487 std::ostringstream dump;
488 dump <<
"starting solution exchange.. " << status.MPI_SOURCE <<
std::endl;
492 size_t buffer_size = recv_value;
493 int opt_master_rank = status.MPI_SOURCE;
495 char *buffer =
new char[buffer_size];
496 MPI_Recv(buffer, buffer_size, MPI_CHAR, opt_master_rank,
502 dump.str(std::string());
503 dump <<
"getting " << buffer_size <<
" bytes from OPT "
508 std::ostringstream states;
510 buffer_size = states.str().length();
513 dump.str(std::string());
514 dump <<
"collected solution states of other PILOTS: "
519 MPI_Send(&buffer_size, 1, MPI_UNSIGNED_LONG, opt_master_rank,
522 buffer =
new char[buffer_size];
523 memcpy(buffer, states.str().c_str(), buffer_size);
524 MPI_Send(buffer, buffer_size, MPI_CHAR, opt_master_rank,
528 dump.str(std::string());
529 dump <<
"sent set of new solutions to OPT" <<
std::endl;
547 std::string msg =
"(Pilot) Error: unexpected MPI_TAG: ";
548 msg += status.MPI_TAG;
564 if(! isOpt)
return true;
567 if(!
cmd_args_->getArg<
bool>(
"one-pilot-converge",
false,
false))
575 if(i == my_rank)
continue;
589 MPI_Request opt_request;
590 MPI_Request worker_request;
593 size_t recv_value_worker = 0;
594 size_t recv_value_opt = 0;
598 MPI_Irecv(&recv_value_opt, 1, MPI_UNSIGNED_LONG, MPI_ANY_SOURCE,
600 MPI_Irecv(&recv_value_worker, 1, MPI_UNSIGNED_LONG, MPI_ANY_SOURCE,
603 bool pending_opt_request =
true;
604 bool pending_worker_request =
true;
605 bool pending_pilot_request =
false;
607 MPI_Request pilot_request;
608 size_t recv_value_pilot = 0;
609 if(
cmd_args_->getArg<
bool>(
"one-pilot-converge",
false,
false)) {
610 MPI_Irecv(&recv_value_pilot, 1, MPI_UNSIGNED_LONG, MPI_ANY_SOURCE,
612 pending_pilot_request =
true;
619 if(opt_request != MPI_REQUEST_NULL) {
620 MPI_Test(&opt_request, &flag, &status);
622 pending_opt_request =
false;
627 MPI_Irecv(&recv_value_opt, 1, MPI_UNSIGNED_LONG,
630 pending_opt_request =
true;
637 if(worker_request != MPI_REQUEST_NULL) {
638 MPI_Test(&worker_request, &flag, &status);
640 pending_worker_request =
false;
644 if(
onMessage(status, recv_value_worker)) {
645 MPI_Irecv(&recv_value_worker, 1,
646 MPI_UNSIGNED_LONG, MPI_ANY_SOURCE, MPI_ANY_TAG,
648 pending_worker_request =
true;
655 if(
cmd_args_->getArg<
bool>(
"one-pilot-converge",
false,
false)) {
656 if(pilot_request != MPI_REQUEST_NULL) {
657 MPI_Test(&pilot_request, &flag, &status);
659 pending_pilot_request =
false;
663 MPI_Irecv(&recv_value_pilot, 1,
664 MPI_UNSIGNED_LONG, MPI_ANY_SOURCE, MPI_ANY_TAG,
666 pending_pilot_request =
true;
675 if(pending_opt_request) MPI_Cancel( &opt_request );
676 if(pending_worker_request) MPI_Cancel( &worker_request );
677 if(pending_pilot_request) MPI_Cancel( &pilot_request );
std::map< size_t, std::pair< Param_t, reqVarContainer_t > > Jobs_t
keep track of requests and running jobs
void setup(functionDictionary_t known_expr_funcs)
Implements a node in the network of all pilots, exposing store and collect operations on a specific s...
std::map< std::string, reqVarInfo_t > reqVarContainer_t
virtual void onStop()
enable implementation to react to STOP tag
virtual void startOptimizer()
void parseInputFile(functionDictionary_t known_expr_funcs, bool isOptimizationRun)
boost::scoped_ptr< Trace > job_trace_
#define MPI_EXCHANGE_SOL_STATE_DATA_TAG
std::string input_file_
input file for simulation with embedded optimization problem
MPI_Comm worker_comm_
MPI communicator used for messages to/from worker.
constexpr double e
The value of .
#define MPI_EXCHANGE_SOL_STATE_RES_TAG
virtual void startWorker()
Pilot(CmdArguments_t args, boost::shared_ptr< Comm_t > comm, const DVarContainer_t &dvar)
boost::shared_ptr< CmdArguments > CmdArguments_t
#define MPI_WORKER_FINISHED_ACK_TAG
pilot notifies worker that he is ready to collect the results
boost::scoped_ptr< MasterNode_t > master_node_
A worker MPI entity consists of a processor group that runs a simulation of type Sim_t. The main loop in run() accepts new jobs from the master process runs the simulation and reports back the results.
void MPI_Send_reqvars(reqVarContainer_t reqvars, size_t pid, MPI_Comm comm)
Pilot(CmdArguments_t args, boost::shared_ptr< Comm_t > comm, functionDictionary_t known_expr_funcs, const DVarContainer_t &dvar, const Expressions::Named_t &obj, const Expressions::Named_t &cons, std::vector< double > hypervolRef={}, bool isOptimizerRun=true)
#define MPI_EXCHANGE_SOL_STATE_RES_SIZE_TAG
virtual void sendNewJobToWorker(int worker)
constexpr double alpha
The fine structure constant, no dimension.
Jobs_t::iterator JobIter_t
Expressions::Named_t objectives_
objectives
namedVariableCollection_t Param_t
MasterNode< typename Opt_t::SolutionState_t, SolPropagationGraph_t > MasterNode_t
MPI_Comm coworker_comm_
MPI communicator used for messages between all pilots.
virtual void startPilot()
virtual void prePoll()
executed before checking for new request
Pilot(CmdArguments_t args, boost::shared_ptr< Comm_t > comm, functionDictionary_t known_expr_funcs)
int total_available_workers_
#define MPI_WORK_JOBID_TAG
unique id of the job
Expressions::Named_t constraints_
constraints
void MPI_Recv_params(Param_t ¶ms, size_t pid, MPI_Comm comm)
DVarContainer_t dvars_
design variables
virtual bool onMessage(MPI_Status status, size_t recv_value)
std::map< std::string, DVar_t > DVarContainer_t
void MPI_Send_params(Param_t params, size_t pid, MPI_Comm comm)
std::map< std::string, Expressions::Expr_t * > Named_t
type of an expressions with a name
boost::shared_ptr< Comm_t > comm_
void MPI_Recv_reqvars(reqVarContainer_t &reqvars, size_t pid, MPI_Comm comm)
int my_rank_in_worker_comm_
virtual void setupPoll()
executed before starting polling loop
std::vector< bool > is_worker_idle_
std::string::iterator iterator
Poller(MPI_Comm comm, double delay=0.1)
bool stop(bool isOpt=true)
#define MPI_OPT_JOB_FINISHED_TAG
pilot tells optimizer that results are ready to collect
std::map< std::string, client::function::type > functionDictionary_t
std::vector< double > hypervolRef_
hypervolume reference point
An interface implementing the basics of a poll loop, posting an MPI_Irecv and waiting for new request...
MPI_Comm opt_comm_
MPI communicator used for messages to/from optimizer.
The Optimization Pilot (Master): Coordinates requests by optimizer to workers and reports results bac...
MPI_Comm comm_m
communicator the poller listens to requests
Inform & endl(Inform &inf)
virtual void postPoll()
executed after handling (if any) new request
#define MPI_STOP_TAG
global stop tag to exit poll loop (