From ee7b994021cf816b1eb68850d1f993a1b8e9ac29 Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Mon, 14 Oct 2024 09:06:14 -0700 Subject: [PATCH] Remove Newton Cholesky factor from mjData arena, rollback of b66da3d3691cdf6759782f943a1618233d03af08. PiperOrigin-RevId: 685726867 Change-Id: Ic2afd0dd35e38f403164d2cbe4618286abfa51ab --- doc/includes/references.h | 8 ------ include/mujoco/mjdata.h | 8 ------ include/mujoco/mjxmacro.h | 10 ------- introspect/structs.py | 40 ---------------------------- python/mujoco/bindings_test.py | 6 ++--- python/mujoco/structs.cc | 14 ---------- src/engine/engine_core_constraint.c | 2 +- src/engine/engine_io.c | 1 - src/engine/engine_print.c | 7 ----- unity/Runtime/Bindings/MjBindings.cs | 6 ----- 10 files changed, 4 insertions(+), 98 deletions(-) diff --git a/doc/includes/references.h b/doc/includes/references.h index f36ebfd0..86fa0e80 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -170,7 +170,6 @@ struct mjData_ { int nl; // number of limit constraints int nefc; // number of constraints int nnzJ; // number of non-zeros in constraint Jacobian - int nnzL; // number of non-zeros in Newton Cholesky factor int nisland; // number of detected constraint islands // global properties @@ -392,13 +391,6 @@ struct mjData_ { int* efc_AR_colind; // column indices in sparse AR (nefc x nefc) mjtNum* efc_AR; // J*inv(M)*J' + R (nefc x nefc) - // computed by mj_fwdConstraint (Newton solver) - int* L_rownnz; // number of non-zeros in Hessian factor L rows (nv x 1) - int* L_rowadr; // row start address in colind array (nv x 1) - int* L_colind; // column indices in sparse AR (nnzL x 1) - mjtNum* L; // chol(M + J'*diag(efc_D)*J) (nnzL x 1) - mjtNum* Lcone; // L with cone contributions (nnzL x 1) - //-------------------- arena-allocated: POSITION, VELOCITY dependent // computed by mj_fwdVelocity/mj_referenceConstraint diff --git a/include/mujoco/mjdata.h b/include/mujoco/mjdata.h index 54b3ae5f..3a863f13 100644 --- a/include/mujoco/mjdata.h +++ b/include/mujoco/mjdata.h @@ -198,7 +198,6 @@ struct mjData_ { int nl; // number of limit constraints int nefc; // number of constraints int nnzJ; // number of non-zeros in constraint Jacobian - int nnzL; // number of non-zeros in Newton Cholesky factor int nisland; // number of detected constraint islands // global properties @@ -420,13 +419,6 @@ struct mjData_ { int* efc_AR_colind; // column indices in sparse AR (nefc x nefc) mjtNum* efc_AR; // J*inv(M)*J' + R (nefc x nefc) - // computed by mj_fwdConstraint (Newton solver) - int* L_rownnz; // number of non-zeros in Hessian factor L rows (nv x 1) - int* L_rowadr; // row start address in colind array (nv x 1) - int* L_colind; // column indices in sparse AR (nnzL x 1) - mjtNum* L; // chol(M + J'*diag(efc_D)*J) (nnzL x 1) - mjtNum* Lcone; // L with cone contributions (nnzL x 1) - //-------------------- arena-allocated: POSITION, VELOCITY dependent // computed by mj_fwdVelocity/mj_referenceConstraint diff --git a/include/mujoco/mjxmacro.h b/include/mujoco/mjxmacro.h index c999b855..038c6a6c 100644 --- a/include/mujoco/mjxmacro.h +++ b/include/mujoco/mjxmacro.h @@ -707,14 +707,6 @@ X( mjtNum, efc_force, MJ_D(nefc), 1 ) \ X( int, efc_state, MJ_D(nefc), 1 ) -// array fields of mjData that are used in the dual problem -#define MJDATA_ARENA_POINTERS_NEWTON \ - X( int, L_rownnz, MJ_M(nv), 1 ) \ - X( int, L_rowadr, MJ_M(nv), 1 ) \ - X( int, L_colind, MJ_D(nnzL), 1 ) \ - X( mjtNum, L, MJ_D(nnzL), 1 ) \ - X( mjtNum, Lcone, MJ_D(nnzL), 1 ) - // array fields of mjData that are used in the dual problem #define MJDATA_ARENA_POINTERS_DUAL \ X( int, efc_AR_rownnz, MJ_D(nefc), 1 ) \ @@ -738,7 +730,6 @@ #define MJDATA_ARENA_POINTERS \ MJDATA_ARENA_POINTERS_CONTACT \ MJDATA_ARENA_POINTERS_SOLVER \ - MJDATA_ARENA_POINTERS_NEWTON \ MJDATA_ARENA_POINTERS_DUAL \ MJDATA_ARENA_POINTERS_ISLAND @@ -762,7 +753,6 @@ X( int, nl ) \ X( int, nefc ) \ X( int, nnzJ ) \ - X( int, nnzL ) \ X( int, nisland ) \ X( mjtNum, time ) \ X( uintptr_t, threadpool ) diff --git a/introspect/structs.py b/introspect/structs.py index c4076a03..22e745c5 100644 --- a/introspect/structs.py +++ b/introspect/structs.py @@ -4326,11 +4326,6 @@ STRUCTS: Mapping[str, StructDecl] = dict([ type=ValueType(name='int'), doc='number of non-zeros in constraint Jacobian', ), - StructFieldDecl( - name='nnzL', - type=ValueType(name='int'), - doc='number of non-zeros in Newton Cholesky factor', - ), StructFieldDecl( name='nisland', type=ValueType(name='int'), @@ -5287,41 +5282,6 @@ STRUCTS: Mapping[str, StructDecl] = dict([ ), doc="J*inv(M)*J' + R (nefc x nefc)", # pylint: disable=line-too-long ), - StructFieldDecl( - name='L_rownnz', - type=PointerType( - inner_type=ValueType(name='int'), - ), - doc='number of non-zeros in Hessian factor L rows (nv x 1)', # pylint: disable=line-too-long - ), - StructFieldDecl( - name='L_rowadr', - type=PointerType( - inner_type=ValueType(name='int'), - ), - doc='row start address in colind array (nv x 1)', # pylint: disable=line-too-long - ), - StructFieldDecl( - name='L_colind', - type=PointerType( - inner_type=ValueType(name='int'), - ), - doc='column indices in sparse AR (nnzL x 1)', # pylint: disable=line-too-long - ), - StructFieldDecl( - name='L', - type=PointerType( - inner_type=ValueType(name='mjtNum'), - ), - doc="chol(M + J'*diag(efc_D)*J) (nnzL x 1)", # pylint: disable=line-too-long - ), - StructFieldDecl( - name='Lcone', - type=PointerType( - inner_type=ValueType(name='mjtNum'), - ), - doc='L with cone contributions (nnzL x 1)', # pylint: disable=line-too-long - ), StructFieldDecl( name='efc_vel', type=PointerType( diff --git a/python/mujoco/bindings_test.py b/python/mujoco/bindings_test.py index ae032df4..edf9218a 100644 --- a/python/mujoco/bindings_test.py +++ b/python/mujoco/bindings_test.py @@ -1362,7 +1362,7 @@ Euler integrator, semi-implicit in velocity. def test_pickle_mjdata_clean(self): data2 = pickle.loads(pickle.dumps(self.data)) - attr_to_compare = ('time', 'qpos', 'qvel', 'mocap_pos', 'L') + attr_to_compare = ('time', 'qpos', 'qvel', 'mocap_pos') self._assert_attributes_equal(data2, self.data, attr_to_compare) def test_pickle_mjdata(self): @@ -1370,7 +1370,7 @@ Euler integrator, semi-implicit in velocity. data2 = pickle.loads(pickle.dumps(self.data)) attr_to_compare = ( 'time', 'qpos', 'qvel', 'qacc', 'xpos', 'mocap_pos', - 'warning', 'energy', 'contact', 'efc_J', 'L' + 'warning', 'energy', 'contact', 'efc_J' ) self._assert_attributes_equal(data2, self.data, attr_to_compare) for _ in range(10): @@ -1384,7 +1384,7 @@ Euler integrator, semi-implicit in velocity. data2 = pickle.loads(pickle.dumps(self.data)) attr_to_compare = ( 'time', 'qpos', 'qvel', 'qacc', 'xpos', 'mocap_pos', - 'warning', 'energy', 'contact', 'efc_J', 'L' + 'warning', 'energy', 'contact', 'efc_J' ) self._assert_attributes_equal(data2, self.data, attr_to_compare) for _ in range(10): diff --git a/python/mujoco/structs.cc b/python/mujoco/structs.cc index ff4a9f4d..0c97081e 100644 --- a/python/mujoco/structs.cc +++ b/python/mujoco/structs.cc @@ -748,7 +748,6 @@ void MjDataWrapper::Serialize(std::ostream& output) const { X(ne); X(nf); X(nnzJ); - X(nnzL); X(nefc); X(nisland); X(time); @@ -764,9 +763,6 @@ void MjDataWrapper::Serialize(std::ostream& output) const { MJDATA_POINTERS #undef X - bool is_sparse_newton = this->model_->get()->opt.solver == mjSOL_NEWTON && - mj_isSparse(this->model_->get()); - #undef MJ_M #define MJ_M(x) this->model_->get()->x #undef MJ_D @@ -779,9 +775,6 @@ void MjDataWrapper::Serialize(std::ostream& output) const { MJDATA_ARENA_POINTERS_CONTACT MJDATA_ARENA_POINTERS_SOLVER - if (is_sparse_newton) { - MJDATA_ARENA_POINTERS_NEWTON - } if (mj_isDual(this->model_->get())) { MJDATA_ARENA_POINTERS_DUAL } @@ -811,8 +804,6 @@ MjDataWrapper MjDataWrapper::Deserialize(std::istream& input) { bool is_dual = mj_isDual(&m); - bool is_sparse_newton = m.opt.solver == mjSOL_NEWTON && mj_isSparse(&m); - raw::MjData* d = mj_makeData(&m); if (!d) { throw py::value_error("Failed to create mjData."); @@ -834,7 +825,6 @@ MjDataWrapper MjDataWrapper::Deserialize(std::istream& input) { X(ne); X(nf); X(nnzJ); - X(nnzL); X(nefc); X(nisland); X(time); @@ -873,9 +863,6 @@ MjDataWrapper MjDataWrapper::Deserialize(std::istream& input) { MJDATA_ARENA_POINTERS_CONTACT MJDATA_ARENA_POINTERS_SOLVER - if (is_sparse_newton) { - MJDATA_ARENA_POINTERS_NEWTON - } if (is_dual) { MJDATA_ARENA_POINTERS_DUAL } @@ -2035,7 +2022,6 @@ This is useful for example when the MJB is not available as a file on disk.)")); }); MJDATA_ARENA_POINTERS_SOLVER - MJDATA_ARENA_POINTERS_NEWTON MJDATA_ARENA_POINTERS_DUAL MJDATA_ARENA_POINTERS_ISLAND diff --git a/src/engine/engine_core_constraint.c b/src/engine/engine_core_constraint.c index 8c775d1d..87bba06e 100644 --- a/src/engine/engine_core_constraint.c +++ b/src/engine/engine_core_constraint.c @@ -1917,7 +1917,7 @@ static int mj_nc(const mjModel* m, mjData* d, int* nnz) { // driver: call all functions above void mj_makeConstraint(const mjModel* m, mjData* d) { // clear sizes - d->ne = d->nf = d->nl = d->nefc = d->nnzJ = d->nnzL = 0; + d->ne = d->nf = d->nl = d->nefc = d->nnzJ = 0; // disabled or Jacobian not allocated: return if (mjDISABLED(mjDSBL_CONSTRAINT)) { diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index a91cd260..c66eeee6 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -1802,7 +1802,6 @@ static void _resetData(const mjModel* m, mjData* d, unsigned char debug_value) { d->nl = 0; d->nefc = 0; d->nnzJ = 0; - d->nnzL = 0; d->nisland = 0; // clear global properties diff --git a/src/engine/engine_print.c b/src/engine/engine_print.c index fb1cc962..626ced94 100644 --- a/src/engine/engine_print.c +++ b/src/engine/engine_print.c @@ -1180,13 +1180,6 @@ void mj_printFormattedData(const mjModel* m, mjData* d, const char* filename, printSparse("EFC_J", d->efc_J, d->nefc, d->efc_J_rownnz, d->efc_J_rowadr, d->efc_J_colind, fp, float_format); - if (d->nnzL) { - // L sparse structure - printSparsity("L: Newton reverse Cholesky factor", m->nv, m->nv, - d->L_rowadr, d->L_rownnz, d->L_colind, fp); - printSparse("L", d->L, m->nv, d->L_rownnz, d->L_rowadr, d->L_colind, fp, float_format); - } - printArrayInt("EFC_AR_ROWNNZ", d->nefc, 1, d->efc_AR_rownnz, fp); printArrayInt("EFC_AR_ROWADR", d->nefc, 1, d->efc_AR_rowadr, fp); printSparse("EFC_AR", d->efc_AR, d->nefc, d->efc_AR_rownnz, diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index b3eefdbf..23771e67 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -4847,7 +4847,6 @@ public unsafe struct mjData_ { public int nl; public int nefc; public int nnzJ; - public int nnzL; public int nisland; public double time; public fixed double energy[2]; @@ -4985,11 +4984,6 @@ public unsafe struct mjData_ { public int* efc_AR_rowadr; public int* efc_AR_colind; public double* efc_AR; - public int* L_rownnz; - public int* L_rowadr; - public int* L_colind; - public double* L; - public double* Lcone; public double* efc_vel; public double* efc_aref; public double* efc_b;