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 template <
typename T,
typename Compare=std::less<T>>
98 ThreadSafeSet() =
default;
101 void add(
const T val)
103 std::lock_guard<std::mutex> lock(mtx);
108 void remove(
const T val)
110 std::lock_guard<std::mutex> lock(mtx);
111 if (
const auto it = data.find(val); it != data.end())
118 std::lock_guard<std::mutex> lock(mtx);
123 std::pair<T, bool> get_min()
const
125 std::lock_guard<std::mutex> lock(mtx);
129 return std::make_pair(val,
false);
133 return std::make_pair(*data.begin(),
true);
140 std::lock_guard<std::mutex> lock(mtx);
145 mutable std::mutex mtx;
146 std::set<T, Compare> data;
149 template <
typename T>
150 class ThreadSafeVector
154 ThreadSafeVector() =
default;
157 void push_back(
const T& value)
159 std::lock_guard<std::mutex> lock(mtx);
160 data.push_back(value);
166 std::lock_guard<std::mutex> lock(mtx);
173 std::lock_guard<std::mutex> lock(mtx);
178 std::vector<T> get()
const
180 std::lock_guard<std::mutex> lock(mtx);
185 bool contains(
const T& value, std::function<
bool(
const OptSolution&,
const OptSolution&)>& compare)
const
187 std::lock_guard<std::mutex> lock(mtx);
188 for (
auto it = data.begin(); it != data.end(); ++it)
190 if (compare(*it, value))
return true;
196 bool push_back_if_not_contains(
const T& value, std::function<
bool(
const OptSolution&,
const OptSolution&)>& compare)
198 std::lock_guard<std::mutex> lock(mtx);
199 for (
const auto& existing : data)
201 if (compare(existing, value))
return false;
203 data.push_back(value);
208 mutable std::mutex mtx;
212 class Node final :
public ADMM_solver
216 explicit Node(
const std::shared_ptr<ADMM_data>& data) : ADMM_solver(data)
219 this->x_box = *data->x_box;
223 Node(
const Node& other) : ADMM_solver(other)
225 this->x_box = other.x_box;
226 this->solution = other.solution;
227 this->width = this->x_box.width();
231 OptSolution solution = OptSolution();
232 zono_float width = std::numeric_limits<zono_float>::infinity();
235 bool run_contractor()
237 const bool contractor_feasible = this->startup(this->x_box, this->solution);
238 this->width = this->x_box.width();
239 return contractor_feasible;
246 this->x_box.set_element(ind, Interval(val, val));
249 const bool contractor_feasible = this->startup(this->x_box, this->solution, {ind});
250 this->width = this->x_box.width();
251 return contractor_feasible;
255 void solve(std::atomic<bool>* stop =
nullptr)
257 this->solve_core(this->x_box, this->solution, stop);
263 this->eps_prim = eps_prim;
264 this->eps_dual = eps_dual;
268 const Box& get_box()
const
278 template <
typename T,
typename Compare=std::less<T>>
279 class PriorityQueuePrunable final :
public std::priority_queue<T, std::vector<T>, Compare>
283 explicit PriorityQueuePrunable(
const Compare& comp = Compare()) : std::priority_queue<
284 T, std::vector<T>, Compare>(comp)
289 void prune(
const T& t)
291 auto it_prune = std::remove_if(this->c.begin(), this->c.end(), [&](
const T& item)
293 return this->comp(item, t);
295 if (it_prune != this->c.end())
297 this->c.erase(it_prune, this->c.end());
298 std::make_heap(this->c.begin(), this->c.end(), this->comp);
303 const T& bottom()
const
305 return this->c.back();
311 T top = std::move(this->c.front());
319 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