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:45