Dynamically allocate contact and efc_ arrays on a new memory arena.

- Add private function `mj_arenaAlloc`. This is used internally to allocate memory from the arena.

- Add private function `mj_nefc` to count constraints. This function returns a tight upper bound on `d->nefc`. The number of counted constraints can be slightly bigger than exact `d->nefc` in the case of constraints with empty Jacobian, as when placing a frictional tendon between two world sites.

- Add new `memory` attribute to the `size` XML element for specification of arena memory size. This attribute is mutually exclusive with `nstack` and `njmax` specifications, which are now deprecated (but left around for the time being for legacy compatibility).

- Move `d->stack` to the end of the new arena space. The stack now grows in reverse from the end.

PiperOrigin-RevId: 479341539
Change-Id: Ie019c202e0908577ffc6f833a37920858116f667
This commit is contained in:
Saran Tunyasuvunakool
2022-10-06 10:02:35 -07:00
committed by Copybara-Service
parent 4d85a464cc
commit 58fd72f53d
29 changed files with 1281 additions and 433 deletions
+9 -9
View File
@@ -27,7 +27,7 @@ namespace mujoco {
namespace {
using ::testing::ElementsAre;
using UserDataTest = MujocoTest;
using XMLReaderTest = MujocoTest;
static std::vector<mjtNum> GetRow(const mjtNum* array, int ncolumn, int row) {
return std::vector<mjtNum>(array + ncolumn * row,
@@ -36,7 +36,7 @@ static std::vector<mjtNum> GetRow(const mjtNum* array, int ncolumn, int row) {
// ------------- test automatic inference of nuser_xxx -------------------------
TEST_F(UserDataTest, AutoNUserBody) {
TEST_F(XMLReaderTest, AutoNUserBody) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -52,7 +52,7 @@ TEST_F(UserDataTest, AutoNUserBody) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserJoint) {
TEST_F(XMLReaderTest, AutoNUserJoint) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -71,7 +71,7 @@ TEST_F(UserDataTest, AutoNUserJoint) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserGeom) {
TEST_F(XMLReaderTest, AutoNUserGeom) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -87,7 +87,7 @@ TEST_F(UserDataTest, AutoNUserGeom) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserSite) {
TEST_F(XMLReaderTest, AutoNUserSite) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -103,7 +103,7 @@ TEST_F(UserDataTest, AutoNUserSite) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserCamera) {
TEST_F(XMLReaderTest, AutoNUserCamera) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -119,7 +119,7 @@ TEST_F(UserDataTest, AutoNUserCamera) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserTendon) {
TEST_F(XMLReaderTest, AutoNUserTendon) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -145,7 +145,7 @@ TEST_F(UserDataTest, AutoNUserTendon) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserActuator) {
TEST_F(XMLReaderTest, AutoNUserActuator) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>
@@ -169,7 +169,7 @@ TEST_F(UserDataTest, AutoNUserActuator) {
mj_deleteModel(m);
}
TEST_F(UserDataTest, AutoNUserSensor) {
TEST_F(XMLReaderTest, AutoNUserSensor) {
static constexpr char xml[] = R"(
<mujoco>
<worldbody>