OP  0.1
OP is a optimization solver plugin package
 All Classes Namespaces Functions Variables Typedefs Enumerations Friends
op_waitloop.hpp
1 #pragma once
2 
4 namespace op {
5 
7 using ActionFn = std::function<void()>;
8 
23 enum State : int
24 {
25  OTHER,
26  SOLUTION_FOUND = -4,
27  UPDATE_VARIABLES = -3,
28  OBJ_GRAD = -2,
29  OBJ_EVAL = -1
30 };
31 
35 class WaitLoop {
36 public:
37  using ConstraintActionFn = std::function<void(int)>;
38  using UnknownActionFn = std::function<void(int)>;
39 
41  WaitLoop(const std::function<int()>& get_size, double& final_obj, MPI_Comm comm = MPI_COMM_WORLD)
42  : get_size_(get_size), final_obj_(final_obj), comm_(comm)
43  {
44  }
45 
47  WaitLoop& onUpdate(const ActionFn& update)
48  {
49  update_ = update;
50  return *this;
51  }
52 
54  WaitLoop& onObjectiveGrad(const ActionFn& obj_grad)
55  {
56  obj_grad_ = obj_grad;
57  return *this;
58  }
59 
61  WaitLoop& onObjectiveEval(const ActionFn& obj_eval)
62  {
63  obj_eval_ = obj_eval;
64  return *this;
65  }
66 
68  WaitLoop& onConstraintsEval(const ConstraintActionFn& constraints_states)
69  {
70  constraints_states_ = constraints_states;
71  return *this;
72  }
73 
75  WaitLoop& onConstraintsGrad(const ConstraintActionFn& constraints_grad_states)
76  {
77  constraints_grad_states_ = constraints_grad_states;
78  return *this;
79  }
80 
82  WaitLoop& onSolution(const ActionFn& solution_state)
83  {
84  solution_state_ = solution_state;
85  return *this;
86  }
87 
89  WaitLoop& onUnknown(const UnknownActionFn& unknown_state)
90  {
91  unknown_state_ = unknown_state;
92  return *this;
93  }
94 
95  // Start the whileloop
96  void operator()()
97  {
98  int nconstraints = get_size_(); // get runtime-defered size
99  while (final_obj_ == std::numeric_limits<double>::max()) {
100  // set up to recieve
101  int opt_state;
102  op::mpi::Broadcast(opt_state, 0, comm_);
103 
104  if (opt_state == op::SOLUTION_FOUND) {
105  solution_state_();
106  break;
107  } else if (opt_state >= nconstraints && opt_state < nconstraints * 2) {
108  constraints_grad_states_(opt_state % nconstraints);
109  } else if (opt_state >= 0 && opt_state < nconstraints) {
110  constraints_states_(opt_state);
111  } else {
112  switch (opt_state) {
113  case op::State::UPDATE_VARIABLES:
114  update_();
115  break;
116  case op::State::OBJ_GRAD:
117  obj_grad_();
118  break;
119  case op::State::OBJ_EVAL:
120  obj_eval_();
121  break;
122  default:
123  unknown_state_(opt_state);
124  break;
125  }
126  }
127  }
128  }
129 
130 protected:
131  std::function<int()> get_size_;
132  double& final_obj_;
133  MPI_Comm comm_;
134  ActionFn update_;
135  ActionFn obj_grad_;
136  ActionFn obj_eval_;
137  ConstraintActionFn constraints_states_;
138  ConstraintActionFn constraints_grad_states_;
139  ActionFn solution_state_;
140  UnknownActionFn unknown_state_;
141 };
142 
143 } // namespace op
WaitLoop & onObjectiveEval(const ActionFn &obj_eval)
Set action to perform in Objective Eval state.
Definition: op_waitloop.hpp:61
std::enable_if_t<!(detail::has_data< T >::value &&detail::has_size< T >::value), int > Broadcast(T &buf, int root=0, MPI_Comm comm=MPI_COMM_WORLD)
Broadcast a single element to all ranks on the communicator.
Definition: op_mpi.hpp:106
WaitLoop & onObjectiveGrad(const ActionFn &obj_grad)
Set action to perform in Objective Grad state.
Definition: op_waitloop.hpp:54
WaitLoop & onUnknown(const UnknownActionFn &unknown_state)
Set action to perform in Unknown state.
Definition: op_waitloop.hpp:89
WaitLoop & onUpdate(const ActionFn &update)
Set action to perform in Update state.
Definition: op_waitloop.hpp:47
std::function< void()> ActionFn
Action type we&#39;ll use over and over again.
Definition: op_waitloop.hpp:7
WaitLoop & onConstraintsEval(const ConstraintActionFn &constraints_states)
Set action to perform in Constraint Eval state.
Definition: op_waitloop.hpp:68
WaitLoop & onConstraintsGrad(const ConstraintActionFn &constraints_grad_states)
Set action to perform in Constraint Grad state.
Definition: op_waitloop.hpp:75
WaitLoop & onSolution(const ActionFn &solution_state)
Set action to perform in Solution state.
Definition: op_waitloop.hpp:82