Remove mjMARKSTACK and mjFREESTACK macros.
PiperOrigin-RevId: 562844184 Change-Id: Id2f57f5d132c47094dad75c6dab7297d7aa73458
This commit is contained in:
committed by
Copybara-Service
parent
329ed193ac
commit
4929077211
@@ -43,39 +43,6 @@ API function can be classified as:
|
||||
Macros
|
||||
^^^^^^
|
||||
|
||||
|
||||
.. _mjMARKSTACK:
|
||||
|
||||
mjMARKSTACK
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
#define mjMARKSTACK int _mark = d->pstack;
|
||||
|
||||
This macro is helpful when using the MuJoCo stack in custom computations. It works together with the next macro and the
|
||||
:ref:`mj_stackAlloc` family of functions, and assumes that mjData\* d is defined. The use pattern is this:
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
mjMARKSTACK;
|
||||
mjtNum* temp = mj_stackAllocNum(d, 100);
|
||||
// ... use temp as needed
|
||||
mjFREESTACK;
|
||||
|
||||
|
||||
.. _mjFREESTACK:
|
||||
|
||||
mjFREESTACK
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
#define mjFREESTACK d->pstack = _mark;
|
||||
|
||||
Reset the MuJoCo stack pointer to the variable \_mark, normally saved by mjMARKSTACK.
|
||||
|
||||
|
||||
.. _mjDISABLED:
|
||||
|
||||
mjDISABLED
|
||||
|
||||
+50
-28
@@ -5,58 +5,80 @@ Changelog
|
||||
Upcoming version (not yet released)
|
||||
-----------------------------------
|
||||
|
||||
General
|
||||
^^^^^^^
|
||||
New features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
.. youtube:: Vc1tq0fFvQA
|
||||
:align: right
|
||||
:width: 240px
|
||||
|
||||
1. Added constraint island discovery in :ref:`mj_island`. Constraint islands are disjoint sets of constraints
|
||||
and degrees-of-freedom that do not interact. In a future release the constraint solver will be refactored to
|
||||
exploit the disjoint structure. Island discovery can be activated using a new :ref:`enable flag<option-flag-island>`
|
||||
which will be removed after the refactor. If island discovery is enabled, geoms, contacts and
|
||||
tendons will be colored according to the corresponding island, see video.
|
||||
|
||||
.. youtube:: QewlEqIZi1o
|
||||
:align: right
|
||||
:width: 240px
|
||||
|
||||
1. Added new signed distance field (SDF) collision primitive. SDFs can take any shape and are not constrained to be
|
||||
2. Added new signed distance field (SDF) collision primitive. SDFs can take any shape and are not constrained to be
|
||||
convex. Collision points are found by minimizing the maximum of the two colliding SDFs via gradient descent.
|
||||
|
||||
- Added new SDF plugin for defining implicit geometries. The plugin must define methods computing an SDF and its
|
||||
gradient at query points See the :ref:`documentation<exWriting>` for more details.
|
||||
|
||||
.. youtube:: Vc1tq0fFvQA
|
||||
:align: right
|
||||
:width: 240px
|
||||
3. Added :ref:`mjThreadPool` and :ref:`mjTask` which allow for multi-threaded operations within MuJoCo engine pipeline.
|
||||
|
||||
#. Added constraint island discovery in :ref:`mj_island`. Constraint islands are disjoint sets of constraints
|
||||
and degrees-of-freedom that do not interact. In a future release the constraint solver will be refactored to
|
||||
exploit the disjoint structure. Island discovery can be activated using a new :ref:`enable flag<option-flag-island>`
|
||||
which will be removed after the refactor. If island discovery is enabled, geoms, contacts and
|
||||
tendons will be colored according to the corresponding island, see video.
|
||||
#. Added a new :ref:`dyntype<actuator-general-dyntype>`, ``filterexact``, which updates first-order filter states with
|
||||
General
|
||||
^^^^^^^
|
||||
|
||||
.. admonition:: Breaking API changes
|
||||
:class: attention
|
||||
|
||||
4. Removed macros ``mjMARKSTACK`` and ``mjFREESTACK``.
|
||||
|
||||
.. admonition:: Migration note
|
||||
:class: note
|
||||
|
||||
These macros have been replaced by new functions :ref:`mj_markStack` and :ref:`mj_freeStack`. These functions
|
||||
manages ``mjData`` stack frames in a fully encapsulated way (i.e. without having to introduce a local variable
|
||||
at the call site).
|
||||
|
||||
5. Changed the function :ref:`mj_stackAlloc` to allocate an arbitrary number of bytes, rather than in multiples of
|
||||
``sizeof(mjtNum)``, and add an additional argument for specifying the alignment of the returned pointer.
|
||||
|
||||
.. admonition:: Migration note
|
||||
:class: note
|
||||
|
||||
The old functionality for allocating ``mjtNum`` arrays is still available through a new function
|
||||
:ref:`mj_stackAllocNum`.
|
||||
|
||||
6. Renamed the ``nstack`` field in :ref:`mjModel` and :ref:`mjData` to ``narena``. Changed ``narena``, ``pstack``,
|
||||
and ``maxuse_stack`` to count number of bytes rather than number of :ref:`mjtNum` |-| s.
|
||||
|
||||
7. Added a new :ref:`dyntype<actuator-general-dyntype>`, ``filterexact``, which updates first-order filter states with
|
||||
the exact formula rather than with Euler integration.
|
||||
#. Added an actuator attribute, :ref:`actearly<actuator-general-actearly>`, which uses semi-implicit integration for
|
||||
8. Added an actuator attribute, :ref:`actearly<actuator-general-actearly>`, which uses semi-implicit integration for
|
||||
actuator forces: using the next step's actuator state to compute the current actuator forces at the current timestep.
|
||||
#. Renamed ``actuatorforcerange`` and ``actuatorforcelimited``, introduced in the previous version to
|
||||
9. Renamed ``actuatorforcerange`` and ``actuatorforcelimited``, introduced in the previous version to
|
||||
:ref:`actuatorfrcrange<body-joint-actuatorfrcrange>` and
|
||||
:ref:`actuatorfrclimited<body-joint-actuatorfrclimited>`, respectively.
|
||||
#. Added the flag :ref:`eulerdamp<option-flag-eulerdamp>`, which disables implicit integration of joint damping in the
|
||||
Euler integrator. See the :ref:`Numerical Integration<geIntegration>` section for more details.
|
||||
#. Added the flag :ref:`invdiscrete<option-flag-invdiscrete>`, which enables discrete-time inverse dynamics for all
|
||||
:ref:`integrators<option-integrator>` other than ``RK4``. See the flag documentation for more details.
|
||||
#. Changed the function :ref:`mj_stackAlloc` to allocate an arbitrary number of bytes, rather than in multiples of
|
||||
``sizeof(mjtNum)``, and add an additional argument for specifying the alignment of the returned pointer. The existing
|
||||
functionality of allocating ``mjtNum`` arrays is still available through the new function :ref:`mj_stackAllocNum`.
|
||||
#. Renamed the ``nstack`` field in :ref:`mjModel` and :ref:`mjData` to ``narena``. Changed ``narena``, ``pstack``, and
|
||||
``maxuse_stack`` to count number of bytes rather than number of :ref:`mjtNum` |-| s.
|
||||
#. Added new functions ``mj_markStack`` and ``mj_freeStack`` that manages ``mjData`` stack frames in a fully
|
||||
encapsulated way (i.e. without having to introduce a local variable at the call site).
|
||||
#. Added :ref:`mjThreadPool` and :ref:`mjTask` which allow for multi-threaded operations within MuJoCo engine pipeline.
|
||||
10. Added the flag :ref:`eulerdamp<option-flag-eulerdamp>`, which disables implicit integration of joint damping in the
|
||||
Euler integrator. See the :ref:`Numerical Integration<geIntegration>` section for more details.
|
||||
11. Added the flag :ref:`invdiscrete<option-flag-invdiscrete>`, which enables discrete-time inverse dynamics for all
|
||||
:ref:`integrators<option-integrator>` other than ``RK4``. See the flag documentation for more details.
|
||||
|
||||
Python bindings
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
10. Fixed `#870 <https://github.com/deepmind/mujoco/issues/870>`__ where calling ``update_scene`` with an invalid
|
||||
12. Fixed `#870 <https://github.com/deepmind/mujoco/issues/870>`__ where calling ``update_scene`` with an invalid
|
||||
camera name used the default camera.
|
||||
|
||||
Bug fixes
|
||||
^^^^^^^^^
|
||||
|
||||
11. Fixed a bug that was causing the geom margins to be ignored during the midphase.
|
||||
13. Fixed a bug that was causing the geom margins to be ignored during the midphase.
|
||||
|
||||
|
||||
Version 2.3.7 (July 20, 2023)
|
||||
|
||||
@@ -2456,7 +2456,7 @@ void mju_addTo3(mjtNum res[3], const mjtNum vec[3]);
|
||||
void mju_subFrom3(mjtNum res[3], const mjtNum vec[3]);
|
||||
void mju_addToScl3(mjtNum res[3], const mjtNum vec[3], mjtNum scl);
|
||||
void mju_addScl3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3], mjtNum scl);
|
||||
mjtNum mju_normalize3(mjtNum res[3]);
|
||||
mjtNum mju_normalize3(mjtNum vec[3]);
|
||||
mjtNum mju_norm3(const mjtNum vec[3]);
|
||||
mjtNum mju_dot3(const mjtNum vec1[3], const mjtNum vec2[3]);
|
||||
mjtNum mju_dist3(const mjtNum pos1[3], const mjtNum pos2[3]);
|
||||
@@ -2466,10 +2466,10 @@ void mju_cross(mjtNum res[3], const mjtNum a[3], const mjtNum b[3]);
|
||||
void mju_zero4(mjtNum res[4]);
|
||||
void mju_unit4(mjtNum res[4]);
|
||||
void mju_copy4(mjtNum res[4], const mjtNum data[4]);
|
||||
mjtNum mju_normalize4(mjtNum res[4]);
|
||||
mjtNum mju_normalize4(mjtNum vec[4]);
|
||||
void mju_zero(mjtNum* res, int n);
|
||||
void mju_fill(mjtNum* res, mjtNum val, int n);
|
||||
void mju_copy(mjtNum* res, const mjtNum* data, int n);
|
||||
void mju_copy(mjtNum* res, const mjtNum* vec, int n);
|
||||
mjtNum mju_sum(const mjtNum* vec, int n);
|
||||
mjtNum mju_L1(const mjtNum* vec, int n);
|
||||
void mju_scl(mjtNum* res, const mjtNum* vec, mjtNum scl, int n);
|
||||
|
||||
@@ -703,21 +703,19 @@ internally when an instability is detected in :ref:`mj_step`, :ref:`mj_step1` an
|
||||
take advantage of the custom stack, this needs to be done in-between MuJoCo calls that have the potential to reset the
|
||||
simulation.
|
||||
|
||||
Below is the general template for using the custom stack in user code. This assumes that ``mjData\* d`` is defined in
|
||||
the scope. If not, saving and restoring the stack pointer should be done manually instead of using the
|
||||
:ref:`mjMARKSTACK` and :ref:`mjFREESTACK` macros.
|
||||
Below is the general template for using the custom stack in user code.
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
// save stack pointer in the "hidden" variable _mark
|
||||
mjMARKSTACK;
|
||||
// mark an mjData stack frame
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate space
|
||||
mjtNum* myqpos = mj_stackAllocNum(d, m->nq);
|
||||
mjtNum* myqvel = mj_stackAllocNum(d, m->nv);
|
||||
|
||||
// restore stack from _mark
|
||||
mjFREESTACK;
|
||||
// restore the mjData stack frame
|
||||
mj_freeStack(d);
|
||||
|
||||
The function :ref:`mj_stackAllocNum` checks if there is enough space, and if so it advances the stack pointer,
|
||||
otherwise it triggers an error. It also keeps track of the maximum stack allocation;
|
||||
|
||||
@@ -30,10 +30,6 @@
|
||||
#define mjMAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||
#define mjMIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
|
||||
// mjData stack frame management
|
||||
#define mjMARKSTACK mj_markStack(d);
|
||||
#define mjFREESTACK mj_freeStack(d);
|
||||
|
||||
// return current value of mjOption enable/disable flags
|
||||
#define mjDISABLED(x) (m->opt.disableflags & (x))
|
||||
#define mjENABLED(x) (m->opt.enableflags & (x))
|
||||
|
||||
@@ -895,7 +895,7 @@ MJAPI void mju_addToScl3(mjtNum res[3], const mjtNum vec[3], mjtNum scl);
|
||||
MJAPI void mju_addScl3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3], mjtNum scl);
|
||||
|
||||
// Normalize vector, return length before normalization.
|
||||
MJAPI mjtNum mju_normalize3(mjtNum res[3]);
|
||||
MJAPI mjtNum mju_normalize3(mjtNum vec[3]);
|
||||
|
||||
// Return vector length (without normalizing the vector).
|
||||
MJAPI mjtNum mju_norm3(const mjtNum vec[3]);
|
||||
@@ -925,7 +925,7 @@ MJAPI void mju_unit4(mjtNum res[4]);
|
||||
MJAPI void mju_copy4(mjtNum res[4], const mjtNum data[4]);
|
||||
|
||||
// Normalize vector, return length before normalization.
|
||||
MJAPI mjtNum mju_normalize4(mjtNum res[4]);
|
||||
MJAPI mjtNum mju_normalize4(mjtNum vec[4]);
|
||||
|
||||
// Set res = 0.
|
||||
MJAPI void mju_zero(mjtNum* res, int n);
|
||||
@@ -934,7 +934,7 @@ MJAPI void mju_zero(mjtNum* res, int n);
|
||||
MJAPI void mju_fill(mjtNum* res, mjtNum val, int n);
|
||||
|
||||
// Set res = vec.
|
||||
MJAPI void mju_copy(mjtNum* res, const mjtNum* data, int n);
|
||||
MJAPI void mju_copy(mjtNum* res, const mjtNum* vec, int n);
|
||||
|
||||
// Return sum(vec).
|
||||
MJAPI mjtNum mju_sum(const mjtNum* vec, int n);
|
||||
|
||||
@@ -5558,7 +5558,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
|
||||
return_type=ValueType(name='mjtNum'),
|
||||
parameters=(
|
||||
FunctionParameterDecl(
|
||||
name='res',
|
||||
name='vec',
|
||||
type=ArrayType(
|
||||
inner_type=ValueType(name='mjtNum'),
|
||||
extents=(3,),
|
||||
@@ -5771,7 +5771,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
|
||||
return_type=ValueType(name='mjtNum'),
|
||||
parameters=(
|
||||
FunctionParameterDecl(
|
||||
name='res',
|
||||
name='vec',
|
||||
type=ArrayType(
|
||||
inner_type=ValueType(name='mjtNum'),
|
||||
extents=(4,),
|
||||
@@ -5832,7 +5832,7 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
|
||||
),
|
||||
),
|
||||
FunctionParameterDecl(
|
||||
name='data',
|
||||
name='vec',
|
||||
type=PointerType(
|
||||
inner_type=ValueType(name='mjtNum', is_const=True),
|
||||
),
|
||||
|
||||
@@ -19,10 +19,8 @@
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <mujoco/mjdata.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
@@ -249,7 +247,7 @@ TouchGrid::TouchGrid(const mjModel* m, mjData* d, int instance, int nchannel,
|
||||
void TouchGrid::Reset(const mjModel* m, int instance) {}
|
||||
|
||||
void TouchGrid::Compute(const mjModel* m, mjData* d, int instance) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// Get sensor id.
|
||||
int id;
|
||||
@@ -283,7 +281,7 @@ void TouchGrid::Compute(const mjModel* m, mjData* d, int instance) {
|
||||
|
||||
// No contacts, return.
|
||||
if (!ncon) {
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -372,7 +370,7 @@ void TouchGrid::Compute(const mjModel* m, mjData* d, int instance) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// Thickness of taxel-visualization boxes relative to contact distance.
|
||||
@@ -380,7 +378,7 @@ static const mjtNum kRelativeThickness = 0.02;
|
||||
|
||||
void TouchGrid::Visualize(const mjModel* m, mjData* d, const mjvOption* opt,
|
||||
mjvScene* scn, int instance) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// Get sensor id.
|
||||
int id;
|
||||
@@ -403,7 +401,7 @@ void TouchGrid::Visualize(const mjModel* m, mjData* d, const mjvOption* opt,
|
||||
|
||||
// If no normal force readings, quick return.
|
||||
if (!maxval) {
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -430,7 +428,7 @@ void TouchGrid::Visualize(const mjModel* m, mjData* d, const mjvOption* opt,
|
||||
}
|
||||
if (scn->ngeom >= scn->maxgeom) {
|
||||
mj_warning(d, mjWARN_VGEOMFULL, scn->maxgeom);
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
} else {
|
||||
// size
|
||||
@@ -478,7 +476,7 @@ void TouchGrid::Visualize(const mjModel* m, mjData* d, const mjvOption* opt,
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ void worker(const mjModel* m, const mjData* dmain, mjData* d, int id) {
|
||||
int nv = m->nv;
|
||||
|
||||
// allocate stack space for result at center
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* center = mj_stackAllocNum(d, nv);
|
||||
mjtNum* warmstart = mj_stackAllocNum(d, nv);
|
||||
|
||||
@@ -188,7 +188,7 @@ void worker(const mjModel* m, const mjData* dmain, mjData* d, int id) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -222,7 +222,7 @@ void checkderiv(const mjModel* m, mjData* d, mjtNum error[7]) {
|
||||
int nv = m->nv;
|
||||
|
||||
// allocate space
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* mat = mj_stackAllocNum(d, nv*nv);
|
||||
|
||||
// get pointers to derivative matrices
|
||||
@@ -275,7 +275,7 @@ void checkderiv(const mjModel* m, mjData* d, mjtNum error[7]) {
|
||||
mju_addTo(mat, F0, nv*nv);
|
||||
error[7] = relnorm(mat, F0, nv*nv);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ static void collideTree(const mjModel* m, mjData* d, int b1, int b2,
|
||||
mjtNum offset[12]; // 2 bb x 2 bb x 3 axes (world)
|
||||
mjtByte initialize = 1;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
// TODO(b/273737633): Store bvh max depths to make this bound tighter.
|
||||
const int max_stack = m->body_bvhnum[b1] + m->body_bvhnum[b2];
|
||||
mjCollisionTree* stack = mj_stackAllocTree(d, max_stack);
|
||||
@@ -345,7 +345,7 @@ static void collideTree(const mjModel* m, mjData* d, int b1, int b2,
|
||||
}
|
||||
}
|
||||
}
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -408,7 +408,7 @@ void mj_collision(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// predefined only; ignore exclude
|
||||
if (m->opt.collision == mjCOL_PAIR) {
|
||||
@@ -503,7 +503,7 @@ void mj_collision(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -750,7 +750,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
|
||||
mju_eig3(eigval, frame, quat, cov);
|
||||
|
||||
// allocate AABB; clear world entry (not used)
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
aabb = mj_stackAllocNum(d, 6*nbody);
|
||||
mju_zero(aabb, 6);
|
||||
|
||||
@@ -859,7 +859,7 @@ endbroad:
|
||||
mjQUICKSORT(pair, npair, sizeof(int), paircompare, 0);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return npair;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "engine/engine_collision_sdf.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <mujoco/mjdata.h>
|
||||
@@ -449,7 +450,7 @@ static void collideBVH(const mjModel* m, mjData* d, int g,
|
||||
const int* child = m->bvh_child + 2*bvhadr;
|
||||
mjtByte* visited = d->bvh_active + bvhadr;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
// TODO(quaglino): Store bvh max depths to make this bound tighter.
|
||||
int max_stack = m->mesh_bvhnum[m->geom_dataid[g]];
|
||||
struct CollideTreeArgs_ {
|
||||
@@ -479,7 +480,7 @@ static void collideBVH(const mjModel* m, mjData* d, int g,
|
||||
faces[*npoints] = faceid[node];
|
||||
if (++(*npoints)==MAXSDFFACE) {
|
||||
mju_warning("mjc_MeshSDF: too many bounding volumes, some contacts may be missed");
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
visited[node] = 1;
|
||||
@@ -504,7 +505,7 @@ static void collideBVH(const mjModel* m, mjData* d, int g,
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
//------------------------------ collision functions -----------------------------------------------
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
#include <mujoco/mjmacro.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include <mujoco/mjxmacro.h>
|
||||
#include "engine/engine_array_safety.h"
|
||||
#include "engine/engine_crossplatform.h"
|
||||
#include "engine/engine_core_smooth.h"
|
||||
#include "engine/engine_io.h"
|
||||
#include "engine/engine_support.h"
|
||||
@@ -508,7 +506,7 @@ void mj_instantiateEquality(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate space
|
||||
jac[0] = mj_stackAllocNum(d, 6*nv);
|
||||
@@ -702,7 +700,7 @@ void mj_instantiateEquality(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -717,7 +715,7 @@ void mj_instantiateFriction(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate Jacobian
|
||||
jac = mj_stackAllocNum(d, nv);
|
||||
@@ -763,7 +761,7 @@ void mj_instantiateFriction(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -779,7 +777,7 @@ void mj_instantiateLimit(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate Jacobian
|
||||
jac = mj_stackAllocNum(d, nv);
|
||||
@@ -909,7 +907,7 @@ void mj_instantiateLimit(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -925,7 +923,7 @@ void mj_instantiateContact(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate Jacobian
|
||||
jac = mj_stackAllocNum(d, 6*NV);
|
||||
@@ -1019,7 +1017,7 @@ void mj_instantiateContact(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1474,7 +1472,7 @@ static inline int mj_ne(const mjModel* m, mjData* d, int* nnz) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
if (nnz) {
|
||||
chain = mj_stackAllocInt(d, nv);
|
||||
@@ -1555,7 +1553,7 @@ static inline int mj_ne(const mjModel* m, mjData* d, int* nnz) {
|
||||
*nnz += nnze;
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return ne;
|
||||
}
|
||||
|
||||
@@ -1670,7 +1668,7 @@ static inline int mj_nc(const mjModel* m, mjData* d, int* nnz) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int *chain = mj_stackAllocInt(d, m->nv);
|
||||
|
||||
for (int i=0; i < ncon; i++) {
|
||||
@@ -1703,7 +1701,7 @@ static inline int mj_nc(const mjModel* m, mjData* d, int* nnz) {
|
||||
*nnz += nnzc;
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return nc;
|
||||
}
|
||||
|
||||
@@ -1838,7 +1836,7 @@ void mj_projectConstraint(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// space for backsubM2(J')' and its traspose
|
||||
mjtNum* JM2 = mj_stackAllocNum(d, nefc*nv);
|
||||
@@ -1978,7 +1976,7 @@ void mj_projectConstraint(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ void mj_kinematics(const mjModel* m, mjData* d) {
|
||||
// map inertias and motion dofs to global frame centered at subtree-CoM
|
||||
void mj_comPos(const mjModel* m, mjData* d) {
|
||||
mjtNum offset[3], axis[3];
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* mass_subtree = mj_stackAllocNum(d, m->nbody);
|
||||
|
||||
// clear subtree
|
||||
@@ -261,7 +261,7 @@ void mj_comPos(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@ void mj_tendon(const mjModel* m, mjData* d) {
|
||||
}
|
||||
|
||||
// allocate space
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
jac1 = mj_stackAllocNum(d, 3*nv);
|
||||
jac2 = mj_stackAllocNum(d, 3*nv);
|
||||
jacdif = mj_stackAllocNum(d, 3*nv);
|
||||
@@ -609,7 +609,7 @@ void mj_tendon(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -628,7 +628,7 @@ void mj_transmission(const mjModel* m, mjData* d) {
|
||||
}
|
||||
|
||||
// allocate space, clear moments
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
jac = mj_stackAllocNum(d, 3*nv);
|
||||
jacA = mj_stackAllocNum(d, 3*nv);
|
||||
jacS = mj_stackAllocNum(d, 3*nv);
|
||||
@@ -954,7 +954,7 @@ void mj_transmission(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1383,7 +1383,7 @@ void mj_comVel(const mjModel* m, mjData* d) {
|
||||
// subtree linear velocity and angular momentum
|
||||
void mj_subtreeVel(const mjModel* m, mjData* d) {
|
||||
mjtNum dx[3], dv[3], dp[3], dL[3];
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* body_vel = mj_stackAllocNum(d, 6*m->nbody);
|
||||
|
||||
// bodywise quantities
|
||||
@@ -1440,7 +1440,7 @@ void mj_subtreeVel(const mjModel* m, mjData* d) {
|
||||
mju_addTo3(d->subtree_angmom+3*parent, dL);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1449,7 +1449,7 @@ void mj_subtreeVel(const mjModel* m, mjData* d) {
|
||||
// RNE: compute M(qpos)*qacc + C(qpos,qvel); flg_acc=0 removes inertial term
|
||||
void mj_rne(const mjModel* m, mjData* d, int flg_acc, mjtNum* result) {
|
||||
mjtNum tmp[6], tmp1[6];
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* loc_cacc = mj_stackAllocNum(d, m->nbody*6);
|
||||
mjtNum* loc_cfrc_body = mj_stackAllocNum(d, m->nbody*6);
|
||||
|
||||
@@ -1495,7 +1495,7 @@ void mj_rne(const mjModel* m, mjData* d, int flg_acc, mjtNum* result) {
|
||||
result[i] = mju_dot(d->cdof+6*i, loc_cfrc_body+6*m->dof_bodyid[i], 6);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -399,7 +399,7 @@ void mjd_rne_vel_dense(const mjModel* m, mjData* d) {
|
||||
int nv = m->nv, nbody = m->nbody;
|
||||
mjtNum mat[36], mat1[36], mat2[36], dmul[36], tmp[6];
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* Dcvel = mj_stackAllocNum(d, nbody*6*nv);
|
||||
mjtNum* Dcdofdot = mj_stackAllocNum(d, nv*6*nv);
|
||||
mjtNum* Dcacc = mj_stackAllocNum(d, nbody*6*nv);
|
||||
@@ -470,7 +470,7 @@ void mjd_rne_vel_dense(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -614,7 +614,7 @@ static void mjd_rne_vel(const mjModel* m, mjData* d) {
|
||||
|
||||
mjtNum mat[36], mat1[36], mat2[36], dmul[36], tmp[6];
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* Dcdofdot = mj_stackAllocNum(d, 6*m->nD);
|
||||
mjtNum* Dcvel = mj_stackAllocNum(d, 6*m->nB);
|
||||
mjtNum* Dcacc = mj_stackAllocNum(d, 6*m->nB);
|
||||
@@ -687,7 +687,7 @@ static void mjd_rne_vel(const mjModel* m, mjData* d) {
|
||||
mju_subFrom(d->qDeriv + Dadr[j], row, Bnnz[i]);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -734,7 +734,7 @@ static void addJTBJ(const mjModel* m, mjData* d, const mjtNum* J, const mjtNum*
|
||||
int nv = m->nv;
|
||||
|
||||
// allocate dense row
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* row = mj_stackAllocNum(d, nv);
|
||||
|
||||
// process non-zero elements of B
|
||||
@@ -760,7 +760,7 @@ static void addJTBJ(const mjModel* m, mjData* d, const mjtNum* J, const mjtNum*
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -773,7 +773,7 @@ static void addJTBJSparse(
|
||||
int nv = m->nv;
|
||||
|
||||
// allocate row
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* row = mj_stackAllocNum(d, nv);
|
||||
|
||||
// compute qDeriv(k,p) += sum_{i,j} ( J(i,k)*B(i,j)*J(j,p) )
|
||||
@@ -808,7 +808,7 @@ static void addJTBJSparse(
|
||||
}
|
||||
|
||||
// free space
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1226,7 +1226,7 @@ static inline void mjd_magnus_force(
|
||||
|
||||
// fluid forces based on ellipsoid approximation
|
||||
void mjd_ellipsoidFluid(const mjModel* m, mjData* d, int bodyid) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
int nv = m->nv;
|
||||
int nnz = nv;
|
||||
@@ -1331,14 +1331,14 @@ void mjd_ellipsoidFluid(const mjModel* m, mjData* d, int bodyid) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
// fluid forces based on inertia-box approximation
|
||||
void mjd_inertiaBoxFluid(const mjModel* m, mjData* d, int i)
|
||||
{
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
int nv = m->nv;
|
||||
int rownnz[6], rowadr[6];
|
||||
@@ -1488,7 +1488,7 @@ void mjd_inertiaBoxFluid(const mjModel* m, mjData* d, int i)
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ static void inverseSkip(const mjModel* m, mjData* d, mjtStage stage, int skipsen
|
||||
void mjd_passive_velFD(const mjModel* m, mjData* d, mjtNum eps) {
|
||||
int nv = m->nv;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* qfrc_passive = mj_stackAllocNum(d, nv);
|
||||
mjtNum* fd = mj_stackAllocNum(d, nv);
|
||||
int* cnt = mj_stackAllocInt(d, nv);
|
||||
@@ -237,7 +237,7 @@ void mjd_passive_velFD(const mjModel* m, mjData* d, mjtNum eps) {
|
||||
// restore
|
||||
mj_fwdVelocity(m, d);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -248,7 +248,7 @@ void mjd_passive_velFD(const mjModel* m, mjData* d, mjtNum eps) {
|
||||
void mjd_smooth_velFD(const mjModel* m, mjData* d, mjtNum eps) {
|
||||
int nv = m->nv;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* plus = mj_stackAllocNum(d, nv);
|
||||
mjtNum* minus = mj_stackAllocNum(d, nv);
|
||||
mjtNum* fd = mj_stackAllocNum(d, nv);
|
||||
@@ -303,7 +303,7 @@ void mjd_smooth_velFD(const mjModel* m, mjData* d, mjtNum eps) {
|
||||
mj_fwdVelocity(m, d);
|
||||
mj_fwdActuation(m, d);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -330,7 +330,7 @@ void mjd_stepFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_centered,
|
||||
mjtNum* DsDq, mjtNum* DsDv, mjtNum* DsDa, mjtNum* DsDu) {
|
||||
int nq = m->nq, nv = m->nv, na = m->na, nu = m->nu, ns = m->nsensordata;
|
||||
int ndx = 2*nv+na; // row length of Dy Jacobians
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// states
|
||||
mjtNum *state = mj_stackAllocNum(d, nq+nv+na); // current state
|
||||
@@ -558,7 +558,7 @@ void mjd_stepFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_centered,
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -580,7 +580,7 @@ void mjd_transitionFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_cente
|
||||
mjtNum *DyDq, *DyDv, *DyDa, *DsDq, *DsDv, *DsDa;
|
||||
DyDq = DyDv = DyDa = DsDq = DsDv = DsDa = NULL;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate transposed matrices
|
||||
mjtNum *AT = A ? mj_stackAllocNum(d, ndx*ndx) : NULL; // state-transition matrix (transposed)
|
||||
@@ -611,7 +611,7 @@ void mjd_transitionFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_cente
|
||||
if (C) mju_transpose(C, CT, ndx, ns);
|
||||
if (D) mju_transpose(D, DT, nu, ns);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// finite differenced Jacobians of (force, sensors) = mj_inverse(state, acceleration)
|
||||
@@ -648,7 +648,7 @@ void mjd_inverseFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_actuatio
|
||||
int skipsensor = !DsDq && !DsDv && !DsDa;
|
||||
|
||||
// local vectors
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum *pos = mj_stackAllocNum(d, nq); // position
|
||||
mjtNum *force = mj_stackAllocNum(d, nv); // force
|
||||
mjtNum *force_plus = mj_stackAllocNum(d, nv); // nudged force
|
||||
@@ -731,5 +731,5 @@ void mjd_inverseFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_actuatio
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
+12
-12
@@ -199,7 +199,7 @@ void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
}
|
||||
|
||||
// local, clamped copy of ctrl
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum *ctrl = mj_stackAllocNum(d, nu);
|
||||
if (mjDISABLED(mjDSBL_CLAMPCTRL)) {
|
||||
mju_copy(ctrl, d->ctrl, nu);
|
||||
@@ -392,7 +392,7 @@ void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
TM_END(mjTIMER_ACTUATION);
|
||||
}
|
||||
|
||||
@@ -401,7 +401,7 @@ void mj_fwdActuation(const mjModel* m, mjData* d) {
|
||||
// add up all non-constraint forces, compute qacc_smooth
|
||||
void mj_fwdAcceleration(const mjModel* m, mjData* d) {
|
||||
TM_START;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int nv = m->nv;
|
||||
|
||||
// qforce = sum of all non-constraint forces
|
||||
@@ -413,7 +413,7 @@ void mj_fwdAcceleration(const mjModel* m, mjData* d) {
|
||||
// qacc_smooth = M \ qfr_smooth
|
||||
mj_solveM(m, d, d->qacc_smooth, d->qfrc_smooth, 1);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
TM_END(mjTIMER_ACCELERATION);
|
||||
}
|
||||
|
||||
@@ -425,7 +425,7 @@ static void warmstart(const mjModel* m, mjData* d) {
|
||||
|
||||
// warmstart with best of (qacc_warmstart, qacc_smooth)
|
||||
if (!mjDISABLED(mjDSBL_WARMSTART)) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* jar = mj_stackAllocNum(d, nefc);
|
||||
|
||||
// start with qacc = qacc_warmstart
|
||||
@@ -479,7 +479,7 @@ static void warmstart(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// coldstart with qacc = qacc_smooth, efc_force = 0
|
||||
@@ -589,7 +589,7 @@ static void mj_advance(const mjModel* m, mjData* d,
|
||||
// Euler integrator, semi-implicit in velocity, possibly skipping factorisation
|
||||
void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) {
|
||||
int nv = m->nv, nM = m->nM;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* qfrc = mj_stackAllocNum(d, nv);
|
||||
mjtNum* qacc = mj_stackAllocNum(d, nv);
|
||||
|
||||
@@ -633,7 +633,7 @@ void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) {
|
||||
// advance state and time
|
||||
mj_advance(m, d, d->act_dot, qacc, NULL);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -672,7 +672,7 @@ void mj_RungeKutta(const mjModel* m, mjData* d, int N) {
|
||||
}
|
||||
|
||||
// allocate space for intermediate solutions
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
dX = mj_stackAllocNum(d, 2*nv+na);
|
||||
for (int i=0; i < N; i++) {
|
||||
X[i] = mj_stackAllocNum(d, nq+nv+na);
|
||||
@@ -746,7 +746,7 @@ void mj_RungeKutta(const mjModel* m, mjData* d, int N) {
|
||||
// advance state and time
|
||||
mj_advance(m, d, dX+2*nv, dX+nv, dX);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -755,7 +755,7 @@ void mj_RungeKutta(const mjModel* m, mjData* d, int N) {
|
||||
void mj_implicitSkip(const mjModel* m, mjData* d, int skipfactor) {
|
||||
int nv = m->nv;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* qfrc = mj_stackAllocNum(d, nv);
|
||||
mjtNum* qacc = mj_stackAllocNum(d, nv);
|
||||
|
||||
@@ -810,7 +810,7 @@ void mj_implicitSkip(const mjModel* m, mjData* d, int skipfactor) {
|
||||
// advance state and time
|
||||
mj_advance(m, d, d->act_dot, qacc, NULL);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ static void mj_discreteAcc(const mjModel* m, mjData* d) {
|
||||
int nv = m->nv, dof_damping;
|
||||
mjtNum *qacc = d->qacc;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* qfrc = mj_stackAllocNum(d, nv);
|
||||
|
||||
// use selected integrator
|
||||
@@ -119,7 +119,7 @@ static void mj_discreteAcc(const mjModel* m, mjData* d) {
|
||||
|
||||
// if disabled or no dof damping, nothing to do
|
||||
if (!dof_damping) {
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ static void mj_discreteAcc(const mjModel* m, mjData* d) {
|
||||
// solve for qacc: qfrc = M * qacc
|
||||
mj_solveM(m, d, qacc, qfrc, 1);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -186,7 +186,7 @@ void mj_invConstraint(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* jar = mj_stackAllocNum(d, nefc);
|
||||
|
||||
// compute jar = Jac*qacc - aref
|
||||
@@ -196,7 +196,7 @@ void mj_invConstraint(const mjModel* m, mjData* d) {
|
||||
// call update function
|
||||
mj_constraintUpdate(m, d, jar, NULL, 0);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
TM_END(mjTIMER_CONSTRAINT);
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ void mj_invConstraint(const mjModel* m, mjData* d) {
|
||||
void mj_inverseSkip(const mjModel* m, mjData* d,
|
||||
int skipstage, int skipsensor) {
|
||||
TM_START;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* qacc;
|
||||
int nv = m->nv;
|
||||
|
||||
@@ -259,7 +259,7 @@ void mj_inverseSkip(const mjModel* m, mjData* d,
|
||||
mju_copy(d->qacc, qacc, nv);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
TM_END(mjTIMER_INVERSE);
|
||||
}
|
||||
|
||||
@@ -286,7 +286,7 @@ void mj_compareFwdInv(const mjModel* m, mjData* d) {
|
||||
}
|
||||
|
||||
// allocate
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
qforce = mj_stackAllocNum(d, nv);
|
||||
dif = mj_stackAllocNum(d, nv);
|
||||
save_qfrc_constraint = mj_stackAllocNum(d, nv);
|
||||
@@ -314,5 +314,5 @@ void mj_compareFwdInv(const mjModel* m, mjData* d) {
|
||||
mju_copy(d->qfrc_constraint, save_qfrc_constraint, nv);
|
||||
mju_copy(d->efc_force, save_efc_force, nefc);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
@@ -850,7 +850,7 @@ static void makeDSparse(const mjModel* m, mjData* d) {
|
||||
int* rowadr = d->D_rowadr;
|
||||
int* colind = d->D_colind;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* remaining = mj_stackAllocInt(d, nv);
|
||||
|
||||
// compute rownnz
|
||||
@@ -898,7 +898,7 @@ static void makeDSparse(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -943,7 +943,7 @@ static void makeBSparse(const mjModel* m, mjData* d) {
|
||||
}
|
||||
|
||||
// allocate and clear incremental row counts
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* cnt = mj_stackAllocInt(d, nbody);
|
||||
mju_zeroInt(cnt, nbody);
|
||||
|
||||
@@ -991,7 +991,7 @@ static void makeBSparse(const mjModel* m, mjData* d) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -18,11 +18,9 @@
|
||||
#include <stddef.h>
|
||||
|
||||
#include <mujoco/mjdata.h>
|
||||
#include <mujoco/mjmacro.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include <mujoco/mjxmacro.h>
|
||||
#include "engine/engine_core_constraint.h"
|
||||
#include "engine/engine_crossplatform.h"
|
||||
#include "engine/engine_io.h"
|
||||
#include "engine/engine_support.h"
|
||||
#include "engine/engine_util_errmem.h"
|
||||
@@ -414,7 +412,7 @@ void mj_island(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate edge array
|
||||
int nedge_max = countMaxEdge(m, d);
|
||||
@@ -448,7 +446,7 @@ void mj_island(const mjModel* m, mjData* d) {
|
||||
|
||||
// allocate island arrays on arena
|
||||
if (!arenaAllocIsland(m, d)) {
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -527,5 +525,5 @@ void mj_island(const mjModel* m, mjData* d) {
|
||||
d->island_efcind[d->island_efcadr[island] + (d->island_efcnum[island]++)] = i;
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ extern "C" {
|
||||
|
||||
// find disjoint subgraphs ("islands") given sparse symmetric adjacency matrix
|
||||
MJAPI int mj_floodFill(int* island, int nr, const int* rownnz, const int* rowadr, const int* colind,
|
||||
int* scratch);
|
||||
int* stack);
|
||||
|
||||
//-------------------------- top-level API for island construction ---------------------------------
|
||||
|
||||
|
||||
@@ -736,7 +736,7 @@ void mj_printFormattedData(const mjModel* m, mjData* d, const char* filename,
|
||||
}
|
||||
|
||||
mjtNum *M;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// check format string
|
||||
if (!validateFloatFormat(float_format)) {
|
||||
@@ -755,7 +755,7 @@ void mj_printFormattedData(const mjModel* m, mjData* d, const char* filename,
|
||||
// check for nullptr
|
||||
if (!fp) {
|
||||
mju_warning("Could not open file '%s' for writing mjModel", filename);
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1145,7 +1145,7 @@ void mj_printFormattedData(const mjModel* m, mjData* d, const char* filename,
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "engine/engine_ray.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <mujoco/mjdata.h>
|
||||
@@ -1158,7 +1159,7 @@ static mjtNum mju_singleRay(const mjModel* m, mjData* d, const mjtNum pnt[3], co
|
||||
void mj_multiRay(const mjModel* m, mjData* d, const mjtNum pnt[3], const mjtNum* vec,
|
||||
const mjtByte* geomgroup, mjtByte flg_static, int bodyexclude,
|
||||
int* geomid, mjtNum* dist, int nray, mjtNum cutoff) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate source
|
||||
mjtNum* geom_ba = mj_stackAllocNum(d, 4*m->ngeom);
|
||||
@@ -1173,5 +1174,5 @@ void mj_multiRay(const mjModel* m, mjData* d, const mjtNum pnt[3], const mjtNum*
|
||||
dist[i] = mju_singleRay(m, d, pnt, vec+3*i, geom_eliminate, geom_ba, geomid+i);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
@@ -860,12 +860,12 @@ void mj_energyVel(const mjModel* m, mjData* d) {
|
||||
return;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
vec = mj_stackAllocNum(d, m->nv);
|
||||
|
||||
// kinetic energy: 0.5 * qvel' * M * qvel
|
||||
mj_mulM(m, d, vec, d->qvel);
|
||||
d->energy[1] = 0.5*mju_dot(vec, d->qvel, m->nv);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ static void mj_setM0(mjModel* m, mjData* d) {
|
||||
static void set0(mjModel* m, mjData* d) {
|
||||
int id, id1, id2, dnum, nv = m->nv;
|
||||
mjtNum A[36] = {0}, pos[3], quat[4];
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* jac = mj_stackAllocNum(d, 6*nv);
|
||||
mjtNum* tmp = mj_stackAllocNum(d, 6*nv);
|
||||
int* cammode = 0;
|
||||
@@ -264,7 +264,7 @@ static void set0(mjModel* m, mjData* d) {
|
||||
mju_copy3(m->light_dir0+3*i, d->light_xdir+3*i);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -283,7 +283,7 @@ static void setStat(mjModel* m, mjData* d) {
|
||||
mjtNum xmin[3] = {1E+10, 1E+10, 1E+10};
|
||||
mjtNum xmax[3] = {-1E+10, -1E+10, -1E+10};
|
||||
mjtNum rbound;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* body = mj_stackAllocNum(d, m->nbody);
|
||||
|
||||
// compute bounding box of bodies, joint centers, geoms and sites
|
||||
@@ -383,7 +383,7 @@ static void setStat(mjModel* m, mjData* d) {
|
||||
m->stat.meaninertia /= m->nv;
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+13
-13
@@ -309,7 +309,7 @@ void mj_solPGS(const mjModel* m, mjData* d, int maxiter) {
|
||||
mjtNum *mu, x, denom, improvement;
|
||||
mjtNum v[6], v1[6], Athis[36], Ac[25], bc[5], res[6], oldforce[6];
|
||||
mjContact* con;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* ARinv = mj_stackAllocNum(d, nefc);
|
||||
int* oldstate = mj_stackAllocInt(d, nefc);
|
||||
|
||||
@@ -497,7 +497,7 @@ void mj_solPGS(const mjModel* m, mjData* d, int maxiter) {
|
||||
// map to joint space
|
||||
dualFinish(m, d);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -511,7 +511,7 @@ void mj_solNoSlip(const mjModel* m, mjData* d, int maxiter) {
|
||||
mjtNum *mu, improvement;
|
||||
mjtNum v[5], Ac[25], bc[5], res[5], oldforce[5], delta[5], mid, y, K0, K1;
|
||||
mjContact* con;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* ARinv = mj_stackAllocNum(d, nefc);
|
||||
int* oldstate = mj_stackAllocInt(d, nefc);
|
||||
|
||||
@@ -703,7 +703,7 @@ void mj_solNoSlip(const mjModel* m, mjData* d, int maxiter) {
|
||||
// map to joint space
|
||||
dualFinish(m, d);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1277,7 +1277,7 @@ static mjtNum CGsearch(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
static void HessianCone(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
int nv = m->nv, nefc = d->nefc;
|
||||
mjtNum local[36];
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// storage for L'*J
|
||||
mjtNum* LTJ = mj_stackAllocNum(d, 6*nv);
|
||||
@@ -1347,7 +1347,7 @@ static void HessianCone(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1355,7 +1355,7 @@ static void HessianCone(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
// compute and factorize Hessian: direct method
|
||||
static void HessianDirect(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
int nv = m->nv, nefc = d->nefc;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// compute D corresponding to quad states
|
||||
mjtNum* D = mj_stackAllocNum(d, nefc);
|
||||
@@ -1427,7 +1427,7 @@ static void HessianDirect(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
ctx->nnz = nv*nv;
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
|
||||
// add cones if present
|
||||
if (ctx->ncone) {
|
||||
@@ -1444,7 +1444,7 @@ static void HessianDirect(const mjModel* m, mjData* d, mjCGContext* ctx) {
|
||||
static void HessianIncremental(const mjModel* m, mjData* d,
|
||||
mjCGContext* ctx, const int* oldstate) {
|
||||
int rank, nv = m->nv, nefc = d->nefc;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// local space
|
||||
mjtNum* vec = mj_stackAllocNum(d, nv);
|
||||
@@ -1490,7 +1490,7 @@ static void HessianIncremental(const mjModel* m, mjData* d,
|
||||
|
||||
// recompute H directly if accuracy lost
|
||||
if (rank < nv) {
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
HessianDirect(m, d, ctx);
|
||||
|
||||
// nothing else to do
|
||||
@@ -1504,7 +1504,7 @@ static void HessianIncremental(const mjModel* m, mjData* d,
|
||||
HessianCone(m, d, ctx);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1515,7 +1515,7 @@ static void mj_solCGNewton(const mjModel* m, mjData* d, int maxiter, int flg_New
|
||||
mjtNum alpha, beta;
|
||||
mjtNum *gradold = NULL, *Mgradold = NULL, *Mgraddif = NULL;
|
||||
mjCGContext ctx;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// allocate context
|
||||
CGallocate(m, d, &ctx, flg_Newton);
|
||||
@@ -1625,7 +1625,7 @@ static void mj_solCGNewton(const mjModel* m, mjData* d, int maxiter, int flg_New
|
||||
d->solver_nnz = 0;
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+12
-12
@@ -279,7 +279,7 @@ void mj_jacBodyCom(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* jacr
|
||||
// compute subtree-com Jacobian
|
||||
void mj_jacSubtreeCom(const mjModel* m, mjData* d, mjtNum* jacp, int body) {
|
||||
int nv = m->nv;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* jacp_b = mj_stackAllocNum(d, 3*nv);
|
||||
|
||||
// clear output
|
||||
@@ -300,7 +300,7 @@ void mj_jacSubtreeCom(const mjModel* m, mjData* d, mjtNum* jacp, int body) {
|
||||
// normalize by subtree mass
|
||||
mju_scl(jacp, jacp, 1/m->body_subtreemass[body], 3*nv);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -325,7 +325,7 @@ void mj_jacPointAxis(const mjModel* m, mjData* d, mjtNum* jacPoint, mjtNum* jacA
|
||||
int nv = m->nv;
|
||||
|
||||
// get full Jacobian of point
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* jacp = (jacPoint ? jacPoint : mj_stackAllocNum(d, 3*nv));
|
||||
mjtNum* jacr = mj_stackAllocNum(d, 3*nv);
|
||||
mj_jac(m, d, jacp, jacr, point, body);
|
||||
@@ -339,7 +339,7 @@ void mj_jacPointAxis(const mjModel* m, mjData* d, mjtNum* jacPoint, mjtNum* jacA
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1014,7 +1014,7 @@ void mj_addM(const mjModel* m, mjData* d, mjtNum* dst,
|
||||
// sparse
|
||||
if (rownnz && rowadr && colind) {
|
||||
int nv = m->nv;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
// create sparse inertia matrix M
|
||||
int nnz = m->nD; // use sparse dof-dof matrix
|
||||
int* M_rownnz = mj_stackAllocInt(d, nv); // actual nnz count
|
||||
@@ -1024,7 +1024,7 @@ void mj_addM(const mjModel* m, mjData* d, mjtNum* dst,
|
||||
mj_makeMSparse(m, d, M, M_rownnz, NULL, M_colind);
|
||||
mj_addMSparse(m, d, dst, rownnz, rowadr, colind, M,
|
||||
M_rownnz, NULL, M_colind);
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// dense
|
||||
@@ -1111,7 +1111,7 @@ void mj_addMSparse(const mjModel* m, mjData* d, mjtNum* dst,
|
||||
M_rowadr = d->D_rowadr;
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* buf_ind = mj_stackAllocInt(d, nv);
|
||||
mjtNum* sparse_buf = mj_stackAllocNum(d, nv);
|
||||
|
||||
@@ -1121,7 +1121,7 @@ void mj_addMSparse(const mjModel* m, mjData* d, mjtNum* dst,
|
||||
rownnz[i], M_rownnz[i], colind + rowadr[i],
|
||||
M_colind + M_rowadr[i], sparse_buf, buf_ind);
|
||||
}
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1158,7 +1158,7 @@ void mj_addMDense(const mjModel* m, mjData* d, mjtNum* dst) {
|
||||
// dst[D] = src[M], handle different sparsity representations
|
||||
void mj_copyM2DSparse(const mjModel* m, mjData* d, mjtNum* dst, const mjtNum* src) {
|
||||
int nv = m->nv;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// init remaining
|
||||
int* remaining = mj_stackAllocInt(d, nv);
|
||||
@@ -1185,7 +1185,7 @@ void mj_copyM2DSparse(const mjModel* m, mjData* d, mjtNum* dst, const mjtNum* sr
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -1223,7 +1223,7 @@ void mj_applyFT(const mjModel* m, mjData* d,
|
||||
int nv = m->nv;
|
||||
|
||||
// allocate local variables
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* jacp = mj_stackAllocNum(d, 3*nv);
|
||||
mjtNum* jacr = mj_stackAllocNum(d, 3*nv);
|
||||
mjtNum* qforce = mj_stackAllocNum(d, nv);
|
||||
@@ -1246,7 +1246,7 @@ void mj_applyFT(const mjModel* m, mjData* d,
|
||||
mju_addTo(qfrc_target, qforce, nv);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <mujoco/mjmacro.h>
|
||||
#include <mujoco/mjtnum.h>
|
||||
|
||||
#ifdef mjUSEPLATFORMSIMD
|
||||
|
||||
@@ -147,7 +147,7 @@ int mju_cholFactorSparse(mjtNum* mat, int n, mjtNum mindiag,
|
||||
mjData* d) {
|
||||
int rank = n;
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* buf_ind = mj_stackAllocInt(d, n);
|
||||
mjtNum* sparse_buf = mj_stackAllocNum(d, n);
|
||||
|
||||
@@ -198,7 +198,7 @@ int mju_cholFactorSparse(mjtNum* mat, int n, mjtNum mindiag,
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return rank;
|
||||
}
|
||||
|
||||
@@ -253,7 +253,7 @@ void mju_cholSolveSparse(mjtNum* res, const mjtNum* mat, const mjtNum* vec, int
|
||||
int mju_cholUpdateSparse(mjtNum* mat, mjtNum* x, int n, int flg_plus,
|
||||
int* rownnz, int* rowadr, int* colind, int x_nnz, int* x_ind,
|
||||
mjData* d) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* buf_ind = mj_stackAllocInt(d, n);
|
||||
mjtNum* sparse_buf = mj_stackAllocNum(d, n);
|
||||
|
||||
@@ -294,7 +294,7 @@ int mju_cholUpdateSparse(mjtNum* mat, mjtNum* x, int n, int flg_plus,
|
||||
i = i - 1 + (new_x_nnz - i);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return rank;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,12 +13,11 @@
|
||||
// limitations under the License.
|
||||
|
||||
#include "engine/engine_util_sparse.h"
|
||||
#include "engine/engine_util_sparse_avx.h"
|
||||
#include "engine/engine_util_sparse_avx.h" // IWYU pragma: keep
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <mujoco/mjdata.h>
|
||||
#include <mujoco/mjmacro.h>
|
||||
#include <mujoco/mjtnum.h>
|
||||
#include "engine/engine_io.h"
|
||||
#include "engine/engine_util_blas.h"
|
||||
@@ -474,13 +473,12 @@ void mju_sqrMatTDSparseInit(int* res_rownnz, int* res_rowadr,
|
||||
const int* rownnzT, const int* rowadrT,
|
||||
const int* colindT, const int* rowsuperT,
|
||||
mjData* d) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* chain = mj_stackAllocInt(d, 2*nc);
|
||||
int nchain = 0;
|
||||
int* res_colind = NULL;
|
||||
|
||||
for (int r=0; r < nc; r++) {
|
||||
|
||||
// supernode; copy everything to next row
|
||||
if (rowsuperT && r > 0 && rowsuperT[r-1] > 0) {
|
||||
res_rownnz[r] = res_rownnz[r - 1];
|
||||
@@ -556,7 +554,7 @@ void mju_sqrMatTDSparseInit(int* res_rownnz, int* res_rowadr,
|
||||
res_rowadr[r] = res_rowadr[r-1] + res_rownnz[r-1];
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
@@ -580,7 +578,7 @@ void mju_sqrMatTDSparse(mjtNum* res, const mjtNum* mat, const mjtNum* matT,
|
||||
const int* colindT, const int* rowsuperT,
|
||||
mjData* d) {
|
||||
// allocate space for accumulation buffer and matT
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// a dense row buffer that stores the current row in the resulting matrix
|
||||
mjtNum* buffer = mj_stackAllocNum(d, nc);
|
||||
@@ -689,5 +687,5 @@ void mju_sqrMatTDSparse(mjtNum* res, const mjtNum* mat, const mjtNum* matT,
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
|
||||
#include <mujoco/mjdata.h>
|
||||
#include <mujoco/mjexport.h>
|
||||
#include <mujoco/mjmacro.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include <mujoco/mjvisualize.h>
|
||||
#include "engine/engine_core_smooth.h"
|
||||
@@ -518,7 +517,7 @@ void mjv_moveModel(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
|
||||
|
||||
// copy perturb pos,quat from selected body; set scale for perturbation
|
||||
void mjv_initPerturb(const mjModel* m, mjData* d, const mjvScene* scn, mjvPerturb* pert) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
int nv = m->nv;
|
||||
int sel = pert->select;
|
||||
@@ -529,7 +528,7 @@ void mjv_initPerturb(const mjModel* m, mjData* d, const mjvScene* scn, mjvPertur
|
||||
|
||||
// invalid selected body: return
|
||||
if (sel <= 0 || sel >= m->nbody) {
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -558,7 +557,7 @@ void mjv_initPerturb(const mjModel* m, mjData* d, const mjvScene* scn, mjvPertur
|
||||
mju_sub3(dif, pert->refselpos, headpos);
|
||||
pert->scale = mjv_frustumHeight(scn) * mju_dot3(dif, forward);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -105,13 +105,13 @@ static void BM_solveLD(benchmark::State& state, bool new_function) {
|
||||
static mjModel* m = LoadModelFromPath("composite/cloth.xml");
|
||||
mjData* d = mj_makeData(m);
|
||||
|
||||
// warm-up rollout to get a typcal state
|
||||
// warm-up rollout to get a typical state
|
||||
for (int i=0; i < kNumWarmupSteps; i++) {
|
||||
mj_step(m, d);
|
||||
}
|
||||
|
||||
// allocate gadient
|
||||
mjMARKSTACK;
|
||||
// allocate gradient
|
||||
mj_markStack(d);
|
||||
mjtNum *grad = mj_stackAllocNum(d, m->nv);
|
||||
mjtNum *Ma = mj_stackAllocNum(d, m->nv);
|
||||
mjtNum *res = mj_stackAllocNum(d, m->nv);
|
||||
@@ -145,7 +145,7 @@ static void BM_solveLD(benchmark::State& state, bool new_function) {
|
||||
}
|
||||
|
||||
// finalize
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
state.SetItemsProcessed(state.iterations());
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
// A benchmark for comparing different implementations of mj_solveLD.
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
|
||||
#include <benchmark/benchmark.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <absl/base/attributes.h>
|
||||
@@ -47,7 +50,7 @@ void ABSL_ATTRIBUTE_NOINLINE mju_sqrMatTDSparse_baseline(
|
||||
const int* rownnz, const int* rowadr, const int* colind,
|
||||
const int* rowsuper, const int* rownnzT, const int* rowadrT,
|
||||
const int* colindT, const int* rowsuperT, mjData* d) {
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
int* chain = mj_stackAllocInt(d, 2 * nc);
|
||||
mjtNum* buffer = mj_stackAllocNum(d, nc);
|
||||
|
||||
@@ -149,7 +152,7 @@ void ABSL_ATTRIBUTE_NOINLINE mju_sqrMatTDSparse_baseline(
|
||||
}
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// transpose sparse matrix (uncompressed)
|
||||
@@ -354,7 +357,7 @@ static void BM_MatVecSparse(benchmark::State& state, int unroll) {
|
||||
}
|
||||
|
||||
// allocate gradient
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum *Ma = mj_stackAllocNum(d, m->nv);
|
||||
mjtNum *vec = mj_stackAllocNum(d, m->nv);
|
||||
mjtNum *res = mj_stackAllocNum(d, d->nefc);
|
||||
@@ -395,7 +398,7 @@ static void BM_MatVecSparse(benchmark::State& state, int unroll) {
|
||||
}
|
||||
|
||||
// finalize
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
state.SetItemsProcessed(state.iterations());
|
||||
}
|
||||
@@ -433,7 +436,7 @@ static void BM_combineSparse(benchmark::State& state, CombineFuncPtr func) {
|
||||
}
|
||||
|
||||
// allocate
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* H = mj_stackAllocNum(d, m->nv*m->nv);
|
||||
int* rownnz = mj_stackAllocInt(d, m->nv);
|
||||
int* rowadr = mj_stackAllocInt(d, m->nv);
|
||||
@@ -478,7 +481,7 @@ static void BM_combineSparse(benchmark::State& state, CombineFuncPtr func) {
|
||||
}
|
||||
|
||||
// finalize
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
state.SetItemsProcessed(state.iterations());
|
||||
}
|
||||
@@ -510,7 +513,7 @@ static void BM_transposeSparse(benchmark::State& state, TransposeFuncPtr func) {
|
||||
mj_step(m, d);
|
||||
}
|
||||
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// need uncompressed layout
|
||||
mjtNum* res = mj_stackAllocNum(d, m->nv * d->nefc);
|
||||
@@ -524,7 +527,7 @@ static void BM_transposeSparse(benchmark::State& state, TransposeFuncPtr func) {
|
||||
d->efc_J_rownnz, d->efc_J_rowadr, d->efc_J_colind);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
state.SetItemsProcessed(state.iterations());
|
||||
}
|
||||
@@ -556,7 +559,7 @@ static void BM_sqrMatTDSparse(benchmark::State& state, SqrMatTDFuncPtr func) {
|
||||
}
|
||||
|
||||
// allocate
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjtNum* H = mj_stackAllocNum(d, m->nv * m->nv);
|
||||
int* rownnz = mj_stackAllocInt(d, m->nv);
|
||||
int* rowadr = mj_stackAllocInt(d, m->nv);
|
||||
@@ -598,7 +601,7 @@ static void BM_sqrMatTDSparse(benchmark::State& state, SqrMatTDFuncPtr func) {
|
||||
}
|
||||
|
||||
// finalize
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
state.SetItemsProcessed(state.iterations());
|
||||
}
|
||||
|
||||
@@ -14,7 +14,10 @@
|
||||
|
||||
// Tests for engine/engine_derivative.c.
|
||||
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <random>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
@@ -287,7 +290,7 @@ TEST_F(DerivativeTest, StepSkip) {
|
||||
static void LinearSystem(const mjModel* m, mjData* d, mjtNum* A, mjtNum* B) {
|
||||
int nv = m->nv, nu = m->nu;
|
||||
mjtNum dt = m->opt.timestep;
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
// === state-transition matrix A
|
||||
if (A) {
|
||||
@@ -330,7 +333,7 @@ static void LinearSystem(const mjModel* m, mjData* d, mjtNum* A, mjtNum* B) {
|
||||
mju_scl(B+nu*nv, BcT, dt, nu*nv);
|
||||
}
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
}
|
||||
|
||||
// compare FD derivatives to analytic derivatives of linear dynamical system
|
||||
|
||||
@@ -50,7 +50,7 @@ TEST(TestMjArrayList, TestMjArrayListSingleThreaded) {
|
||||
mjModel* m = LoadModelFromString("<mujoco/>", error.data(), error.size());
|
||||
ASSERT_THAT(m, NotNull()) << "Failed to load model: " << error.data();
|
||||
mjData* d = mj_makeData(m);
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
|
||||
using DataType = int;
|
||||
constexpr int kInitialCapacity = 10;
|
||||
@@ -76,7 +76,7 @@ TEST(TestMjArrayList, TestMjArrayListSingleThreaded) {
|
||||
EXPECT_EQ(mju_arrayListAt(array_list, kNumElements), nullptr);
|
||||
EXPECT_EQ(mju_arrayListAt(array_list, 100), nullptr);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
@@ -85,7 +85,7 @@ TEST(TestMjArrayList, ZeroInitialCapacity) {
|
||||
mjModel* m = LoadModelFromString("<mujoco/>", nullptr, 0);
|
||||
ASSERT_THAT(m, NotNull()) << "Failed to load model";
|
||||
mjData* d = mj_makeData(m);
|
||||
mjMARKSTACK;
|
||||
mj_markStack(d);
|
||||
mjArrayList* array_list =
|
||||
mju_arrayListCreate(d, sizeof(double), /*initial_capacity=*/0);
|
||||
EXPECT_EQ(mju_arrayListSize(array_list), 0);
|
||||
@@ -101,7 +101,7 @@ TEST(TestMjArrayList, ZeroInitialCapacity) {
|
||||
}
|
||||
EXPECT_EQ(mju_arrayListAt(array_list, 35), nullptr);
|
||||
|
||||
mjFREESTACK;
|
||||
mj_freeStack(d);
|
||||
mj_deleteData(d);
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
@@ -3659,7 +3659,7 @@ public static unsafe extern void mju_addToScl3(double* res, double* vec, double
|
||||
public static unsafe extern void mju_addScl3(double* res, double* vec1, double* vec2, double scl);
|
||||
|
||||
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static unsafe extern double mju_normalize3(double* res);
|
||||
public static unsafe extern double mju_normalize3(double* vec);
|
||||
|
||||
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static unsafe extern double mju_norm3(double* vec);
|
||||
@@ -3689,7 +3689,7 @@ public static unsafe extern void mju_unit4(double* res);
|
||||
public static unsafe extern void mju_copy4(double* res, double* data);
|
||||
|
||||
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static unsafe extern double mju_normalize4(double* res);
|
||||
public static unsafe extern double mju_normalize4(double* vec);
|
||||
|
||||
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static unsafe extern void mju_zero(double* res, int n);
|
||||
@@ -3698,7 +3698,7 @@ public static unsafe extern void mju_zero(double* res, int n);
|
||||
public static unsafe extern void mju_fill(double* res, double val, int n);
|
||||
|
||||
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static unsafe extern void mju_copy(double* res, double* data, int n);
|
||||
public static unsafe extern void mju_copy(double* res, double* vec, int n);
|
||||
|
||||
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static unsafe extern double mju_sum(double* vec, int n);
|
||||
|
||||
Reference in New Issue
Block a user