diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index a46fcdb..12de4f2 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -12,7 +12,7 @@ #include "base_def.h" #include "mbase_def.h" -#include "block/block.h" +//#include "block/block.h" #include "operation_utils.h" #include "ranges/rheader.h" #include "pack_num.h" @@ -105,8 +105,8 @@ namespace MultiArrayTools AssignmentExpr(AssignmentExpr&& in) = default; //AssignmentExpr& operator=(const AssignmentExpr&& in) = default; - inline void operator()(size_t start = 0); - inline void operator()(size_t start, ExtType last); + inline void operator()(size_t start = 0) const; + inline void operator()(size_t start, ExtType last) const; auto rootSteps(std::intptr_t iPtrNum = 0) const -> ExtType; @@ -127,14 +127,15 @@ namespace MultiArrayTools std::shared_ptr& index, const IndexInfo* blockIndex); - MBlock& get(); - const Block& get() const; + //MBlock& get(); + //const Block& get() const; - inline T& get(size_t pos); + inline void set(size_t pos, T val) { mDataPtr[pos] = val }; + inline T get(size_t pos); inline const T& get(size_t pos) const; - std::vector block(const IndexInfo* blockIndex, bool init = false) const; - const OperationMaster& block() const; + //std::vector block(const IndexInfo* blockIndex, bool init = false) const; + //const OperationMaster& block() const; private: @@ -142,7 +143,7 @@ namespace MultiArrayTools void performAssignment(std::intptr_t blockIndexNum); OpClass const& mSecond; MutableMultiArrayBase& mArrayRef; - std::vector& mData; + T* mDataPtr; std::shared_ptr mIndex; IndexInfo mIInfo; mutable bType mBlock; @@ -168,15 +169,15 @@ namespace MultiArrayTools ConstOperationRoot(const MultiArrayBase& ma, const std::shared_ptr&... indices); - const Block& get() const; + //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::vector block(const IndexInfo* blockIndex, bool init = false) const; - const ConstOperationRoot& block() const; - - std::tuple rootSteps(std::intptr_t iPtrNum = 0) const; // nullptr for simple usage with decltype + MExt rootSteps(std::intptr_t iPtrNum = 0) const; // nullptr for simple usage with decltype template Expr loop(Expr exp) const; @@ -188,10 +189,10 @@ namespace MultiArrayTools const std::shared_ptr&... indices); MultiArrayBase const& mArrayRef; - const std::vector& mData; + const T* mDataPtr; std::shared_ptr mIndex; IndexInfo mIInfo; - mutable bType mBlock; + //mutable bType mBlock; }; template @@ -215,8 +216,8 @@ namespace MultiArrayTools template OperationMaster operator=(const OpClass& in); - const MBlock& get() const; - MBlock& get(); + //const MBlock& get() const; + //MBlock& get(); template inline const T& get(const ET& pos) const; @@ -224,11 +225,11 @@ namespace MultiArrayTools 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; + //OperationRoot& set(const IndexInfo* blockIndex); + //std::vector block(const IndexInfo* blockIndex, bool init = false) const; + //const OperationRoot& block() const; - std::tuple rootSteps(std::intptr_t iPtrNum = 0) const; // nullptr for simple usage with decltype + MExt rootSteps(std::intptr_t iPtrNum = 0) const; // nullptr for simple usage with decltype template Expr loop(Expr exp) const; @@ -240,11 +241,11 @@ namespace MultiArrayTools const std::shared_ptr&... indices); MutableMultiArrayBase& mArrayRef; - std::vector& mData; + T* mDataPtr; std::shared_ptr mIndex; IndexInfo mIInfo; - mutable bType mBlock; - const IndexInfo* mBlockII; // predefine to save time + //mutable bType mBlock; + //const IndexInfo* mBlockII; // predefine to save time }; template @@ -265,7 +266,7 @@ namespace MultiArrayTools template struct rs { - static const size_t SIZE = Op1::SIZE + RootSumN::template rs::SIZE; + static constexpr size_t SIZE = Op1::SIZE + RootSumN::template rs::SIZE; }; }; @@ -275,7 +276,7 @@ namespace MultiArrayTools template struct rs { - static const size_t SIZE = Op1::SIZE; + static constexpr size_t SIZE = Op1::SIZE; }; }; @@ -283,7 +284,7 @@ namespace MultiArrayTools template struct RootSum { - static const size_t SIZE = RootSumN::template rs::SIZE; + static constexpr size_t SIZE = RootSumN::template rs::SIZE; }; @@ -299,28 +300,28 @@ namespace MultiArrayTools typedef BlockResult bType; static size_t rootNum() { return sumRootNum(); } - static const size_t SIZE = RootSum::SIZE; + static constexpr size_t SIZE = RootSum::SIZE; private: - std::tuple mOps; + std::tuple mOps; mutable bType mRes; public: - typedef decltype(PackNum::mkStepTuple(0, mOps)) ETuple; + typedef decltype(PackNum::mkSteps(0, mOps)) ETuple; //typedef decltype(PackNum::template mkLoopType) LType; Operation(const Ops&... ops); - const BlockResult& get() const; + //const BlockResult& get() const; - template + template inline T get(const ET& pos) const; - std::vector block(const IndexInfo* blockIndex, bool init = false) const; - const Operation& block() const; + //std::vector block(const IndexInfo* blockIndex, bool init = false) const; + //const Operation& block() const; auto rootSteps(std::intptr_t iPtrNum = 0) const // nullptr for simple usage with decltype - -> decltype(PackNum::mkStepTuple(iPtrNum, mOps)); + -> decltype(PackNum::mkSteps(iPtrNum, mOps)); template auto loop(Expr exp) const @@ -351,13 +352,13 @@ namespace MultiArrayTools Contraction(const Op& op, std::shared_ptr ind); - const BlockResult& get() const; + //const BlockResult& get() const; - template + template inline T get(const ET& pos) const; - std::vector block(const IndexInfo* blockIndex, bool init = false) const; - const Contraction& block() const; + //std::vector block(const IndexInfo* blockIndex, bool init = false) const; + //const Contraction& block() const; auto rootSteps(std::intptr_t iPtrNum = 0) const // nullptr for simple usage with decltype -> decltype(mOp.rootSteps(iPtrNum)); @@ -489,9 +490,9 @@ namespace MultiArrayTools template inline void OperationMaster::AssignmentExpr:: - operator()(size_t start, ExtType last) + operator()(size_t start, ExtType last) const { - mM.get(start) = mSec.template get(last); + mM.get(start) += mSec.template get(last); } template @@ -511,16 +512,16 @@ namespace MultiArrayTools OperationMaster:: OperationMaster(MutableMultiArrayBase& ma, const OpClass& second, std::shared_ptr& index) : - mSecond(second), mArrayRef(ma), mData(mArrayRef.datav()), + mSecond(second), mArrayRef(ma), mDataPtr(mArrayRef.data()), mIndex(mkIndex(index)), mIInfo(*mIndex) { - auto blockIndex = seekBlockIndex( &mIInfo, second); - std::intptr_t blockIndexNum = blockIndex->getPtrNum(); + //auto blockIndex = seekBlockIndex( &mIInfo, second); + //std::intptr_t blockIndexNum = blockIndex->getPtrNum(); - block(blockIndex, true); - second.block(blockIndex, true); + //block(blockIndex, true); + //second.block(blockIndex, true); - performAssignment(blockIndexNum); + performAssignment(0); } template @@ -528,13 +529,13 @@ namespace MultiArrayTools OperationMaster(MutableMultiArrayBase& ma, const OpClass& second, std::shared_ptr& index, const IndexInfo* blockIndex) : - mSecond(second), mArrayRef(ma), mData(mArrayRef.datav()), + mSecond(second), mArrayRef(ma), mDataPtr(mArrayRef.data()), mIndex(mkIndex(index)), mIInfo(*mIndex) { - std::intptr_t blockIndexNum = blockIndex->getPtrNum(); - second.block(blockIndex, true); + //std::intptr_t blockIndexNum = blockIndex->getPtrNum(); + //second.block(blockIndex, true); - performAssignment(blockIndexNum); + performAssignment(0); } template @@ -558,7 +559,7 @@ namespace MultiArrayTools // === N E W === 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 + 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 @@ -570,7 +571,7 @@ namespace MultiArrayTools } #endif } - + /* template MBlock& OperationMaster::get() { @@ -582,23 +583,23 @@ namespace MultiArrayTools { return mBlock; } - + */ template inline T& OperationMaster::get(size_t pos) { //assert(pos < mIndex->max()); //if(pos >= mIndex->max()) { VCHECK(pos); VCHECK(mIndex->max()); assert(0); } //VCHECK(pos); - return mData[pos]; + return mDataPtr[pos]; } template inline const T& OperationMaster::get(size_t pos) const { //VCHECK(pos); - return mData[pos]; + return mDataPtr[pos]; } - + /* template std::vector OperationMaster::block(const IndexInfo* blockIndex, bool init) const { @@ -616,7 +617,7 @@ namespace MultiArrayTools mBlock.set( mIndex->pos() ); return *this; } - + */ /**************************** * ConstOperationRoot * @@ -627,7 +628,7 @@ namespace MultiArrayTools ConstOperationRoot(const MultiArrayBase& ma, const std::shared_ptr&... indices) : //OperationTemplate >(this), - mArrayRef(ma), mData(mArrayRef.datav()), + mArrayRef(ma), mDataPtr(mArrayRef.data()), mIndex( mkIndex(ma,indices...) ), mIInfo(*mIndex) {} @@ -641,21 +642,21 @@ namespace MultiArrayTools (*mIndex)(indices...); return i; } - + /* template const Block& ConstOperationRoot::get() const { block(); return mBlock; } - + */ template template inline const T& ConstOperationRoot::get(const ET& pos) const { - return mData[pos.val()]; + return mDataPtr[pos.val()]; } - + /* template std::vector ConstOperationRoot::block(const IndexInfo* blockIndex, bool init) const { @@ -672,11 +673,11 @@ namespace MultiArrayTools mBlock.set( (*mIndex)().pos() ); return *this; } - + */ template - std::tuple ConstOperationRoot::rootSteps(std::intptr_t iPtrNum) const + MExt ConstOperationRoot::rootSteps(std::intptr_t iPtrNum) const { - return std::tuple(0ul); // !!!!!! + return MExt(0u); // !!!!!! } @@ -696,9 +697,9 @@ namespace MultiArrayTools OperationRoot(MutableMultiArrayBase& ma, const std::shared_ptr&... indices) : //OperationTemplate >(this), - mArrayRef(ma), mData(mArrayRef.datav()), - mIndex( mkIndex( ma, indices... ) ), mIInfo(*mIndex), - mBlockII(nullptr) + mArrayRef(ma), mDataPtr(mArrayRef.data()), + mIndex( mkIndex( ma, indices... ) ), mIInfo(*mIndex) + //mBlockII(nullptr) {} template @@ -716,14 +717,14 @@ namespace MultiArrayTools template OperationMaster OperationRoot::operator=(const OpClass& in) { - if(mBlockII != nullptr){ - return OperationMaster(mArrayRef, in, mIndex, mBlockII); - } - else { + //if(mBlockII != nullptr){ + // return OperationMaster(mArrayRef, in, mIndex, mBlockII); + //} + //else { return OperationMaster(mArrayRef, in, mIndex); - } + //} } - + /* template const MBlock& OperationRoot::get() const { @@ -737,21 +738,21 @@ namespace MultiArrayTools block(); return mBlock; } - + */ template template inline const T& OperationRoot::get(const ET& pos) const { - return mData[pos.val()]; + return mDataPtr[pos.val()]; } template template inline T& OperationRoot::get(const ET& pos) { - return mData[pos.val()]; + return mDataPtr[pos.val()]; } - + /* template OperationRoot& OperationRoot::set(const IndexInfo* blockIndex) @@ -759,7 +760,7 @@ namespace MultiArrayTools mBlockII = blockIndex; return *this; } - + template std::vector OperationRoot::block(const IndexInfo* blockIndex, bool init) const { @@ -776,11 +777,11 @@ namespace MultiArrayTools mBlock.set( (*mIndex)().pos() ); return *this; } - + */ template - std::tuple OperationRoot::rootSteps(std::intptr_t iPtrNum) const + MExt OperationRoot::rootSteps(std::intptr_t iPtrNum) const { - return std::tuple(0ul); // !!!!!! + return MExt(0u); // !!!!!! } template @@ -798,23 +799,23 @@ namespace MultiArrayTools Operation::Operation(const Ops&... ops) : //OperationTemplate >(this), mOps(ops...) {} - + /* template const BlockResult& Operation::get() const { PackNum::template unpackArgs(mRes, mOps); return mRes; } - + */ template - template + template inline T Operation::get(const ET& pos) const { typedef std::tuple OpTuple; - return PackNum:: - template mkOpExpr(pos, mOps); + return PackNum:: + template mkOpExpr(pos, mOps); } - + /* template std::vector Operation::block(const IndexInfo* blockIndex, bool init) const { @@ -833,12 +834,12 @@ namespace MultiArrayTools //mBlock.set( mIndex->pos() ); return *this; } - + */ template auto Operation::rootSteps(std::intptr_t iPtrNum) const - -> decltype(PackNum::mkStepTuple(iPtrNum, mOps)) + -> decltype(PackNum::mkSteps(iPtrNum, mOps)) { - return PackNum::mkStepTuple(iPtrNum, mOps); + return PackNum::mkSteps(iPtrNum, mOps); } template @@ -859,7 +860,7 @@ namespace MultiArrayTools //OperationTemplate >(this), mOp(op), mInd(ind) {} - + /* template const BlockResult& Contraction::get() const { @@ -869,15 +870,15 @@ namespace MultiArrayTools } return mRes; } - + */ // forward loop !!!! template - template + template inline T Contraction::get(const ET& pos) const { - return mOp.template get(pos); + return mOp.template get(pos); } - + /* template std::vector Contraction::block(const IndexInfo* blockIndex, bool init) const { @@ -892,7 +893,7 @@ namespace MultiArrayTools { return *this; } - + */ template auto Contraction::rootSteps(std::intptr_t iPtrNum) const -> decltype(mOp.rootSteps(iPtrNum)) diff --git a/src/pack_num.h b/src/pack_num.h index 4cb5f5a..303537a 100644 --- a/src/pack_num.h +++ b/src/pack_num.h @@ -14,6 +14,13 @@ namespace MultiArrayHelper { + template