more tests on index multiplication + corresponding fixes

This commit is contained in:
Christian Zimmermann 2022-12-04 17:35:22 +01:00
parent 38e011c979
commit 9210f59d39
3 changed files with 23 additions and 15 deletions

View file

@ -16,7 +16,8 @@ namespace CNORXZ
Isq<Is...> is) Isq<Is...> is)
{ {
static_assert(sizeof...(Is) == sizeof...(Indices), "inconsistent index sequence"); static_assert(sizeof...(Is) == sizeof...(Indices), "inconsistent index sequence");
return MIndex<Indices...,I>( std::get<Is>(a.pack())..., b.THIS() ); return MIndex<Indices...,I>( std::get<Is>(a.pack())...,
std::make_shared<I>(b.THIS()) );
} }
template <class BlockT, class... Indices, class I, typename Meta, SizeT... Js> template <class BlockT, class... Indices, class I, typename Meta, SizeT... Js>
@ -25,7 +26,8 @@ namespace CNORXZ
Isq<Js...> js) Isq<Js...> js)
{ {
static_assert(sizeof...(Js) == sizeof...(Indices), "inconsistent index sequence"); static_assert(sizeof...(Js) == sizeof...(Indices), "inconsistent index sequence");
return MIndex<Indices...,I>( a.THIS(), std::get<Js>(b.pack())... ); return MIndex<Indices...,I>( std::make_shared<I>(a.THIS()),
std::get<Js>(b.pack())... );
} }
template <class BlockT1, class... Indices1, class BlockT2, class... Indices2, template <class BlockT1, class... Indices1, class BlockT2, class... Indices2,
@ -83,20 +85,24 @@ namespace CNORXZ
const IndexInterface<I2,Meta2>& b) const IndexInterface<I2,Meta2>& b)
{ {
// special operations for DIndex / YIndex // special operations for DIndex / YIndex
if constexpr(index_dim<I1>::value == 1){ constexpr SizeT I1D = index_dim<I1>::value;
if constexpr(index_dim<I2>::value == 1){ constexpr SizeT I2D = index_dim<I2>::value;
if constexpr(I1D == 1){
if constexpr(I2D == 1){
return MIndex<I1,I2>(a.THIS(),b.THIS()); return MIndex<I1,I2>(a.THIS(),b.THIS());
} }
else { else {
return MIndexMul::evalXM(a, b.THIS()); return MIndexMul::evalXM(a, b.THIS(), std::make_index_sequence<I2D>{});
} }
} }
else { else {
if constexpr(index_dim<I2>::value == 1){ if constexpr(I2D == 1){
return MIndexMul::evalMX(a.THIS(), b); return MIndexMul::evalMX(a.THIS(), b, std::make_index_sequence<I1D>{});
} }
else { else {
return MIndexMul::evalMM(a.THIS(), b.THIS()); return MIndexMul::evalMM(a.THIS(), b.THIS(),
std::make_index_sequence<I1D>{},
std::make_index_sequence<I2D>{});
} }
} }
} }

View file

@ -46,9 +46,6 @@ namespace CNORXZ
GMIndex& operator+=(Int n); GMIndex& operator+=(Int n);
GMIndex& operator-=(Int n); GMIndex& operator-=(Int n);
template <class Index, typename Meta>
constexpr decltype(auto) operator*(const IndexInterface<Index,Meta>& a) const;
SizeT lex() const; SizeT lex() const;
constexpr decltype(auto) pmax() const; constexpr decltype(auto) pmax() const;
constexpr decltype(auto) lmax() const; constexpr decltype(auto) lmax() const;

View file

@ -412,18 +412,23 @@ namespace
TEST_F(YR_Test, IndexMultiplication) TEST_F(YR_Test, IndexMultiplication)
{ {
const SizeT ssize = mMeta.size(); const SizeT s1 = mMeta.size();
const SizeT s2 = mSize;
auto crx = std::dynamic_pointer_cast<CRange>(cr); auto crx = std::dynamic_pointer_cast<CRange>(cr);
auto urx = std::dynamic_pointer_cast<URange<String>>(ur); auto urx = std::dynamic_pointer_cast<URange<String>>(ur);
for(auto cix = crx->begin(); cix != crx->end(); ++cix){ for(auto cix = crx->begin(); cix != crx->end(); ++cix){
for(auto uix = urx->begin(); uix != urx->end(); ++uix){ for(auto uix = urx->begin(); uix != urx->end(); ++uix){
const SizeT p = cix.lex()*ssize + uix.lex(); const SizeT p1 = cix.lex()*s1 + uix.lex();
EXPECT_EQ((cix*uix).lex(), p); EXPECT_EQ((cix*uix).lex(), p1);
for(auto ci2x = crx->begin(); ci2x != crx->end(); ++ci2x){
const SizeT p2 = cix.lex()*s1*s2 + uix.lex()*s2 + ci2x.lex();
EXPECT_EQ((cix*uix*ci2x).lex(), p2);
}
} }
} }
for(auto ci = cr->begin(); ci != cr->end(); ++ci){ for(auto ci = cr->begin(); ci != cr->end(); ++ci){
for(auto ui = ur->begin(); ui != ur->end(); ++ui){ for(auto ui = ur->begin(); ui != ur->end(); ++ui){
const SizeT p = ci.lex()*ssize + ui.lex(); const SizeT p = ci.lex()*s1 + ui.lex();
EXPECT_EQ((ci*ui).lex(), p); EXPECT_EQ((ci*ui).lex(), p);
} }
} }