mju_compressSparse(): add option to compress away small elements.

PiperOrigin-RevId: 726010576
Change-Id: Ib6458037a5cf9a9d82abb364b7dda7aab2f36807
This commit is contained in:
Yuval Tassa
2025-02-12 05:07:18 -08:00
committed by Copybara-Service
parent faed1a1137
commit e39a5df06a
4 changed files with 62 additions and 14 deletions
+35
View File
@@ -300,6 +300,41 @@ TEST_F(EngineUtilSparseTest, MjuTransposeNullMatrix) {
EXPECT_THAT(rowadrT, ElementsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
}
TEST_F(EngineUtilSparseTest, MjuCompressSparse) {
// sparse matrix (uncompressed with spurious values between the rows):
// [[1, 0, 2]
// [0, O, 3] (second zero represented)
mjtNum mat[] = {1, 2, 9, 0, 3}; // spurious 9 value
int colind[] = {0, 2, -1, 1, 2}; // spurious -1 index
int rownnz[] = {2, 2};
int rowadr[] = {0, 3};
mjtNum dense_expected[] = {1, 0, 2, 0, 0, 3};
mjtNum dense[6];
mju_sparse2dense(dense, mat, 2, 3, rownnz, rowadr, colind);
EXPECT_EQ(AsVector(dense, 6), AsVector(dense_expected, 6));
// check that spurious values are removed
int nnz = mju_compressSparse(mat, 2, 3, rownnz, rowadr, colind,
/*minval=*/-1);
EXPECT_EQ(nnz, 4);
mju_sparse2dense(dense, mat, 2, 3, rownnz, rowadr, colind);
EXPECT_EQ(AsVector(dense, 6), AsVector(dense_expected, 6));
// check that represented zero gets compressed aways with minval=0
nnz = mju_compressSparse(mat, 2, 3, rownnz, rowadr, colind, /*minval=*/0);
EXPECT_EQ(nnz, 3);
mju_sparse2dense(dense, mat, 2, 3, rownnz, rowadr, colind);
EXPECT_EQ(AsVector(dense, 6), AsVector(dense_expected, 6));
// check that 1 gets compressed aways with minval=1
nnz = mju_compressSparse(mat, 2, 3, rownnz, rowadr, colind, /*minval=*/1);
EXPECT_EQ(nnz, 2);
mju_sparse2dense(dense, mat, 2, 3, rownnz, rowadr, colind);
mjtNum dense_expected_minval1[] = {0, 0, 2, 0, 0, 3};
EXPECT_EQ(AsVector(dense, 6), AsVector(dense_expected_minval1, 6));
}
static constexpr char modelStr[] = R"(<mujoco/>)";
TEST_F(EngineUtilSparseTest, MjuSqrMatTDSparse1) {