Rejigged solver statistics in preparation for islanding.
- See public description below. - Stopped incrementing the iteration count in saveStats(). - `sizeof(mjSolverStat) == 40`, so this ends up costing 160KB, up from 40KB. BEGIN_PUBLIC Changed the size of `mjData.solver`, the structure used to collect solver diagnostic information. The array is now of length `mjNISLAND * mjNSOLVER`, where each row of length `mjNSOLVER` contains separate solver statistics for each constraint island. Until solver islanding is implemented, only row 0 is used. - The new constant `mjNISLAND` is set to 20. - `mjNSOLVER` is reduced from 1000 to 200. - Added `mjData.solver_nisland`, the number of islands for which the solver ran. - `mjData.solver_niter` (renamed from mjData.solver_iter) and `mjData.solver_nnz` are now integer vectors of length `mjNISLAND`. END_PUBLIC PiperOrigin-RevId: 565030093 Change-Id: I773e918805c6ced79f0dab5f19ea23956760c8c5
This commit is contained in:
committed by
Copybara-Service
parent
8faf47dd16
commit
86d8b912f4
+25
-16
@@ -837,24 +837,33 @@ void mj_printFormattedData(const mjModel* m, mjData* d, const char* filename,
|
||||
}
|
||||
|
||||
// SOLVER STAT
|
||||
if (d->solver_iter) {
|
||||
if (d->nefc) {
|
||||
fprintf(fp, "SOLVER STAT\n");
|
||||
fprintf(fp, " solver_iter = %d\n", d->solver_iter);
|
||||
fprintf(fp, " solver_nnz = %d\n", d->solver_nnz);
|
||||
for (int i=0; i < mjMIN(mjNSOLVER, d->solver_iter); i++) {
|
||||
fprintf(fp, " %d: improvement = ", i);
|
||||
fprintf(fp, float_format, d->solver[i].improvement);
|
||||
fprintf(fp, " gradient = ");
|
||||
fprintf(fp, float_format, d->solver[i].gradient);
|
||||
fprintf(fp, " lineslope = ");
|
||||
fprintf(fp, float_format, d->solver[i].lineslope);
|
||||
fprintf(fp, "\n");
|
||||
fprintf(fp, " nactive = %d nchange = %d neval = %d nupdate = %d\n",
|
||||
d->solver[i].nactive, d->solver[i].nchange,
|
||||
d->solver[i].neval, d->solver[i].nupdate);
|
||||
fprintf(fp, " solver_nisland = %d\n", d->solver_nisland);
|
||||
printVector(" solver_fwdinv = ", d->solver_fwdinv, 2, fp, float_format);
|
||||
int nisland_stat = mjMIN(d->solver_nisland, mjNISLAND);
|
||||
for (int island=0; island < nisland_stat; island++) {
|
||||
int niter_stat = mjMIN(mjNSOLVER, d->solver_niter[island]);
|
||||
if (niter_stat) {
|
||||
fprintf(fp, " ISLAND %d\n", island);
|
||||
fprintf(fp, " solver_niter = %d\n", d->solver_niter[island]);
|
||||
fprintf(fp, " solver_nnz = %d\n", d->solver_nnz[island]);
|
||||
for (int i=0; i < niter_stat; i++) {
|
||||
mjSolverStat* stat = d->solver + island*mjNSOLVER + i;
|
||||
fprintf(fp, " %d: improvement = ", i);
|
||||
fprintf(fp, float_format, stat->improvement);
|
||||
fprintf(fp, " gradient = ");
|
||||
fprintf(fp, float_format, stat->gradient);
|
||||
fprintf(fp, " lineslope = ");
|
||||
fprintf(fp, float_format, stat->lineslope);
|
||||
fprintf(fp, "\n");
|
||||
fprintf(fp, " nactive = %d nchange = %d neval = %d nupdate = %d\n",
|
||||
stat->nactive, stat->nchange,
|
||||
stat->neval, stat->nupdate);
|
||||
}
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
}
|
||||
printVector("solver_fwdinv = ", d->solver_fwdinv, 2, fp, float_format);
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
|
||||
printVector("ENERGY = ", d->energy, 2, fp, float_format);
|
||||
|
||||
Reference in New Issue
Block a user