43 #ifndef RTOPPACK_RTOP_T_HELPERS_DECL_HPP 44 #define RTOPPACK_RTOP_T_HELPERS_DECL_HPP 53 #include "RTOpPack_RTOpT.hpp" 54 #include "Teuchos_StandardMemberCompositionMacros.hpp" 55 #include "Teuchos_ScalarTraits.hpp" 56 #include "Teuchos_dyn_cast.hpp" 57 #include "Teuchos_TypeNameTraits.hpp" 60 #ifdef RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT 61 # include "Teuchos_VerboseObject.hpp" 62 namespace RTOpPack {
extern bool rtop_helpers_dump_all; }
63 #endif // RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT 73 template<
class Scalar>
94 template<
class Scalar>
95 std::ostream& operator<<(std::ostream &out, const ScalarIndex<Scalar> &scalarIndex)
97 out <<
"{"<<scalarIndex.scalar<<
","<<scalarIndex.index<<
"}";
105 template <
class Scalar>
121 const ArrayView<primitiveType> &primitiveObjs,
122 const ArrayView<index_type> &indexObjs,
123 const ArrayView<char> &charObjs
126 assertInput(primitiveObjs, indexObjs, charObjs);
127 ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
128 obj.
scalar, primitiveObjs, Teuchos::null, Teuchos::null );
129 indexObjs[0] = obj.
index;
133 const ArrayView<const primitiveType> &primitiveObjs,
134 const ArrayView<const index_type> &indexObjs,
135 const ArrayView<const char> &charObjs,
139 assertInput(primitiveObjs, indexObjs, charObjs);
140 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
141 primitiveObjs, Teuchos::null, Teuchos::null,
142 Teuchos::outArg(obj->scalar) );
143 obj->index = indexObjs[0];
146 static void assertInput(
147 const ArrayView<const primitiveType> &primitiveObjs,
148 const ArrayView<const index_type> &indexObjs,
149 const ArrayView<const char> &charObjs
153 TEUCHOS_TEST_FOR_EXCEPT(
154 primitiveObjs.size()!=ScalarPrimitiveTypeTraits::numPrimitiveObjs()
155 || indexObjs.size()!=1
156 || charObjs.size()!=0 );
166 template<
class ConcreteReductObj>
171 : concreteReductObj_(concreteReductObj)
174 void set(
const ConcreteReductObj &concreteReductObj )
175 { concreteReductObj_ = concreteReductObj; }
177 const ConcreteReductObj&
get()
const 178 {
return concreteReductObj_; }
182 ConcreteReductObj concreteReductObj_;
190 template<
class ConcreteReductObj>
191 const RCP<DefaultReductTarget<ConcreteReductObj> >
221 template<
class Scalar>
222 void validate_apply_op(
224 const int allowed_num_sub_vecs,
225 const int allowed_num_targ_sub_vecs,
226 const bool expect_reduct_obj,
229 const Ptr<const ReductTarget> &reduct_obj
239 enum EBasicReductTypes { REDUCT_TYPE_SUM, REDUCT_TYPE_MAX, REDUCT_TYPE_MIN };
243 template<
class ConcreteReductObj,
int ReductionType>
247 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const 249 return in_reduct.this_reduction_type_needs_a_specialization();
255 template<
class ConcreteReductObj>
259 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const 261 inout_reduct += in_reduct;
267 template<
class ConcreteReductObj>
271 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const 273 inout_reduct = std::max(inout_reduct, in_reduct);
279 template<
class ConcreteReductObj>
283 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const 285 inout_reduct = std::min(inout_reduct, in_reduct);
291 template<
class Scalar>
295 inline void operator()(
const Scalar& in_reduct, Scalar& inout_reduct)
const 297 inout_reduct += in_reduct;
306 template<
class Scalar,
class ConcreteReductObj,
class ReductObjReduction>
319 const ConcreteReductObj &initReductObjValue_in = ScalarTraits<Scalar>::zero(),
320 ReductObjReduction reductObjReduction_in = ReductObjReduction()
322 : initReductObjValue_(initReductObjValue_in),
323 reductObjReduction_(reductObjReduction_in)
329 using Teuchos::dyn_cast;
335 const Ptr<ReductTarget> &reduct_obj
338 using Teuchos::dyn_cast;
353 const Ptr<int> &num_values,
354 const Ptr<int> &num_indexes,
355 const Ptr<int> &num_chars
359 *num_values = PTT::numPrimitiveObjs();
360 *num_indexes = PTT::numIndexObjs();
361 *num_chars = PTT::numCharObjs();
373 const ReductTarget& in_reduct_obj,
const Ptr<ReductTarget>& inout_reduct_obj
376 const ConcreteReductObj scalar_in_reduct_obj = this->
getRawVal(in_reduct_obj);
377 ConcreteReductObj scalar_inout_reduct_obj = this->
getRawVal(*inout_reduct_obj);
378 reductObjReduction_(scalar_in_reduct_obj, scalar_inout_reduct_obj);
379 this->
setRawVal( scalar_inout_reduct_obj, inout_reduct_obj );
385 setRawVal( initReductObjValue(), reduct_obj );
391 const ArrayView<primitive_value_type> &value_data,
392 const ArrayView<index_type> &index_data,
393 const ArrayView<char_type> &char_data
397 PTT::extractPrimitiveObjs(
getRawVal(reduct_obj),
398 value_data, index_data, char_data );
403 const ArrayView<const primitive_value_type> &value_data,
404 const ArrayView<const index_type> &index_data,
405 const ArrayView<const char_type> &char_data,
406 const Ptr<ReductTarget> &reduct_obj
410 ConcreteReductObj concrete_reduct_obj;
411 PTT::loadPrimitiveObjs( value_data, index_data, char_data,
412 Teuchos::outArg(concrete_reduct_obj) );
413 this->
setRawVal( concrete_reduct_obj, reduct_obj );
425 ReductObjReduction reductObjReduction_;
436 template<
class Scalar,
class ConcreteReductObj,
class EleWiseReduction,
437 class ReductObjReduction = SumScalarReductObjReduction<ConcreteReductObj> >
448 const ConcreteReductObj &initReductObjValue_in = ConcreteReductObj(),
449 EleWiseReduction eleWiseReduction_in = EleWiseReduction(),
450 ReductObjReduction reductObjReduction_in = ReductObjReduction()
452 :
base_t(initReductObjValue_in, reductObjReduction_in),
453 eleWiseReduction_(eleWiseReduction_in)
463 const Ptr<ReductTarget> &reduct_obj_inout
466 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
467 using Teuchos::dyn_cast;
470 validate_apply_op<Scalar>(*
this, 1, 0,
true,
471 sub_vecs, targ_sub_vecs, reduct_obj_inout.getConst());
476 ConcreteReductObj reduct = reduct_obj.
get();
478 const RTOpPack::index_type subDim = sub_vecs[0].subDim();
480 const_iter_t v0_val = sub_vecs[0].values().begin();
481 const ptrdiff_t v0_s = sub_vecs[0].stride();
484 for( Teuchos_Ordinal i = 0; i < subDim; ++i )
485 eleWiseReduction_( *v0_val++, reduct);
488 for( Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s )
489 eleWiseReduction_( *v0_val, reduct);
492 reduct_obj.set(reduct);
500 EleWiseReduction eleWiseReduction_;
506 #define RTOP_ROP_1_REDUCT_SCALAR_CUSTOM_DEFAULT( ROP_CLASS_NAME, REDUCT_SCALAR, \ 507 BASIC_REDUCT_TYPE_ENUM, CUSTOM_DEFAULT \ 510 template<class Scalar, class ReductScalar> \ 511 class ROP_CLASS_NAME ## EleWiseReduction \ 514 inline void operator()( \ 516 ReductScalar &reduct \ 521 template<class Scalar> \ 522 class ROP_CLASS_NAME \ 523 : public RTOpPack::ROp_1_ScalarReduction< \ 526 ROP_CLASS_NAME ## EleWiseReduction<Scalar, REDUCT_SCALAR >, \ 527 RTOpPack::BasicReductObjReductionOp<REDUCT_SCALAR, BASIC_REDUCT_TYPE_ENUM> > \ 529 typedef RTOpPack::ROp_1_ScalarReduction< \ 532 ROP_CLASS_NAME ## EleWiseReduction<Scalar, REDUCT_SCALAR >, \ 533 RTOpPack::BasicReductObjReductionOp<REDUCT_SCALAR, BASIC_REDUCT_TYPE_ENUM> > \ 537 : base_t(CUSTOM_DEFAULT) \ 539 this->setOpNameBase( #ROP_CLASS_NAME ); \ 544 template<class Scalar, class ReductScalar> \ 545 void ROP_CLASS_NAME ## EleWiseReduction<Scalar, ReductScalar>::operator()( \ 546 const Scalar &v0, ReductScalar &reduct \ 551 #define RTOP_ROP_1_REDUCT_SCALAR( ROP_CLASS_NAME, REDUCT_SCALAR, \ 552 BASIC_REDUCT_TYPE_ENUM \ 554 RTOP_ROP_1_REDUCT_SCALAR_CUSTOM_DEFAULT(ROP_CLASS_NAME, REDUCT_SCALAR, \ 555 BASIC_REDUCT_TYPE_ENUM, Teuchos::ScalarTraits<REDUCT_SCALAR >::zero() ) 568 class EleWiseReduction,
569 class ReductObjReduction = SumScalarReductObjReduction<ReductScalar>
584 const ReductScalar &initReductObjValue_in = ReductScalar(),
585 EleWiseReduction eleWiseReduction_in = EleWiseReduction(),
586 ReductObjReduction reductObjReduction_in = ReductObjReduction()
588 :
base_t(initReductObjValue_in, reductObjReduction_in),
589 eleWiseReduction_(eleWiseReduction_in)
594 { eleWiseReduction_ = eleWiseReduction_in; }
598 {
return eleWiseReduction_; }
612 const Ptr<ReductTarget> &reduct_obj_inout
615 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
616 using Teuchos::dyn_cast;
619 validate_apply_op<Scalar>(*
this, 1, 0,
true,
620 sub_vecs, targ_sub_vecs, reduct_obj_inout);
625 ReductScalar reduct = reduct_obj.
get();
627 const RTOpPack::index_type subDim = sub_vecs[0].subDim();
629 const_iter_t v0_val = sub_vecs[0].values().begin();
630 const ptrdiff_t v0_s = sub_vecs[0].stride();
632 RTOpPack::index_type global_i = sub_vecs[0].globalOffset();
635 for( Teuchos_Ordinal i = 0; i < subDim; ++i, ++global_i )
636 eleWiseReduction_( global_i, *v0_val++, reduct);
639 for( Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s, ++global_i )
640 eleWiseReduction_( global_i, *v0_val, reduct);
643 reduct_obj.set(reduct);
651 EleWiseReduction eleWiseReduction_;
665 class EleWiseReduction,
666 class ReductObjReduction = SumScalarReductObjReduction<ReductScalar>
679 const ReductScalar &initReductObjValue_in = ReductScalar(),
680 EleWiseReduction eleWiseReduction_in = EleWiseReduction(),
681 ReductObjReduction reductObjReduction_in = ReductObjReduction()
683 :
base_t(initReductObjValue_in, reductObjReduction_in),
684 eleWiseReduction_(eleWiseReduction_in)
694 const Ptr<ReductTarget> &reduct_obj_inout
697 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
698 using Teuchos::dyn_cast;
701 validate_apply_op<Scalar>(*
this, 2, 0,
true,
702 sub_vecs, targ_sub_vecs, reduct_obj_inout.getConst());
707 Scalar reduct = reduct_obj.
get();
709 const RTOpPack::index_type subDim = sub_vecs[0].subDim();
711 const_iter_t v0_val = sub_vecs[0].values().begin();
712 const ptrdiff_t v0_s = sub_vecs[0].stride();
713 const_iter_t v1_val = sub_vecs[1].values().begin();
714 const ptrdiff_t v1_s = sub_vecs[1].stride();
716 if( v0_s == 1 && v1_s == 1 ) {
717 for( Teuchos_Ordinal i = 0; i < subDim; ++i )
718 eleWiseReduction_( *v0_val++, *v1_val++, reduct);
721 for( Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s, v1_val += v1_s )
722 eleWiseReduction_( *v0_val, *v1_val, reduct);
725 reduct_obj.set(reduct);
733 EleWiseReduction eleWiseReduction_;
741 #define RTOP_ROP_2_REDUCT_SCALAR( ROP_CLASS_NAME, REDUCT_SCALAR, \ 742 BASIC_REDUCT_TYPE_ENUM \ 745 template<class Scalar, class ReductScalar> \ 746 class ROP_CLASS_NAME ## EleWiseReduction \ 749 inline void operator()(const Scalar &v0, \ 751 ReductScalar &reduct \ 756 template<class Scalar> \ 757 class ROP_CLASS_NAME \ 758 : public RTOpPack::ROp_2_ScalarReduction< \ 761 ROP_CLASS_NAME ## EleWiseReduction<Scalar, REDUCT_SCALAR >, \ 762 RTOpPack::BasicReductObjReductionOp<REDUCT_SCALAR, BASIC_REDUCT_TYPE_ENUM> > \ 767 this->setOpNameBase( #ROP_CLASS_NAME ); \ 768 this->initReductObjValue(ScalarTraits<REDUCT_SCALAR >::zero()); \ 772 template<class Scalar, class ReductScalar> \ 773 void ROP_CLASS_NAME ## EleWiseReduction<Scalar, ReductScalar>::operator()( \ 774 const Scalar &v0, const Scalar &v1, ReductScalar &reduct) const 783 template<
class Scalar,
class EleWiseTransformation>
790 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
792 : eleWiseTransformation_(eleWiseTransformation)
802 const Ptr<ReductTarget> &reduct_obj_inout
805 typedef typename Teuchos::ArrayRCP<Scalar>::iterator iter_t;
808 validate_apply_op<Scalar>(*
this, 0, 1,
false,
809 sub_vecs, targ_sub_vecs, reduct_obj_inout.getConst());
812 const RTOpPack::index_type subDim = targ_sub_vecs[0].subDim();
814 iter_t z0_val = targ_sub_vecs[0].values().begin();
815 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
818 for( Teuchos_Ordinal i = 0; i < subDim; ++i )
819 eleWiseTransformation_( *z0_val++);
822 for( Teuchos_Ordinal i = 0; i < subDim; ++i, z0_val += z0_s )
823 eleWiseTransformation_( *z0_val);
832 EleWiseTransformation eleWiseTransformation_;
839 template<
class Scalar,
class EleWiseTransformation>
846 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
848 : eleWiseTransformation_(eleWiseTransformation)
854 eleWiseTransformation_ = eleWiseTransformation;
860 return eleWiseTransformation_;
873 const Ptr<ReductTarget> &reduct_obj_inout
876 typedef typename Teuchos::ArrayRCP<Scalar>::iterator iter_t;
879 validate_apply_op<Scalar>(*
this, 0, 1,
false,
880 sub_vecs, targ_sub_vecs, reduct_obj_inout.getConst());
883 const RTOpPack::index_type subDim = targ_sub_vecs[0].subDim();
885 iter_t z0_val = targ_sub_vecs[0].values().begin();
886 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
888 RTOpPack::index_type global_i = targ_sub_vecs[0].globalOffset();
891 for( Teuchos_Ordinal i = 0; i < subDim; ++i, ++global_i )
892 eleWiseTransformation_(global_i, *z0_val++);
895 for( Teuchos_Ordinal i = 0; i < subDim; ++i, z0_val += z0_s, ++global_i )
896 eleWiseTransformation_(global_i, *z0_val);
905 EleWiseTransformation eleWiseTransformation_;
916 template<
class Scalar,
class EleWiseTransformation>
923 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
925 : eleWiseTransformation_(eleWiseTransformation)
935 const Ptr<ReductTarget> &reduct_obj_inout
938 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
939 typedef typename Teuchos::ArrayRCP<Scalar>::iterator iter_t;
942 validate_apply_op<Scalar>(*
this, 1, 1,
false,
943 sub_vecs, targ_sub_vecs, reduct_obj_inout.getConst());
946 const RTOpPack::index_type subDim = sub_vecs[0].subDim();
948 const_iter_t v0_val = sub_vecs[0].values().begin();
949 const ptrdiff_t v0_s = sub_vecs[0].stride();
951 iter_t z0_val = targ_sub_vecs[0].values().begin();
952 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
954 if ( v0_s == 1 && z0_s == 1 ) {
955 for( Teuchos_Ordinal i = 0; i < subDim; ++i )
956 eleWiseTransformation_( *v0_val++, *z0_val++);
959 for( Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s, z0_val += z0_s )
960 eleWiseTransformation_( *v0_val, *z0_val);
969 EleWiseTransformation eleWiseTransformation_;
975 #define RTOP_TOP_1_1( TOP_CLASS_NAME ) \ 977 template<class Scalar> \ 978 class TOP_CLASS_NAME ## EleWiseTransformation \ 981 inline void operator()( const Scalar &v0, Scalar &z0 ) const; \ 985 template<class Scalar> \ 986 class TOP_CLASS_NAME \ 987 : public RTOpPack::TOp_1_1_Base< Scalar, \ 988 TOP_CLASS_NAME ## EleWiseTransformation<Scalar> > \ 993 this->setOpNameBase( #TOP_CLASS_NAME ); \ 998 template<class Scalar> \ 999 void TOP_CLASS_NAME ## EleWiseTransformation<Scalar>::operator()( \ 1000 const Scalar &v0, Scalar &z0 \ 1010 template<
class Scalar,
class EleWiseTransformation>
1017 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
1019 : eleWiseTransformation_(eleWiseTransformation)
1029 const Ptr<ReductTarget> &reduct_obj_inout
1032 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
1033 typedef typename Teuchos::ArrayRCP<Scalar>::iterator iter_t;
1035 #ifdef TEUCHOS_DEBUG 1036 validate_apply_op<Scalar>(*
this, 2, 1,
false,
1037 sub_vecs, targ_sub_vecs, reduct_obj_inout);
1040 const RTOpPack::index_type subDim = sub_vecs[0].subDim();
1042 const_iter_t v0_val = sub_vecs[0].values().begin();
1043 const ptrdiff_t v0_s = sub_vecs[0].stride();
1045 const_iter_t v1_val = sub_vecs[1].values().begin();
1046 const ptrdiff_t v1_s = sub_vecs[1].stride();
1048 iter_t z0_val = targ_sub_vecs[0].values().begin();
1049 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
1051 if ( v0_s == 1 && v1_s == 1 && z0_s == 1 ) {
1052 for( Teuchos_Ordinal i = 0; i < subDim; ++i )
1053 eleWiseTransformation_( *v0_val++, *v1_val++, *z0_val++ );
1057 Teuchos_Ordinal i = 0;
1059 ++i, v0_val += v0_s, v1_val += v1_s, z0_val += z0_s
1062 eleWiseTransformation_( *v0_val, *v1_val, *z0_val );
1073 EleWiseTransformation eleWiseTransformation_;
1078 template<
class Scalar,
class EleWiseTransformation>
1085 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
1087 : eleWiseTransformation_(eleWiseTransformation)
1097 const Ptr<ReductTarget> &reduct_obj_inout
1100 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
1101 typedef typename Teuchos::ArrayRCP<Scalar>::iterator iter_t;
1103 #ifdef TEUCHOS_DEBUG 1104 validate_apply_op<Scalar>(*
this, 3, 1,
false,
1105 sub_vecs, targ_sub_vecs, reduct_obj_inout);
1108 const RTOpPack::index_type subDim = sub_vecs[0].subDim();
1110 const_iter_t v0_val = sub_vecs[0].values().begin();
1111 const ptrdiff_t v0_s = sub_vecs[0].stride();
1113 const_iter_t v1_val = sub_vecs[1].values().begin();
1114 const ptrdiff_t v1_s = sub_vecs[1].stride();
1116 const_iter_t v2_val = sub_vecs[2].values().begin();
1117 const ptrdiff_t v2_s = sub_vecs[2].stride();
1119 iter_t z0_val = targ_sub_vecs[0].values().begin();
1120 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
1122 if ( v0_s == 1 && v1_s == 1 && v2_s == 1 && z0_s == 1 ) {
1123 for( Teuchos_Ordinal i = 0; i < subDim; ++i )
1124 eleWiseTransformation_( *v0_val++, *v1_val++, *v2_val++, *z0_val++ );
1128 Teuchos_Ordinal i = 0;
1130 ++i, v0_val += v0_s, v1_val += v1_s, v2_val += v2_s, z0_val += z0_s
1133 eleWiseTransformation_( *v0_val, *v1_val, *v2_val, *z0_val );
1143 EleWiseTransformation eleWiseTransformation_;
1151 #endif // RTOPPACK_RTOP_T_HELPERS_DECL_HPP void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
Teuchos::RCP< ReductTarget > reduct_obj_create_impl() const
const ConcreteReductObj & get() const
Base class for scalar reduction RTOps with one input vector.
Base class for coordinate-variant scalar reduction RTOps with one input vector.
Simple ReductTarget subclass for simple scalar objects.
ROp_2_ScalarReduction(const ReductScalar &initReductObjValue_in=ReductScalar(), EleWiseReduction eleWiseReduction_in=EleWiseReduction(), ReductObjReduction reductObjReduction_in=ReductObjReduction())
Null reduction object reduction operator.
TOp_0_1_CoordVariantBase(EleWiseTransformation eleWiseTransformation=EleWiseTransformation())
const RCP< DefaultReductTarget< ConcreteReductObj > > defaultReductTarget(const ConcreteReductObj &concreteReductObj)
Nonmember constructor.
STANDARD_MEMBER_COMPOSITION_MEMBERS(ConcreteReductObj, initReductObjValue)
void operator()(const ConcreteReductObj &in_reduct, ConcreteReductObj &inout_reduct) const
Base class for coordinate variant transformations for 0 input and 1 output vector.
const EleWiseTransformation & getEleWiseTransformation() const
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
const EleWiseReduction & getEleWiseReduction() const
Base class for transformations for 2 input and 1 output vector.
DefaultReductTarget(const ConcreteReductObj &concreteReductObj)
void setEleWiseReduction(EleWiseReduction eleWiseReduction_in)
ROp_1_ScalarReduction(const ConcreteReductObj &initReductObjValue_in=ConcreteReductObj(), EleWiseReduction eleWiseReduction_in=EleWiseReduction(), ReductObjReduction reductObjReduction_in=ReductObjReduction())
Base class for transformations for 0 input and 1 output vector.
TOp_0_1_Base(EleWiseTransformation eleWiseTransformation=EleWiseTransformation())
void set(const ConcreteReductObj &concreteReductObj)
void reduct_obj_reinit_impl(const Ptr< ReductTarget > &reduct_obj) const
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
PrimitiveTypeTraits< Scalar, Scalar > ScalarPrimitiveTypeTraits
virtual void reduce_reduct_objs_impl(const ReductTarget &in_reduct_obj, const Ptr< ReductTarget > &inout_reduct_obj) const
void get_reduct_type_num_entries_impl(const Ptr< int > &num_values, const Ptr< int > &num_indexes, const Ptr< int > &num_chars) const
std::string description() const
Base class for transformations for 1 input and 1 output vector.
TOp_1_1_Base(EleWiseTransformation eleWiseTransformation=EleWiseTransformation())
ROpScalarReductionWithOpBase< Scalar, ConcreteReductObj, ReductObjReduction > base_t
Simple struct for a Scalar and an Ordinal object.
void operator()(const Scalar &in_reduct, Scalar &inout_reduct) const
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
void setEleWiseTransformation(EleWiseTransformation eleWiseTransformation)
ROpScalarReductionWithOpBase(const ConcreteReductObj &initReductObjValue_in=ScalarTraits< Scalar >::zero(), ReductObjReduction reductObjReduction_in=ReductObjReduction())
void operator()(const ConcreteReductObj &in_reduct, ConcreteReductObj &inout_reduct) const
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
void operator()(const ConcreteReductObj &in_reduct, ConcreteReductObj &inout_reduct) const
TOp_2_1_Base(EleWiseTransformation eleWiseTransformation=EleWiseTransformation())
Base class for scalar reduction RTOps with two input vectors.
bool coord_invariant_impl() const
This RTOp is NOT coordinate invariant! .
ROpScalarReductionWithOpBase< Scalar, ReductScalar, ReductObjReduction > base_t
void setRawVal(const ConcreteReductObj &rawVal, const Ptr< ReductTarget > &reduct_obj) const
ConcreteReductObj operator()(const ReductTarget &reduct_obj) const
bool coord_invariant_impl() const
This RTOp is NOT coordinate invariant! .
static void loadPrimitiveObjs(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs, const Ptr< ScalarIndex< Scalar > > &obj)
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
static int numPrimitiveObjs()
TOp_3_1_Base(EleWiseTransformation eleWiseTransformation=EleWiseTransformation())
static int numIndexObjs()
void extract_reduct_obj_state_impl(const ReductTarget &reduct_obj, const ArrayView< primitive_value_type > &value_data, const ArrayView< index_type > &index_data, const ArrayView< char_type > &char_data) const
static void extractPrimitiveObjs(const ScalarIndex< Scalar > &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
ROpScalarReductionWithOpBase< Scalar, ReductScalar, ReductObjReduction > base_t
RTOpT< Scalar >::primitive_value_type primitive_value_type
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const
Base class for transformations for 3 input and 1 output vector.
void load_reduct_obj_state_impl(const ArrayView< const primitive_value_type > &value_data, const ArrayView< const index_type > &index_data, const ArrayView< const char_type > &char_data, const Ptr< ReductTarget > &reduct_obj) const
ScalarIndex(const Scalar &_scalar, const Ordinal &_index)
void operator()(const ConcreteReductObj &in_reduct, ConcreteReductObj &inout_reduct) const
const ConcreteReductObj & getRawVal(const ReductTarget &reduct_obj) const
ScalarPrimitiveTypeTraits::primitiveType primitiveType
ROp_1_CoordVariantScalarReduction(const ReductScalar &initReductObjValue_in=ReductScalar(), EleWiseReduction eleWiseReduction_in=EleWiseReduction(), ReductObjReduction reductObjReduction_in=ReductObjReduction())
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj_inout) const