YRange: bug fix in deepFormat + add setFormat + array: bug fix in check format
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed

This commit is contained in:
Christian Zimmermann 2023-12-11 02:20:02 +01:00
parent fb8a44e88b
commit 642381ecc0
3 changed files with 42 additions and 1 deletions

View file

@ -206,6 +206,10 @@ namespace CNORXZ
CXZ_ASSERT(f1[i1] >= f2[i2], "obtained format " << toString(f1) CXZ_ASSERT(f1[i1] >= f2[i2], "obtained format " << toString(f1)
<< ", which is incompatible to target format " << toString(f2)); << ", which is incompatible to target format " << toString(f2));
} }
else {
++i1;
++i2;
}
} }
} }

View file

@ -76,6 +76,7 @@ namespace CNORXZ
const DPack& pack() const; const DPack& pack() const;
RangePtr prange(const YIndex& last) const; RangePtr prange(const YIndex& last) const;
Vector<SizeT> deepFormat() const; Vector<SizeT> deepFormat() const;
YIndex& setFormat(const Vector<SizeT>& f, const Vector<SizeT>& s);
const YFormat& format() const; const YFormat& format() const;
const YFormat& lexFormat() const; const YFormat& lexFormat() const;
YIndex& setFormat(const YFormat& bs); YIndex& setFormat(const YFormat& bs);

View file

@ -383,6 +383,8 @@ namespace CNORXZ
SizeT osize = 0; SizeT osize = 0;
for(SizeT j = 0; j != dfv.size(); ++j){ for(SizeT j = 0; j != dfv.size(); ++j){
dfv[j] = mIs[j]->deepFormat(); dfv[j] = mIs[j]->deepFormat();
std::for_each(dfv[j].begin(), dfv[j].end(),
[&](SizeT& x) { x *= mFormat[j].val(); } );
osize += dfv[j].size(); osize += dfv[j].size();
} }
Vector<SizeT> o(osize); Vector<SizeT> o(osize);
@ -390,10 +392,44 @@ namespace CNORXZ
for(SizeT j = 0; j != dfv.size(); ++j){ for(SizeT j = 0; j != dfv.size(); ++j){
std::copy(dfv[j].begin(), dfv[j].end(), o.begin()+off); std::copy(dfv[j].begin(), dfv[j].end(), o.begin()+off);
off += dfv[j].size(); off += dfv[j].size();
} }
return o; return o;
} }
YIndex& YIndex::setFormat(const Vector<SizeT>& f, const Vector<SizeT>& s)
{
CXZ_ASSERT(f.size() == s.size(), "input error: f.size() != s.size()");
// f: input format
// s: input sizes
SizeT j = 0;
SizeT j0 = 0;
Vector<UPos> nformat(dim());
for(SizeT i = 0; i != dim(); ++i){
SizeT si = 1;
if(mIs[i]->lmax().val() == 1){
continue;
}
for(; si < mIs[i]->lmax().val(); ++j){
si *= s[i];
CXZ_ASSERT(j < f.size(), "incompatible index formats");
}
CXZ_ASSERT(si == mIs[i]->lmax().val(),
"incompatible index formats: " << toString(s) << " vs " //!!!
);
Vector<SizeT> nf(j-j0);
Vector<SizeT> ns(j-j0);
std::copy(f.begin()+j0,f.begin()+j,nf.begin());
nformat[i] = *std::min_element(nf.begin(), nf.end());
std::for_each(nf.begin(), nf.end(), [&](SizeT& x)
{ CXZ_ASSERT(x % mFormat[i].val() == 0, "incompatible"); x /= nformat[i].val(); } );
std::copy(s.begin()+j0,s.begin()+j,ns.begin());
CXZ_ERROR("implement for all indices!!!");
//mIs[i]->setFormat(nf,ns);
}
mFormat = nformat;
return *this;
}
bool YIndex::formatIsTrivial() const bool YIndex::formatIsTrivial() const
{ {
for(SizeT i = 0; i != mIs.size(); ++i){ for(SizeT i = 0; i != mIs.size(); ++i){