Add mju_addToSymSparse

- Internal engine function to add a symmetric sparse matrix to a dense matrix.
- Also minor refactors to related functions.

PiperOrigin-RevId: 757954336
Change-Id: I8d8a48bcbbd5d6c618ae097a87df2bc1e6f5ef1d
This commit is contained in:
Yuval Tassa
2025-05-12 16:18:51 -07:00
committed by Copybara-Service
parent 755564a348
commit 436b5a8e1f
7 changed files with 109 additions and 19 deletions
+34
View File
@@ -1036,6 +1036,40 @@ TEST_F(EngineUtilSparseTest, MjuMulMatTVec) {
EXPECT_THAT(AsVector(res, 3), ElementsAre(5, 28, 24));
}
TEST_F(EngineUtilSparseTest, MjuAddToSymSparse) {
// 1 2 4
// M = 2 3 0
// 4 0 5
// only lower triangle represented
mjtNum mat[] = {1, 2, 3, 4, 5};
int colind[] = {0, 0, 1, 0, 2};
int rownnz[] = {1, 2, 2};
int rowadr[] = {0, 1, 3};
// 0 0 0
// A = 5 4 2
// 4 3 2
mjtNum A[] = {0, 0, 0,
5, 4, 2,
4, 3, 2};
mju_addToSymSparse(A, mat, 3, rownnz, rowadr, colind, /*flg_upper=*/1);
EXPECT_THAT(AsVector(A, 9), ElementsAre(1, 2, 4,
7, 7, 2,
8, 3, 7));
// same as A
mjtNum B[] = {0, 0, 0,
5, 4, 2,
4, 3, 2};
mju_addToSymSparse(B, mat, 3, rownnz, rowadr, colind, /*flg_upper=*/0);
EXPECT_THAT(AsVector(B, 9), ElementsAre(1, 0, 0,
7, 7, 2,
8, 3, 7));
}
TEST_F(EngineUtilSparseTest, MjuMulSymVecSparse) {
constexpr int n = 4;
constexpr int nnz = 9;