WIP: index format test + fixes...
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed

This commit is contained in:
Christian Zimmermann 2023-12-28 00:25:44 +01:00
parent bf83c26a12
commit c72fbc329d
5 changed files with 66 additions and 8 deletions

View file

@ -39,6 +39,13 @@ namespace CNORXZ
return DXpr<R>( bufxpr([&](auto x){ return mI->ifor( DXpr<None>( assignxpr(x, xpr) ), NoF {} ); }) ); return DXpr<R>( bufxpr([&](auto x){ return mI->ifor( DXpr<None>( assignxpr(x, xpr) ), NoF {} ); }) );
} }
} }
template <class I>
I indexAs(const DIndex& i)
{
static_assert(is_index<I>::value, "expected index type");
return std::dynamic_pointer_cast<XIndex<I,typename I::MetaType>>( i.xptr() )->get();
}
} }
#endif #endif

View file

@ -84,6 +84,9 @@ namespace CNORXZ
template <> template <>
struct has_sub<DIndex> struct has_sub<DIndex>
{ static constexpr bool value = true; }; { static constexpr bool value = true; };
template <class I>
I indexAs(const DIndex& i);
} }
#endif #endif

View file

@ -30,8 +30,8 @@ namespace CNORXZ
template <class FormatT> template <class FormatT>
constexpr MFormat<N>::MFormat(const FormatT& f) constexpr MFormat<N>::MFormat(const FormatT& f)
{ {
static_assert(f.size() == N, "try to assign format of wrong dimension"); CXZ_ASSERT(f.size() == N, "try to assign format of wrong dimension");
iter<0,N>( [&](auto i) { mB[i] = f[i]; }, NoF{} ); iter<0,N>( [&](auto i) { mB[i] = f[i].val(); }, NoF{} );
} }
template <SizeT N> template <SizeT N>

View file

@ -187,6 +187,9 @@ namespace CNORXZ
mLMax(mkLMax(mIPack)), mLMax(mkLMax(mIPack)),
mPMax(mkPMax(mIPack,mFormat)) mPMax(mkPMax(mIPack,mFormat))
{ {
if constexpr(not std::is_same<None,FormatT>::value){
mFormat = mLexFormat;
}
mkPos(); mkPos();
} }
@ -213,6 +216,9 @@ namespace CNORXZ
mLMax(mkLMax(mIPack)), mLMax(mkLMax(mIPack)),
mPMax(mkPMax(mIPack,mFormat)) mPMax(mkPMax(mIPack,mFormat))
{ {
if constexpr(not std::is_same<None,FormatT>::value){
mFormat = mLexFormat;
}
mkPos(); mkPos();
} }
@ -240,6 +246,9 @@ namespace CNORXZ
mLMax(mkLMax(mIPack)), mLMax(mkLMax(mIPack)),
mPMax(mkPMax(mIPack,mFormat)) mPMax(mkPMax(mIPack,mFormat))
{ {
if constexpr(not std::is_same<None,FormatT>::value){
mFormat = mLexFormat;
}
*this = lexpos; *this = lexpos;
} }
@ -364,7 +373,7 @@ namespace CNORXZ
template <class FormatT, class... Indices> template <class FormatT, class... Indices>
constexpr decltype(auto) GMIndex<FormatT,Indices...>::lmax() const constexpr decltype(auto) GMIndex<FormatT,Indices...>::lmax() const
{ {
return mPMax; return mLMax;
} }
template <class FormatT, class... Indices> template <class FormatT, class... Indices>
@ -554,7 +563,13 @@ namespace CNORXZ
SizeT j = 0; SizeT j = 0;
SizeT j0 = 0; SizeT j0 = 0;
typename FormatT::InputType nformat; typename FormatT::InputType nformat;
auto npack = iter<0,NI>( [&](auto i) { auto mkFv = [&]() {
Vector<SizeT> o(NI);
SizeT i = 0;
for(const auto& y:mFormat.all()) { o[i++] = y.val(); }
return o;
};
iter<0,NI>( [&](auto i) {
SizeT si = 1; SizeT si = 1;
if(mIPack[i]->lmax().val() != 1){ if(mIPack[i]->lmax().val() != 1){
// CHECK!!! // CHECK!!!
@ -563,7 +578,9 @@ namespace CNORXZ
CXZ_ASSERT(j < f.size(), "incompatible index formats"); CXZ_ASSERT(j < f.size(), "incompatible index formats");
} }
CXZ_ASSERT(si == mIPack[i]->lmax().val(), CXZ_ASSERT(si == mIPack[i]->lmax().val(),
"incompatible index formats: " << toString(s) << " vs " /*!!!*/); "incompatible index formats: " << toString(f) << " vs "
<< toString(mkFv()) << " ( " << si << " != "
<< mIPack[i]->lmax().val() << " ) ");
Vector<SizeT> nf(j-j0); Vector<SizeT> nf(j-j0);
Vector<SizeT> ns(j-j0); Vector<SizeT> ns(j-j0);
std::copy(f.begin()+j0,f.begin()+j,nf.begin()); std::copy(f.begin()+j0,f.begin()+j,nf.begin());

View file

@ -28,19 +28,24 @@ namespace
auto mr105 = mrange(ur3x,ur7x,cr5x); auto mr105 = mrange(ur3x,ur7x,cr5x);
auto cr11 = CRangeFactory(11).create(); auto cr11 = CRangeFactory(11).create();
auto cr13 = CRangeFactory(13).create(); auto cr13 = CRangeFactory(13).create();
auto cr17 = CRangeFactory(17).create();
mRange = yrange({cr11,mr105,cr13,sr2}); mRange = yrange({cr11,mr105,cr13,sr2});
mRange2 = yrange({cr11,mr105,cr13,cr17,sr2});
} }
Vector<String> mMeta7; Vector<String> mMeta7;
RangePtr mRange; RangePtr mRange;
RangePtr mRange2;
}; };
TEST_F(Format_Test, RangeCheck) TEST_F(Format_Test, RangeCheck)
{ {
EXPECT_EQ(mRange->size(), 2*105*11*13); EXPECT_EQ(mRange->size(), 2*105*11*13);
EXPECT_EQ(mRange2->size(), 2*105*11*13*17);
auto yi = mRange->begin(); auto yi = mRange->begin();
EXPECT_EQ(yi.lmax().val(), mRange->size()); EXPECT_EQ(yi.lmax().val(), mRange->size());
EXPECT_EQ(yi.pmax().val(), mRange->size()); EXPECT_EQ(yi.pmax().val(), mRange->size());
EXPECT_EQ(mRange->dim(), 4u);
} }
TEST_F(Format_Test, CFormat) TEST_F(Format_Test, CFormat)
@ -48,9 +53,35 @@ namespace
CIndex ci(mRange); CIndex ci(mRange);
EXPECT_EQ(ci.lmax().val(), mRange->size()); EXPECT_EQ(ci.lmax().val(), mRange->size());
auto yi = mRange->begin(); auto yi = mRange->begin();
auto rfi = ci.reformat( yi.deepFormat(), yi.deepMax() ); auto yi2 = mRange2->begin();
ci.reformat( yi.deepFormat(), yi.deepMax() );
VCHECK(toString(yi.deepFormat())); VCHECK(toString(yi.deepFormat()));
VCHECK(toString(yi.deepMax())); VCHECK(toString(yi.deepMax()));
EXPECT_EQ(rfi.lmax().val(), mRange->size()); VCHECK(toString(yi2.deepFormat()));
VCHECK(toString(yi2.deepMax()));
EXPECT_EQ(ci.lmax().val(), mRange->size());
}
TEST_F(Format_Test, XFormat)
{
GMIndex<MFormat<4>,CIndex,CIndex,CIndex,CIndex> mi(mRange);
MIndex<CIndex,CIndex,CIndex,CIndex,CIndex> mi2(mRange2);
EXPECT_EQ(mi.lmax().val(), mRange->size());
EXPECT_EQ(mi2.lmax().val(), mRange2->size());
auto yi = indexAs<YIndex>( mRange->begin() );
mi.reformat( yi.deepFormat(), yi.deepMax() );
EXPECT_EQ(mi.lmax().val(), mRange->size());
VCHECK(toString(mi.deepFormat()));
VCHECK(toString(mi.deepMax()));
VCHECK(toString(mi2.deepFormat()));
VCHECK(toString(mi2.deepMax()));
yi.setFormat( YFormat( Vector<SizeT>{ mi2.format()[CSizeT<0>{}].val(), mi2.format()[CSizeT<1>{}].val(), mi2.format()[CSizeT<2>{}].val(), mi2.format()[CSizeT<4>{}].val() } ) );
VCHECK(toString(yi.deepFormat()));
mi.reformat( yi.deepFormat(), yi.deepMax() );
VCHECK(toString(mi.deepFormat()));
VCHECK(toString(mi.deepMax()));
} }
} }