Fix stupid sparse bugs with outerSize == 0

This commit is contained in:
Charles Schlosser 2023-01-28 02:03:09 +00:00
parent 0471e61b4c
commit 6987a200bb
2 changed files with 22 additions and 48 deletions

View File

@ -60,12 +60,12 @@ class SparseCompressedBase
/** \returns the number of non zero coefficients */ /** \returns the number of non zero coefficients */
inline Index nonZeros() const inline Index nonZeros() const
{ {
if(Derived::IsVectorAtCompileTime && outerIndexPtr()==0) if (Derived::IsVectorAtCompileTime && outerIndexPtr() == 0)
return derived().nonZeros(); return derived().nonZeros();
else if(isCompressed()) else if (derived().outerSize() == 0)
return outerIndexPtr()[derived().outerSize()]-outerIndexPtr()[0];
else if(derived().outerSize()==0)
return 0; return 0;
else if (isCompressed())
return outerIndexPtr()[derived().outerSize()] - outerIndexPtr()[0];
else else
return innerNonZeros().sum(); return innerNonZeros().sum();
} }

View File

@ -672,31 +672,14 @@ class SparseMatrix
m_innerSize = IsRowMajor ? cols : rows; m_innerSize = IsRowMajor ? cols : rows;
m_data.clear(); m_data.clear();
if (m_innerNonZeros) if ((m_outerIndex == 0) || (m_outerSize != outerSize)) {
{ m_outerIndex = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(m_outerIndex, outerSize + 1, m_outerSize + 1);
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
m_innerNonZeros = 0;
}
if (outerSize == 0)
{
// don't allocate memory if outerSize == 0 !
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_outerIndex, m_outerSize + 1);
m_outerIndex = 0;
m_outerSize = 0;
return;
}
if (m_outerSize != outerSize)
{
if (m_outerIndex == 0)
m_outerIndex = internal::conditional_aligned_new_auto<StorageIndex, true>(outerSize + 1);
else
m_outerIndex = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(m_outerIndex, outerSize + 1,
m_outerSize + 1);
m_outerSize = outerSize; m_outerSize = outerSize;
} }
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
m_innerNonZeros = 0;
std::fill_n(m_outerIndex, m_outerSize + 1, StorageIndex(0)); std::fill_n(m_outerIndex, m_outerSize + 1, StorageIndex(0));
} }
@ -718,7 +701,7 @@ class SparseMatrix
/** Default constructor yielding an empty \c 0 \c x \c 0 matrix */ /** Default constructor yielding an empty \c 0 \c x \c 0 matrix */
inline SparseMatrix() inline SparseMatrix()
: m_outerSize(-1), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
{ {
resize(0, 0); resize(0, 0);
} }
@ -803,10 +786,8 @@ class SparseMatrix
inline void setIdentity() inline void setIdentity()
{ {
eigen_assert(m_outerSize == m_innerSize && "ONLY FOR SQUARED MATRICES"); eigen_assert(m_outerSize == m_innerSize && "ONLY FOR SQUARED MATRICES");
if (m_innerNonZeros) {
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize); internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
m_innerNonZeros = 0; m_innerNonZeros = 0;
}
m_data.resize(m_outerSize); m_data.resize(m_outerSize);
// is it necessary to squeeze? // is it necessary to squeeze?
m_data.squeeze(); m_data.squeeze();
@ -923,12 +904,9 @@ protected:
void initAssignment(const Other& other) void initAssignment(const Other& other)
{ {
resize(other.rows(), other.cols()); resize(other.rows(), other.cols());
if(m_innerNonZeros)
{
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize); internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
m_innerNonZeros = 0; m_innerNonZeros = 0;
} }
}
/** \internal /** \internal
* \sa insert(Index,Index) */ * \sa insert(Index,Index) */
@ -1003,10 +981,8 @@ protected:
if(m_data.size()==0 || overwrite) if(m_data.size()==0 || overwrite)
{ {
if (!isCompressed()) {
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize); internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
m_innerNonZeros = 0; m_innerNonZeros = 0;
}
resizeNonZeros(n); resizeNonZeros(n);
ValueMap valueMap(valuePtr(), n); ValueMap valueMap(valuePtr(), n);
std::iota(m_outerIndex, m_outerIndex + n + 1, StorageIndex(0)); std::iota(m_outerIndex, m_outerIndex + n + 1, StorageIndex(0));
@ -1338,10 +1314,8 @@ void SparseMatrix<Scalar, Options_, StorageIndex_>::collapseDuplicates(DenseBase
} }
m_outerIndex[m_outerSize] = count; m_outerIndex[m_outerSize] = count;
// turn the matrix into compressed form // turn the matrix into compressed form
if (m_innerNonZeros) {
internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize); internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
m_innerNonZeros = 0; m_innerNonZeros = 0;
}
m_data.resize(m_outerIndex[m_outerSize]); m_data.resize(m_outerIndex[m_outerSize]);
} }