Fix direct access for sparse blocks.

libeigen/eigen!2202
This commit is contained in:
Antonio Sánchez
2026-02-23 20:00:52 +00:00
committed by Rasmus Munk Larsen
parent d537b51ede
commit f3f2c676b5
2 changed files with 42 additions and 0 deletions

View File

@@ -68,6 +68,32 @@ class BlockImpl<XprType, BlockRows, BlockCols, true, Sparse>
Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
inline const Scalar* valuePtr() const { return m_matrix.valuePtr(); }
inline Scalar* valuePtr() { return m_matrix.valuePtr(); }
inline const StorageIndex* innerIndexPtr() const { return m_matrix.innerIndexPtr(); }
inline StorageIndex* innerIndexPtr() { return m_matrix.innerIndexPtr(); }
inline const StorageIndex* outerIndexPtr() const {
const StorageIndex* p = m_matrix.outerIndexPtr();
return p ? p + m_outerStart : 0;
}
inline StorageIndex* outerIndexPtr() {
StorageIndex* p = m_matrix.outerIndexPtr();
return p ? p + m_outerStart : 0;
}
inline const StorageIndex* innerNonZeroPtr() const {
const StorageIndex* p = m_matrix.innerNonZeroPtr();
return p ? p + m_outerStart : 0;
}
inline StorageIndex* innerNonZeroPtr() {
StorageIndex* p = m_matrix.innerNonZeroPtr();
return p ? p + m_outerStart : 0;
}
bool isCompressed() const { return m_matrix.innerNonZeroPtr() == 0; }
protected:
typename internal::ref_selector<XprType>::non_const_type m_matrix;
Index m_outerStart;

View File

@@ -279,6 +279,22 @@ void sparse_block(const SparseMatrixType& ref) {
++block_iterator;
++matrix_iterator;
}
// Test direct access methods
if (m2.isCompressed()) {
VERIFY(v.isCompressed());
VERIFY_IS_EQUAL(v.innerNonZeroPtr(), (const StorageIndex*)0);
} else {
VERIFY(!v.isCompressed());
if (SparseMatrixType::IsRowMajor) {
VERIFY_IS_EQUAL(v.innerNonZeroPtr(), m2.innerNonZeroPtr() + j0);
} else {
VERIFY_IS_EQUAL(v.innerNonZeroPtr(), m2.innerNonZeroPtr() + j0);
}
}
VERIFY_IS_EQUAL(v.valuePtr(), m2.valuePtr());
VERIFY_IS_EQUAL(v.innerIndexPtr(), m2.innerIndexPtr());
VERIFY_IS_EQUAL(v.outerIndexPtr(), m2.outerIndexPtr() + j0);
}
}