@@ -32,6 +32,7 @@ static SymmetricBlockMatrix testBlockMatrix(
3232 6, 12, 18, 24, 30, 36).finished());
3333
3434/* ************************************************************************* */
35+ // Read block accessors.
3536TEST (SymmetricBlockMatrix, ReadBlocks)
3637{
3738 // On the diagonal
@@ -51,6 +52,7 @@ TEST(SymmetricBlockMatrix, ReadBlocks)
5152}
5253
5354/* ************************************************************************* */
55+ // Write block setters.
5456TEST (SymmetricBlockMatrix, WriteBlocks)
5557{
5658 // On the diagonal
@@ -77,6 +79,7 @@ TEST(SymmetricBlockMatrix, WriteBlocks)
7779}
7880
7981/* ************************************************************************* */
82+ // Verify block range access.
8083TEST (SymmetricBlockMatrix, Ranges)
8184{
8285 // On the diagonal
@@ -97,6 +100,7 @@ TEST(SymmetricBlockMatrix, Ranges)
97100}
98101
99102/* ************************************************************************* */
103+ // Exercise block expression helpers.
100104TEST (SymmetricBlockMatrix, expressions)
101105{
102106 const std::vector<size_t > dimensions{2 , 3 , 1 };
@@ -151,6 +155,40 @@ TEST(SymmetricBlockMatrix, expressions)
151155}
152156
153157/* ************************************************************************* */
158+ // Update via block mapping.
159+ TEST (SymmetricBlockMatrix, UpdateFromMappedBlocks)
160+ {
161+ const std::vector<size_t > destDims{1 , 3 , 2 };
162+ const std::vector<DenseIndex> mapping{1 , 2 , 0 };
163+
164+ SymmetricBlockMatrix actual (destDims);
165+ actual.setZero ();
166+ actual.updateFromMappedBlocks (testBlockMatrix, mapping);
167+
168+ SymmetricBlockMatrix expected (destDims);
169+ expected.setZero ();
170+ for (DenseIndex i = 0 ; i < testBlockMatrix.nBlocks (); ++i) {
171+ const DenseIndex I = static_cast <DenseIndex>(mapping[i]);
172+ expected.updateDiagonalBlock (I, testBlockMatrix.diagonalBlock (i));
173+ for (DenseIndex j = i + 1 ; j < testBlockMatrix.nBlocks (); ++j) {
174+ const DenseIndex J = static_cast <DenseIndex>(mapping[j]);
175+ expected.setOffDiagonalBlock (I, J,
176+ testBlockMatrix.aboveDiagonalBlock (i, j));
177+ }
178+ }
179+ EXPECT (assert_equal (Matrix (expected.selfadjointView ()),
180+ actual.selfadjointView ()));
181+
182+ SymmetricBlockMatrix doubled (destDims);
183+ doubled.setZero ();
184+ doubled.updateFromMappedBlocks (testBlockMatrix, mapping);
185+ doubled.updateFromMappedBlocks (testBlockMatrix, mapping);
186+ EXPECT (assert_equal (2.0 * Matrix (expected.selfadjointView ()),
187+ Matrix (doubled.selfadjointView ())));
188+ }
189+
190+ /* ************************************************************************* */
191+ // In-place inversion path.
154192TEST (SymmetricBlockMatrix, inverseInPlace) {
155193 // generate an invertible matrix
156194 const Vector3 a (1.0 , 0.2 , 2.0 ), b (0.3 , 0.8 , -1.0 ), c (0.1 , 0.2 , 0.7 );
@@ -171,4 +209,3 @@ TEST(SymmetricBlockMatrix, inverseInPlace) {
171209/* ************************************************************************* */
172210int main () { TestResult tr; return TestRegistry::runAllTests (tr); }
173211/* ************************************************************************* */
174-
0 commit comments