1#ifndef ZONOOPT_MI_DATA_STRUCTURES_
2#define ZONOOPT_MI_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[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
260 template <
typename T,
typename Compare=std::less<T>>
261 class PriorityQueuePrunable final :
public std::priority_queue<T, std::vector<T>, Compare>
265 explicit PriorityQueuePrunable(
const Compare& comp = Compare()) : std::priority_queue<T, std::vector<T>, Compare>(comp) {}
268 void prune(
const T& t)
270 auto it_prune = std::find_if(this->c.begin(), this->c.end(), [&](
const T& item) {
271 return this->comp(item, t);
273 if (it_prune != this->c.end())
275 this->c.erase(it_prune, this->c.end());
280 const T& bottom()
const
282 return this->c.back();
288 T top = std::move(this->c.front());
296 while (!this->empty())
ADMM implementation 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:43