diff --git a/src/block.cc b/src/block.cc index ce5ea44..113c5ba 100644 --- a/src/block.cc +++ b/src/block.cc @@ -22,6 +22,20 @@ namespace MultiArrayHelper } return res; } + + template + BlockBinaryOpSelf::BlockBinaryOpSelf(BlockResult& res) : mRes(res) {} + + template + void BlockBinaryOpSelf::operator()(const BlockClass& arg) + { + static OpFunc f; + assert(mRes.size() == arg.size()); + for(size_t i = 0; i != arg.size(); ++i){ + mRes[i] = f(mRes[i], arg[i]); + } + } + /***************** * BlockBase * @@ -35,7 +49,7 @@ namespace MultiArrayHelper { return mSize; } - + /* template template BlockResult BlockBase::operate(const BlockBase& in) @@ -43,6 +57,7 @@ namespace MultiArrayHelper assert(mSize == in.size()); OpFunction f; BlockResult res(mSize); + CHECK; for(size_t i = 0; i != mSize; ++i){ res[i] = f((*this)[i], in[i]); } @@ -73,7 +88,7 @@ namespace MultiArrayHelper { return operate >(in); } - + */ /************************ * MutableBlockBase * ************************/ @@ -190,6 +205,7 @@ namespace MultiArrayHelper template BlockResult& BlockResult::operator=(const BlockClass& in) { + //CHECK; for(size_t i = 0; i != BlockBase::mSize; ++i){ (*this)[i] = in[i]; } @@ -228,25 +244,33 @@ namespace MultiArrayHelper } template - BlockResult& BlockResult::operator+=(const BlockBase& in) + BlockResult& BlockResult::assing(const T& val) + { + mRes.assing(BB::mSize, val); + return *this; + } + + /* + template + BlockResult& BlockResult::operator+=(const BlockBase& in) { return operateSelf >(in); } template - BlockResult& BlockResult::operator-=(const BlockBase& in) + BlockResult& BlockResult::operator-=(const BlockBase& in) { return operateSelf >(in); } template - BlockResult& BlockResult::operator*=(const BlockBase& in) + BlockResult& BlockResult::operator*=(const BlockBase& in) { return operateSelf >(in); } template - BlockResult& BlockResult::operator/=(const BlockBase& in) + BlockResult& BlockResult::operator/=(const BlockBase& in) { return operateSelf >(in); } @@ -255,14 +279,14 @@ namespace MultiArrayHelper template BlockResult& BlockResult::operateSelf(const BlockBase& in) { - assert(mSize == in.size()); + assert(BB::mSize == in.size()); OpFunction f; //BlockResult res(mSize); - for(size_t i = 0; i != mSize; ++i){ + for(size_t i = 0; i != BB::mSize; ++i){ (*this)[i] = f((*this)[i], in[i]); } return *this; } - + */ } // end namespace MultiArrayHelper diff --git a/src/block.h b/src/block.h index 09e9768..468e6b6 100644 --- a/src/block.h +++ b/src/block.h @@ -29,6 +29,17 @@ namespace MultiArrayHelper BlockResult operator()(const BlockClass1& arg1, const BlockClass2& arg2); }; + template + class BlockBinaryOpSelf + { + public: + BlockBinaryOpSelf(BlockResult& res); + void operator()(const BlockClass& arg); + private: + BlockResult& mRes; + }; + + // EVERYTHING IN HERE MUST N O T BE VITUAL !! template @@ -39,7 +50,7 @@ namespace MultiArrayHelper BlockBase(size_t size); size_t size() const; - + /* template BlockResult operate(const BlockBase& in); @@ -47,7 +58,7 @@ namespace MultiArrayHelper BlockResult operator-(const BlockBase& in); BlockResult operator*(const BlockBase& in); BlockResult operator/(const BlockBase& in); - + */ protected: size_t mSize; }; @@ -116,12 +127,16 @@ namespace MultiArrayHelper class BlockResult : public MutableBlockBase { public: + typedef BlockBase BB; + DEFAULT_MEMBERS(BlockResult); BlockResult(size_t size); template BlockResult& operator=(const BlockClass& in); + + BlockResult& assing(const T& val); BlockType type() const; const T& operator[](size_t pos) const; @@ -129,13 +144,13 @@ namespace MultiArrayHelper BlockResult& set(size_t npos); size_t stepSize() const; - BlockResult& operator+=(const BlockBase& in); - BlockResult& operator-=(const BlockBase& in); - BlockResult& operator*=(const BlockBase& in); - BlockResult& operator/=(const BlockBase& in); + //BlockResult& operator+=(const BlockBase& in); + //BlockResult& operator-=(const BlockBase& in); + //BlockResult& operator*=(const BlockBase& in); + //BlockResult& operator/=(const BlockBase& in); - template - BlockResult& operateSelf(const BlockBase& in); + //template + //BlockResult& operateSelf(const BlockBase& in); protected: std::vector mRes; diff --git a/src/multi_array_operation.cc b/src/multi_array_operation.cc index 3aaefaf..6e12a72 100644 --- a/src/multi_array_operation.cc +++ b/src/multi_array_operation.cc @@ -160,7 +160,7 @@ namespace MultiArrayTools { return Operation,OperationClass,Second>(*mOc, in); } - + /* template template auto OperationTemplate::c(std::shared_ptr& ind) const @@ -168,7 +168,7 @@ namespace MultiArrayTools { return Contraction(*mOc, ind); } - + */ /************************* * OperationMaster * @@ -324,6 +324,7 @@ namespace MultiArrayTools const BlockResult& Operation::get() const { mRes = std::move( PackNum::template unpackArgs(mOps) ); + //CHECK; return mRes; } @@ -347,15 +348,18 @@ namespace MultiArrayTools *********************/ template - Contraction(const Op& op, std::shared_ptr ind) : + Contraction::Contraction(const Op& op, std::shared_ptr ind) : OperationTemplate >(this), mOp(op) {} - const BlockResult& get() const + template + const BlockResult& Contraction::get() const { - // set mRes = 0 !!! - for(*mIndex = 0; mIndex->pos() != mIndex->max(); ++(*mIndex)){ - mRes += mOp.get(); + BlockBinaryOpSelf,BlockResult > f(mRes); + mRes.assign( static_cast(0) ); + for(*mInd = 0; mInd->pos() != mInd->max(); ++(*mInd)){ + //mRes += mOp.get(); + f(mOp.get()); } return mRes; } @@ -364,12 +368,12 @@ namespace MultiArrayTools std::vector Contraction::block(const std::shared_ptr blockIndex) const { std::vector btv; - PackNum::makeBlockTypeVec(btv, mOp, blockIndex); + PackNum<0>::makeBlockTypeVec(btv, std::make_tuple( mOp ), blockIndex); return btv; } template - const Contraction& block() const + const Contraction& Contraction::block() const { return *this; } diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index 6fa7a48..1a9bc39 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -108,11 +108,11 @@ namespace MultiArrayTools template auto operator/(const Second& in) const -> Operation,OperationClass,Second>; - + /* template auto c(std::shared_ptr& ind) const -> Contraction; - + */ private: OperationClass* mOc; }; @@ -226,9 +226,9 @@ namespace MultiArrayTools std::tuple mOps; mutable BlockResult mRes; }; - + template - class Contraction : public OperationTemplate > + class Contraction : public OperationTemplate > { public: diff --git a/src/op_unit_test.cc b/src/op_unit_test.cc index 3085da7..1ca0767 100644 --- a/src/op_unit_test.cc +++ b/src/op_unit_test.cc @@ -198,6 +198,7 @@ namespace { std::cout << "ratio: " << static_cast( end - begin ) / static_cast( end2 - begin2 ) << std::endl; EXPECT_EQ( xround( res.at(mkt(7,9)) ), xround(res2[7*vs1 + 9]) ); + //EXPECT_EQ( xround( res.at(mkt(700,900)) ), xround(res2[700*vs1 + 900]) ); }