32 inline EvalMode operator&(EvalMode a, EvalMode b)
33 {
return static_cast<EvalMode
>(
static_cast<int>(a) &
static_cast<int>(b)); }
35 inline EvalMode operator|(EvalMode a, EvalMode b)
36 {
return static_cast<EvalMode
>(
static_cast<int>(a) |
static_cast<int>(b)); }
39 requires std::is_base_of_v<AnalyticTypeBase,T>
40 class AnalyticFunction :
public FunctionBase<AnalyticExpr<T>>
44 AnalyticFunction(
const FunctionArgsList& args,
const ScalarExprList& y)
45 requires(std::is_same_v<T,VectorType>)
46 : FunctionBase<AnalyticExpr<T>>(args, y)
48 assert_release(y->belongs_to_args_list(this->args()) &&
49 "Invalid argument: variable not present in input arguments");
52 AnalyticFunction(
const FunctionArgsList& args,
const AnalyticExprWrapper<T>& y)
53 : FunctionBase<AnalyticExpr<T>>(args, y)
55 assert_release(y->belongs_to_args_list(this->args()) &&
56 "Invalid argument: variable not present in input arguments");
59 AnalyticFunction(
const FunctionArgsList& args,
const AnalyticVarExpr<T>& y)
60 : AnalyticFunction(args, { std::dynamic_pointer_cast<AnalyticExpr<T>>(y.copy()) })
63 AnalyticFunction(
const AnalyticFunction<T>& f)
64 : FunctionBase<AnalyticExpr<T>>(f)
67 template<
typename... X>
68 AnalyticExprWrapper<T> operator()(
const X&... x)
const
70 return { this->FunctionBase<AnalyticExpr<T>>::operator()(x...) };
73 template<
typename... Args>
74 auto real_eval(
const Args&... x)
const
76 return eval(x...).mid();
79 template<
typename... Args>
80 typename T::Domain eval(
const EvalMode& m,
const Args&... x)
const
82 check_valid_inputs(x...);
86 case EvalMode::NATURAL:
88 return eval_<true>(x...).a;
91 case EvalMode::CENTERED:
93 auto x_ = eval_<false>(x...);
94 auto flatten_x = IntervalVector(cart_prod(x...));
95 assert(x_.da.rows() == x_.a.size() && x_.da.cols() == flatten_x.size());
97 if constexpr(std::is_same_v<T,ScalarType>)
98 return x_.m + (x_.da*(flatten_x-flatten_x.mid()))[0];
100 return x_.m + (x_.da*(flatten_x-flatten_x.mid())).col(0);
103 case EvalMode::DEFAULT:
106 auto x_ = eval_<false>(x...);
111 return eval(EvalMode::NATURAL, x...);
115 auto flatten_x = IntervalVector(cart_prod(x...));
116 if constexpr(std::is_same_v<T,ScalarType>)
117 return x_.a & (x_.m + (x_.da*(flatten_x-flatten_x.mid()))[0]);
120 assert(x_.da.rows() == x_.a.size() && x_.da.cols() == flatten_x.size());
121 return x_.a & (x_.m + (x_.da*(flatten_x-flatten_x.mid())).col(0));
128 template<
typename... Args>
129 typename T::Domain eval(
const Args&... x)
const
131 return eval(EvalMode::NATURAL | EvalMode::CENTERED, x...);
134 template<
typename... Args>
135 auto diff(
const Args&... x)
const
137 check_valid_inputs(x...);
138 return eval_<false>(x...).da;
141 Index output_size()
const
143 if constexpr(std::is_same_v<T,ScalarType>)
146 else if constexpr(std::is_same_v<T,VectorType>)
148 assert_release(this->args().size() == 1 &&
"unable (yet) to compute output size for multi-arg functions");
154 if(
dynamic_cast<ScalarVar*
>(this->args()[0].get()))
155 return eval(EvalMode::NATURAL, Interval()).size();
157 return eval(EvalMode::NATURAL, IntervalVector(this->input_size())).size();
162 assert_release(
false &&
"unable to estimate output size");
167 friend std::ostream& operator<<(std::ostream& os, [[maybe_unused]]
const AnalyticFunction<T>& f)
169 if constexpr(std::is_same_v<T,ScalarType>)
170 os <<
"scalar function";
171 else if constexpr(std::is_same_v<T,VectorType>)
172 os <<
"vector function";
179 friend class CtcInverse_;
182 void add_value_to_arg_map(ValuesMap& v,
const D& x, Index i)
const
184 assert(i >= 0 && i < (Index)this->args().size());
185 assert_release(size_of(x) == this->args()[i]->size() &&
"provided arguments do not match function inputs");
187 using D_TYPE =
typename ValueType<D>::Type;
189 IntervalMatrix d(0,0);
191 if constexpr(!std::is_same_v<D_TYPE,MatrixType>)
193 d = IntervalMatrix::zero(size_of(x), this->args().total_size());
196 for(Index j = 0 ; j < i ; j++)
197 p += this->args()[j]->size();
199 for(Index k = p ; k < p+size_of(x) ; k++)
203 v[this->args()[i]->unique_id()] =
204 std::make_shared<D_TYPE>(
typename D_TYPE::Domain(x).mid(), x, d,
true);
207 template<
typename... Args>
208 void fill_from_args(ValuesMap& v,
const Args&... x)
const
211 (add_value_to_arg_map(v, x, i++), ...);
215 void intersect_value_from_arg_map(
const ValuesMap& v, D& x, Index i)
const
217 assert(v.find(this->args()[i]->unique_id()) != v.end() &&
"argument cannot be found");
218 x &= std::dynamic_pointer_cast<typename ValueType<D>::Type>(v.at(this->args()[i]->unique_id()))->a;
221 template<
typename... Args>
222 void intersect_from_args(
const ValuesMap& v, Args&... x)
const
225 (intersect_value_from_arg_map(v, x, i++), ...);
228 template<
bool NATURAL_EVAL,
typename... Args>
229 auto eval_(
const Args&... x)
const
233 if constexpr(
sizeof...(Args) == 0)
234 return this->expr()->fwd_eval(v, 0, NATURAL_EVAL);
238 fill_from_args(v, x...);
239 return this->expr()->fwd_eval(v, cart_prod(x...).size(), NATURAL_EVAL);
243 template<
typename... Args>
244 void check_valid_inputs(
const Args&... x)
const
246 [[maybe_unused]] Index n = 0;
247 ((n += size_of(x)), ...);
249 assert_release(this->_args.total_size() == n &&
250 "Invalid arguments: wrong number of input arguments");
254 AnalyticFunction(
const FunctionArgsList&,
double) ->
255 AnalyticFunction<ScalarType>;
257 AnalyticFunction(
const FunctionArgsList&,
const Interval&) ->
258 AnalyticFunction<ScalarType>;
260 AnalyticFunction(
const FunctionArgsList&, std::initializer_list<int>) ->
261 AnalyticFunction<VectorType>;
263 AnalyticFunction(
const FunctionArgsList&, std::initializer_list<double>) ->
264 AnalyticFunction<VectorType>;
266 AnalyticFunction(
const FunctionArgsList&, std::initializer_list<Interval>) ->
267 AnalyticFunction<VectorType>;
269 AnalyticFunction(
const FunctionArgsList&, std::initializer_list<ScalarExpr>) ->
270 AnalyticFunction<VectorType>;
272 AnalyticFunction(
const FunctionArgsList&, std::initializer_list<ScalarVar>) ->
273 AnalyticFunction<VectorType>;
276 AnalyticFunction(
const FunctionArgsList&,
const T&) ->
277 AnalyticFunction<typename ValueType<T>::Type>;
Interval class, for representing closed and connected subsets of .
Definition codac2_Interval.h:62