codac 2.0.5
Loading...
Searching...
No Matches
codac2_SepInter.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <type_traits>
13#include "codac2_Sep.h"
14#include "codac2_Collection.h"
15#include "codac2_SepWrapper.h"
16
17namespace codac2
18{
19 class SepInter : public Sep<SepInter>
20 {
21 public:
22
23 template<typename S>
24 requires IsSepBaseOrPtr<S>
25 SepInter(std::initializer_list<S> seps)
26 : SepInter(Collection<SepBase>(seps))
27 { }
28
29 SepInter(const Collection<SepBase>& c)
30 : Sep<SepInter>([&c]() {
31 assert_release(!c.empty());
32 return size_of(c.front());
33 }()), _seps(c)
34 { }
35
36 template<typename S>
37 requires (IsSepBaseOrPtr<S> && !std::is_same_v<SepInter,S>)
38 SepInter(const S& s)
39 : Sep<SepInter>(size_of(s)), _seps(s)
40 { }
41
42 template<typename... S>
43 requires (IsSepBaseOrPtr<S> && ...)
44 SepInter(const S&... s)
45 : Sep<SepInter>(size_first_item(s...)), _seps(s...)
46 {
47 assert_release(all_same_size(s...));
48 }
49
50 size_t nb() const
51 {
52 return _seps.size();
53 }
54
55 BoxPair separate(const IntervalVector& x) const;
56
57 template<typename S>
58 requires IsSepBaseOrPtr<S>
59 SepInter& operator&=(const S& s)
60 {
61 assert_release(size_of(s) == this->size());
62 _seps.push_back(s);
63 return *this;
64 }
65
66 protected:
67
68 Collection<SepBase> _seps;
69 };
70
71 template<typename S1, typename S2>
72 requires (IsSepBaseOrPtr<S1> && IsSepBaseOrPtr<S2>)
73 inline SepInter operator&(const S1& s1, const S2& s2)
74 {
75 return SepInter(s1,s2);
76 }
77
78 template<typename S2>
79 requires IsSepBaseOrPtr<S2>
80 inline SepInter operator&(const IntervalVector& s1, const S2& s2)
81 {
82 assert_release(s1.size() == s2.size());
83 return SepInter(SepWrapper(s1),s2);
84 }
85
86 template<typename S1>
87 requires IsSepBaseOrPtr<S1>
88 inline SepInter operator&(const S1& s1, const IntervalVector& s2)
89 {
90 assert_release(s1.size() == s2.size());
91 return SepInter(s1,SepWrapper(s2));
92 }
93}
Definition codac2_OctaSym.h:21
Eigen::Matrix< Interval,-1, 1 > IntervalVector
Alias for a dynamic-size column vector of intervals.
Definition codac2_IntervalVector.h:25
CtcInterType< typenameC1::ContractedTypes >::Ctc operator&(const C1 &c1, const C2 &c2)
Builds an intersection contractor from two contractors.
Definition codac2_CtcInter.h:229