1#ifndef ZONOOPT_BNB_DATA_STRUCTURES_
2#define ZONOOPT_BNB_DATA_STRUCTURES_
27namespace ZonoOpt::detail
31 std::shared_ptr<ADMM_data> admm_data;
32 std::pair<int, int> idx_b;
33 bool zero_one_form =
false;
37 class ThreadSafeAccess
40 ThreadSafeAccess() =
default;
45 std::lock_guard<std::mutex> lock(mtx);
50 void set(
const T& value)
52 std::lock_guard<std::mutex> lock(mtx);
57 mutable std::mutex mtx;
62 class ThreadSafeIncrementable
65 explicit ThreadSafeIncrementable(T value) : data(value) {}
70 std::lock_guard<std::mutex> lock(mtx);
77 std::lock_guard<std::mutex> lock(mtx);
82 void operator+=(T value)
84 std::lock_guard<std::mutex> lock(mtx);
89 mutable std::mutex mtx;
93 class ThreadSafeMultiset
97 ThreadSafeMultiset() =
default;
102 std::lock_guard<std::mutex> lock(mtx);
109 std::lock_guard<std::mutex> lock(mtx);
110 if (
const auto it = data.find(J); it != data.end())
117 std::lock_guard<std::mutex> lock(mtx);
122 std::pair<zono_float, bool> get_min()
const
124 std::lock_guard<std::mutex> lock(mtx);
126 return std::make_pair(std::numeric_limits<zono_float>::infinity(),
false);
128 return std::make_pair(*data.begin(),
true);
134 std::lock_guard<std::mutex> lock(mtx);
139 mutable std::mutex mtx;
140 std::multiset<zono_float> data;
143 template <
typename T>
144 class ThreadSafeVector
148 ThreadSafeVector() =
default;
151 void push_back(
const T& value)
153 std::lock_guard<std::mutex> lock(mtx);
154 data.push_back(value);
160 std::lock_guard<std::mutex> lock(mtx);
167 std::lock_guard<std::mutex> lock(mtx);
172 std::vector<T> get()
const
174 std::lock_guard<std::mutex> lock(mtx);
179 bool contains(
const T& value, std::function<
bool(
const OptSolution&,
const OptSolution&)>& compare)
const
181 std::lock_guard<std::mutex> lock(mtx);
182 for (
auto it = data.begin(); it != data.end(); ++it)
184 if (compare(*it, value))
return true;
190 mutable std::mutex mtx;
194 class Node final :
public ADMM_solver
198 explicit Node(
const std::shared_ptr<ADMM_data>& data) : ADMM_solver(data)
201 this->x_box = *data->x_box;
205 Node(
const Node& other) : ADMM_solver(other)
207 this->x_box = other.x_box;
208 this->solution = other.solution;
209 this->width = this->x_box.width();
213 OptSolution solution = OptSolution();
214 zono_float width = std::numeric_limits<zono_float>::infinity();
217 bool run_contractor()
219 const bool contractor_feasible = this->startup(this->x_box, this->solution);
220 this->width = this->x_box.width();
221 return contractor_feasible;
228 this->x_box.set_element(ind, Interval(val, val));
231 const bool contractor_feasible = this->startup(this->x_box, this->solution, {ind});
232 this->width = this->x_box.width();
233 return contractor_feasible;
237 void solve(std::atomic<bool>* stop =
nullptr)
239 this->solve_core(this->x_box, this->solution, stop);
245 this->eps_prim = eps_prim;
246 this->eps_dual = eps_dual;
250 const Box& get_box()
const
255 bool is_priority()
const
260 void set_priority(
bool priority)
262 this->priority = priority;
268 bool priority =
false;
271 template <
typename T,
typename Compare=std::less<T>>
272 class PriorityQueuePrunable final :
public std::priority_queue<T, std::vector<T>, Compare>
276 explicit PriorityQueuePrunable(
const Compare& comp = Compare()) : std::priority_queue<
277 T, std::vector<T>, Compare>(comp)
282 void prune(
const T& t)
284 auto it_prune = std::find_if(this->c.begin(), this->c.end(), [&](
const T& item)
286 return this->comp(item, t);
288 if (it_prune != this->c.end())
290 this->c.erase(it_prune, this->c.end());
295 const T& bottom()
const
297 return this->c.back();
303 T top = std::move(this->c.front());
311 while (!this->empty())
Convex and mixed-integer ADMM implementations used within ZonoOpt.
Optimization settings and solution data structures for ZonoOpt library.
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45