1#ifndef ZONOOPT_INTERVAL_UTILITIES_HPP_
2#define ZONOOPT_INTERVAL_UTILITIES_HPP_
22#include <Eigen/Sparse>
32 using namespace detail;
46 template <
typename Derived>
118 y_min() = std::min({
a, b, c,
d});
119 y_max() = std::max({
a, b, c,
d});
151 min = std::numeric_limits<zono_float>::infinity();
152 max = -std::numeric_limits<zono_float>::infinity();
154 else if (
min > 0 ||
max < 0)
162 max = std::numeric_limits<zono_float>::infinity();
167 min = -std::numeric_limits<zono_float>::infinity();
171 min = -std::numeric_limits<zono_float>::infinity();
172 max = std::numeric_limits<zono_float>::infinity();
195 y_min() = std::max(
x1.y_min(),
x2.y_min());
196 y_max() = std::min(
x1.y_max(),
x2.y_max());
242 if (x.y_max() - x.y_min() >= two*pi)
264 y_max() = ((
l < pi/two && pi/two < u) || (
l < -3*pi/two && -3*pi/two < u)) ? one : std::max(std::sin(u), std::sin(
l));
265 y_min() = ((
l < -pi/two && -pi/two < u) || (
l < 3*pi/two && 3*pi/two < u)) ? -one : std::min(std::sin(u), std::sin(
l));
276 x_sin.set(x.y_min() + pi/two, x.y_max() + pi/two);
286 if (x.y_max() - x.y_min() >= pi)
288 y_max() = std::numeric_limits<zono_float>::infinity();
289 y_min() = -std::numeric_limits<zono_float>::infinity();
308 if ((
l < -pi/two && -pi/two < u) || (
l < pi/two && pi/two < u))
310 y_max() = std::numeric_limits<zono_float>::infinity();
311 y_min() = -std::numeric_limits<zono_float>::infinity();
315 y_max() = std::tan(u);
327 assert(x.y_min() >= -one && x.y_min() <= one);
328 assert(x.y_max() >= -one && x.y_max() <= one);
329 y_min() = std::asin(x.y_min());
330 y_max() = std::asin(x.y_max());
339 assert(x.y_min() >= -one && x.y_min() <= one);
340 assert(x.y_max() >= -one && x.y_max() <= one);
341 y_min() = std::acos(x.y_max());
342 y_max() = std::acos(x.y_min());
351 y_min() = std::atan(x.y_min());
352 y_max() = std::atan(x.y_max());
361 y_min() = std::exp(x.y_min());
362 y_max() = std::exp(x.y_max());
519 return (
ub +
lb) / two;
536 return "Interval: [" + std::to_string(
lb) +
", " + std::to_string(
ub) +
"]";
661 template <
typename Derived>
732 explicit Box(
const size_t size);
738 explicit Box(
const std::vector<Interval>& vals);
745 Box(
const Eigen::Vector<zono_float, -1>&
x_lb,
const Eigen::Vector<zono_float, -1>&
x_ub);
795 virtual void project(Eigen::Ref<Eigen::Vector<zono_float, -1>> x)
const;
881 bool contract(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
const Eigen::Vector<zono_float, -1>& b,
int iter);
896 bool contract_subset(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A_rm,
const Eigen::Vector<zono_float, -1>& b,
int iter,
897 const Eigen::SparseMatrix<zono_float>& A,
const std::set<int>& inds,
int tree_search_depth);
904 Box linear_map(
const Eigen::Matrix<zono_float, -1, -1>& A)
const;
911 Box linear_map(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A)
const;
918 Interval dot(
const Eigen::Vector<zono_float, -1>& x)
const;
924 void permute(
const Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic>& P);
930 std::string
print()
const;
938 friend std::ostream&
operator<<(std::ostream& os,
const Box& box);
961 bool contract_helper(
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A,
const Eigen::Vector<zono_float, -1>& b,
const int iter,
962 const std::set<int>& constraints);
974 void get_vars_cons(
const Eigen::SparseMatrix<zono_float>& A,
const Eigen::SparseMatrix<zono_float, Eigen::RowMajor>& A_rm,
975 std::set<int>& constraints, std::set<int>& vars,
const std::set<int>& new_vars,
int depth,
int max_depth);
Box (i.e., interval vector) class.
Definition Intervals.hpp:718
IntervalView operator[](size_t i)
Element-wise access, used for assignment.
Definition Intervals.cpp:49
Interval dot(const Eigen::Vector< zono_float, -1 > &x) const
Linear map with vector.
Definition Intervals.cpp:233
std::string print() const
Print method.
Definition Intervals.cpp:254
Box linear_map(const Eigen::Matrix< zono_float, -1, -1 > &A) const
Linear map of box based on interval arithmetic.
Definition Intervals.cpp:191
Eigen::Vector< zono_float, -1 > x_ub
vector of upper bounds
Definition Intervals.hpp:947
Eigen::Vector< zono_float, -1 > x_lb
vector of lower bounds
Definition Intervals.hpp:944
Box operator/(const Box &other) const
elementwise division
Definition Intervals.cpp:146
Box & operator=(const Box &other)
Copy assignment.
Definition Intervals.cpp:33
Box()=default
Default constructor.
virtual void project(Eigen::Ref< Eigen::Vector< zono_float, -1 > > x) const
Projects vector onto the Box.
Definition Intervals.cpp:68
const Eigen::Vector< zono_float, -1 > & upper() const
Get upper bounds.
Definition Intervals.hpp:814
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 Intervals.cpp:174
Eigen::Vector< zono_float, -1 > center() const
get center of box
Definition Intervals.cpp:90
void permute(const Eigen::PermutationMatrix< Eigen::Dynamic, Eigen::Dynamic > &P)
Permutes in place using permutation matrix, i.e., [x] <- P*[x].
Definition Intervals.cpp:248
size_t size() const
get size of Box object
Definition Intervals.cpp:63
friend std::ostream & operator<<(std::ostream &os, const Box &box)
print to ostream
Definition Intervals.cpp:265
Box operator-(const Box &other) const
elementwise subtraction
Definition Intervals.cpp:112
virtual Box * clone() const
Clone operation.
Definition Intervals.cpp:75
Box operator*(const Box &other) const
elementwise multiplication
Definition Intervals.cpp:124
zono_float width() const
Get width of box.
Definition Intervals.cpp:80
bool contract(const Eigen::SparseMatrix< zono_float, Eigen::RowMajor > &A, const Eigen::Vector< zono_float, -1 > &b, int iter)
Interval contractor.
Definition Intervals.cpp:158
virtual ~Box()=default
Virtual destructor.
const Eigen::Vector< zono_float, -1 > & lower() const
Get lower bounds.
Definition Intervals.hpp:808
Box operator+(const Box &other) const
elementwise addition
Definition Intervals.cpp:100
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45
#define zono_eps
Defines the precision used for floating point comparisons in ZonoOpt.
Definition ZonoOpt.hpp:53
Definition ZonoOpt.hpp:58
Base class for Interval and IntervalView.
Definition Intervals.hpp:48
void add_assign(const Derived &x1, const Derived &x2)
sets interval to x1 + x2
Definition Intervals.hpp:89
void arccos_assign(const Derived &x)
compute interval containing arccos(x) over x
Definition Intervals.hpp:337
void cos_assign(const Derived &x)
compute interval containing cos(x) over x
Definition Intervals.hpp:273
void inverse()
sets interval to its inverse
Definition Intervals.hpp:144
void subtract_assign(const Derived &x1, const Derived &x2)
sets interval to x1 - x2
Definition Intervals.hpp:100
void divide_assign(const Derived &x1, const Derived &x2)
sets interval to x1 / x2
Definition Intervals.hpp:181
void arctan_assign(const Derived &x)
compute interval containing arctan(x) over x
Definition Intervals.hpp:349
void set(const zono_float min, const zono_float max)
Sets interval bounds.
Definition Intervals.hpp:78
zono_float & y_max()
Returns reference to interval upper bound.
Definition Intervals.hpp:59
void sin_assign(const Derived &x)
compute interval containing sin(x) over x
Definition Intervals.hpp:240
void intersect_assign(const Derived &x1, const Derived &x2)
sets interval to intersection of x1 and x2
Definition Intervals.hpp:193
void exp_assign(const Derived &x)
compute interval containing exp(x) over x
Definition Intervals.hpp:359
void multiply_assign(const Derived &x1, const Derived &x2)
sets interval to x1 * x2
Definition Intervals.hpp:111
zono_float & y_min()
Returns reference to interval lower bound.
Definition Intervals.hpp:53
void tan_assign(const Derived &x)
compute interval containing tan(x) over x
Definition Intervals.hpp:284
void arcsin_assign(const Derived &x)
compute interval containing arcsin(x) over x
Definition Intervals.hpp:325
bool is_single_valued() const
checks whether interval is single-valued (i.e., width is 0 within numerical tolerance)
Definition Intervals.hpp:222
zono_float width() const
get width of interval (ub - lb)
Definition Intervals.hpp:231
const zono_float & y_min() const
Returns const reference to interval lower bound.
Definition Intervals.hpp:65
void multiply_assign(const Derived &x1, zono_float alpha)
sets interval to alpha * x1
Definition Intervals.hpp:127
bool contains(zono_float y) const
checks whether interval contains a value
Definition Intervals.hpp:213
bool is_empty() const
checks whether interval is empty
Definition Intervals.hpp:203
const zono_float & y_max() const
Returns const reference to interval upper bound.
Definition Intervals.hpp:71
IntervalView class.
Definition Intervals.hpp:635
zono_float & get_y_min()
get reference to lower bound
Definition Intervals.hpp:682
IntervalView & operator=(const IntervalBase< Derived > &other)
Assignment operator.
Definition Intervals.hpp:662
const zono_float & get_y_max() const
get const reference to upper bound
Definition Intervals.hpp:700
zono_float & get_y_max()
get reference to upper bound
Definition Intervals.hpp:688
Interval to_interval() const
convert to Interval class
Definition Intervals.hpp:704
const zono_float & get_y_min() const
get const reference to lower bound
Definition Intervals.hpp:694
zono_float * lb_ptr
pointer to lower bound
Definition Intervals.hpp:639
IntervalView(zono_float *y_min, zono_float *y_max)
constructor for IntervalView
Definition Intervals.hpp:651
zono_float * ub_ptr
pointer to upper bound
Definition Intervals.hpp:642
Interval class.
Definition Intervals.hpp:372
Interval(zono_float y_min, zono_float y_max)
Interval constructor.
Definition Intervals.hpp:391
const zono_float & get_y_max() const
get const reference to upper bound
Definition Intervals.hpp:426
std::string print() const
print method for Interval
Definition Intervals.hpp:534
zono_float & get_y_max()
get reference to upper bound
Definition Intervals.hpp:414
Interval()
default constructor
Definition Intervals.hpp:384
Interval intersect(const Interval &other) const
interval intersection
Definition Intervals.hpp:506
Interval arctan() const
compute interval containing arctan(x) for all x in interval
Definition Intervals.hpp:610
Interval exp() const
compute interval containing exp(x) for all x in interval
Definition Intervals.hpp:621
Interval operator+(const Interval &other) const
interval addition
Definition Intervals.hpp:435
Interval arcsin() const
compute interval containing arcsin(x) for all x in interval
Definition Intervals.hpp:588
Interval operator*(zono_float alpha) const
interval multiplication with scalar
Definition Intervals.hpp:471
zono_float lb
lower bound
Definition Intervals.hpp:375
Interval operator*(const Interval &other) const
interval multiplication
Definition Intervals.hpp:459
IntervalView as_view()
IntervalView interface for Interval.
Definition Intervals.hpp:709
const zono_float & get_y_min() const
get const reference to lower bound
Definition Intervals.hpp:420
friend std::ostream & operator<<(std::ostream &os, const Interval &interval)
print to ostream
Definition Intervals.hpp:545
Interval tan() const
compute interval containing tan(x) for all x in interval
Definition Intervals.hpp:577
Interval inv() const
interval inverse
Definition Intervals.hpp:482
Interval operator-(const Interval &other) const
interval subtraction
Definition Intervals.hpp:447
Interval operator/(const Interval &other) const
interval division
Definition Intervals.hpp:494
zono_float center() const
get center of interval
Definition Intervals.hpp:517
zono_float ub
upper bound
Definition Intervals.hpp:378
zono_float & get_y_min()
get reference to lower bound
Definition Intervals.hpp:408
Interval sin() const
compute interval containing sin(x) for all x in interval
Definition Intervals.hpp:555
Interval cos() const
compute interval containing cos(x) for all x in interval
Definition Intervals.hpp:566
Interval * clone() const
Clone Interval object.
Definition Intervals.hpp:397
Interval arccos() const
compute interval containing arccos(x) for all x in interval
Definition Intervals.hpp:599