Move mju_cholFactorCount to engine_util_solve.
PiperOrigin-RevId: 746011856 Change-Id: If9812251420053644f4eca81adb5116d370ee524
This commit is contained in:
committed by
Copybara-Service
parent
3c530976e3
commit
25126e88c7
@@ -795,55 +795,3 @@ void mju_sqrMatTDSparse(mjtNum* res, const mjtNum* mat, const mjtNum* matT,
|
||||
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// precount row non-zeros of reverse-Cholesky factor L, return total non-zeros
|
||||
// based on ldl_symbolic from 'Algorithm 8xx: a concise sparse Cholesky factorization package'
|
||||
// reads pattern from upper triangle
|
||||
int mju_cholFactorCount(int* L_rownnz, const int* rownnz, const int* rowadr, const int* colind,
|
||||
int n, mjData* d) {
|
||||
mj_markStack(d);
|
||||
int* parent = mjSTACKALLOC(d, n, int);
|
||||
int* flag = mjSTACKALLOC(d, n, int);
|
||||
|
||||
// loop over rows in reverse order
|
||||
for (int r = n - 1; r >= 0; r--) {
|
||||
parent[r] = -1;
|
||||
flag[r] = r;
|
||||
L_rownnz[r] = 1; // start with 1 for diagonal
|
||||
|
||||
// loop over non-zero columns of upper triangle
|
||||
int start = rowadr[r];
|
||||
int end = start + rownnz[r];
|
||||
for (int c = start; c < end; c++) {
|
||||
int i = colind[c];
|
||||
|
||||
// skip lower triangle
|
||||
if (i <= r) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// traverse from i to ancestor, stop when row is flagged
|
||||
while (flag[i] != r) {
|
||||
// if not yet set, set parent to current row
|
||||
if (parent[i] == -1) {
|
||||
parent[i] = r;
|
||||
}
|
||||
|
||||
// increment non-zeros, flag row i, advance to parent
|
||||
L_rownnz[i]++;
|
||||
flag[i] = r;
|
||||
i = parent[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mj_freeStack(d);
|
||||
|
||||
// sum up all row non-zeros
|
||||
int nnz = 0;
|
||||
for (int r = 0; r < n; r++) {
|
||||
nnz += L_rownnz[r];
|
||||
}
|
||||
|
||||
return nnz;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user