12 inline EvalMode operator&(EvalMode a, EvalMode b)
13 {
return static_cast<EvalMode
>(
static_cast<int>(a) &
static_cast<int>(b)); }
15 inline EvalMode operator|(EvalMode a, EvalMode b)
16 {
return static_cast<EvalMode
>(
static_cast<int>(a) |
static_cast<int>(b)); }
22 requires std::is_base_of_v<AnalyticTypeBase,T>
23 template<
typename... X>
24 inline AnalyticExprWrapper<T> AnalyticFunction<T>::operator()(
const X&... x)
const
26 return { this->FunctionBase<AnalyticExpr<T>>::operator()(x...) };
30 requires std::is_base_of_v<AnalyticTypeBase,T>
31 template<
typename... Args>
32 inline auto AnalyticFunction<T>::real_eval(
const Args&... x)
const
34 return eval(x...).mid();
38 requires std::is_base_of_v<AnalyticTypeBase,T>
39 template<
typename... Args>
40 inline typename T::Domain AnalyticFunction<T>::eval(
const EvalMode& m,
const Args&... x)
const
42 check_valid_inputs(x...);
46 case EvalMode::NATURAL:
48 return eval_<true>(x...).a;
51 case EvalMode::CENTERED:
53 auto x_ = eval_<false>(x...);
54 auto flatten_x = cart_prod(x...);
55 assert(x_.da.rows() == x_.a.size() && x_.da.cols() == flatten_x.size());
57 if constexpr(std::is_same_v<T,ScalarType>)
58 return x_.m + (x_.da*(flatten_x-flatten_x.mid()))[0];
60 return x_.m + (x_.da*(flatten_x-flatten_x.mid())).col(0);
63 case EvalMode::DEFAULT:
66 auto x_ = eval_<false>(x...);
69 return eval(EvalMode::NATURAL, x...);
73 auto flatten_x = cart_prod(x...);
74 if constexpr(std::is_same_v<T,ScalarType>)
75 return x_.a & (x_.m + (x_.da*(flatten_x-flatten_x.mid()))[0]);
78 assert(x_.da.rows() == x_.a.size() && x_.da.cols() == flatten_x.size());
79 return x_.a & (x_.m + (x_.da*(flatten_x-flatten_x.mid())).col(0));
87 requires std::is_base_of_v<AnalyticTypeBase,T>
88 template<
typename... Args>
89 inline typename T::Domain AnalyticFunction<T>::eval(
const Args&... x)
const
91 return eval(EvalMode::NATURAL | EvalMode::CENTERED, x...);
95 requires std::is_base_of_v<AnalyticTypeBase,T>
96 template<
typename... Args>
97 inline auto AnalyticFunction<T>::diff(
const Args&... x)
const
99 check_valid_inputs(x...);
100 return eval_<false>(x...).da;
104 requires std::is_base_of_v<AnalyticTypeBase,T>
105 inline Index AnalyticFunction<T>::output_size()
const
107 if constexpr(std::is_same_v<T,ScalarType>)
110 else if constexpr(std::is_same_v<T,VectorType>)
112 assert_release(this->args().size() == 1 &&
"unable (yet) to compute output size for multi-arg functions");
118 if(
dynamic_cast<ScalarVar*
>(this->args()[0].get()))
119 return eval(EvalMode::NATURAL,
Interval()).size();
121 return eval(EvalMode::NATURAL, IntervalVector(this->input_size())).size();
126 assert_release(
false &&
"unable to estimate output size");
132 std::ostream&
operator<<(std::ostream& os, [[maybe_unused]]
const AnalyticFunction<U>& f)
134 if constexpr(std::is_same_v<U,ScalarType>)
135 os <<
"scalar function";
136 else if constexpr(std::is_same_v<U,VectorType>)
137 os <<
"vector function";
144 requires std::is_base_of_v<AnalyticTypeBase,T>
146 inline void AnalyticFunction<T>::add_value_to_arg_map(ValuesMap& v,
const D& x, Index i)
const
148 assert(i >= 0 && i < (Index)this->args().size());
149 assert_release(size_of(x) == this->args()[i]->size() &&
"provided arguments do not match function inputs");
151 IntervalMatrix d = IntervalMatrix::zero(size_of(x), this->args().total_size());
155 p += this->args()[j]->size();
157 for(Index k = p ; k < p+size_of(x) ; k++)
160 using D_DOMAIN =
typename ValueType<D>::Type;
162 v[this->args()[i]->unique_id()] =
163 std::make_shared<D_DOMAIN>(
typename D_DOMAIN::Domain(x).mid(), x, d,
true);
167 requires std::is_base_of_v<AnalyticTypeBase,T>
168 template<
typename... Args>
169 inline void AnalyticFunction<T>::fill_from_args(ValuesMap& v,
const Args&... x)
const
172 (add_value_to_arg_map(v, x, i++), ...);
176 requires std::is_base_of_v<AnalyticTypeBase,T>
178 inline void AnalyticFunction<T>::intersect_value_from_arg_map(
const ValuesMap& v, D& x, Index i)
const
180 assert(v.find(this->args()[i]->unique_id()) != v.end() &&
"argument cannot be found");
181 x &= std::dynamic_pointer_cast<typename ValueType<D>::Type>(v.at(this->args()[i]->unique_id()))->a;
185 requires std::is_base_of_v<AnalyticTypeBase,T>
186 template<
typename... Args>
187 inline void AnalyticFunction<T>::intersect_from_args(
const ValuesMap& v, Args&... x)
const
190 (intersect_value_from_arg_map(v, x, i++), ...);
194 requires std::is_base_of_v<AnalyticTypeBase,T>
195 template<
bool NATURAL_EVAL,
typename... Args>
196 inline auto AnalyticFunction<T>::eval_(
const Args&... x)
const
200 if constexpr(
sizeof...(Args) == 0)
201 return this->expr()->fwd_eval(v, 0, NATURAL_EVAL);
205 fill_from_args(v, x...);
206 return this->expr()->fwd_eval(v, cart_prod(x...).size(), NATURAL_EVAL);
211 requires std::is_base_of_v<AnalyticTypeBase,T>
212 template<
typename... Args>
213 inline void AnalyticFunction<T>::check_valid_inputs(
const Args&... x)
const
215 [[maybe_unused]] Index n = 0;
216 ((n += size_of(x)), ...);
218 assert_release(this->_args.total_size() == n &&
219 "Invalid arguments: wrong number of input arguments");
Interval class, for representing closed and connected subsets of .
Definition codac2_Interval.h:62
std::ostream & operator<<(std::ostream &os, const BoolInterval &x)
Streams out a BoolInterval.
Definition codac2_BoolInterval.h:45