1#ifndef ZONOOPT_MI_SOLVER_ 
    2#define ZONOOPT_MI_SOLVER_ 
   18#include <condition_variable> 
   22#include <memory_resource> 
   29namespace ZonoOpt::detail {
 
   34        explicit MI_Solver(
const MI_data& data);
 
   40        std::pair<std::vector<OptSolution>, OptSolution> multi_solve(
int max_sols = std::numeric_limits<int>::max());
 
   47            std::pmr::synchronized_pool_resource* pool_ptr;
 
   49            explicit NodeDeleter(std::pmr::synchronized_pool_resource* pool_ptr) : pool_ptr(pool_ptr) {}
 
   51            void operator()(Node* node)
 const 
   56                    pool_ptr->deallocate(node, 
sizeof(Node), 
alignof(Node));
 
   63            bool operator()(
const std::unique_ptr<Node, NodeDeleter>& n1, 
const std::unique_ptr<Node, NodeDeleter>& n2)
 const 
   65                return n1->solution.J > n2->solution.J;
 
   70        std::pmr::synchronized_pool_resource pool;
 
   73        PriorityQueuePrunable<std::unique_ptr<Node, NodeDeleter>, NodeCompare> node_queue; 
 
   74        mutable std::mutex pq_mtx;
 
   75        std::condition_variable pq_cv_bnb; 
 
   77        bool multi_sol = 
false;
 
   78        std::shared_ptr<ADMM_data> bnb_data; 
 
   80        std::atomic<bool> converged = 
false;
 
   81        std::atomic<bool> done = 
false;
 
   82        std::atomic<bool> feasible = 
false; 
 
   83        std::atomic<long int> qp_iter = 0; 
 
   84        std::atomic<int> iter = 0; 
 
   85        std::atomic<zono_float> J_max = std::numeric_limits<zono_float>::infinity(); 
 
   86        ThreadSafeAccess<Eigen::Vector<
zono_float, -1>> z, x, u; 
 
   87        std::atomic<zono_float> primal_residual = std::numeric_limits<zono_float>::infinity();
 
   88        std::atomic<zono_float> dual_residual = std::numeric_limits<zono_float>::infinity();
 
   89        ThreadSafeIncrementable<double> total_startup_time{0.0};
 
   90        ThreadSafeIncrementable<double> total_run_time{0.0};
 
   91        ThreadSafeMultiset J_threads; 
 
   92        ThreadSafeVector<OptSolution> solutions; 
 
   95        std::unique_ptr<Node, NodeDeleter> make_node(
const std::shared_ptr<ADMM_data>& data);
 
   97        std::unique_ptr<Node, NodeDeleter> clone_node(
const std::unique_ptr<Node, NodeDeleter>& other);
 
  100        std::variant<OptSolution, std::pair<std::vector<OptSolution>, OptSolution>> solver_core(
 
  101                int max_sols = std::numeric_limits<int>::max());
 
  104        void solve_and_branch(
const std::unique_ptr<Node, NodeDeleter>& node);
 
  107        bool is_integer_feasible(Eigen::Ref<
const Eigen::Vector<zono_float,-1>> xb) 
const;
 
  110        void branch_most_frac(
const std::unique_ptr<Node, NodeDeleter>& node);
 
  116        void push_node(std::unique_ptr<Node, NodeDeleter>&& node);
 
  122        bool check_bin_equal(
const OptSolution& sol1, 
const OptSolution& sol2) 
const;
 
ADMM implementation used within ZonoOpt.
Data structures for mixed-integer optimization in ZonoOpt library.
Optimization settings and solution data structures for ZonoOpt library.
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45