From a96c637572128c38eadb6bd9aecc1689af58ebc6 Mon Sep 17 00:00:00 2001 From: Joshua Robbins Date: Wed, 15 Apr 2026 16:52:10 -0400 Subject: [PATCH] made progress bar when plotting optional and updated documentation --- .../html/BnbDataStructures_8hpp_source.html | 115 ++++----- docs/C++/html/BranchAndBound_8hpp_source.html | 244 +++++++++--------- docs/python/build/doctrees/environment.pickle | Bin 187352 -> 187352 bytes docs/python/build/doctrees/index.doctree | Bin 56491 -> 56491 bytes docs/python/build/doctrees/zonoopt.doctree | Bin 1333725 -> 1335170 bytes docs/python/build/html/searchindex.js | 2 +- docs/python/build/html/zonoopt.html | 15 +- python/zonoopt/_core.pyi | 12 +- python/zonoopt/zono_plot.py | 11 +- 9 files changed, 199 insertions(+), 200 deletions(-) diff --git a/docs/C++/html/BnbDataStructures_8hpp_source.html b/docs/C++/html/BnbDataStructures_8hpp_source.html index 8b46cd70..673c0a30 100644 --- a/docs/C++/html/BnbDataStructures_8hpp_source.html +++ b/docs/C++/html/BnbDataStructures_8hpp_source.html @@ -355,70 +355,61 @@
270 return x_box;
271 }
272
-
273 bool is_priority() const
-
274 {
-
275 return priority;
-
276 }
+
273 private:
+
274 // members
+
275 Box x_box;
+
276 };
277
-
278 void set_priority(bool priority)
-
279 {
-
280 this->priority = priority;
-
281 }
-
282
-
283 private:
-
284 // members
-
285 Box x_box;
-
286 bool priority = false;
-
287 };
-
288
-
289 template <typename T, typename Compare=std::less<T>>
-
290 class PriorityQueuePrunable final : public std::priority_queue<T, std::vector<T>, Compare>
-
291 {
-
292 public:
-
293 // constructor
-
294 explicit PriorityQueuePrunable(const Compare& comp = Compare()) : std::priority_queue<
-
295 T, std::vector<T>, Compare>(comp)
-
296 {
-
297 }
-
298
-
299 // prune queue
-
300 void prune(const T& t)
-
301 {
-
302 auto it_prune = std::find_if(this->c.begin(), this->c.end(), [&](const T& item)
-
303 {
-
304 return this->comp(item, t);
-
305 });
-
306 if (it_prune != this->c.end())
-
307 {
-
308 this->c.erase(it_prune, this->c.end());
-
309 }
-
310 }
-
311
-
312 // bottom
-
313 const T& bottom() const
-
314 {
-
315 return this->c.back();
-
316 }
-
317
-
318 // pop top
-
319 T pop_top()
-
320 {
-
321 T top = std::move(this->c.front());
-
322 this->pop();
-
323 return top;
-
324 }
+
278 template <typename T, typename Compare=std::less<T>>
+
279 class PriorityQueuePrunable final : public std::priority_queue<T, std::vector<T>, Compare>
+
280 {
+
281 public:
+
282 // constructor
+
283 explicit PriorityQueuePrunable(const Compare& comp = Compare()) : std::priority_queue<
+
284 T, std::vector<T>, Compare>(comp)
+
285 {
+
286 }
+
287
+
288 // prune queue
+
289 void prune(const T& t)
+
290 {
+
291 auto it_prune = std::remove_if(this->c.begin(), this->c.end(), [&](const T& item)
+
292 {
+
293 return this->comp(item, t);
+
294 });
+
295 if (it_prune != this->c.end())
+
296 {
+
297 this->c.erase(it_prune, this->c.end());
+
298 std::make_heap(this->c.begin(), this->c.end(), this->comp);
+
299 }
+
300 }
+
301
+
302 // bottom
+
303 const T& bottom() const
+
304 {
+
305 return this->c.back();
+
306 }
+
307
+
308 // pop top
+
309 T pop_top()
+
310 {
+
311 T top = std::move(this->c.front());
+
312 this->pop();
+
313 return top;
+
314 }
+
315
+
316 // clear
+
317 void clear()
+
318 {
+
319 while (!this->empty())
+
320 this->pop();
+
321 }
+
322
+
323 };
+
324} // namespace ZonoOpt::detail
325
-
326 // clear
-
327 void clear()
-
328 {
-
329 while (!this->empty())
-
330 this->pop();
-
331 }
-
332 };
-
333} // namespace ZonoOpt::detail
-
334
-
335
-
336#endif
+
326
+
327#endif
Convex and mixed-integer ADMM implementations 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
diff --git a/docs/C++/html/BranchAndBound_8hpp_source.html b/docs/C++/html/BranchAndBound_8hpp_source.html index be7b5895..dc12a59f 100644 --- a/docs/C++/html/BranchAndBound_8hpp_source.html +++ b/docs/C++/html/BranchAndBound_8hpp_source.html @@ -156,128 +156,130 @@
71 bool operator()(const std::unique_ptr<Node, NodeDeleter>& n1,
72 const std::unique_ptr<Node, NodeDeleter>& n2) const
73 {
-
74 if (n2->is_priority() && !n1->is_priority())
-
75 return true;
-
76 else if (!n2->is_priority() && n1->is_priority())
-
77 return false;
-
78 else
-
79 return n1->solution.J > n2->solution.J;
-
80 }
-
81 };
-
82
-
83 struct JThreadCompare
-
84 {
-
85 bool operator()(const std::pair<int, zono_float>& v1,
-
86 const std::pair<int, zono_float>& v2) const
-
87 {
-
88 if (v1.second != v2.second) return v1.second < v2.second;
-
89 return v1.first < v2.first;
-
90 }
-
91 };
-
92
-
93 template <typename T, typename Comp=std::less<T>>
-
94 struct ThreadGuard
-
95 {
-
96 ThreadSafeSet<T, Comp>& thread_tags;
-
97 T tag;
-
98 bool specified = false;
-
99
-
100 explicit ThreadGuard(ThreadSafeSet<T, Comp>& thread_tags): thread_tags(thread_tags)
-
101 {
-
102 }
-
103
-
104 void specify_tag(const T& tag)
-
105 {
-
106 if (!specified)
-
107 {
-
108 this->tag = tag;
-
109 this->specified = true;
-
110 this->thread_tags.add(tag);
-
111 }
-
112 }
-
113
-
114 ~ThreadGuard()
-
115 {
-
116 if (specified)
-
117 this->thread_tags.remove(tag);
-
118 }
-
119 };
-
120
-
121 const MI_data data;
-
122 std::pmr::synchronized_pool_resource pool;
-
123 NodeCompare comp;
-
124
-
125 PriorityQueuePrunable<std::unique_ptr<Node, NodeDeleter>, NodeCompare> node_queue; // priority queue for nodes
-
126 mutable std::mutex pq_mtx;
-
127 mutable std::mutex incumbent_mtx; // guards atomic check-and-update of incumbent (J_max, z, x, u, etc.)
-
128 std::condition_variable pq_cv_bnb, pq_cv_admm_fp;
-
129 // condition variables for branch-and-bound and ADMM-FP threads
-
130
-
131 bool multi_sol = false;
-
132 std::shared_ptr<ADMM_data> bnb_data, admm_fp_data; // data for branch-and-bound threads / ADMM-FP threads
-
133
-
134 std::atomic<bool> converged = false;
-
135 std::atomic<bool> done = false;
-
136 std::atomic<bool> feasible = false; // feasible solution found
-
137 std::atomic<bool> admm_fp_incumbent = false; // incumbent is from ADMM FP
-
138 std::atomic<long int> qp_iter = 0; // number of QP iterations
-
139 std::atomic<int> iter = 0; // number of iterations
-
140 std::atomic<int> iter_admm_fp = 0; // number of feasibility pump iterations
-
141 std::atomic<zono_float> J_max = std::numeric_limits<zono_float>::infinity(); // upper bound
-
142 ThreadSafeAccess<Eigen::Vector<zono_float, -1>> z, x, u; // solution vector
-
143 std::atomic<zono_float> primal_residual = std::numeric_limits<zono_float>::infinity();
-
144 std::atomic<zono_float> dual_residual = std::numeric_limits<zono_float>::infinity();
-
145 ThreadSafeIncrementable<double> total_startup_time{0.0};
-
146 ThreadSafeIncrementable<double> total_run_time{0.0};
-
147 ThreadSafeSet<std::pair<int, zono_float>, JThreadCompare> J_threads; // threads for J values
-
148 ThreadSafeVector<OptSolution> solutions; // solutions found
-
149 std::uniform_int_distribution<int> uniform_dist{0, std::numeric_limits<int>::max()};
-
150 std::mt19937 rng{0};
-
151
-
152 // warmstart variables
-
153 Eigen::Vector<zono_float, -1> xi_ws, u_ws;
-
154
-
155 // allocate nodes
-
156 std::unique_ptr<Node, NodeDeleter> make_node(const std::shared_ptr<ADMM_data>& admm_data);
-
157
-
158 std::unique_ptr<Node, NodeDeleter> clone_node(const std::unique_ptr<Node, NodeDeleter>& other);
+
74 return n1->solution.J > n2->solution.J; // min-heap on J
+
75 }
+
76 };
+
77
+
78 struct JThreadCompare
+
79 {
+
80 bool operator()(const std::pair<int, zono_float>& v1,
+
81 const std::pair<int, zono_float>& v2) const
+
82 {
+
83 if (v1.second != v2.second) return v1.second < v2.second;
+
84 return v1.first < v2.first;
+
85 }
+
86 };
+
87
+
88 template <typename T, typename Comp=std::less<T>>
+
89 struct ThreadGuard
+
90 {
+
91 ThreadSafeSet<T, Comp>& thread_tags;
+
92 T tag;
+
93 bool specified = false;
+
94
+
95 explicit ThreadGuard(ThreadSafeSet<T, Comp>& thread_tags): thread_tags(thread_tags)
+
96 {
+
97 }
+
98
+
99 void specify_tag(const T& tag)
+
100 {
+
101 if (!specified)
+
102 {
+
103 this->tag = tag;
+
104 this->specified = true;
+
105 this->thread_tags.add(tag);
+
106 }
+
107 }
+
108
+
109 ~ThreadGuard()
+
110 {
+
111 if (specified)
+
112 this->thread_tags.remove(tag);
+
113 }
+
114 };
+
115
+
116 const MI_data data;
+
117 std::pmr::synchronized_pool_resource pool;
+
118 NodeCompare comp;
+
119
+
120 PriorityQueuePrunable<std::unique_ptr<Node, NodeDeleter>, NodeCompare> node_queue; // priority queue for nodes
+
121 PriorityQueuePrunable<std::unique_ptr<Node, NodeDeleter>, NodeCompare> dive_queue; // dive queue for search mode 1
+
122 mutable std::mutex pq_mtx;
+
123 mutable std::mutex incumbent_mtx; // guards atomic check-and-update of incumbent (J_max, z, x, u, etc.)
+
124 std::condition_variable pq_cv_bnb, pq_cv_admm_fp;
+
125 // condition variables for branch-and-bound and ADMM-FP threads
+
126
+
127 bool multi_sol = false;
+
128 std::shared_ptr<ADMM_data> bnb_data, admm_fp_data; // data for branch-and-bound threads / ADMM-FP threads
+
129
+
130 std::atomic<bool> converged = false;
+
131 std::atomic<bool> done = false;
+
132 std::atomic<bool> feasible = false; // feasible solution found
+
133 std::atomic<bool> admm_fp_incumbent = false; // incumbent is from ADMM FP
+
134 std::atomic<long int> qp_iter = 0; // number of QP iterations
+
135 std::atomic<int> iter = 0; // number of iterations
+
136 std::atomic<int> iter_admm_fp = 0; // number of feasibility pump iterations
+
137 std::atomic<zono_float> J_max = std::numeric_limits<zono_float>::infinity(); // upper bound
+
138 ThreadSafeAccess<Eigen::Vector<zono_float, -1>> z, x, u; // solution vector
+
139 std::atomic<zono_float> primal_residual = std::numeric_limits<zono_float>::infinity();
+
140 std::atomic<zono_float> dual_residual = std::numeric_limits<zono_float>::infinity();
+
141 ThreadSafeIncrementable<double> total_startup_time{0.0};
+
142 ThreadSafeIncrementable<double> total_run_time{0.0};
+
143 ThreadSafeSet<std::pair<int, zono_float>, JThreadCompare> J_threads; // threads for J values
+
144 ThreadSafeVector<OptSolution> solutions; // solutions found
+
145 std::uniform_int_distribution<int> uniform_dist{0, std::numeric_limits<int>::max()};
+
146 std::mt19937 rng{0};
+
147
+
148 // warmstart variables
+
149 Eigen::Vector<zono_float, -1> xi_ws, u_ws;
+
150
+
151 // allocate nodes
+
152 std::unique_ptr<Node, NodeDeleter> make_node(const std::shared_ptr<ADMM_data>& admm_data);
+
153
+
154 std::unique_ptr<Node, NodeDeleter> clone_node(const std::unique_ptr<Node, NodeDeleter>& other);
+
155
+
156 // solver core
+
157 std::variant<OptSolution, std::pair<std::vector<OptSolution>, OptSolution>> solver_core(
+
158 int max_sols = std::numeric_limits<int>::max());
159
-
160 // solver core
-
161 std::variant<OptSolution, std::pair<std::vector<OptSolution>, OptSolution>> solver_core(
-
162 int max_sols = std::numeric_limits<int>::max());
-
163
-
164 // solve node and branch
-
165 void solve_and_branch(const std::unique_ptr<Node, NodeDeleter>& node);
-
166
-
167 void admm_fp_solve(const std::unique_ptr<ADMM_FP_solver>& node);
-
168
-
169 // check if integer feasible, xb is vector of relaxed binary variables
-
170 bool is_integer_feasible(const Eigen::Ref<const Eigen::Vector<zono_float, -1>> xb) const;
-
171
-
172 // most fractional branching
-
173 void branch_most_frac(const std::unique_ptr<Node, NodeDeleter>& node);
-
174
-
175 // loop for multithreading
-
176 void worker_loop();
-
177
-
178 void admm_fp_loop(std::unique_ptr<ADMM_FP_solver>&& node);
-
179
-
180 // push node to queue
-
181 void push_node(std::unique_ptr<Node, NodeDeleter>&& node);
-
182
-
183 // prune
-
184 void prune(zono_float J_prune);
-
185
-
186 // check if 2 solutions correspond to the same binaries
-
187 bool check_bin_equal(const OptSolution& sol1, const OptSolution& sol2) const;
-
188
-
189 // check whether integer variables are fully specified
-
190 bool is_box_integer(const Box& box) const;
-
191 };
-
192} // namespace ZonoOpt::detail
-
193
-
194
-
195#endif
+
160 // solve node and branch
+
161 void solve_and_branch(const std::unique_ptr<Node, NodeDeleter>& node);
+
162
+
163 void admm_fp_solve(const std::unique_ptr<ADMM_FP_solver>& node);
+
164
+
165 // check if integer feasible, xb is vector of relaxed binary variables
+
166 bool is_integer_feasible(const Eigen::Ref<const Eigen::Vector<zono_float, -1>> xb) const;
+
167
+
168 // most fractional branching
+
169 void branch_most_frac(const std::unique_ptr<Node, NodeDeleter>& node);
+
170
+
171 // loop for multithreading
+
172 void worker_loop();
+
173
+
174 void admm_fp_loop(std::unique_ptr<ADMM_FP_solver>&& node);
+
175
+
176 // push node to queue
+
177 void push_node(std::unique_ptr<Node, NodeDeleter>&& node);
+
178
+
179 // push node to dive queue (search mode 1)
+
180 void push_dive_node(std::unique_ptr<Node, NodeDeleter>&& node);
+
181
+
182 // prune
+
183 void prune(zono_float J_prune);
+
184
+
185 // check if 2 solutions correspond to the same binaries
+
186 bool check_bin_equal(const OptSolution& sol1, const OptSolution& sol2) const;
+
187
+
188 // check whether integer variables are fully specified
+
189 bool is_box_integer(const Box& box) const;
+
190
+
191 // get lower bound
+
192 zono_float get_lower_bound();
+
193 };
+
194} // namespace ZonoOpt::detail
+
195
+
196
+
197#endif
Convex and mixed-integer ADMM implementations used within ZonoOpt.
Data structures for mixed-integer optimization in ZonoOpt library.
Optimization settings and solution data structures for ZonoOpt library.
diff --git a/docs/python/build/doctrees/environment.pickle b/docs/python/build/doctrees/environment.pickle index 2180761e6c8a276ddbac398f652be003a1de65b1..d6d1ea6afb09933735e37b7c47389e12eff8b64f 100644 GIT binary patch delta 193 zcmcbyo%_ai?hRSO!W?<|MX4pFMR`+t*pu^f3vyB`Ca)J3HSgif%uP(s%u6h)oYKQn zl2MeJm=d3ppPZO8rH8k;B(WqjIX$wy5@cr|*M^z^1= ptpzH{T06Pl#B8#HsVX;w3lR%2bwlPiFEnjmXv(;Kp(&I3G5|HGOaA}> diff --git a/docs/python/build/doctrees/index.doctree b/docs/python/build/doctrees/index.doctree index e9bca46dc5f08740b8cdde179ca6c6ad93c85578..e5dcdfa0e135a39ccf4cb5248b621ba3f3cf3aa3 100644 GIT binary patch delta 145 zcmZ3zlX>+{<_+SqksNvXMX4pFMR`+t*pu^f3vyB`fULxv%=EncG#D$fcuEgvW^Q77 zW?o`Z<&++tl8mC%#FY4){N%)(DLuT!C5a`O$?=KB#i>OlQ+imE^7C^x7sztUv#wx| rzS}yv!KRp3qlZaPZ%URa3j;%z>Evizv&mMrB9lMcxNn|lD>WYgXBszu delta 148 zcmZ3zlX>+{<_+Sqkt|91`8iX1IP&s~QcFsU@}~4~X67cQXXYgqRZi*QEiOqc$xMz< zEG|whDw)#5o}8askds<5rH7{^qbM~oB|axVIT5IzJuxRUJug2E#!4*STp-IW&#I^+ usp&Jh!KQe!fi2tQ09(h&X0{@{8a+&UdQ-COSQr?x>?YZoZJuZ=H6H-fl{NkV diff --git a/docs/python/build/doctrees/zonoopt.doctree b/docs/python/build/doctrees/zonoopt.doctree index caedf57ade47a136495565d787942d1678995e52..96166bca78e6f3cbff2f749b3bff00d40888bcc8 100644 GIT binary patch delta 13016 zcmb_idsvj!)^G1&WNKE$tjTDU2ZF1rZcQ=q6fP+Rd)^onxV8TH5)(wbp)znL&8Ie?FfF*Svf0_1kOh zz1MHAz2En%Pd^rUuF*A8 zS@L=0n>~!49!d44HtoreJ+(6j<|Ne%&u_K#)k796^iOkH_LxGR`@~t2R~aLclatmT zM`YhTYkU8a&6YnR8izWqzaJ;yK%+g_5OD01{U2}<|7Y9zEch3Nf35M)ihnlz zv*Vuw|Dy3P#^288>^|JGPKfL1UqQapLH9Kd@#PQQ-OnY?3 z#F;b4=VZ?qbpMRm6a5W8y9$Mf_bid(x&>#CsE@kXR;iOFbf<#o%5Tw1r@W8xspYJwj3X; zzlv2tzKA3H2$qP9(SVab=TaC+|g@1}?&g3amJQF6* zoIWM{DNnX1KoA}z2+y3{iBmn(r%anQYx2}bJ-JWi%$PjEGk4n5X|twHpEwiFJ5=l- z)l3%#@vdyPZfT(=hjw{~jM1$!Mi=Gzc@8fW7n(ZAQ^xR|Y%)BbHa|S5%cFe3P$Ntl zWmAz}IM)@0E|gv|Ma`}g)Z#%#NrODG3OmbfpKHqPa9?ixeY10NV^J75}=`8y5$1KOrq-i z^~hkTI6`hPbY4Sw$&n1P9n_7mwUg>t;9cC-;G`7T*fm-qAu}l!Bl>IBu5z0Jhnfth zZTi$<72ks|N~J)|kr)dU#VZfN)PL;q#0@4!xTh5o?DsTTnfe!;Z*80BU!0(vxYvQ` zuHvELeM^G4>Ob01br2$2mlYqD9c`$lCoj)Y41E*TcF_f@l2pRl@z=}5VyK^QO%kbG zQm`hz0~KW#S-Xl1f=Hvs^R>=wF_In=pmMHjnH+{qM%z+Ydx5owj4y`UZ&1U-1~l7 zVCy0d!Gk@NSKi`-j5fA-h)Hs>R=~oA3_?0VHj`6|ya`lFM0QGY0J)1OH zl;lwI5-y?-Vs3Fdi*a^4(ndPhhrgV~@N0@nv^%gkH$GF~?)_U4^!~-x4KjPG$K*mE zI7_Ww_-CZ64mNvK4DIjpeg2wWDp$(YKFHr-^V(M-6l$Bej`x1~2Kr13expzC`(yj4 zKgkN8Cip!liQrK>i*ThM_i5TVib}ZWyFMb*LiYT*Sbou|s67(~N+Jxg2U62i7b@n+ z^rLKy%u;MayZt9=*s*m7Di$>kKds=>nx(+X7B2>qj@7x znTm%P9Ciow*&UQW3{X#yk?hX!ChjoZ`FNz0Xm+!!F|OCcra=L!JB8yz zGk+2d`q=p(%o!YDxw8zFL^VOJ5z0t`pNhb@Qt$dm3lT(z|+|kCj;x? zdTdEN7gs_xxNkcnSVuk{ez^BsbSz zm#%IXa&ie|Oh9`*8=W2GL^SNM^EjmcAtNC(OGU$^kD?urF8c%!*WA9SSq@xrvy1U<$txF;6B}Wf|kJLLpR;_llgJHMJ zHqu*4qdNo^ww6x#a-hWvo?KIVYQu;_O0|XfjI^y@21lC^7;f@#unEHA#%3TEpSFx6 zoci^SB)K@)cke4PDUv)eJYy;gA3UbAH%s+kypF0wW#LVj${t34iOS~E95R(1F2!GS zOJM3S)y+PKW<*n2PKll&xjC2P@EJgmqw=nyU2&#{@``Kr8% z<3+)G86|NQO5!STj>crvzEdAgTsyJj5TZH^^`r1`f^9jbP;yM6eDO|K4=Sgaf(fIP z2V#zyt>Oas?pG`1T|0GWLr_v@D3KY4%CS2&H;vh;xv9%eeGnPne7~r+>H*b5&NkHW zIb)k6T`o1A7dL@tI^!`K^S%i;n*FNi$|;5$V#S&43v$GccB!RB7Q<&DK>FD zIW|vY`7GPr@+1x&jq``-D$;{Ii=9N;yz*NHNuu&V`}|Xm5u!{tmt`U3(5_6AgB}h| z4nmJTo+qILuRDmzq8#(nAyqrry829M>bujO8&*xy)O`j}cRj~m4w1d9Dzr>JQb z`7fjV`#?E7JsXefCOH2L9@md%w!@P-8DMz^4aGG30{r-d8V={4P#Z-1#zwM@U!VKa z>m6pCh6{7l1x(-q81lyOY7Xdd&nciq7HK3w%rmZe@?O6V>hNY9)MIg;DX8brpmR{? z`|;PDGUz`~CD>=tkm{fwU#5e4`8+ikQ$a+>B=~I92RH?G%1&na_3gt-s_Iz~^XEvp z+z*S6IbRch=OVs$kZ<@o)WjQ*{j?e>%Bd<%?)K{pq=GsR3G93gBTT zy2gM-SDbEP^xvTSM=b8YLHB>Inf|X@xgi|pV#_e>2&$7KCf_arKfY_ulUTr> zY`?~nE^zui^D5B;Hmz0q`b&1*t(Rd}II~9eh2a+>yNcVWK1~kX9kwDec3-n1cwP{J z+!3R+76GC+B3D073`3vN~j5Fd3@4c+~-X*HC3-4;135i_zOh29q2l=9T5V20XfXeK`I&xt+L9_L* zTw{G_*mA;LDBO^>Aut&+dvti9%t~;1A)y4XDt~wt9qGC!Y%Y@bG(Q)p$c|)a(8?2Z z?TDb{&4`e)Vc~H1w+zQi3?X=l#q1H_J!Kw4nCz7uW%!(QhRRp)=)GKb*5Ghk@RY1wAL&XHdmHnL{&04SO28|Ewwi={>O+S?{UVdG_`XKm6~yfy#HGAK%pxk*H!Na2 zByLji5#96ZaZjRKmU`M&IJsE77k_bbv3M^h7trl>byBX|8_X?Cuvb8RtT+bIo7F)1 z7FP|hVQC<{*a`)k)hbzu2z1~mN0;!HMZS+MDdop!&ecD~@u33;KJ$U&N0fNr!25d~ zot~_QS-IE+3;wR|moD523C&Ti(LCiE4WAjUSGh*R=cE5ngJgO+C1Zbv30u`bF%S|< zalkRhV0}vVckKnv4MOe4BA+b|wndq|GLQ9*v&i^&O`Z5Gf*16N)UjaUnP_{sCZ`K) z(Ire5Zh4!Ak<*3e%kdXIE-TDS#QTkvQM0Cv&zm`IYWJkV*||M(*W`A{+e$;HvxvgI zI*W*W8*e$*ldb`wNr z`0|w5g6MpeVfU%Wg$?Q}@EY!@J*thg?9-u*68Y*Lk*Mpu-?nNa5@1uMQs6x&ua`d{ zCS7TC-q*Y-sL!UL`NWTVOkm9 zjJ>i;-HPnaZWqUj1lx0nVC2`Y`V)4m)LK>iQvzQzZrjJJR=j7R zFT~R?mTeNQ1>y@`hC_5ScxO2J>4kTiFx*glS;UE-gFvTotm*vx<=-L`rKr#mWVDUB zAme0gg^m+!$cJ6*g$}!7EBv`a&6BC9Lb?BqkaZA8DZ^-eV+B-gQQZ)bLlhtBN>OH4 z=%AWT_laY%kS+$Ok}eSD1sn5y;_?c8pBSizV0}XsrlniBFXK898yRM8JfNPG6^2>3 zIgnZJ8fNV=x;ll>YaMB59-H;=P_xb&W(C@|+8=1kR=M$!ZaD+hof@mzDDQq6F2g8n z!xsZv_i3&Oonb7ZJI-PI^^j+RIA-udcq`_G#ki7@7h=}aB4b{dwjY13hmVe^8|<&r z!qM@+6laNUIeXTs2j%Sj`W|yhuzm)vA-Wb=zMrE%Y8k>HgDgS(KJI(LU#D{9=KY!k zHln1g8YQ3FckkCMP)4RE7fgS_>)K0Jgpj~Agnhx~#+Awk_G4Ou5b(g>1=5S~aPbwk z+3rXqkQDhonn)r1O^ZN$WdA(~#1V~vOfDN?())O^jE@}9>v<6Q3PQe$P3WSu%?GLs z6TeNTR8m24l2vx9)Lx+s=Gi+xQhmiu(EBt_!SGl+nU$rSy_}WTx^$c63t9kn9;kGgqP9cTA0=uGqDX1l0-FthQLlHJ{5}f#lKX6&PNj zZ1f6W8Bjf&hZGX(9GkME1yc}%y*r}Shuh6If$-$qCn1O@u0=fEG9o*N$m|@-@p0}u zB}#U#Fx)xHiUjDnOs7kZW&3rK^9;rsW=6OPaCfi+ z%9rdjD6sgY9|o8IyVI(_NvzPIYn~KthY^!@+>x;jzJZ1au@jV5t9WPzA{C?^lwc4<-r3)(G#fnHn|_+=mIxfjY)b(l_u%; zXoi@izdnG!-h=(;R2N$vjkPA}ozQSj9g;ubSkY^y(qPSZXf)CDALtn-XO`a)0O=X; z7=OX{5c_{p6NL*lT?r&gj)R)ZQ1T}p#m7y_qML3&*^<2BpuYD>I*5jZ@buS+PpcRe zIWSRjV4|!zkKe|iq`;I`loUR{f4+=obIK&RxnDVn4BxdMpeg{0w zfEahM5rQLdbqK`D5Qwq(feCxau{RL47dTSj&5Nz#Bw0kZ_UL1YR&+jlf* zI`m4R^RMc4@xDgnz%xcW3Ih)t>cHC>jDylD9eCI=2i`y$IS#yU=@%z>-ySpq4;ypf zSud+piMNkvcSnB5V!CoL7fve~ssWu-;W}r7 zI>AW&wOU6i>QJPL2z-g}*6D4a$Q4$^@k_%&@!J8dJfP+XFE@dO!|d(wJu|QJATt*t8OLRFVT|IwDS#GMBlGnp_&wE=x4G-T}CJj z-b>gA<$qZYcfO1}tn)t?O3MFGa{iZmSYPROKdecm=V3G>gjCKP(xigzIr|%8w8v-8 z{)nCA{YGIHzSp2{(9#d<1n_~D!8ik)5(Hz$LQrNblx}Oo8-ajjC6-Qe<6Eh= z@l?bNJZz*h0Y3w6RN@bIu#(B|_OSNMbYulF-H95_bPpR%@Dl1F)S?fMrUtdJh%zbh zS1Qs>M@7VRtEk9ey63^y*I>GU#y`R|nCZ$G7Z#R_c-hhd}gK_*Vi2{ml%bM&;(+->1Z7tb(gga#!UBG5RCZ& zL7C}LzTeNCMx8Q2+=jA|=?2znraNMIRBd>KGRSnF8OW!aSoB2;7NIgT-9K#A#E z)#>3e)rEUzscU|iP>(%9$)2F(;~z@)q^gN0Om#PNVUp~QMiA9?snt}MS*K_6F6=BY zlN}nFPCkUT(R=p?>om{ZRoAG_JogmV4~tHV4As^wx2jIFoSr9xwXARgV zg0ReTZdzBGOML#Lx4CbMkh`!cv7E6QiRG{rvz%>5ka~QuaEQAttq#sNr_)?8$$dbh z$@%67b)0X?JfGkGC-)&K&F}a>ywj~Bx_(S;KEnTIu8f+R{rJRLPvIxE_|<$KRV<&G z>%kA`^F9LmP8>UqkdPn{LJ~*}BdZV;7goVRWO0CiV5Sk-Tu@{Q!edlG zAV7&a0_r%!43GsvvxFtYgup{hKu2^?!41Vh;W=zF==;y9+v!eB_`Xp0o_o$;=Tz1C z@2R@I=)mw#w+~;qSS*%{ZHpsz*fZw29`2Eq^KjP0jLdEsee#RCw$d{`kgmX_dG^YP zI?r@;Rg>of`xn{EqoP7K`o-n;St@j&(PvF= z1;lxKXM0m)3W0uMv*UMxjLY^Fws5T(UdQfm!P2U0_CVFOCK*$LS`%}oXkfM0D?f{F zAGmWuyj$gbmKgKl;MU`k?o zA6>K2(MAv3&?H$eZ0c|Y4pv7_vj;uO>NX|N?VpiJ5pm&WRtKZvBDCkSy-gtdc;xv| zWH4F$S>)TDYJ2LQRllbIdTJT!q z&4>~*a8{~bLMQHXMQdeO8G2=e^6Ra3wO$<4_cT%4#c{nVLdEAVe8H#FBGvQq{VlrY zVfQ2AEX#HFRoPsAwM7@b89iLT?NAR&xm6F}>B^G7Y|&-^jBZA4<~UauJwDxgiyqKa z#p=&zx!Mb*lcH5>{*2`r-WFTMP5zH7_39J4tZbGf*zG5T37tu%clEvf>EPQUpLe6|IJnm;w;@ z5J($+`dXy3Hi&=3C@ssaAP!hTpyePA#Hv(z(sJR$Ixc+DunXdV3F2HVf*?2wLTod` z@Jk&8+qQSejrI3KYYi20e{#L3Ou^rd(;omw_}yVfZ0dvA)ogf+R-nL??M^A6fG zTXf#zt^x9^ZTiemXO=v(O?w=!PWp#7>Lqz;n=TsR&XE5HEHc8wpi$0w=l!C<*u241I#a~^I`I}YLZ)Kw zPI?pLQfZY8Y=R^kQ-G^M=1O0Ta?K4Sw^JS=XBTMkt?DVKqrc6r6M8@gb+24hpz~I^ zdb+2>D7RIvEw{BluRwp&L2Z*SL+`r#Ho2xi*UUpKZ$mZ7)r0PH3Y;DEcS)*EexWCh z1Q(BZa%3gir@U{b%v_SrYgC z;yq(!i$WTh2lR}~v4f4?^zr-Y%yY$e`}xkZzgXlOk8+{-C!OYNL4!?O(d647m-rNv?Puo8rxaEH4B3 zi$IfBJ8!Eum`PuFbLG3}n8xNvq3$=)onB8RFC|(@KNiLNvAsNtY5v*}U7jz*)#3vE z>a8ltokueiKS<=Z^gmjlGymgC))#J7Q{_*E+Oxx%p_gZ=PvwQez@uGNu9UJ!=cKta z+@grBY_Pge$owwjig*!%rwhA*kur-+GN%`DGV7`?Ao9NBTuIF9^6nyL6nQ7Crntv= z?*(8urJpY}ln!&^5@Y^(n#;O6+e5_}*@8iywz5-^A@*dT60y(ksqT{VEf1bC9!RvF zUTUz+x4K@57IY%V7U`J_qSL)=8*u@4OlN5Mt%CNx-dF@^DY4~K^*X=OTm4lYwK}h~ zI!AkPZghq&Tw`l3Kes$MRnLPnjd%cKVl;WhvLjF;HAk@-L_6B>NTP}x9!%JABxpGj zv@5dJlM*dQQXYzgIjSAxL^lfk6Gz1s8IBrKZ1`qiu`WC587;>Z8+saBZ1f=y>Vuw! z%ej{RoMN4sqbA6e#Y|1s$ftpEym2x(_T?LF4v0n z^1At$HK!s<4w2laNlB{cZtk{K2g@jGBsSz+pcHkM5oBLmJ#mDUW#t1 z@4Ew))tju@UoVW39-TN$4I*{M3|N@BM+|D6j*gQRAqdtv5z+x9UP2aH;lCW?2&m@I z==V~{DD!%3nxr7C;FzZBjvvvKxLKDCS9j^t3)FboY=@z$x@t^SConNYRp)5}nW}p1 zz}5L;tsYRx?sGIThN?cqN+POy>;bhv^dJC$8pslSp#dF4_`W4}n3wIc9T0%~Qm76^vr*ad9oK9#tozSkj z$J>eIoKCp_rgC#Ko)arQJx1kSl{o$hEn=vU=cYTZ^Q@K#vWIl z#J6F#koDUdovn|J2IW={S1mP%bEzKW&y7RQJfS-2Q=?En0gGcq%Q2!&9;f<}d{bv{ zrU-?|j4=`J5@QVCVUl*}4#OA&OAKS&Q(_onYzZ@l7^REGqM%(k*yfaY#)%FaW{o+P z%@ZYtHI|nc)-Xe2v4%Al;&}sf`Xie|{7)DtjDw)e9#|U89#}xk9spzZc$o%++2ddd zu9!UzqC;Yjnn|iWLVjFg*yFY)gr2rYx%KD{`0v0UReSkuiD8cqVQ#U<*^)rI zU+D<>3xKGY_}Mr%<7VNKmrL}8Io{6tp(49epBn4EN5<_mT3($r3vYcW#LmEC?re!W z)rv>YL`itJCB7pl4h)^8raR;~OFo9>w#y|#r|q*B%O@@Qtf0Q`{j9nqS6Jc~YQ=h< z`ak)$C4Qq;%&A=`IL#HvJJ1BxiG!rsK@Zz#bGYlOacWm%GAXss(dcq&f3*`==SuXc zg(|^)mPXB__Hj%%rFQ2$b*DVH(^Mf72HB6&h{wvaJ59Oq>rS(x{<~A>9rwH@TLw(M z5f?C7jkY$cWtV_?QKkh&x67Ulj4|S z;Y|81PHy8k910*P6wywPTd5u;M2bWt5mF}^i$G~P3|ggD%0F9?thXXT8`_B%TP|Q{ zQa_X(jko}N4yEY|ghHSc%D*g}lfT9Jv~e5`1rQX9ZT&8xXVln-5+(<;u5K`WkK0#D z?{1zJ5v@I|Rh*38T^oyC7hI0)Ad`2S#A=5&e0`_vZg^sVz|lOn8qwf}qZwv_45_Wn|>_go#g!2nbpfV26fd=1=9XC4do7%qQykEsq;?lINDa`M8e4)82!!_~o7 z%jWNUOm%Q*kEsp}!&=pW#p`0f0pjXlZx|?ygP>d;;N`;A0p3Ae9RQ50gZ@NyTpe7Z zk>Kj!5;{b6ppX4keS`$LxEY=%ZuGPkQGwHcQ?Wv~d`l(h!e%1D6}7jvCTOj@|6Q#R zS)?DIUp=U$?6Q~l0HU8IY7tK&D#!J*zgR~h5YWCt_|%x5-s0_{#~-t`)u-QzZ4F~Skf>|KrGOnXfKni~4MxS3 z0yp?dk10YW(3-}|R05HEO(n3UNKKWtQd0?xKhpH5=ke*|{j;Y(w#HJtsZkk9rurxQw;6qU8;|m8|J{AkOQ1&9e_!B)~wVlZ!h1s&EGgOQrtv#T_whrS2()o z75)%)&nx_Ey5bf7b*ZU;uk1m6D}OCD_3!mk?OqanLZ|OnL$U5N52|>x%CE!Fs(jsn z^8G4G;C+e539HB7EED&c#ds@8deSYeaFK27c_Bi!Nq85C`;F|vVmVzW=Gt1xq5F8l zE2bD*-12_+^!mso@widujKBlhpo%}$>hb=R`f~bG_0Q#Mu6UcCCFtyrWlLeXge?rY z^oHfqA%n;+kqqa1;schgn{RtkRzpN-7gYbDt~wp@iT{!;A^+g!*0pL;I_U@oicoED z>=Qb6z9U1lAYlTZ^|2zngi|Xsd{2o?encaezTb>oUy}5sTOPR~AwZF?XI7|eF`h;2 zuA?hqJ~{cBI9IGYi&r&mcHL|@=ew=2a@SJ=NPsot@jy52%m9?Xs3V3 zK=6F*-)}geu3C=A=Mz}eL;Oglg3Gnq@|O-n-VN)c)bt@P8=o@*(&_%1GR1tMxl$T<@r>$b6TcWA4}Kx+ z!9;W8q#ubUzE)PJ6t|J-U3%eyCW$0)=svI8 zTANqzt%nSS*EQubu6>!|@NAlAKG7L@2v^zq;h$7{_w6)ShMzl@84lm~llrrGNQ+BY z{=Br3Lpq}m84jO8kGndj0SQ?{3i&z1+UbWcsmZ8p@yue4yhDaH&~iyvc*2${UNH*U zNe&0zLtNFpMlOXB`bfyBs)HTpJ6fhKw3Du=ZX{>gnva$$sA-2xR{9T_%>KamS5wcw znycz|@ijfOO2RKJ`lM2>KYT zEbN8lffd5nT}X}K=(}%zIoC7tFVLm$zPP7ck=t=k-%xOW%;tMbR`6h0-#p67%{Pya zEhF4>4Ol%*Hj`&rv%k)mY8xYin%6^`oVrc*%n0Aeb*T~ekxJ$wlxguKG6@S2Cu}N- zh%Mrpmm!8HCi>Ix`&5B2H);I@*!FRBnpIH!T(HA~(E4quMEC0|7^b_lOk{>2Nh$L!yy- z27Ro47cwdogX-VcQRiy*ngLDxA-+~CQulM4VX|#_$Ep*X=~YoatC%HkEJyj=xXyYo zg<@Bo7mHcWs4xUmSAz*A7r8=5#?R3bWP%w{fve}r^&yY1oqHjzF~cxZF`-l?w)Fb` zA;yqzDLQskQ-|9h(s{7LFwA4-F?|zqOa&fj#;=RweXVtDiQ`s%S@~w-V*)|&N1`Pa zhG@`I#VB4k=KMkB)e1v08_BIOk{JOxkqm73+e{$L1~Pn`X|I{E4u?H>2mVprw!Oj> zkw+Q_rLQyM^DtY0GMk}gHbc9wxvwWVz-+dt!c>zB@SLhiD#E0*($vI}l^h|8oSd6| zLu4Y}S@^}1j7MwvQ`Sp$_Ea_;BdocM>~5J68kLa)toyq|FnsVmsBs()0rngM+ILT> zdn8&8A)>N21TMdxMQB9OQ!5NX=T?}bq!pD+u#OkePjG6-$PJa|1NCb_BdZtTH5FU1 zVp=Y>tagW4CF_h4-rHnNrQu{VFIJ%yoZ)vX&9~~K7Vhp4E)(*Dw7?9<`U4e-zCCt% z9V+w-3TtUP!N^#e%*az|wOZQ9bY^69%XQUuS`N&}-ovMB39D`NTuDwBQ9 zrFJGD4XLDx=m=Harlap$ZBO+L7QJ*{8(+NM_Alphw_oUO!R zv*R4kA}(l#95!q+jYQ0kVu*eu-8WAxAjxfdVVRmK=N>j2^?ZXh;mgPbU@=kO_j^wQ zj-6O{*yY%%q{}pilQwe7(q)=MXT%<2fPN{%H%FXc4L&P--}3B?B|@nM5%b)SBx284 zM7wsOFJ?iMv8X$9ow%Vri9QtsVyjl9(v>Wj>Qd-7KA)%#qRba!lKHvq{lgZ?-Ngzz zCdJD}OmYJbo82&tc5qA~qTTSrq@JJ?Ux}P*>Zu7;hVJU>GTpU3Z0f1oX?~gR7FXfw zcKyz6zEpQl0yk{e9-a}~4XO4->GW>CC&UZfO@4N@a<>cVEv+()_quVS@UKnc9IpZr zY0*yS+!18F6Wx8I#BPI7-62kvR2jxY%Z&G)F~3kE;^hBU8OEz7&%zjQG33N}uwlkK z8)gF;GhTKt6)&!YJ@^m&BZm31$}rxw#zC3!Vsuh3%oXsMDbO-gpq<^@$eAgMs|-^V z;CYbju=HVTYDdvc=k)N!q4D(b4Z*&FQHLC<>&*Q}8ji5r5#~FQYs_%VyG@+0kZ(`c zLz&w+3daC*jsY#R9a@f|>yg?RnC-S;h={jdtunmza+N7Z_j6dZNp$Q*SHYPbgJ1E% zAFCEU22e8I3)hMCV9Yzre}{~}3o|ynhvdoZ@4L;K9EU-t-{P6N(*D_d)ns1IwDsjqz~ciJJxnfkCUnEJk?b-~nk$5C7{_1$rl zsZaXb1&RmyDx{oqH1PBgpNi-(h;;77f3uf0eJp3%O)0b?&osOsJAlrY5&PM4t z%ikW=v!8ZF{#+_gsC@CarOfRZnDvmaN{I6&VE*KAPM7ufwb9GQ`PwQ9ep$q$e|&86 Tnn5v7
-bounding_box(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x7d93ad3b0170>) zonoopt._core.Box
+bounding_box(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x76d83b7c0bf0>) zonoopt._core.Box

Computes a bounding box of the set object as a Box object.

Parameters:
@@ -1684,7 +1684,7 @@
-contains_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x7d93ad3a3f70>) bool
+contains_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x76d83b7bb5b0>) bool

Checks whether the point x is contained in the set object.

Parameters:
@@ -1989,7 +1989,7 @@
-is_empty(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x7d93ad3abaf0>) bool
+is_empty(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x76d83b7c32b0>) bool

Returns true if the set is provably empty, false otherwise.

Parameters:
@@ -2080,7 +2080,7 @@
-optimize_over(self: zonoopt._core.HybZono, P: scipy.sparse.csc_matrix[numpy.float64], q: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], c: typing.SupportsFloat | typing.SupportsIndex = 0, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x7d93ad3a37f0>) Annotated[numpy.typing.NDArray[numpy.float64], '[m, 1]']
+optimize_over(self: zonoopt._core.HybZono, P: scipy.sparse.csc_matrix[numpy.float64], q: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], c: typing.SupportsFloat | typing.SupportsIndex = 0, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x76d83b7badb0>) Annotated[numpy.typing.NDArray[numpy.float64], '[m, 1]']

Solves optimization problem with quadratic objective over the current set

Parameters:
@@ -2105,7 +2105,7 @@
-project_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x7d93ad3a3830>) Annotated[numpy.typing.NDArray[numpy.float64], '[m, 1]']
+project_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x76d83b7c3030>) Annotated[numpy.typing.NDArray[numpy.float64], '[m, 1]']

Returns the projection of the point x onto the set object.

Parameters:
@@ -2170,7 +2170,7 @@
-support(self: zonoopt._core.HybZono, d: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x7d93ad3a3c30>) float
+support(self: zonoopt._core.HybZono, d: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = <zonoopt._core.WarmStartParams object at 0x76d83b7bb470>) float

Computes support function of the set in the direction d.

Parameters:
@@ -4525,7 +4525,7 @@
-zonoopt.plot(Z, ax=None, settings=OptSettings structure:    verbose: false   verbosity_interval: 100   t_max: 1.79769e+308   k_max_admm: 5000   rho: 10   eps_dual: 0.01   eps_prim: 0.001   k_inf_check: 10   inf_norm_conv: true   use_interval_contractor: true   contractor_iter: 1   search_mode: 0   polish: 1   eps_dual_search: 0.1   eps_prim_search: 0.01   eps_r: 0.01   eps_a: 0.1   k_max_bnb: 100000   n_threads_bnb: 4   n_threads_admm_fp: 3   single_threaded_admm_fp: false   max_nodes: 100000   contractor_tree_search_depth: 10   enable_perturb_admm_fp: true   k_max_admm_fp_ph1: 10000   k_max_admm_fp_ph2: 90000   cycle_detection_buffer_size: 20   eps_perturb: 0.001   k_restart: 5000   enable_rng_seed: false   rng_seed: 0   enable_restart_admm_fp: true, t_max=60.0, **kwargs)
+zonoopt.plot(Z, ax=None, settings=OptSettings structure:    verbose: false   verbosity_interval: 100   t_max: 1.79769e+308   k_max_admm: 5000   rho: 10   eps_dual: 0.01   eps_prim: 0.001   k_inf_check: 10   inf_norm_conv: true   use_interval_contractor: true   contractor_iter: 1   search_mode: 0   polish: 1   eps_dual_search: 0.1   eps_prim_search: 0.01   eps_r: 0.01   eps_a: 0.1   k_max_bnb: 100000   n_threads_bnb: 4   n_threads_admm_fp: 3   single_threaded_admm_fp: false   max_nodes: 100000   contractor_tree_search_depth: 10   enable_perturb_admm_fp: true   k_max_admm_fp_ph1: 10000   k_max_admm_fp_ph2: 90000   cycle_detection_buffer_size: 20   eps_perturb: 0.001   k_restart: 5000   enable_rng_seed: false   rng_seed: 0   enable_restart_admm_fp: true, t_max=60.0, enable_progress_bar=True, **kwargs)

Plots zonotopic set using matplotlib.

Parameters:
@@ -4534,6 +4534,7 @@
  • ax (matplotlib.axes.Axes, optional) – Axes to plot on. If None, current axes are used.

  • settings (OptSettings, optional) – Settings for the optimization. Defaults to OptSettings().

  • t_max (float, optional) – Maximum time to spend on finding vertices. Defaults to 60.0 seconds.

  • +
  • enable_progress_bar (bool, optional) – If True, will display a progress bar when plotting hybrid zonotopes.

  • **kwargs – Additional keyword arguments passed to the plotting function (e.g., color, alpha).

  • diff --git a/python/zonoopt/_core.pyi b/python/zonoopt/_core.pyi index f56c9324..d0155a7e 100644 --- a/python/zonoopt/_core.pyi +++ b/python/zonoopt/_core.pyi @@ -1518,7 +1518,7 @@ class HybZono: ''' def bounding_box(self, settings: OptSettings = ..., solution: OptSolution = ..., warm_start_params: WarmStartParams = ...) -> Box: - """bounding_box(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> zonoopt._core.Box + """bounding_box(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> zonoopt._core.Box Computes a bounding box of the set object as a Box object. @@ -1559,7 +1559,7 @@ class HybZono: ''' def contains_point(self, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, '[m, 1]'], settings: OptSettings = ..., solution: OptSolution = ..., warm_start_params: WarmStartParams = ...) -> bool: - '''contains_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> bool + '''contains_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> bool Checks whether the point x is contained in the set object. @@ -1786,7 +1786,7 @@ class HybZono: """ def is_empty(self, settings: OptSettings = ..., solution: OptSolution = ..., warm_start_params: WarmStartParams = ...) -> bool: - """is_empty(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> bool + """is_empty(self: zonoopt._core.HybZono, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> bool Returns true if the set is provably empty, false otherwise. @@ -1851,7 +1851,7 @@ class HybZono: """ def optimize_over(self, P: scipy.sparse.csc_matrix[numpy.float64], q: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, '[m, 1]'], c: typing.SupportsFloat | typing.SupportsIndex = ..., settings: OptSettings = ..., solution: OptSolution = ..., warm_start_params: WarmStartParams = ...) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], '[m, 1]']: - '''optimize_over(self: zonoopt._core.HybZono, P: scipy.sparse.csc_matrix[numpy.float64], q: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], c: typing.SupportsFloat | typing.SupportsIndex = 0, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 1]"] + '''optimize_over(self: zonoopt._core.HybZono, P: scipy.sparse.csc_matrix[numpy.float64], q: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], c: typing.SupportsFloat | typing.SupportsIndex = 0, settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 1]"] Solves optimization problem with quadratic objective over the current set @@ -1871,7 +1871,7 @@ class HybZono: ''' def project_point(self, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, '[m, 1]'], settings: OptSettings = ..., solution: OptSolution = ..., warm_start_params: WarmStartParams = ...) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], '[m, 1]']: - '''project_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 1]"] + '''project_point(self: zonoopt._core.HybZono, x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 1]"] Returns the projection of the point x onto the set object. @@ -1924,7 +1924,7 @@ class HybZono: ''' def support(self, d: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, '[m, 1]'], settings: OptSettings = ..., solution: OptSolution = ..., warm_start_params: WarmStartParams = ...) -> float: - '''support(self: zonoopt._core.HybZono, d: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> float + '''support(self: zonoopt._core.HybZono, d: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 1]"], settings: zonoopt._core.OptSettings = OptSettings structure: verbose: false verbosity_interval: 100 t_max: 1.79769e+308 k_max_admm: 5000 rho: 10 eps_dual: 0.01 eps_prim: 0.001 k_inf_check: 10 inf_norm_conv: true use_interval_contractor: true contractor_iter: 1 search_mode: 0 polish: 1 eps_dual_search: 0.1 eps_prim_search: 0.01 eps_r: 0.01 eps_a: 0.1 k_max_bnb: 100000 n_threads_bnb: 4 n_threads_admm_fp: 3 single_threaded_admm_fp: false max_nodes: 100000 contractor_tree_search_depth: 10 enable_perturb_admm_fp: true k_max_admm_fp_ph1: 10000 k_max_admm_fp_ph2: 90000 cycle_detection_buffer_size: 20 eps_perturb: 0.001 k_restart: 5000 enable_rng_seed: false rng_seed: 0 enable_restart_admm_fp: true, solution: zonoopt._core.OptSolution = None, warm_start_params: zonoopt._core.WarmStartParams = ) -> float Computes support function of the set in the direction d. diff --git a/python/zonoopt/zono_plot.py b/python/zonoopt/zono_plot.py index 4698d26d..b8efcf63 100644 --- a/python/zonoopt/zono_plot.py +++ b/python/zonoopt/zono_plot.py @@ -181,7 +181,7 @@ def _get_conzono_vertices(Z, t_max=60.0): else: raise ValueError('get_vertices unsupported data type') -def plot(Z, ax=None, settings=OptSettings(), t_max=60.0, **kwargs): +def plot(Z, ax=None, settings=OptSettings(), t_max=60.0, enable_progress_bar=True, **kwargs): """ Plots zonotopic set using matplotlib. @@ -190,6 +190,7 @@ def plot(Z, ax=None, settings=OptSettings(), t_max=60.0, **kwargs): ax (matplotlib.axes.Axes, optional): Axes to plot on. If None, current axes are used. settings (OptSettings, optional): Settings for the optimization. Defaults to OptSettings(). t_max (float, optional): Maximum time to spend on finding vertices. Defaults to 60.0 seconds. + enable_progress_bar (bool, optional): If True, will display a progress bar when plotting hybrid zonotopes. **kwargs: Additional keyword arguments passed to the plotting function (e.g., color, alpha). Returns: @@ -220,9 +221,13 @@ def plot(Z, ax=None, settings=OptSettings(), t_max=60.0, **kwargs): return [] objs = [] - pbar = tqdm(leaves) + if enable_progress_bar: + pbar = tqdm(leaves) + else: + pbar = leaves for leaf in pbar: - pbar.set_description('Plotting HybZono leaves') + if enable_progress_bar: + pbar.set_description('Plotting HybZono leaves') t = time.time() - t0 if t > t_max: warnings.warn('Plotting time limit reached, terminating early.')