codac 1.5.6
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 x.put(i,xi);
54 i += ci->size();
55 }
56 assert(i == x.size());
57 }
58
59 protected:
60
61 Collection<CtcBase<IntervalVector>> _ctcs;
62 };
63
64 template<typename... C>
65 requires ((is_ctc_v<C>) || ...) && (!(is_sep_v<C>) && ...)
66 inline CtcCartProd cart_prod(const C&... c)
67 {
68 return CtcCartProd(c...);
69 }
70}