tests and fix bugs regarding prange

This commit is contained in:
Christian Zimmermann 2023-10-22 01:33:54 +02:00
parent cf0e7c5856
commit eb5276c967
15 changed files with 125 additions and 40 deletions

View file

@ -47,7 +47,7 @@ namespace CNORXZ
CIndex& at(const SizeT& metaPos);
COpRoot<SizeT,CIndex> xpr(const Sptr<CIndex>& _this) const;
RangePtr prange(const CIndex& end) const;
RangePtr prange(const CIndex& last) const;
SizeT deepFormat() const;
/*

View file

@ -480,12 +480,12 @@ namespace CNORXZ
}
template <class FormatT, class... Indices>
RangePtr GMIndex<FormatT,Indices...>::prange(const MIndex<Indices...>& end) const
RangePtr GMIndex<FormatT,Indices...>::prange(const MIndex<Indices...>& last) const
{
return iter<0,NI>
( [&](auto i) {
typedef typename std::remove_reference<decltype(*mIPack[i])>::type::RangeType RangeT;
return std::dynamic_pointer_cast<RangeT>( mIPack[i]->prange( *end.pack()[i] ) );
return std::dynamic_pointer_cast<RangeT>( mIPack[i]->prange( *last.pack()[i] ) );
},
[](const auto&... e) { return mrange(e...); }
);

View file

@ -81,7 +81,7 @@ namespace CNORXZ
const SPack<Indices...>& pack() const;
const auto& format() const;
const auto& lexFormat() const;
RangePtr prange(const MIndex<Indices...>& end) const;
RangePtr prange(const MIndex<Indices...>& last) const;
auto deepFormat() const;
GMIndex& setFormat(const FormatT& bs);

View file

@ -13,9 +13,13 @@ namespace CNORXZ
template <class IndexT>
PIndex<IndexT>::PIndex(const RangePtr& range, SizeT pos) :
IndexInterface<PIndex<IndexT>,typename IndexT::MetaType>(pos),
mRangePtr(rangeCast<RangeType>(range)),
mOrig(std::make_shared<IndexT>(mRangePtr->orig(),mRangePtr->parts()[pos]))
{}
mRangePtr(rangeCast<RangeType>(range))//,
//mOrig(std::make_shared<IndexT>(mRangePtr->orig(),mRangePtr->parts()[pos]))
{
auto o = mRangePtr->orig();
auto p = mRangePtr->parts()[pos];
mOrig = std::make_shared<IndexT>(o,p);
}
template <class IndexT>
PIndex<IndexT>& PIndex<IndexT>::operator=(SizeT lexpos)
@ -124,14 +128,14 @@ namespace CNORXZ
}
template <class IndexT>
RangePtr PIndex<IndexT>::prange(const PIndex<IndexT>& end) const
RangePtr PIndex<IndexT>::prange(const PIndex<IndexT>& last) const
{
CXZ_ASSERT(end > *this, "got end index position smaller than begin index position");
CXZ_ASSERT(last > *this, "got last index position smaller than begin index position");
auto oi = *orig();
auto oend = *end.orig();
auto olast = *last.orig();
const SizeT beginPos = oi.lex();
Vector<SizeT> parts(oend.lex()-beginPos);
for(auto i = oi; i != oend; ++i){
Vector<SizeT> parts(olast.lex()-beginPos+1);
for(auto i = oi; i != olast+1; ++i){
parts[i.lex()-beginPos] = i.lex();
}
return CNORXZ::prange(mRangePtr->orig(), parts);
@ -280,7 +284,7 @@ namespace CNORXZ
template <class RangeT>
SizeT PRange<RangeT>::size() const
{
return mParts.size();
return mParts.size()-1;
}
template <class RangeT>
@ -345,7 +349,10 @@ namespace CNORXZ
template <class RangeT>
PRange<RangeT>::PRange(const Sptr<RangeT>& range, const Vector<SizeT>& _parts) :
mRange(range), mParts(_parts)
{}
{
const auto max = std::max_element( mParts.begin(), mParts.end() );
mParts.push_back( *max );
}
template <class RangeT>
Vector<Uuid> PRange<RangeT>::key() const

View file

@ -41,7 +41,7 @@ namespace CNORXZ
template <SizeT I>
UPos stepSize(const IndexId<I>& id) const;
RangePtr prange(const PIndex<IndexT>& end) const;
RangePtr prange(const PIndex<IndexT>& last) const;
decltype(auto) deepFormat() const;
String stringMeta() const;

View file

@ -143,12 +143,12 @@ namespace CNORXZ
}
template <typename MetaT, SizeT S>
RangePtr SIndex<MetaT,S>::prange(const SIndex<MetaType,S>& end) const
RangePtr SIndex<MetaT,S>::prange(const SIndex<MetaType,S>& last) const
{
CXZ_ASSERT(end > *this, "got end index position smaller than begin index position");
CXZ_ASSERT(last > *this, "got last index position smaller than begin index position");
const SizeT beginPos = lex();
Vector<SizeT> parts(end.lex()-beginPos);
for(auto i = *this; i != end; ++i){
Vector<SizeT> parts(last.lex()-beginPos+1);
for(auto i = *this; i != last+1; ++i){
parts[i.lex()-beginPos] = i.lex();
}
return CNORXZ::prange(mRangePtr, parts);

View file

@ -48,7 +48,7 @@ namespace CNORXZ
SIndex& at(const MetaT& metaPos);
decltype(auto) xpr(const Sptr<SIndex<MetaType,S>>& _this) const;
RangePtr prange(const SIndex<MetaType,S>& end) const;
RangePtr prange(const SIndex<MetaType,S>& last) const;
SizeT deepFormat() const;
/*
template <class Index>

View file

@ -128,12 +128,12 @@ namespace CNORXZ
}
template <typename MetaT>
RangePtr UIndex<MetaT>::prange(const UIndex<MetaT>& end) const
RangePtr UIndex<MetaT>::prange(const UIndex<MetaT>& last) const
{
CXZ_ASSERT(end > *this, "got end index position smaller than begin index position");
CXZ_ASSERT(last > *this, "got last index position smaller than begin index position");
const SizeT beginPos = lex();
Vector<SizeT> parts(end.lex()-beginPos);
for(auto i = *this; i != end; ++i){
Vector<SizeT> parts(last.lex()-beginPos+1);
for(auto i = *this; i != last+1; ++i){
parts[i.lex()-beginPos] = i.lex();
}
return CNORXZ::prange(mRangePtr, parts);

View file

@ -55,7 +55,7 @@ namespace CNORXZ
UIndex& at(const MetaT& metaPos);
decltype(auto) xpr(const Sptr<UIndex<MetaType>>& _this) const;
RangePtr prange(const UIndex<MetaType>& end) const;
RangePtr prange(const UIndex<MetaType>& last) const;
SizeT deepFormat() const;
/*

View file

@ -128,9 +128,9 @@ namespace CNORXZ
}
template <class Index, typename Meta>
RangePtr XIndex<Index,Meta>::prange(const XIndexPtr& end) const
RangePtr XIndex<Index,Meta>::prange(const XIndexPtr& last) const
{
return mI->prange( *std::dynamic_pointer_cast<Index>(end) );
return mI->prange( std::dynamic_pointer_cast<XIndex<Index,Meta>>(last)->get() );
}
template <class Index, typename Meta>

View file

@ -38,7 +38,7 @@ namespace CNORXZ
virtual SizeT dim() const = 0;
virtual RangePtr range() const = 0;
virtual UPos stepSize(const IndexId<0>& id) const = 0;
virtual RangePtr prange(const XIndexPtr& end) const = 0;
virtual RangePtr prange(const XIndexPtr& last) const = 0;
virtual Vector<SizeT> deepFormat() const = 0;
//virtual Vector<XIndexPtr> pack() const = 0;
//virtual Vector<SizeT> format() const = 0;
@ -93,7 +93,7 @@ namespace CNORXZ
virtual SizeT dim() const override final;
virtual RangePtr range() const override final;
virtual UPos stepSize(const IndexId<0>& id) const override final;
virtual RangePtr prange(const XIndexPtr& end) const override final;
virtual RangePtr prange(const XIndexPtr& last) const override final;
virtual Vector<SizeT> deepFormat() const override final;
//virtual Vector<XIndexPtr> pack() const override final;
//virtual Vector<SizeT> format() const override final;

View file

@ -66,7 +66,7 @@ namespace CNORXZ
YIndex& operator()();
const DPack& pack() const;
RangePtr prange(const YIndex& end) const;
RangePtr prange(const YIndex& last) const;
Vector<SizeT> deepFormat() const;
const YFormat& format() const;
const YFormat& lexFormat() const;

View file

@ -117,12 +117,13 @@ namespace CNORXZ
return coproot(m.data(), _this);
}
RangePtr CIndex::prange(const CIndex& end) const
RangePtr CIndex::prange(const CIndex& last) const
{
CXZ_ASSERT(end > *this, "got end index position smaller than begin index position");
CXZ_ASSERT(last > *this, "got last index position (" << last.lex()
<< ") smaller than begin index position (" << lex() << ")");
const SizeT beginPos = lex();
Vector<SizeT> parts(end.lex() - beginPos);
for(auto i = *this; i != end; ++i){
Vector<SizeT> parts(last.lex() - beginPos + 1);
for(auto i = *this; i != last+1; ++i){
parts[i.lex()-beginPos] = i.lex();
}
return CNORXZ::prange(mRangePtr, parts);

View file

@ -368,13 +368,13 @@ namespace CNORXZ
return mIs;
}
RangePtr YIndex::prange(const YIndex& end) const
RangePtr YIndex::prange(const YIndex& last) const
{
CXZ_ASSERT(dim() == end.dim(), "end index has different number of dimensions ("
<< end.dim() << ") than begin index (" << dim() << ")");
CXZ_ASSERT(dim() == last.dim(), "end index has different number of dimensions ("
<< last.dim() << ") than begin index (" << dim() << ")");
Vector<RangePtr> v(dim());
for(SizeT i = 0; i != dim(); ++i){
v[i] = mIs[i]->prange( end.pack()[i] );
v[i] = mIs[i]->prange( last.pack()[i] );
}
return YRangeFactory(v).create();
}

View file

@ -120,9 +120,32 @@ namespace
for(auto x: *crx){
EXPECT_EQ(x, cnt2++);
}
}
TEST_F(CR_Test, prange)
{
auto crx = std::dynamic_pointer_cast<CRange>(cr);
auto beg = crx->begin();
auto end = crx->end();
const SizeT begPos = 1;
const SizeT endPos = mSize-2;
const SizeT pSize = endPos - begPos;
beg += begPos;
end -= mSize-endPos+1;
auto pr = beg.prange(end);
auto prx = std::dynamic_pointer_cast<PRange<CRange>>(pr);
EXPECT_EQ(pr->size(), pSize);
EXPECT_EQ(prx->size(), pSize);
for(auto i = prx->begin(); i != prx->end(); ++i){
EXPECT_EQ(*i, i.lex()+begPos);
}
EXPECT_EQ(prx->orig(),cr);
}
TEST_F(UR_Test, Basics)
{
auto urx = std::dynamic_pointer_cast<URange<String>>(ur);
@ -155,6 +178,29 @@ namespace
}
}
TEST_F(UR_Test, prange)
{
auto urx = std::dynamic_pointer_cast<URange<String>>(ur);
auto beg = urx->begin();
auto end = urx->end();
const SizeT begPos = 1;
const SizeT endPos = mMeta.size() - 2;
const SizeT pSize = endPos - begPos;
beg += begPos;
end -= mMeta.size() - endPos + 1;
auto pr = beg.prange(end);
auto prx = std::dynamic_pointer_cast<PRange<URange<String>>>(pr);
EXPECT_EQ(pr->size(), pSize);
EXPECT_EQ(prx->size(), pSize);
for(auto i = prx->begin(); i != prx->end(); ++i){
EXPECT_EQ(*i, mMeta[i.lex()+begPos]);
}
EXPECT_EQ(prx->orig(),ur);
}
TEST_F(MR_Test, Basics2d)
{
auto mrx = std::dynamic_pointer_cast<MRange<CRange,URange<String>>>(mr);
@ -437,7 +483,38 @@ namespace
}
}
}
TEST_F(YR_Test, prange)
{
auto yrx = std::dynamic_pointer_cast<YRange>(yr);
auto beg = yrx->begin();
auto last = yrx->end();
const SizeT begI = 1;
const SizeT lastI = mSize - 2 - 1;
const SizeT begJ = 1;
const SizeT lastJ = mMeta.size() - 1;
const SizeT begPos = begI * mMeta.size() + begJ;
const SizeT lastPos = lastI * mMeta.size() + lastJ;
const SizeT pSize = (lastI-begI+1)*(lastJ-begJ+1);
beg += begPos;
last = lastPos;
auto pr = beg.prange(last);
auto prx = std::dynamic_pointer_cast<YRange>(pr);
EXPECT_EQ(pr->size(), pSize);
EXPECT_EQ(prx->size(), pSize);
const SizeT mmsize = lastJ-begJ+1;
auto mkm = [&](SizeT i) {
return Vector<DType>({DType(i/mmsize+begI),DType(mMeta[i % mmsize+begJ])}); };
for(auto i = prx->begin(); i != prx->end(); ++i){
EXPECT_TRUE(*i == mkm(i.lex()));
}
}
// RCast_Test
}