From 96d9b4808e772040ef2ee46dd35537c8235a040a Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sun, 14 Jan 2018 19:15:05 +0100 Subject: [PATCH] im com while fixing (still NOT FINISHED) --- src/multi_array_operation.h | 285 ++++++++++++++++++++++++++++++------ src/pack_num.h | 38 ++++- src/ranges/single_range.h | 2 +- src/xfor/xfor.h | 6 +- 4 files changed, 284 insertions(+), 47 deletions(-) diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index af12a96..b875a63 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -26,6 +26,44 @@ namespace MultiArrayTools { using namespace MultiArrayHelper; } + + // OPERATIONS (STATIC) + template + struct plus + { + static T&& apply(T&& a1, T&& a2) + { + return a1 + a2; + } + }; + + template + struct minus + { + static T&& apply(T&& a1, T&& a2) + { + return a1 - a2; + } + }; + + template + struct multiplies + { + static T&& apply(T&& a1, T&& a2) + { + return a1 * a2; + } + }; + + template + struct divides + { + static T&& apply(T&& a1, T&& a2) + { + return a1 / a2; + } + }; + template Block makeBlock(const T* vec, size_t stepSize, size_t blockSize); @@ -53,19 +91,19 @@ namespace MultiArrayTools template auto operator+(const Second& in) const - -> Operation,OperationClass,Second>; + -> Operation,OperationClass,Second>; template auto operator-(const Second& in) const - -> Operation,OperationClass,Second>; + -> Operation,OperationClass,Second>; template auto operator*(const Second& in) const - -> Operation,OperationClass,Second>; + -> Operation,OperationClass,Second>; template auto operator/(const Second& in) const - -> Operation,OperationClass,Second>; + -> Operation,OperationClass,Second>; template auto c(std::shared_ptr& ind) const @@ -88,22 +126,22 @@ namespace MultiArrayTools //AssignmentExpr(const AssignmentExpr& in) = default; //AssignmentExpr& operator=(const AssignmentExpr& in) = default; - OperationMaster* mMPtr; - const OpClass* mSecPtr; + OperationMaster& mM; + const OpClass& mSec; public: static size_t layer() { return 0; } static const size_t LAYER = 0; static const size_t SIZE = OpClass::SIZE; - typedef decltype(mSecPtr->rootSteps()) ETuple; + typedef decltype(mSec.rootSteps()) ETuple; - AssignmentExpr(OperationMaster* mPtr, const OpClass* secPtr); + AssignmentExpr(OperationMaster& m, const OpClass& sec); AssignmentExpr(AssignmentExpr&& in) = default; //AssignmentExpr& operator=(const AssignmentExpr&& in) = default; - inline void operator()(size_t start = 0); + //inline void operator()(size_t start = 0); inline void operator()(size_t start, const ETuple& last); ETuple rootSteps(std::intptr_t iPtrNum = 0); @@ -128,15 +166,19 @@ namespace MultiArrayTools MBlock& get(); const Block& get() const; + T& get(size_t pos); + const T& get(size_t pos) const; + std::vector block(const IndexInfo* blockIndex, bool init = false) const; const OperationMaster& block() const; - + private: std::shared_ptr mkIndex(std::shared_ptr& index); void performAssignment(std::intptr_t blockIndexNum); OpClass const& mSecond; MutableMultiArrayBase& mArrayRef; + T* mData; std::shared_ptr mIndex; IndexInfo mIInfo; mutable bType mBlock; @@ -163,12 +205,18 @@ namespace MultiArrayTools const std::shared_ptr&... indices); const Block& get() const; + + template + inline const T& get(const ET& pos) const; std::vector block(const IndexInfo* blockIndex, bool init = false) const; const ConstOperationRoot& block() const; - std::tuple rootSteps(const IndexInfo* ii = nullptr) const; // nullptr for simple usage with decltype - + std::tuple rootSteps(std::intptr_t iPtrNum = 0) const; // nullptr for simple usage with decltype + + template + Expr&& loop(Expr&& exp) const; + private: std::shared_ptr @@ -176,6 +224,7 @@ namespace MultiArrayTools const std::shared_ptr&... indices); MultiArrayBase const& mArrayRef; + const T* mData; std::shared_ptr mIndex; IndexInfo mIInfo; mutable bType mBlock; @@ -205,11 +254,20 @@ namespace MultiArrayTools const MBlock& get() const; MBlock& get(); + template + inline const T& get(const ET& pos) const; + + template + inline T& get(const ET& pos); + OperationRoot& set(const IndexInfo* blockIndex); std::vector block(const IndexInfo* blockIndex, bool init = false) const; const OperationRoot& block() const; - std::tuple rootSteps(const IndexInfo* ii = nullptr) const; // nullptr for simple usage with decltype + std::tuple rootSteps(std::intptr_t iPtrNum = 0) const; // nullptr for simple usage with decltype + + template + Expr&& loop(Expr&& exp) const; private: @@ -218,6 +276,7 @@ namespace MultiArrayTools const std::shared_ptr&... indices); MutableMultiArrayBase& mArrayRef; + T* mData; std::shared_ptr mIndex; IndexInfo mIInfo; mutable bType mBlock; @@ -283,15 +342,25 @@ namespace MultiArrayTools mutable bType mRes; public: + typedef decltype(PackNum::mkStepTuple(0, mOps)) ETuple; + //typedef decltype(PackNum::template mkLoopType) LType; + Operation(const Ops&... ops); const BlockResult& get() const; + + template + inline T&& get(const ET& pos) const; std::vector block(const IndexInfo* blockIndex, bool init = false) const; const Operation& block() const; - auto rootSteps(const IndexInfo* ii = nullptr) const // nullptr for simple usage with decltype - -> decltype(PackNum::mkStepTuple(ii, mOps)); + auto rootSteps(std::intptr_t iPtrNum = 0) const // nullptr for simple usage with decltype + -> decltype(PackNum::mkStepTuple(iPtrNum, mOps)); + + template + auto loop(Expr&& exp) const + -> decltype(PackNum::mkLoop( mOps, std::forward( exp ) ))&&; }; @@ -314,16 +383,23 @@ namespace MultiArrayTools mutable bType mRes; public: + typedef decltype(mOp.rootSteps(0)) ETuple; + Contraction(const Op& op, std::shared_ptr ind); const BlockResult& get() const; + template + inline T&& get(const ET& pos) const; + std::vector block(const IndexInfo* blockIndex, bool init = false) const; const Contraction& block() const; - auto rootSteps(const IndexInfo* ii = nullptr) const // nullptr for simple usage with decltype - -> decltype(mOp.rootSteps(ii)); - + auto rootSteps(std::intptr_t iPtrNum = 0) const // nullptr for simple usage with decltype + -> decltype(mOp.rootSteps(iPtrNum)); + + template + auto loop(Expr&& exp) const -> decltype(mInd->ifor(exp))&&; }; } @@ -393,33 +469,33 @@ namespace MultiArrayTools template template auto OperationTemplate::operator+(const Second& in) const - -> Operation,OperationClass,Second> + -> Operation,OperationClass,Second> { - return Operation,OperationClass,Second>(THIS(), in); + return Operation,OperationClass,Second>(THIS(), in); } template template auto OperationTemplate::operator-(const Second& in) const - -> Operation,OperationClass,Second> + -> Operation,OperationClass,Second> { - return Operation,OperationClass,Second>(THIS(), in); + return Operation,OperationClass,Second>(THIS(), in); } template template auto OperationTemplate::operator*(const Second& in) const - -> Operation,OperationClass,Second> + -> Operation,OperationClass,Second> { - return Operation,OperationClass,Second>(THIS(), in); + return Operation,OperationClass,Second>(THIS(), in); } template template auto OperationTemplate::operator/(const Second& in) const - -> Operation,OperationClass,Second> + -> Operation,OperationClass,Second> { - return Operation,OperationClass,Second>(THIS(), in); + return Operation,OperationClass,Second>(THIS(), in); } template @@ -430,6 +506,38 @@ namespace MultiArrayTools return Contraction(THIS(), ind); } + /***************************************** + * OperationMaster::AssignmentExpr * + *****************************************/ + + template + OperationMaster::AssignmentExpr:: + AssignmentExpr(OperationMaster& m, const OpClass& sec) : + mM(m), mSec(sec) {} + + /* + template + inline void OperationMaster::AssignmentExpr:: + operator()(size_t start) + { + + }*/ + + template + inline void OperationMaster::AssignmentExpr:: + operator()(size_t start, const ETuple& last) + { + mM.get(start) = mSec.template get(last); + } + + template + typename OperationMaster::AssignmentExpr::ETuple + OperationMaster::AssignmentExpr:: + rootSteps(std::intptr_t iPtrNum) + { + return mSec.rootSteps(iPtrNum); + } + /************************* * OperationMaster * @@ -439,7 +547,8 @@ namespace MultiArrayTools OperationMaster:: OperationMaster(MutableMultiArrayBase& ma, const OpClass& second, std::shared_ptr& index) : - mSecond(second), mArrayRef(ma), mIndex(mkIndex(index)), mIInfo(*mIndex) + mSecond(second), mArrayRef(ma), mData(mArrayRef.data()), + mIndex(mkIndex(index)), mIInfo(*mIndex) { auto blockIndex = seekBlockIndex( &mIInfo, second); std::intptr_t blockIndexNum = blockIndex->getPtrNum(); @@ -455,7 +564,8 @@ namespace MultiArrayTools OperationMaster(MutableMultiArrayBase& ma, const OpClass& second, std::shared_ptr& index, const IndexInfo* blockIndex) : - mSecond(second), mArrayRef(ma), mIndex(mkIndex(index)), mIInfo(*mIndex) + mSecond(second), mArrayRef(ma), mData(mArrayRef.data()), + mIndex(mkIndex(index)), mIInfo(*mIndex) { std::intptr_t blockIndexNum = blockIndex->getPtrNum(); second.block(blockIndex, true); @@ -482,9 +592,12 @@ namespace MultiArrayTools #define XX_USE_NEW_LOOP_ROUTINE_XX #ifdef XX_USE_NEW_LOOP_ROUTINE_XX // === N E W === - AssignmentExpr ae(this, &mSecond); - const auto loop = mIndex->ifor(ae); - loop(); + AssignmentExpr ae(*this, mSecond); // Expression to be executed within loop + //const auto hiddenLoop = mSecond.loop(AssignmentExpr(*this, mSecond)); // hidden loop within 'mSecond' e.g. contractions + const auto loop = mIndex->ifor + ( mSecond.template loop + ( std::move(ae) ) ); // init overall loop(s) + loop(); // execute overall loop(s) and so internal hidden loops and so the inherited expressions #else // === O L D === for(*mIndex = 0; mIndex->pos() != mIndex->max(); mIndex->pp(blockIndexNum) ){ @@ -506,6 +619,18 @@ namespace MultiArrayTools return mBlock; } + template + T& OperationMaster::get(size_t pos) + { + return mData[pos]; + } + + template + const T& OperationMaster::get(size_t pos) const + { + return mData[pos]; + } + template std::vector OperationMaster::block(const IndexInfo* blockIndex, bool init) const { @@ -524,6 +649,7 @@ namespace MultiArrayTools return *this; } + /**************************** * ConstOperationRoot * ****************************/ @@ -533,7 +659,8 @@ namespace MultiArrayTools ConstOperationRoot(const MultiArrayBase& ma, const std::shared_ptr&... indices) : //OperationTemplate >(this), - mArrayRef(ma), mIndex( mkIndex(ma,indices...) ), mIInfo(*mIndex) + mArrayRef(ma), mData(mArrayRef.data()), + mIndex( mkIndex(ma,indices...) ), mIInfo(*mIndex) {} template @@ -553,7 +680,14 @@ namespace MultiArrayTools block(); return mBlock; } - + + template + template + inline const T& ConstOperationRoot::get(const ET& pos) const + { + return mData[std::get(pos)]; + } + template std::vector ConstOperationRoot::block(const IndexInfo* blockIndex, bool init) const { @@ -572,10 +706,18 @@ namespace MultiArrayTools } template - std::tuple ConstOperationRoot::rootSteps(const IndexInfo* ii) const + std::tuple ConstOperationRoot::rootSteps(std::intptr_t iPtrNum) const { return std::tuple(0ul); // !!!!!! } + + + template + template + Expr&& ConstOperationRoot::loop(Expr&& exp) const + { + return std::forward(exp); + } /*********************** * OperationRoot * @@ -586,7 +728,8 @@ namespace MultiArrayTools OperationRoot(MutableMultiArrayBase& ma, const std::shared_ptr&... indices) : //OperationTemplate >(this), - mArrayRef(ma), mIndex( mkIndex( ma, indices... ) ), mIInfo(*mIndex), + mArrayRef(ma), mData(mArrayRef.data()), + mIndex( mkIndex( ma, indices... ) ), mIInfo(*mIndex), mBlockII(nullptr) {} @@ -627,6 +770,20 @@ namespace MultiArrayTools return mBlock; } + template + template + inline const T& OperationRoot::get(const ET& pos) const + { + return mData[std::get( pos )]; + } + + template + template + inline T& OperationRoot::get(const ET& pos) + { + return mData[std::get( pos )]; + } + template OperationRoot& OperationRoot::set(const IndexInfo* blockIndex) @@ -653,10 +810,17 @@ namespace MultiArrayTools } template - std::tuple OperationRoot::rootSteps(const IndexInfo* ii) const + std::tuple OperationRoot::rootSteps(std::intptr_t iPtrNum) const { return std::tuple(0ul); // !!!!!! } + + template + template + Expr&& OperationRoot::loop(Expr&& exp) const + { + return std::forward(exp); + } /******************* * Operation * @@ -674,6 +838,15 @@ namespace MultiArrayTools return mRes; } + template + template + inline T&& Operation::get(const ET& pos) const + { + typedef std::tuple OpTuple; + return std::forward( PackNum:: + template mkOpExpr(pos, mOps) ); + } + template std::vector Operation::block(const IndexInfo* blockIndex, bool init) const { @@ -694,10 +867,21 @@ namespace MultiArrayTools } template - auto Operation::rootSteps(const IndexInfo* ii) const - -> decltype(PackNum::mkStepTuple(ii, mOps)) + auto Operation::rootSteps(std::intptr_t iPtrNum) const + -> decltype(PackNum::mkStepTuple(iPtrNum, mOps)) { - return PackNum::mkStepTuple(ii, mOps); + return PackNum::mkStepTuple(iPtrNum, mOps); + } + + template + template + auto Operation::loop(Expr&& exp) const + -> decltype(PackNum::mkLoop( mOps, std::forward( exp ) ))&& + { + typedef decltype(PackNum::mkLoop( mOps, std::forward( exp ) ) ) + LType; + return std::forward + ( PackNum::mkLoop( mOps, std::forward( exp ) ) ); } @@ -721,6 +905,14 @@ namespace MultiArrayTools return mRes; } + // forward loop !!!! + template + template + inline T&& Contraction::get(const ET& pos) const + { + return std::forward( mOp.template get(pos) ); + } + template std::vector Contraction::block(const IndexInfo* blockIndex, bool init) const { @@ -737,10 +929,19 @@ namespace MultiArrayTools } template - auto Contraction::rootSteps(const IndexInfo* ii) const - -> decltype(mOp.rootSteps(ii)) + auto Contraction::rootSteps(std::intptr_t iPtrNum) const + -> decltype(mOp.rootSteps(iPtrNum)) { - return mOp.rootSteps(ii); + return mOp.rootSteps(iPtrNum); + } + + template + template + auto Contraction::loop(Expr&& exp) const -> decltype(mInd->ifor(exp))&& + { + typedef decltype(mInd->ifor(exp)) LType; + LType&& loop = mInd->ifor(exp); + return std::forward( loop ); } } diff --git a/src/pack_num.h b/src/pack_num.h index 95c903c..4e585f3 100644 --- a/src/pack_num.h +++ b/src/pack_num.h @@ -51,7 +51,7 @@ namespace MultiArrayHelper } template - static auto mkStepTuple(const IndexInfo* ii, std::tuple otp) + static auto mkStepTuple(std::intptr_t ii, std::tuple otp) -> decltype(std::tuple_cat( PackNum::mkStepTuple(ii, otp), std::get(otp).rootSteps(ii) )) { return std::tuple_cat( PackNum::mkStepTuple(ii, otp), std::get(otp).rootSteps(ii) ); @@ -65,6 +65,23 @@ namespace MultiArrayHelper std::get(out) = second.rootSteps( std::get(siar) ); PackNum::mkExt(out, siar, second); } + + // call with -2 (instead of -1) + template + static T&& mkOpExpr(const ETuple& pos, const OpTuple& ops) + { + static const size_t NEXT = START - std::tuple_element::type::SIZE; + return std::forward + ( OpFunction::apply( std::get(ops).template get(pos), + PackNum::template mkOpExpr(pos, ops) ) ); + } + + template + static auto mkLoop( const OpTuple& ot, Expr&& exp ) + -> decltype(std::get(ot).loop( PackNum::mkLoop(ot,exp) ))&& + { + return std::get(ot).loop( PackNum::mkLoop(ot,exp) ); + } }; template<> @@ -105,7 +122,7 @@ namespace MultiArrayHelper } template - static auto mkStepTuple(const IndexInfo* ii, std::tuple otp) + static auto mkStepTuple(std::intptr_t ii, std::tuple otp) -> decltype(std::get<0>(otp).rootSteps(ii)) { return std::get<0>(otp).rootSteps(ii); @@ -119,6 +136,23 @@ namespace MultiArrayHelper std::get<0>(out) = second.rootSteps( std::get<0>(siar) ); } + template + static T&& mkOpExpr(const ETuple& pos, const OpTuple& ops) + { + static const size_t NEXT = START - std::tuple_element<1,OpTuple>::type::SIZE; + return std::forward + ( OpFunction::apply( std::get<1>(ops).template get(pos), + std::get<0>(ops).template get(pos) ) ); + } + + template + static auto mkLoop( const OpTuple& ot, Expr&& exp ) + -> decltype(std::get<0>(ot).loop( exp ))&& + { + return std::get<0>(ot).loop( exp ); + } + + }; diff --git a/src/ranges/single_range.h b/src/ranges/single_range.h index 24e4604..f7ac16d 100644 --- a/src/ranges/single_range.h +++ b/src/ranges/single_range.h @@ -254,7 +254,7 @@ namespace MultiArrayTools -> For,Expr> { //static const size_t LAYER = typename Expr::LAYER; - return For,Expr>(this, ex); + return For,Expr>(this, std::forward( ex )); } diff --git a/src/xfor/xfor.h b/src/xfor/xfor.h index 59cb09d..f1dd6ff 100644 --- a/src/xfor/xfor.h +++ b/src/xfor/xfor.h @@ -66,12 +66,14 @@ namespace MultiArrayHelper template For::For(const std::shared_ptr& indPtr, Expr&& expr) : - mIndPtr(indPtr.get()), mExpr(expr), mExt(expr.rootSteps( static_cast( mIndPtr.get() ))) {} + mIndPtr(indPtr.get()), mExpr(expr), + mExt(expr.rootSteps( reinterpret_cast( mIndPtr.get() ))) {} template For::For(const IndexClass* indPtr, Expr&& expr) : - mIndPtr(indPtr), mExpr(expr), mExt(expr.rootSteps( static_cast( mIndPtr ) )) {} + mIndPtr(indPtr), mExpr(std::forward( expr )), + mExt(expr.rootSteps( reinterpret_cast( mIndPtr ) )) {} template inline void For::operator()(size_t mlast,