23 template<
typename X1,
typename X2>
24 static std::string str(
const X1& x1,
const X2& x2)
26 return "extend(" + x1->str() +
"," + x2->str() +
")";
29 template<
typename X1,
typename X2>
30 static std::pair<Index,Index> output_shape(
const X1& s1, [[maybe_unused]]
const X2& s2)
32 auto shape1 = s1->output_shape();
33 assert(shape1 == s2->output_shape());
38 static inline T fwd(
const T& x1,
const T& x2)
44 static inline T fwd_natural(
const T& x1,
const T& x2)
47 (x1.def_domain ? x1.a : fwd(x1.a,x2.a)),
48 x1.def_domain || x2.def_domain
53 static inline T fwd_centered(
const T& x1,
const T& x2)
56 (x1.def_domain ? x1.m : fwd(x1.m,x2.m)),
57 (x1.def_domain ? x1.a : fwd(x1.a,x2.a)),
58 (x1.def_domain ? x1.da : (x1.da | x2.da)),
59 x1.def_domain || x2.def_domain
64 static inline void bwd(
const T& y, T& x1, T& x2)
79 template<typename T1,typename T2,typename T=ExprType<T1>::Type>
80 inline AnalyticExprWrapper<T>
81 extend(
const T1& x1,
const T2& x2)
83 return { std::make_shared<AnalyticOperationExpr<ExtendOp,T,T,T>>(
84 (AnalyticExprWrapper<T>)x1,(AnalyticExprWrapper<T>)x2) };