diff --git a/src/include/high_level_operation.cc.h b/src/include/high_level_operation.cc.h index 0e5ab54..9a1878d 100644 --- a/src/include/high_level_operation.cc.h +++ b/src/include/high_level_operation.cc.h @@ -69,7 +69,7 @@ namespace MultiArrayTools } template - const ROP* HighLevelOpRoot::get() const + ROP* HighLevelOpRoot::get() { return &mOp; } @@ -100,6 +100,7 @@ namespace MultiArrayTools auto op = *dop.op.data()->mOp; typedef decltype(op) OP; res.appendOuter(dop); + assert(dop.op.init()); Create::template cx::template ccx::template cccx (res, in, inds..., op, ops..., dop, dops...); } @@ -137,6 +138,7 @@ namespace MultiArrayTools auto op = *dop.op.data()->mOp; res.appendOuter(dop); res.op = mkDynOutOp(mkFOp(op,ops...), inds...); + assert(dop.op.init()); res.appendOuterM(dop.op,dops.op...); } else { @@ -160,7 +162,7 @@ namespace MultiArrayTools } template - const ROP* HighLevelOp::get() const + ROP* HighLevelOp::get() { assert(0); return nullptr; @@ -174,6 +176,8 @@ namespace MultiArrayTools typename B::template RetT res; Create::template cx::template ccx::template cccx (res,mIn,inds...); + // assert(res.op.init()); + //assert(res.outer.init()); return res; } @@ -195,7 +199,7 @@ namespace MultiArrayTools } template - auto HighLevelOpHolder::get() const + auto HighLevelOpHolder::get() -> decltype(mOp->get()) { return mOp->get(); @@ -255,7 +259,7 @@ namespace MultiArrayTools const std::shared_ptr&... is) { const size_t dim = di->dim(); - if(dim >= 2){ + if(dim > 2){ auto ci1 = di->getP(dim-2)->reduced(); auto ci2 = di->getP(dim-1)->reduced(); //auto ci1 = std::dynamic_pointer_cast>(di->getP(dim-2)); @@ -268,9 +272,9 @@ namespace MultiArrayTools this->assign(in, mi, ci1, ci2); } else { - assert(dim == 1); + assert(dim == 2 or dim == 1); //auto ci1 = std::dynamic_pointer_cast>(di->getP(dim-2)); - auto ci1 = di->getP(dim-2)->reduced(); + auto ci1 = di->getP(dim-1)->reduced(); assert(ci1 != nullptr); auto odi = mkSubSpaceX(di, dim-1); auto mi = mkMIndex(is..., odi); @@ -303,12 +307,25 @@ namespace MultiArrayTools { //VCHECK(printInd(inds...)); auto xx = mkArrayPtr(nullr()); - auto& opr = *mOp->get(); + ROP& opr = *mOp->get(); + if(in.root()){ + auto inx = in; + opr.par() = *inx.get(); + return *this; + } auto loop = mkPILoop ( [&opr,&in,&xx,&inds...,this](){ auto inx = in; auto dop = inx.create(inds...); - auto gexp = mkDynOp1(mkMOp(dop.outer,dop.op)); + DynamicO gexp; + //VCHECK(dop.outer.init()); + //VCHECK(dop.op.init()); + if(dop.outer.init()){ + gexp = mkDynOp1(mkMOp(dop.outer,dop.op)); + } + else { + gexp = mkDynOp1(mkMOp(dop.op)); + } auto xloop = mkILoop(std::make_tuple(*dop.op.data()->mOp), std::make_tuple(inds...), std::make_tuple(xx), @@ -327,12 +344,23 @@ namespace MultiArrayTools const std::shared_ptr&... inds) { auto xx = mkArrayPtr(nullr()); - auto& opr = *mOp->get(); + ROP& opr = *mOp->get(); + if(in.root()){ + auto inx = in; + opr.par() += *inx.get(); + return *this; + } auto loop = mkPILoop ( [&opr,&in,&xx,&inds...,this](){ auto inx = in; auto dop = inx.create(inds...); - auto gexp = mkDynOp1(mkMOp(dop.outer,dop.op)); + DynamicO gexp; + if(dop.outer.init()){ + gexp = mkDynOp1(mkMOp(dop.outer,dop.op)); + } + else { + gexp = mkDynOp1(mkMOp(dop.op)); + } auto xloop = mkILoop(std::make_tuple(*dop.op.data()->mOp), std::make_tuple(inds...), std::make_tuple(xx), diff --git a/src/include/high_level_operation.h b/src/include/high_level_operation.h index 2ea1629..31198bd 100644 --- a/src/include/high_level_operation.h +++ b/src/include/high_level_operation.h @@ -53,7 +53,7 @@ namespace MultiArrayTools #undef reg_ind2 #undef reg_ind3 - virtual const ROP* get() const = 0; + virtual ROP* get() = 0; }; @@ -85,7 +85,7 @@ namespace MultiArrayTools #include "hl_reg_ind.h" - virtual const ROP* get() const override final; + virtual ROP* get() override final; }; @@ -116,7 +116,7 @@ namespace MultiArrayTools virtual bool root() const override final; - virtual const ROP* get() const override final; + virtual ROP* get() override final; #include "hl_reg_ind.h" @@ -147,7 +147,7 @@ namespace MultiArrayTools auto create(const std::shared_ptr&... inds) const -> decltype(mOp->create(inds...)); - auto get() const -> decltype(mOp->get()); + auto get() -> decltype(mOp->get()); std::shared_ptr> op() const; HighLevelOpHolder operator*(const HighLevelOpHolder& in) const; diff --git a/src/include/ranges/dynamic_range.cc.h b/src/include/ranges/dynamic_range.cc.h index 97ca41e..de305cd 100644 --- a/src/include/ranges/dynamic_range.cc.h +++ b/src/include/ranges/dynamic_range.cc.h @@ -99,7 +99,10 @@ namespace MultiArrayTools template DynamicExpression DynamicIndex::ifor(size_t step, Expr ex) const { - if(mIVec.size() == 1){ + if(mIVec.size() == 0){ + return ex; + } + else if(mIVec.size() == 1){ return mIVec.back().first->ifor(step,ex); } else { @@ -112,7 +115,10 @@ namespace MultiArrayTools template DynamicExpression DynamicIndex::iforh(size_t step, Expr ex) const { - if(mIVec.size() == 1){ + if(mIVec.size() == 0){ + return ex; + } + else if(mIVec.size() == 1){ return mIVec.back().first->iforh(step,ex); } else { diff --git a/src/lib/ranges/dynamic_range.cc b/src/lib/ranges/dynamic_range.cc index d0d9407..b8c846b 100644 --- a/src/lib/ranges/dynamic_range.cc +++ b/src/lib/ranges/dynamic_range.cc @@ -79,12 +79,14 @@ namespace MultiArrayTools IndexInterface(range, 0), mIVec(range->dim()) { - size_t xx = 1; - for(size_t i = mIVec.size()-1; i != 0; --i){ - mIVec[i].second = xx; - xx *= range->sub(i)->size(); + if(mIVec.size() > 0){ + size_t xx = 1; + for(size_t i = mIVec.size()-1; i != 0; --i){ + mIVec[i].second = xx; + xx *= range->sub(i)->size(); + } + mIVec[0].second = xx; } - mIVec[0].second = xx; }