ZonoOpt 2.4.1
Loading...
Searching...
No Matches
HybZono.hpp
Go to the documentation of this file.
1#ifndef ZONOOPT_HYBZONO_HPP_
2#define ZONOOPT_HYBZONO_HPP_
3
16#include "BranchAndBound.hpp"
17#include "BnbDataStructures.hpp"
18#include "IntervalMatrix.hpp"
19
20#include <cassert>
21#include <limits>
22#include <set>
23
24namespace ZonoOpt
25{
26
27using namespace detail;
28
29// forward declarations
30class Zono;
31class ConZono;
32
43{
44 public:
45
46 // constructors
47
52 HybZono() = default;
53
67 HybZono(const Eigen::SparseMatrix<zono_float>& Gc, const Eigen::SparseMatrix<zono_float>& Gb, const Eigen::Vector<zono_float, -1>& c,
68 const Eigen::SparseMatrix<zono_float>& Ac, const Eigen::SparseMatrix<zono_float>& Ab, const Eigen::Vector<zono_float, -1>& b,
69 const bool zero_one_form=false, const bool sharp=false);
70
71 // virtual destructor
72 virtual ~HybZono() = default;
73
87 void set(const Eigen::SparseMatrix<zono_float>& Gc, const Eigen::SparseMatrix<zono_float>& Gb, const Eigen::Vector<zono_float, -1>& c,
88 const Eigen::SparseMatrix<zono_float>& Ac, const Eigen::SparseMatrix<zono_float>& Ab, const Eigen::Vector<zono_float, -1>& b,
89 bool zero_one_form=false, bool sharp=false);
90
94 virtual HybZono* clone() const;
95
96 // get methods
97
103 virtual int get_n() const { return this->n; }
104
110 virtual int get_nC() const { return this->nC; }
111
117 virtual int get_nG() const { return this->nG; }
118
124 virtual int get_nGc() const { return this->nGc; }
125
131 virtual int get_nGb() const { return this->nGb; }
132
138 virtual Eigen::SparseMatrix<zono_float> get_Gc() const { return this->Gc; }
139
145 virtual Eigen::SparseMatrix<zono_float> get_Gb() const { return this->Gb; }
146
152 virtual Eigen::SparseMatrix<zono_float> get_G() const { return this->G; }
153
159 virtual Eigen::SparseMatrix<zono_float> get_Ac() const { return this->Ac; }
160
166 virtual Eigen::SparseMatrix<zono_float> get_Ab() const { return this->Ab; }
167
173 virtual Eigen::SparseMatrix<zono_float> get_A() const { return this->A; }
174
180 virtual Eigen::Vector<zono_float, -1> get_c() const { return this->c; }
181
187 virtual Eigen::Vector<zono_float, -1> get_b() const { return this->b; }
188
194 virtual bool is_0_1_form() const { return this->zero_one_form; }
195
203 bool is_sharp() const { return this->sharp; }
204
212 virtual void convert_form();
213
228 virtual std::unique_ptr<HybZono> remove_redundancy(int contractor_iter=10) const;
229
238 virtual std::unique_ptr<ConZono> convex_relaxation() const;
239
259 virtual std::unique_ptr<HybZono> complement(const zono_float delta_m = 100, const bool remove_redundancy=true, const SolverSettings &settings=get_default_solver_settings(),
260 std::shared_ptr<OptSolution>* solution=nullptr, const int n_leaves = std::numeric_limits<int>::max(), const int contractor_iter=10)
261 {
262 return do_complement(delta_m, remove_redundancy, settings, solution, n_leaves, contractor_iter);
263 }
264
265 // type checking
270 bool is_point() const;
271
276 bool is_zono() const;
277
282 bool is_conzono() const;
283
288 bool is_hybzono() const;
289
293 bool is_empty_set() const;
294
295 // display methods
300 virtual std::string print() const;
301
308 friend std::ostream& operator<<(std::ostream& os, const HybZono& Z);
309
310 // optimization
326 Eigen::Vector<zono_float, -1> optimize_over(
327 const Eigen::SparseMatrix<zono_float> &P, const Eigen::Vector<zono_float, -1> &q, zono_float c=0,
328 const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr,
330 {
331 return do_optimize_over(P, q, c, settings, solution, warm_start_params);
332 }
333
345 Eigen::Vector<zono_float, -1> project_point(const Eigen::Vector<zono_float, -1>& x,
346 const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr,
348 {
349 return do_project_point(x, settings, solution, warm_start_params);
350 }
351
362 std::shared_ptr<OptSolution>* solution=nullptr, const WarmStartParams& warm_start_params=WarmStartParams()) const
363 {
364 return do_is_empty(settings, solution, warm_start_params);
365 }
366
380 zono_float support(const Eigen::Vector<zono_float, -1>& d, const SolverSettings &settings=get_default_solver_settings(),
381 std::shared_ptr<OptSolution>* solution=nullptr, const WarmStartParams& warm_start_params=WarmStartParams())
382 {
383 return do_support(d, settings, solution, warm_start_params);
384 }
385
399 bool contains_point(const Eigen::Vector<zono_float, -1>& x, const SolverSettings &settings=get_default_solver_settings(),
400 std::shared_ptr<OptSolution>* solution=nullptr, const WarmStartParams& warm_start_params=WarmStartParams()) const
401 {
402 return do_contains_point(x, settings, solution, warm_start_params);
403 }
404
417 Box bounding_box(const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr,
419 {
420 return do_bounding_box(settings, solution, warm_start_params);
421 }
422
440 std::vector<std::unique_ptr<ConZono>> get_leaves(bool remove_redundancy=false, const SolverSettings &settings=get_default_solver_settings(),
441 std::shared_ptr<OptSolution>* solution=nullptr, int n_leaves = std::numeric_limits<int>::max(), int contractor_iter=10) const;
442
443 // friend function declarations
444 friend std::unique_ptr<HybZono> affine_map(const HybZono& Z,
445 const Eigen::SparseMatrix<zono_float>& R, const Eigen::Vector<zono_float, -1>& s);
446 friend std::unique_ptr<HybZono> affine_inclusion(const HybZono& Z, const IntervalMatrix& R, const Eigen::Vector<zono_float, -1>& s);
447 friend std::unique_ptr<HybZono> project_onto_dims(const HybZono& Z, const std::vector<int>& dims);
448 friend std::unique_ptr<HybZono> minkowski_sum(const HybZono& Z1, HybZono& Z2);
449 friend std::unique_ptr<HybZono> pontry_diff(HybZono& Z1, Zono& Z2, bool exact);
450 friend std::unique_ptr<HybZono> intersection(const HybZono& Z1, HybZono& Z2,
451 const Eigen::SparseMatrix<zono_float>& R);
452 friend std::unique_ptr<HybZono> intersection_over_dims(const HybZono& Z1, HybZono& Z2,
453 const std::vector<int>& dims);
454 friend std::unique_ptr<HybZono> halfspace_intersection(HybZono& Z, const Eigen::SparseMatrix<zono_float>& H,
455 const Eigen::Vector<zono_float, -1>& f, const Eigen::SparseMatrix<zono_float>& R);
456 friend std::unique_ptr<HybZono> union_of_many(const std::vector<std::shared_ptr<HybZono>>& Zs, bool preserve_sharpness, bool expose_indicators);
457 friend std::unique_ptr<ConZono> convex_hull(const std::vector<std::shared_ptr<HybZono>>& Zs, bool exact);
458 friend std::unique_ptr<HybZono> cartesian_product(const HybZono& Z1, HybZono& Z2);
459 friend std::unique_ptr<HybZono> constrain(HybZono& Z, const Eigen::SparseMatrix<zono_float>& H,
460 const Eigen::Vector<zono_float, -1>& f, char direction, const Eigen::SparseMatrix<zono_float>& R);
461 friend std::unique_ptr<HybZono> set_diff(const HybZono& Z1, HybZono& Z2, zono_float delta_m, bool remove_redundancy,
462 const SolverSettings &settings, std::shared_ptr<OptSolution>* solution, const WarmStartParams& warm_start_params, int n_leaves, int contractor_iter);
463 friend std::unique_ptr<HybZono> vrep_2_hybzono(const std::vector<Eigen::Matrix<zono_float, -1, -1>> &Vpolys, bool expose_indicators);
464 friend std::unique_ptr<HybZono> zono_union_2_hybzono(std::vector<std::shared_ptr<Zono>> &Zs, bool expose_indicators);
465
466 // operator overloading
467
475 std::unique_ptr<HybZono> operator+(HybZono& other) const;
476
484 std::unique_ptr<HybZono> operator+(const Eigen::Vector<zono_float, -1>& v) const;
485
494 friend std::unique_ptr<HybZono> operator+(const Eigen::Vector<zono_float, -1>& v, HybZono& Z);
495
503 std::unique_ptr<HybZono> operator+(const Box& box) const;
504
513 friend std::unique_ptr<HybZono> operator+(const Box& box, HybZono& Z);
514
521 void operator+=(HybZono& other);
522
529 void operator+=(const Eigen::Vector<zono_float, -1>& v);
530
537 void operator+=(const Box& box);
538
547 friend std::unique_ptr<HybZono> operator*(const Eigen::SparseMatrix<zono_float>& R, const HybZono& Z);
548
557 friend std::unique_ptr<HybZono> operator*(const Eigen::Matrix<zono_float, -1, -1>& R, const HybZono& Z);
558
566 friend std::unique_ptr<HybZono> operator*(const IntervalMatrix& R, const HybZono& Z);
567
574 std::unique_ptr<HybZono> operator*(zono_float f) const;
575
583 friend std::unique_ptr<HybZono> operator*(zono_float f, const HybZono& Z);
584
590 void operator*=(zono_float f);
591
599 std::unique_ptr<HybZono> operator-(Zono& other);
600
608 std::unique_ptr<HybZono> operator-(const Eigen::Vector<zono_float, -1>& v);
609
616 std::unique_ptr<HybZono> operator-(const Box& box);
617
624 void operator-=(Zono& other);
625
632 void operator-=(const Eigen::Vector<zono_float, -1>& v);
633
639 void operator-=(const Box& box);
640
647 std::unique_ptr<HybZono> operator*(HybZono& other) const;
648
654 std::unique_ptr<HybZono> operator*(const Box& box) const;
655
662 friend std::unique_ptr<HybZono> operator*(const Box& box, HybZono& Z);
663
669 void operator*=(HybZono& other);
670
675 void operator*=(const Box& box);
676
684 std::unique_ptr<HybZono> operator&(HybZono& other) const;
685
693 std::unique_ptr<HybZono> operator|(HybZono& other) const;
694
700 std::unique_ptr<HybZono> operator-() const; // unary minus
701
702 protected:
703
704 // fields
705
707 Eigen::SparseMatrix<zono_float> G = Eigen::SparseMatrix<zono_float>(0, 0);
708
710 Eigen::SparseMatrix<zono_float> Gc = Eigen::SparseMatrix<zono_float>(0, 0);
711
713 Eigen::SparseMatrix<zono_float> Gb = Eigen::SparseMatrix<zono_float>(0, 0);
714
716 Eigen::SparseMatrix<zono_float> A = Eigen::SparseMatrix<zono_float>(0, 0);
717
719 Eigen::SparseMatrix<zono_float> Ac = Eigen::SparseMatrix<zono_float>(0, 0);
720
722 Eigen::SparseMatrix<zono_float> Ab = Eigen::SparseMatrix<zono_float>(0, 0);
723
725 Eigen::Vector<zono_float, -1> c = Eigen::Vector<zono_float, -1>(0);
726
728 Eigen::Vector<zono_float, -1> b = Eigen::Vector<zono_float, -1>(0);
729
731 int n = 0;
732
734 int nG = 0;
735
737 int nGc = 0;
738
740 int nGb = 0;
741
743 int nC = 0;
744
746 bool zero_one_form = false;
747
749 bool sharp = false;
750
751 // methods
752 virtual Eigen::Vector<zono_float, -1> do_optimize_over(
753 const Eigen::SparseMatrix<zono_float> &P, const Eigen::Vector<zono_float, -1> &q, zono_float c,
754 const SolverSettings &settings, std::shared_ptr<OptSolution>* solution,
756
757 virtual Eigen::Vector<zono_float, -1> do_project_point(const Eigen::Vector<zono_float, -1>& x,
758 const SolverSettings &settings, std::shared_ptr<OptSolution>* solution, const WarmStartParams& warm_start_params) const;
759
760 virtual bool do_is_empty(const SolverSettings &settings, std::shared_ptr<OptSolution>* solution,
762
763 virtual zono_float do_support(const Eigen::Vector<zono_float, -1>& d, const SolverSettings &settings,
764 std::shared_ptr<OptSolution>* solution, const WarmStartParams& warm_start_params);
765
766 virtual bool do_contains_point(const Eigen::Vector<zono_float, -1>& x, const SolverSettings &settings,
767 std::shared_ptr<OptSolution>* solution, const WarmStartParams& warm_start_params) const;
768
769 virtual Box do_bounding_box(const SolverSettings &settings, std::shared_ptr<OptSolution>* solution,
771
772 virtual std::unique_ptr<HybZono> do_complement(zono_float, bool remove_redundancy, const SolverSettings &settings,
773 std::shared_ptr<OptSolution>* solution, int n_leaves, int contractor_iter);
774
775
776 static void remove_cols(Eigen::SparseMatrix<zono_float>& M, const std::set<int>& idx_to_remove);
777 static std::set<int> find_unused_generators(const Eigen::SparseMatrix<zono_float>& G, const Eigen::SparseMatrix<zono_float>& A);
778 OptSolution mi_opt(const Eigen::SparseMatrix<zono_float>& P, const Eigen::Vector<zono_float, -1>& q,
779 zono_float c, const Eigen::SparseMatrix<zono_float>& A, const Eigen::Vector<zono_float, -1>& b,
780 const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr,
782 std::vector<OptSolution> mi_opt_multisol(const Eigen::SparseMatrix<zono_float>& P, const Eigen::Vector<zono_float, -1>& q,
783 zono_float c, const Eigen::SparseMatrix<zono_float>& A, const Eigen::Vector<zono_float, -1>& b, int n_sols,
784 const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr) const;
785
786 private:
787
788 void make_G_A();
789 void set_Ac_Ab_from_A();
790 std::vector<Eigen::Vector<zono_float, -1>> get_bin_leaves(const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr,
791 int n_leaves = std::numeric_limits<int>::max()) const;
792 std::vector<std::pair<int, int>> get_simplifiable_constraints() const;
793 void apply_constraint_simplification(const std::vector<std::pair<int, int>>& cons, Box& box);
794 bool rescale_generators(MI_Box& box); // returns false if empty set detected
795 void remove_generators(const std::set<int>& idx_c, const std::set<int>& idx_b, MI_Box& box);
796 void remove_fixed_vars(MI_Box& box);
797 static std::unique_ptr<Zono> zono_hull(Zono& Z1, Zono& Z2);
798};
799
800// forward delcarations
811std::unique_ptr<HybZono> affine_map(const HybZono& Z,
812 const Eigen::SparseMatrix<zono_float>& R, const Eigen::Vector<zono_float, -1>& s = Eigen::Vector<zono_float, -1>());
813
830std::unique_ptr<HybZono> affine_inclusion(const HybZono& Z, const IntervalMatrix& R,
831 const Eigen::Vector<zono_float, -1>& s=Eigen::Vector<zono_float, -1>());
832
842std::unique_ptr<HybZono> project_onto_dims(const HybZono& Z, const std::vector<int>& dims);
843
853std::unique_ptr<HybZono> minkowski_sum(const HybZono& Z1, HybZono& Z2);
854
871std::unique_ptr<HybZono> pontry_diff(HybZono& Z1, Zono& Z2, bool exact=true);
872
883std::unique_ptr<HybZono> intersection(const HybZono& Z1, HybZono& Z2,
884 const Eigen::SparseMatrix<zono_float>& R=Eigen::SparseMatrix<zono_float>());
885
896std::unique_ptr<HybZono> intersection_over_dims(const HybZono& Z1, HybZono& Z2,
897 const std::vector<int>& dims);
898
913std::unique_ptr<HybZono> halfspace_intersection(HybZono& Z, const Eigen::SparseMatrix<zono_float>& H,
914 const Eigen::Vector<zono_float, -1>& f, const Eigen::SparseMatrix<zono_float>& R=Eigen::SparseMatrix<zono_float>());
915
931std::unique_ptr<HybZono> union_of_many(const std::vector<std::shared_ptr<HybZono>>& Zs, bool preserve_sharpness=false, bool expose_indicators=false);
932
947std::unique_ptr<ConZono> convex_hull(const std::vector<std::shared_ptr<HybZono>>& Zs, bool exact=true);
948
957std::unique_ptr<HybZono> cartesian_product(const HybZono& Z1, HybZono& Z2);
958
972std::unique_ptr<HybZono> constrain(HybZono& Z, const Eigen::SparseMatrix<zono_float>& H,
973 const Eigen::Vector<zono_float, -1>& f, char direction, const Eigen::SparseMatrix<zono_float>& R=Eigen::SparseMatrix<zono_float>());
974
989std::unique_ptr<HybZono> set_diff(const HybZono& Z1, HybZono& Z2, zono_float delta_m = 100, bool remove_redundancy=true,
990 const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr<OptSolution>* solution=nullptr,
991 int n_leaves = std::numeric_limits<int>::max(), int contractor_iter = 10);
992
993
1011std::unique_ptr<HybZono> vrep_2_hybzono(const std::vector<Eigen::Matrix<zono_float, -1, -1>> &Vpolys, bool expose_indicators=false);
1012
1013
1029std::unique_ptr<HybZono> zono_union_2_hybzono(std::vector<std::shared_ptr<Zono>> &Zs, bool expose_indicators=false);
1030
1031} // end namespace ZonoOpt
1032
1033#endif
Data structures for mixed-integer optimization in ZonoOpt library.
Internal branch-and-bound routines for ZonoOpt library.
IntervalMatrix class.
SCIPApi::ConsPtr cons
Definition SCIPSolver.cpp:58
Utilities for sparse matrix operations in ZonoOpt library.
Box (i.e., interval vector) class.
Definition Box.hpp:25
Hybrid zonotope class.
Definition HybZono.hpp:43
friend std::unique_ptr< HybZono > affine_map(const HybZono &Z, const Eigen::SparseMatrix< zono_float > &R, const Eigen::Vector< zono_float, -1 > &s)
Returns affine map R*Z + s of set Z.
Definition SetOperations.cpp:12
virtual bool is_0_1_form() const
Returns true if factors are in range [0,1], false if they are in range [-1,1].
Definition HybZono.hpp:194
int nC
number of constraints
Definition HybZono.hpp:743
friend std::unique_ptr< HybZono > constrain(HybZono &Z, const Eigen::SparseMatrix< zono_float > &H, const Eigen::Vector< zono_float, -1 > &f, char direction, const Eigen::SparseMatrix< zono_float > &R)
Computes the generalized intersection of set Z with H*x <= f, H*x >= f, or H*x = f over matrix R.
Definition SetOperations.cpp:857
virtual int get_n() const
Returns dimension of set.
Definition HybZono.hpp:103
friend std::unique_ptr< HybZono > pontry_diff(HybZono &Z1, Zono &Z2, bool exact)
Computes the Pontryagin difference Z1 - Z2.
Definition SetOperations.cpp:330
bool is_sharp() const
Returns true if set is known to be sharp.
Definition HybZono.hpp:203
friend std::unique_ptr< HybZono > cartesian_product(const HybZono &Z1, HybZono &Z2)
Computes the Cartesian product of two sets Z1 and Z2.
Definition SetOperations.cpp:797
int n
set dimension
Definition HybZono.hpp:731
virtual Eigen::SparseMatrix< zono_float > get_Gc() const
Returns continuous generator matrix.
Definition HybZono.hpp:138
friend std::unique_ptr< HybZono > minkowski_sum(const HybZono &Z1, HybZono &Z2)
Computes Minkowski sum of two sets Z1 and Z2.
Definition SetOperations.cpp:155
friend std::unique_ptr< HybZono > intersection_over_dims(const HybZono &Z1, HybZono &Z2, const std::vector< int > &dims)
Computes the generalized intersection of sets Z1 and Z2 over the specified dimensions.
Definition SetOperations.cpp:291
std::vector< std::unique_ptr< ConZono > > get_leaves(bool remove_redundancy=false, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, int n_leaves=std::numeric_limits< int >::max(), int contractor_iter=10) const
Computes individual constrained zonotopes whose union is the hybrid zonotope object.
Definition HybZono.cpp:956
friend std::unique_ptr< HybZono > operator*(const Eigen::SparseMatrix< zono_float > &R, const HybZono &Z)
affine map with sparse matrix: returns R*Z
Definition HybZono.cpp:1379
bool is_hybzono() const
Polymorphic type checking: true if set is a hybrid zonotope.
Definition HybZono.cpp:1320
bool contains_point(const Eigen::Vector< zono_float, -1 > &x, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams()) const
Checks whether the point x is contained in the set object.
Definition HybZono.hpp:399
virtual zono_float do_support(const Eigen::Vector< zono_float, -1 > &d, const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params)
Definition HybZono.cpp:1163
std::unique_ptr< HybZono > operator|(HybZono &other) const
union
Definition HybZono.cpp:1501
friend std::unique_ptr< ConZono > convex_hull(const std::vector< std::shared_ptr< HybZono > > &Zs, bool exact)
Computes convex hull of several sets.
Definition SetOperations.cpp:744
virtual int get_nC() const
Returns number of constraints in set definition.
Definition HybZono.hpp:110
friend std::unique_ptr< HybZono > vrep_2_hybzono(const std::vector< Eigen::Matrix< zono_float, -1, -1 > > &Vpolys, bool expose_indicators)
Computes a hybrid zonotope from a union of vertex representation polytopes.
Definition HybZono.cpp:1022
virtual int get_nGb() const
Returns number of binary generators in set definition.
Definition HybZono.hpp:131
std::unique_ptr< HybZono > operator-() const
unary minus: returns -I * this
Definition HybZono.cpp:1420
bool zero_one_form
flag to indicate whether the set is in 0-1 or -1-1 form
Definition HybZono.hpp:746
Eigen::SparseMatrix< zono_float > Gc
continuous generator matrix
Definition HybZono.hpp:710
virtual Eigen::Vector< zono_float, -1 > do_optimize_over(const Eigen::SparseMatrix< zono_float > &P, const Eigen::Vector< zono_float, -1 > &q, zono_float c, const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params) const
Definition HybZono.cpp:581
virtual void convert_form()
Converts the set representation between -1-1 and 0-1 forms.
Definition HybZono.cpp:54
virtual std::string print() const
Returns set information as a string.
Definition HybZono.cpp:556
Eigen::SparseMatrix< zono_float > Gb
binary generator matrix
Definition HybZono.hpp:713
int nG
total number of factors. nG = nGc + nGb
Definition HybZono.hpp:734
std::vector< OptSolution > mi_opt_multisol(const Eigen::SparseMatrix< zono_float > &P, const Eigen::Vector< zono_float, -1 > &q, zono_float c, const Eigen::SparseMatrix< zono_float > &A, const Eigen::Vector< zono_float, -1 > &b, int n_sols, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr) const
Definition HybZono.cpp:741
virtual HybZono * clone() const
Clone method for polymorphic behavior.
Definition HybZono.cpp:18
friend std::unique_ptr< HybZono > set_diff(const HybZono &Z1, HybZono &Z2, zono_float delta_m, bool remove_redundancy, const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params, int n_leaves, int contractor_iter)
bool is_conzono() const
Polymorphic type checking: true if set is a constrained zonotope.
Definition HybZono.cpp:1311
friend std::unique_ptr< HybZono > halfspace_intersection(HybZono &Z, const Eigen::SparseMatrix< zono_float > &H, const Eigen::Vector< zono_float, -1 > &f, const Eigen::SparseMatrix< zono_float > &R)
Computes the intersection generalized intersection of set Z with halfspace H*x <= f over matrix R.
Definition SetOperations.cpp:322
virtual Box do_bounding_box(const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params)
Definition HybZono.cpp:1194
Eigen::Vector< zono_float, -1 > optimize_over(const Eigen::SparseMatrix< zono_float > &P, const Eigen::Vector< zono_float, -1 > &q, zono_float c=0, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams()) const
Solves optimization problem with quadratic objective over the current set.
Definition HybZono.hpp:326
virtual Eigen::Vector< zono_float, -1 > get_c() const
Returns center vector.
Definition HybZono.hpp:180
bool is_point() const
Polymorphic type checking: true if set is a point.
Definition HybZono.cpp:1298
virtual ~HybZono()=default
virtual int get_nGc() const
Returns number of continuous generators in set definition.
Definition HybZono.hpp:124
virtual bool do_is_empty(const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params) const
Definition HybZono.cpp:629
virtual Eigen::Vector< zono_float, -1 > do_project_point(const Eigen::Vector< zono_float, -1 > &x, const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params) const
Definition HybZono.cpp:606
friend std::unique_ptr< HybZono > zono_union_2_hybzono(std::vector< std::shared_ptr< Zono > > &Zs, bool expose_indicators)
Computes a hybrid zonotope from a union of zonotopes.
Definition SetOperations.cpp:992
void operator+=(HybZono &other)
in-place minkowski sum
Definition HybZono.cpp:1364
void set(const Eigen::SparseMatrix< zono_float > &Gc, const Eigen::SparseMatrix< zono_float > &Gb, const Eigen::Vector< zono_float, -1 > &c, const Eigen::SparseMatrix< zono_float > &Ac, const Eigen::SparseMatrix< zono_float > &Ab, const Eigen::Vector< zono_float, -1 > &b, bool zero_one_form=false, bool sharp=false)
Reset hybrid zonotope object with the given parameters.
Definition HybZono.cpp:23
virtual bool do_contains_point(const Eigen::Vector< zono_float, -1 > &x, const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, const WarmStartParams &warm_start_params) const
Definition HybZono.cpp:650
virtual Eigen::SparseMatrix< zono_float > get_Ab() const
Returns binary constraint matrix.
Definition HybZono.hpp:166
virtual std::unique_ptr< ConZono > convex_relaxation() const
Returns convex relaxation of the hybrid zonotope.
Definition HybZono.cpp:1002
virtual Eigen::SparseMatrix< zono_float > get_A() const
Returns constraint matrix.
Definition HybZono.hpp:173
bool sharp
flag to indicate whether the set is known to be sharp (i.e., convex relaxation = convex hull)
Definition HybZono.hpp:749
Eigen::Vector< zono_float, -1 > c
center vector
Definition HybZono.hpp:725
virtual std::unique_ptr< HybZono > complement(const zono_float delta_m=100, const bool remove_redundancy=true, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const int n_leaves=std::numeric_limits< int >::max(), const int contractor_iter=10)
Computes the complement of the set Z.
Definition HybZono.hpp:259
int nGb
number of binary factors
Definition HybZono.hpp:740
HybZono()=default
Default constructor for HybZono class.
void operator-=(Zono &other)
in-place pontryagin difference
Definition HybZono.cpp:1454
zono_float support(const Eigen::Vector< zono_float, -1 > &d, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams())
Computes support function of the set in the direction d.
Definition HybZono.hpp:380
bool is_zono() const
Polymorphic type checking: true if set is a zonotope.
Definition HybZono.cpp:1304
virtual Eigen::Vector< zono_float, -1 > get_b() const
Returns constraint vector.
Definition HybZono.hpp:187
Eigen::Vector< zono_float, -1 > project_point(const Eigen::Vector< zono_float, -1 > &x, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams()) const
Returns the projection of the point x onto the set object.
Definition HybZono.hpp:345
friend std::unique_ptr< HybZono > union_of_many(const std::vector< std::shared_ptr< HybZono > > &Zs, bool preserve_sharpness, bool expose_indicators)
Computes union of several sets.
Definition SetOperations.cpp:449
static std::set< int > find_unused_generators(const Eigen::SparseMatrix< zono_float > &G, const Eigen::SparseMatrix< zono_float > &A)
Definition HybZono.cpp:838
virtual int get_nG() const
Returns number of generators in set definition.
Definition HybZono.hpp:117
static void remove_cols(Eigen::SparseMatrix< zono_float > &M, const std::set< int > &idx_to_remove)
Definition HybZono.cpp:809
Eigen::SparseMatrix< zono_float > A
constraint matrix A = [Ac, Ab]
Definition HybZono.hpp:716
Eigen::Vector< zono_float, -1 > b
constraint vector
Definition HybZono.hpp:728
virtual std::unique_ptr< HybZono > do_complement(zono_float, bool remove_redundancy, const SolverSettings &settings, std::shared_ptr< OptSolution > *solution, int n_leaves, int contractor_iter)
Definition HybZono.cpp:1263
friend std::ostream & operator<<(std::ostream &os, const HybZono &Z)
Displays set information to the given output stream.
Definition HybZono.cpp:575
OptSolution mi_opt(const Eigen::SparseMatrix< zono_float > &P, const Eigen::Vector< zono_float, -1 > &q, zono_float c, const Eigen::SparseMatrix< zono_float > &A, const Eigen::Vector< zono_float, -1 > &b, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams()) const
Definition HybZono.cpp:676
friend std::unique_ptr< HybZono > project_onto_dims(const HybZono &Z, const std::vector< int > &dims)
Projects set Z onto the dimensions specified in dims.
Definition SetOperations.cpp:125
friend std::unique_ptr< HybZono > intersection(const HybZono &Z1, HybZono &Z2, const Eigen::SparseMatrix< zono_float > &R)
Computes the generalized intersection of sets Z1 and Z2 over the matrix R.
Definition SetOperations.cpp:215
bool is_empty_set() const
Polymorphic type checking: true if set is empty set object.
Definition HybZono.cpp:1328
Box bounding_box(const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams())
Computes a bounding box of the set object as a Box object.
Definition HybZono.hpp:417
Eigen::SparseMatrix< zono_float > Ab
binary constraint matrix
Definition HybZono.hpp:722
virtual Eigen::SparseMatrix< zono_float > get_G() const
Returns generator matrix.
Definition HybZono.hpp:152
friend std::unique_ptr< HybZono > affine_inclusion(const HybZono &Z, const IntervalMatrix &R, const Eigen::Vector< zono_float, -1 > &s)
Returns inclusion of zonotopic set for uncertain affine map R*Z + s.
Definition SetOperations.cpp:57
Eigen::SparseMatrix< zono_float > Ac
continuous constraint matrix
Definition HybZono.hpp:719
virtual Eigen::SparseMatrix< zono_float > get_Gb() const
Returns binary generator matrix.
Definition HybZono.hpp:145
void operator*=(zono_float f)
scalar multiplication in place
Definition HybZono.cpp:1415
bool is_empty(const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, const WarmStartParams &warm_start_params=WarmStartParams()) const
Returns true if the set is provably empty, false otherwise.
Definition HybZono.hpp:361
Eigen::SparseMatrix< zono_float > G
generator matrix G = [Gc, Gb]
Definition HybZono.hpp:707
int nGc
number of continuous factors
Definition HybZono.hpp:737
virtual std::unique_ptr< HybZono > remove_redundancy(int contractor_iter=10) const
Removes redundant constraints and any unused generators.
Definition HybZono.cpp:83
virtual Eigen::SparseMatrix< zono_float > get_Ac() const
Returns continuous constraint matrix.
Definition HybZono.hpp:159
friend std::unique_ptr< HybZono > operator+(const Eigen::Vector< zono_float, -1 > &v, HybZono &Z)
minkowski sum with point
Definition HybZono.cpp:1346
std::unique_ptr< HybZono > operator&(HybZono &other) const
intersection
Definition HybZono.cpp:1496
Class for interval matrices (i.e., every element of the matrix is an interval)
Definition IntervalMatrix.hpp:27
Mixed-integer box.
Definition Box.hpp:644
Zonotope class.
Definition Zono.hpp:32
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45
std::unique_ptr< HybZono > pontry_diff(HybZono &Z1, Zono &Z2, bool exact=true)
Computes the Pontryagin difference Z1 - Z2.
Definition SetOperations.cpp:330
std::unique_ptr< HybZono > cartesian_product(const HybZono &Z1, HybZono &Z2)
Computes the Cartesian product of two sets Z1 and Z2.
Definition SetOperations.cpp:797
std::unique_ptr< HybZono > minkowski_sum(const HybZono &Z1, HybZono &Z2)
Computes Minkowski sum of two sets Z1 and Z2.
Definition SetOperations.cpp:155
std::unique_ptr< HybZono > project_onto_dims(const HybZono &Z, const std::vector< int > &dims)
Projects set Z onto the dimensions specified in dims.
Definition SetOperations.cpp:125
std::unique_ptr< HybZono > set_diff(const HybZono &Z1, HybZono &Z2, zono_float delta_m=100, bool remove_redundancy=true, const SolverSettings &settings=get_default_solver_settings(), std::shared_ptr< OptSolution > *solution=nullptr, int n_leaves=std::numeric_limits< int >::max(), int contractor_iter=10)
Set difference Z1 \ Z2.
Definition SetOperations.cpp:973
std::unique_ptr< HybZono > affine_inclusion(const HybZono &Z, const IntervalMatrix &R, const Eigen::Vector< zono_float, -1 > &s=Eigen::Vector< zono_float, -1 >())
Returns inclusion of zonotopic set for uncertain affine map R*Z + s.
Definition SetOperations.cpp:57
std::unique_ptr< HybZono > affine_map(const HybZono &Z, const Eigen::SparseMatrix< zono_float > &R, const Eigen::Vector< zono_float, -1 > &s=Eigen::Vector< zono_float, -1 >())
Returns affine map R*Z + s of set Z.
Definition SetOperations.cpp:12
std::unique_ptr< HybZono > union_of_many(const std::vector< std::shared_ptr< HybZono > > &Zs, bool preserve_sharpness=false, bool expose_indicators=false)
Computes union of several sets.
Definition SetOperations.cpp:449
std::unique_ptr< HybZono > intersection(const HybZono &Z1, HybZono &Z2, const Eigen::SparseMatrix< zono_float > &R=Eigen::SparseMatrix< zono_float >())
Computes the generalized intersection of sets Z1 and Z2 over the matrix R.
Definition SetOperations.cpp:215
std::unique_ptr< ConZono > convex_hull(const std::vector< std::shared_ptr< HybZono > > &Zs, bool exact=true)
Computes convex hull of several sets.
Definition SetOperations.cpp:744
std::unique_ptr< HybZono > constrain(HybZono &Z, const Eigen::SparseMatrix< zono_float > &H, const Eigen::Vector< zono_float, -1 > &f, char direction, const Eigen::SparseMatrix< zono_float > &R=Eigen::SparseMatrix< zono_float >())
Computes the generalized intersection of set Z with H*x <= f, H*x >= f, or H*x = f over matrix R.
Definition SetOperations.cpp:857
std::unique_ptr< HybZono > halfspace_intersection(HybZono &Z, const Eigen::SparseMatrix< zono_float > &H, const Eigen::Vector< zono_float, -1 > &f, const Eigen::SparseMatrix< zono_float > &R=Eigen::SparseMatrix< zono_float >())
Computes the intersection generalized intersection of set Z with halfspace H*x <= f over matrix R.
Definition SetOperations.cpp:322
std::unique_ptr< HybZono > intersection_over_dims(const HybZono &Z1, HybZono &Z2, const std::vector< int > &dims)
Computes the generalized intersection of sets Z1 and Z2 over the specified dimensions.
Definition SetOperations.cpp:291
std::unique_ptr< HybZono > vrep_2_hybzono(const std::vector< Eigen::Matrix< zono_float, -1, -1 > > &Vpolys, bool expose_indicators=false)
Computes a hybrid zonotope from a union of vertex representation polytopes.
Definition HybZono.cpp:1022
std::unique_ptr< HybZono > zono_union_2_hybzono(std::vector< std::shared_ptr< Zono > > &Zs, bool expose_indicators=false)
Computes a hybrid zonotope from a union of zonotopes.
Definition SetOperations.cpp:992
Definition ZonoOpt.hpp:58
const SolverSettings & get_default_solver_settings()
Returns a reference to the current program-wide default solver settings.
Definition SolverDataStructures.hpp:388
Solution data structure for optimization routines in ZonoOpt library.
Definition SolverDataStructures.hpp:288
Abstract base for all solver settings.
Definition SolverDataStructures.hpp:35
Warm start parameters for optimization routines in ZonoOpt library.
Definition ADMM.hpp:49