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>
+9 -9
View File
@@ -459,9 +459,9 @@ TEST_F(ActRangeTest, ActRangeDefaultsPropagate) {
// ------------- test nuser_xxx fields -----------------------------------------
using UserDataTest = MujocoTest;
using XMLReaderTest = MujocoTest;
TEST_F(UserDataTest, NBodyTooSmall) {
TEST_F(XMLReaderTest, NBodyTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_body="2"/>
@@ -476,7 +476,7 @@ TEST_F(UserDataTest, NBodyTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_body"));
}
TEST_F(UserDataTest, NJointTooSmall) {
TEST_F(XMLReaderTest, NJointTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_jnt="2"/>
@@ -494,7 +494,7 @@ TEST_F(UserDataTest, NJointTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_jnt"));
}
TEST_F(UserDataTest, NGeomTooSmall) {
TEST_F(XMLReaderTest, NGeomTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_geom="2"/>
@@ -509,7 +509,7 @@ TEST_F(UserDataTest, NGeomTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_geom"));
}
TEST_F(UserDataTest, NSiteTooSmall) {
TEST_F(XMLReaderTest, NSiteTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_site="2"/>
@@ -524,7 +524,7 @@ TEST_F(UserDataTest, NSiteTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_site"));
}
TEST_F(UserDataTest, NCameraTooSmall) {
TEST_F(XMLReaderTest, NCameraTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_cam="2"/>
@@ -539,7 +539,7 @@ TEST_F(UserDataTest, NCameraTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_cam"));
}
TEST_F(UserDataTest, NTendonTooSmall) {
TEST_F(XMLReaderTest, NTendonTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_tendon="2"/>
@@ -561,7 +561,7 @@ TEST_F(UserDataTest, NTendonTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_tendon"));
}
TEST_F(UserDataTest, NActuatorTooSmall) {
TEST_F(XMLReaderTest, NActuatorTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_actuator="2"/>
@@ -582,7 +582,7 @@ TEST_F(UserDataTest, NActuatorTooSmall) {
EXPECT_THAT(error.data(), HasSubstr("nuser_actuator"));
}
TEST_F(UserDataTest, NSensorTooSmall) {
TEST_F(XMLReaderTest, NSensorTooSmall) {
static constexpr char xml[] = R"(
<mujoco>
<size nuser_sensor="2"/>