1#ifndef ZONOOPT_BOX_HPP_
2#define ZONOOPT_BOX_HPP_
19 using namespace detail;
38 explicit Box(
const size_t size);
44 explicit Box(
const std::vector<Interval>& vals);
50 explicit Box(
const Eigen::Vector<Interval, -1>& vals);
57 Box(
const Eigen::Vector<zono_float, -1>&
x_lb,
const Eigen::Vector<zono_float, -1>&
x_ub);
64 std::vector<Interval>
to_array()
const;
116 virtual void project(Eigen::Ref<Eigen::Vector<zono_float, -1>> x)
const;
194 bool contains(
const Eigen::Vector<zono_float, -1>& v);
225 Box operator+(
const Eigen::Vector<zono_float, -1>& v)
const;
232 void operator+=(
const Eigen::Vector<zono_float, -1>& v);
240 friend Box operator+(
const Eigen::Vector<zono_float, -1>& v,
const Box& box);
260 Box operator-(
const Eigen::Vector<zono_float, -1>& v)
const;
266 void operator-=(
const Eigen::Vector<zono_float, -1>& v);
274 friend Box operator-(
const Eigen::Vector<zono_float, -1>& v,
const Box& box);
315 Box operator*(
const Eigen::Vector<zono_float, -1>& v)
const;
321 void operator*=(
const Eigen::Vector<zono_float, -1>& v);
329 friend Box operator*(
const Eigen::Vector<zono_float, -1>& v,
const Box& box);
357 friend Box operator*(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
const Box& box);
364 friend Box operator*(
const Eigen::Matrix<zono_float, -1, -1>& A,
const Box& box);
480 bool contract(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
const Eigen::Vector<zono_float, -1>& b,
496 bool contract_subset(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A_rm,
497 const Eigen::Vector<zono_float, -1>& b,
int iter,
498 const Eigen::SparseMatrix<zono_float>& A,
const std::set<int>& inds,
499 int tree_search_depth);
506 Box linear_map(
const Eigen::Matrix<zono_float, -1, -1>& A)
const;
513 Box linear_map(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A)
const;
520 Interval dot(
const Eigen::Vector<zono_float, -1>& x)
const;
526 void permute(
const Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic>& P);
532 std::string
print()
const;
540 friend std::ostream&
operator<<(std::ostream& os,
const Box& box);
561 virtual bool contract_helper(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
562 const Eigen::Vector<zono_float, -1>& b,
const int iter,
563 const std::set<int>& constraints);
572 bool contract_forward(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
573 const Eigen::Vector<zono_float, -1>& b,
const std::set<int>& constraints);
581 void contract_backward(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
582 const Eigen::Vector<zono_float, -1>& b,
const std::set<int>& constraints);
594 static void get_vars_cons(
const Eigen::SparseMatrix<zono_float>& A,
595 const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A_rm,
596 std::set<int>& constraints, std::set<int>& vars,
const std::set<int>& new_vars,
597 int depth,
int max_depth);
627 MI_Box(
const Eigen::Vector<zono_float, -1>&
x_lb,
const Eigen::Vector<zono_float, -1>&
x_ub,
628 const std::pair<int, int>& idx_b,
bool zero_one_form);
636 MI_Box(
const std::vector<Interval>& intervals,
const std::pair<int, int>& idx_b,
bool zero_one_form);
642 void project(Eigen::Ref<Eigen::Vector<zono_float, -1>> x)
const override;
656 bool contract_helper(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
657 const Eigen::Vector<zono_float, -1>& b,
const int iter,
658 const std::set<int>& constraints)
override;
662 std::pair<int, int> idx_b;
Box (i.e., interval vector) class.
Definition Box.hpp:25
std::vector< Interval > to_array() const
Convert to vector of intervals.
Definition Box.cpp:60
Interval dot(const Eigen::Vector< zono_float, -1 > &x) const
Linear map with vector.
Definition Box.cpp:538
std::string print() const
Print method.
Definition Box.cpp:559
void operator/=(const Box &other)
Elementwise division in-place.
Definition Box.cpp:370
bool operator==(const Box &other) const
Set equality operator.
Definition Box.cpp:455
void operator+=(const Box &other)
Elementwise addition in-place.
Definition Box.cpp:210
friend Box operator/(zono_float alpha, const Box &box)
Elementwise division with scalar.
Definition Box.cpp:390
Box linear_map(const Eigen::Matrix< zono_float, -1, -1 > &A) const
Linear map of box based on interval arithmetic.
Definition Box.cpp:496
Eigen::Vector< zono_float, -1 > x_ub
vector of upper bounds
Definition Box.hpp:548
bool contains_set(const Box &other) const
Check set containment.
Definition Box.cpp:186
Eigen::Vector< zono_float, -1 > x_lb
vector of lower bounds
Definition Box.hpp:545
bool contains(const Eigen::Vector< zono_float, -1 > &v)
Check vector continment.
Definition Box.cpp:174
Box intersect(const Box &other) const
Box intersection.
Definition Box.cpp:150
Box & operator=(const Box &other)
Copy assignment.
Definition Box.cpp:44
Box()=default
Default constructor.
virtual void project(Eigen::Ref< Eigen::Vector< zono_float, -1 > > x) const
Projects vector onto the Box.
Definition Box.cpp:88
const Eigen::Vector< zono_float, -1 > & upper() const
Get upper bounds.
Definition Box.hpp:135
bool contract_subset(const Eigen::SparseMatrix< zono_float, Eigen::RowMajor > &A_rm, const Eigen::Vector< zono_float, -1 > &b, int iter, const Eigen::SparseMatrix< zono_float > &A, const std::set< int > &inds, int tree_search_depth)
Interval contractor over a subset of the dimensions of the box.
Definition Box.cpp:477
Box operator|(const Box &other) const
Box interval hull.
Definition Box.cpp:440
Eigen::Vector< zono_float, -1 > center() const
Get center of box.
Definition Box.cpp:110
Box operator&(const Box &other) const
Box intersection.
Definition Box.cpp:435
void permute(const Eigen::PermutationMatrix< Eigen::Dynamic, Eigen::Dynamic > &P)
Permutes in place using permutation matrix, i.e., [x] <- P*[x].
Definition Box.cpp:553
Box interval_hull(const Box &other) const
Box interval hull.
Definition Box.cpp:162
bool operator>=(const Box &other) const
Set containment operator.
Definition Box.cpp:450
size_t size() const
Get size of Box object.
Definition Box.cpp:83
friend std::ostream & operator<<(std::ostream &os, const Box &box)
print to ostream
Definition Box.cpp:570
Box radius() const
Get radius of box.
Definition Box.cpp:120
void set_element(int i, const Interval &val)
Element-wise assignment.
Definition Box.cpp:77
Interval get_element(int i) const
Element-wise access.
Definition Box.cpp:70
virtual Box * clone() const
Clone operation.
Definition Box.cpp:95
friend Box operator*(zono_float alpha, const Box &box)
Elementwise multiplication with scalar.
Definition Box.cpp:279
zono_float width() const
Get width of box.
Definition Box.cpp:100
bool contract(const Eigen::SparseMatrix< zono_float, Eigen::RowMajor > &A, const Eigen::Vector< zono_float, -1 > &b, int iter)
Interval contractor.
Definition Box.cpp:460
virtual ~Box()=default
Virtual destructor.
friend Box operator-(const Eigen::Vector< zono_float, -1 > &v, const Box &box)
Elementwise subtraction with vector.
Definition Box.cpp:264
void operator-=(const Box &other)
Elementwise subtraction in-place.
Definition Box.cpp:249
const Eigen::Vector< zono_float, -1 > & lower() const
Get lower bounds.
Definition Box.hpp:129
bool is_single_valued() const
Determine whether box is single-valued (i.e., all intervals have width 0 within numerical tolerance)
Definition Box.cpp:140
void operator*=(const Box &other)
Elementwise multiplication in-place.
Definition Box.cpp:269
friend Box operator+(const Eigen::Vector< zono_float, -1 > &v, const Box &box)
Elementwise addition with vector.
Definition Box.cpp:232
bool is_empty() const
Determine whether box is empty (any contained interval is empty)
Definition Box.cpp:130
bool operator<=(const Box &other) const
Set containment operator.
Definition Box.cpp:445
Interval class.
Definition Interval.hpp:48
Mixed-integer box.
Definition Box.hpp:611
Box * clone() const override
Clone operation.
Definition Box.cpp:707
MI_Box()=default
default constructor
bool contract_helper(const Eigen::SparseMatrix< zono_float, Eigen::RowMajor > &A, const Eigen::Vector< zono_float, -1 > &b, const int iter, const std::set< int > &constraints) override
Back-end for contractor.
Definition Box.cpp:733
zono_float get_bin_high() const
Definition Box.hpp:653
const std::pair< int, int > & binary_indices() const
Get binary indices.
Definition Box.hpp:649
zono_float get_bin_low() const
Definition Box.hpp:652
void project(Eigen::Ref< Eigen::Vector< zono_float, -1 > > x) const override
Projects vector onto the Box.
Definition Box.cpp:712
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45
Definition ZonoOpt.hpp:58