add reg last commit (value range) + MetaMap + try to fix the map index link issue (no success)

This commit is contained in:
Christian Zimmermann 2018-09-18 01:44:11 +02:00
parent 143ec78355
commit 6c404a272b
3 changed files with 105 additions and 16 deletions

View file

@ -313,14 +313,24 @@ namespace MultiArrayTools
//VCHECK(mIndPtr->id());
//VCHECK(mIndPtr->max());
}
template <typename T>
inline void printxxx(const T& a) {}
template <>
inline void printxxx(const std::array<int,2>& a)
{
std::cout << "( " << std::get<0>(a) << " , " << std::get<1>(a) << " )" << std::endl;
}
template <class MapF, class IndexPack, class Expr>
inline void OpExpr<MapF,IndexPack,Expr>::operator()(size_t mlast,
ExtType last) const
{
constexpr size_t NEXT = Op::SIZE;
const ExtType npos = last;
const size_t pos = mIndPtr->posAt( mOp.get( npos ) );
const ExtType nxpos = last;
const size_t pos = mIndPtr->posAt( mOp.get( nxpos ) );
const ExtType npos = last + mExt*pos;
const size_t mnpos = PosForward<ForType::DEFAULT>::valuex(mlast, mStep, pos);
mExpr(mnpos, Getter<NEXT>::template getX<ExtType>( npos ) );
}
@ -330,8 +340,9 @@ namespace MultiArrayTools
{
const ExtType last;
constexpr size_t NEXT = Op::SIZE;
const ExtType npos = last;
const size_t pos = mIndPtr->posAt( mOp.get( npos ) );
const ExtType nxpos = last;
const size_t pos = mIndPtr->posAt( mOp.get( nxpos ) );
const ExtType npos = last + mExt*pos;
const size_t mnpos = PosForward<ForType::DEFAULT>::valuex(mlast, mStep, pos);
mExpr(mnpos, Getter<NEXT>::template getX<ExtType>( npos ));
}
@ -341,6 +352,7 @@ namespace MultiArrayTools
-> ExtType
{
return mOp.rootSteps(iPtrNum).extend( mExpr.rootSteps(iPtrNum) );
//return mExpr.rootSteps(iPtrNum).extend( mOp.rootSteps(iPtrNum) );
}

View file

@ -104,6 +104,81 @@ namespace MultiArrayTools
std::shared_ptr<RangeBase> create();
};
template <typename U>
class MetaMap
{
private:
std::map<U,size_t> mMap;
public:
MetaMap() = default;
MetaMap(const MetaMap& in) = default;
MetaMap(MetaMap&& in) = default;
MetaMap& operator=(const MetaMap& in) = default;
MetaMap& operator=(MetaMap&& in) = default;
//MetaMap(const std::map<U,size_t>& in) : mMap(in) {}
MetaMap(const std::vector<U>& in)
{
for(size_t i = 0; i != in.size(); ++i){
mMap[in[i]] = i;
}
}
size_t at(const U& in) const { return mMap.at(in); }
};
template <>
class MetaMap<std::array<int,2> >
{
private:
std::vector<size_t> mMap;
int min1;
int min2;
int max1;
int max2;
size_t s1;
size_t s2;
public:
typedef std::array<int,2> U;
MetaMap() = default;
MetaMap(const MetaMap& in) = default;
MetaMap(MetaMap&& in) = default;
MetaMap& operator=(const MetaMap& in) = default;
MetaMap& operator=(MetaMap&& in) = default;
MetaMap(const std::vector<U>& in) : min1(in[0][0]),
min2(in[0][1]),
max1(in[0][0]),
max2(in[0][1])
{
CHECK;
for(auto& x: in){
if(min1 > x[0]) min1 = x[0];
if(min2 > x[1]) min2 = x[1];
if(max1 < x[0]+1) max1 = x[0]+1;
if(max2 < x[1]+1) max2 = x[1]+1;
}
s1 = max1 - min1;
s2 = max2 - min2;
mMap.resize(s1*s2,-1);
for(size_t i = 0; i != in.size(); ++i){
const size_t mpos = (in[i][0] - min1) * s2 + (in[i][1] - min2);
mMap[ mpos ] = i;
}
}
size_t at(const U& in) const
{
//CHECK;
const size_t mpos = (in[0] - min1) * s2 + (in[1] - min2);
assert(mpos < mMap.size());
assert(mMap[ mpos ] != static_cast<size_t>( -1 ) );
return mMap[ mpos ];
}
};
template <typename U, SpaceType TYPE>
class SingleRange : public RangeInterface<SingleIndex<U,TYPE> >
@ -144,7 +219,8 @@ namespace MultiArrayTools
SingleRange(const std::vector<U>& space);
std::vector<U> mSpace;
std::map<U,size_t> mMSpace;
//std::map<U,size_t> mMSpace;
MetaMap<U> mMSpace;
};
}
@ -363,12 +439,13 @@ namespace MultiArrayTools
********************/
template <typename U, SpaceType TYPE>
SingleRange<U,TYPE>::SingleRange(const std::vector<U>& space) : RangeInterface<SingleIndex<U,TYPE> >(),
mSpace(space)
SingleRange<U,TYPE>::SingleRange(const std::vector<U>& space) :
RangeInterface<SingleIndex<U,TYPE> >(),
mSpace(space), mMSpace(mSpace)
{
for(size_t i = 0; i != mSpace.size(); ++i){
mMSpace[mSpace[i]] = i;
}
//for(size_t i = 0; i != mSpace.size(); ++i){
// mMSpace[mSpace[i]] = i;
//}
}
template <typename U, SpaceType TYPE>

View file

@ -73,11 +73,11 @@ namespace MultiArrayTools
void print(size_t offset);
template <class Expr>
auto ifor(Expr ex) const
auto ifor(size_t step, Expr ex) const
-> For<ValueIndex<U>,Expr>;
template <class Expr>
auto iforh(Expr ex) const
auto iforh(size_t step, Expr ex) const
-> For<ValueIndex<U>,Expr,ForType::HIDDEN>;
private:
@ -287,20 +287,20 @@ namespace MultiArrayTools
template <typename U>
template <class Expr>
auto ValueIndex<U>::ifor(Expr ex) const
auto ValueIndex<U>::ifor(size_t step, Expr ex) const
-> For<ValueIndex<U>,Expr>
{
//static const size_t LAYER = typename Expr::LAYER;
return For<ValueIndex<U>,Expr>(this, ex);
return For<ValueIndex<U>,Expr>(this, step, ex);
}
template <typename U>
template <class Expr>
auto ValueIndex<U>::iforh(Expr ex) const
auto ValueIndex<U>::iforh(size_t step, Expr ex) const
-> For<ValueIndex<U>,Expr,ForType::HIDDEN>
{
//static const size_t LAYER = typename Expr::LAYER;
return For<ValueIndex<U>,Expr,ForType::HIDDEN>(this, ex);
return For<ValueIndex<U>,Expr,ForType::HIDDEN>(this, step, ex);
}