codac 2.0.0
Loading...
Searching...
No Matches
codac2_CtcCartProd.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <type_traits>
14#include "codac2_CtcWrapper.h"
15#include "codac2_Collection.h"
16
17namespace codac2
18{
19 class CtcCartProd : public Ctc<CtcCartProd,IntervalVector>
20 {
21 public:
22
23 CtcCartProd(const Collection<CtcBase<IntervalVector>>& ctcs)
24 : Ctc<CtcCartProd,IntervalVector>([ctcs] {
25 Index n = 0;
26 for(const auto& ci : ctcs)
27 n += ci->size();
28 return n;
29 }()), _ctcs(ctcs)
30 { }
31
32 template<typename C>
33 requires (IsCtcBaseOrPtr<C,IntervalVector> && !std::is_same_v<CtcCartProd,C>)
34 CtcCartProd(const C& c)
35 : Ctc<CtcCartProd,IntervalVector>(size_of(c)), _ctcs(c)
36 { }
37
38 template<typename... C>
39 requires (IsCtcBaseOrPtr<C,IntervalVector> && ...)
40 CtcCartProd(const C&... c)
41 : Ctc<CtcCartProd,IntervalVector>((0 + ... + size_of(c))), _ctcs(c...)
42 { }
43
44 void contract(IntervalVector& x) const
45 {
46 assert_release(x.size() == this->size());
47
48 Index i = 0;
49 for(const auto& ci : _ctcs)
50 {
51 IntervalVector xi = x.subvector(i,i+ci->size()-1);
52 ci->contract(xi);
53
54 if(xi.is_empty())
55 {
56 x.set_empty();
57 return;
58 }
59
60 x.put(i,xi);
61 i += ci->size();
62 }
63 assert(i == x.size());
64 }
65
66 protected:
67
68 Collection<CtcBase<IntervalVector>> _ctcs;
69 };
70
71 template<typename... C>
72 requires ((is_ctc_v<C>) || ...) && (!(is_sep_v<C>) && ...)
73 inline CtcCartProd cart_prod(const C&... c)
74 {
75 return CtcCartProd(c...);
76 }
77}