From dcf2816543dd6b1fda14faa2b6d242c3b9c60f7f Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Fri, 18 Oct 2024 11:54:00 -0700 Subject: [PATCH] Remove copy_back from Python bindings and mj_copyBack from the C API. PiperOrigin-RevId: 687377331 Change-Id: I355493d92857418b08b5aa90ea38cebe5c475314 --- doc/APIreference/functions.rst | 9 --------- doc/includes/references.h | 1 - include/mujoco/mujoco.h | 3 --- introspect/functions.py | 20 -------------------- python/mujoco/specs.cc | 6 ------ src/user/user_api.cc | 8 -------- src/user/user_api.h | 3 --- src/xml/xml.cc | 4 ++-- src/xml/xml.h | 2 +- src/xml/xml_api.cc | 7 +++---- src/xml/xml_base.cc | 3 ++- src/xml/xml_base.h | 2 +- src/xml/xml_native_writer.cc | 9 ++++++--- src/xml/xml_native_writer.h | 3 ++- 14 files changed, 17 insertions(+), 63 deletions(-) diff --git a/doc/APIreference/functions.rst b/doc/APIreference/functions.rst index a0af1021..1358aae5 100644 --- a/doc/APIreference/functions.rst +++ b/doc/APIreference/functions.rst @@ -87,15 +87,6 @@ mj_freeLastXML Free last XML model if loaded. Called internally at each load. -.. _mj_copyBack: - -mj_copyBack -~~~~~~~~~~~ - -.. mujoco-include:: mj_copyBack - -Copy (possibly modified) model fields back into spec. - .. _mj_saveXMLString: mj_saveXMLString diff --git a/doc/includes/references.h b/doc/includes/references.h index 86fa0e80..6c02494c 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -3133,7 +3133,6 @@ mjModel* mj_compile(mjSpec* s, const mjVFS* vfs); int mj_recompile(mjSpec* s, const mjVFS* vfs, mjModel* m, mjData* d); int mj_saveLastXML(const char* filename, const mjModel* m, char* error, int error_sz); void mj_freeLastXML(void); -void mj_copyBack(mjSpec* s, const mjModel* m); int mj_saveXMLString(const mjSpec* s, char* xml, int xml_sz, char* error, int error_sz); int mj_saveXML(const mjSpec* s, const char* filename, char* error, int error_sz); void mj_step(const mjModel* m, mjData* d); diff --git a/include/mujoco/mujoco.h b/include/mujoco/mujoco.h index 6051f15b..026abf0c 100644 --- a/include/mujoco/mujoco.h +++ b/include/mujoco/mujoco.h @@ -117,9 +117,6 @@ MJAPI int mj_saveLastXML(const char* filename, const mjModel* m, char* error, in // Free last XML model if loaded. Called internally at each load. MJAPI void mj_freeLastXML(void); -// Copy (possibly modified) model fields back into spec. -MJAPI void mj_copyBack(mjSpec* s, const mjModel* m); - // Save spec to XML string, return 1 on success, 0 otherwise. MJAPI int mj_saveXMLString(const mjSpec* s, char* xml, int xml_sz, char* error, int error_sz); diff --git a/introspect/functions.py b/introspect/functions.py index c7141860..8142a70a 100644 --- a/introspect/functions.py +++ b/introspect/functions.py @@ -317,26 +317,6 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([ parameters=(), doc='Free last XML model if loaded. Called internally at each load.', )), - ('mj_copyBack', - FunctionDecl( - name='mj_copyBack', - return_type=ValueType(name='void'), - parameters=( - FunctionParameterDecl( - name='s', - type=PointerType( - inner_type=ValueType(name='mjSpec'), - ), - ), - FunctionParameterDecl( - name='m', - type=PointerType( - inner_type=ValueType(name='mjModel', is_const=True), - ), - ), - ), - doc='Copy (possibly modified) model fields back into spec.', - )), ('mj_saveXMLString', FunctionDecl( name='mj_saveXMLString', diff --git a/python/mujoco/specs.cc b/python/mujoco/specs.cc index 63e94005..b70ac9a7 100644 --- a/python/mujoco/specs.cc +++ b/python/mujoco/specs.cc @@ -335,12 +335,6 @@ PYBIND11_MODULE(_specs, m) { A dictionary of assets to be used by the spec. The keys are asset names and the values are asset contents. )mydelimiter"); - mjSpec.def( - "copy_back", - [](MjSpec& self, raw::MjModel& model) { - return mj_copyBack(self.ptr, &model); - }, - py::return_value_policy::reference_internal); mjSpec.def("to_xml", [](MjSpec& self) -> std::string { int size = mj_saveXMLString(self.ptr, nullptr, 0, nullptr, 0); std::unique_ptr buf(new char[size + 1]); diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 9869141a..a1412146 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -75,14 +75,6 @@ mjSpec* mj_copySpec(const mjSpec* s) { -// copy back model -void mj_copyBack(mjSpec* s, const mjModel* m) { - mjCModel* modelC = static_cast(s->element); - modelC->CopyBack(m); -} - - - // compile model mjModel* mj_compile(mjSpec* s, const mjVFS* vfs) { mjCModel* modelC = static_cast(s->element); diff --git a/src/user/user_api.h b/src/user/user_api.h index 09812508..25d6106c 100644 --- a/src/user/user_api.h +++ b/src/user/user_api.h @@ -54,9 +54,6 @@ MJAPI const char* mjs_getError(mjSpec* s); // Return 1 if compiler error is a warning. MJAPI int mjs_isWarning(mjSpec* s); -// Copy model fields back into spec. -MJAPI void mj_copyBack(mjSpec* s, const mjModel* m); - // Delete spec. MJAPI void mj_deleteSpec(mjSpec* s); diff --git a/src/xml/xml.cc b/src/xml/xml.cc index 24196f8a..55aefeb5 100644 --- a/src/xml/xml.cc +++ b/src/xml/xml.cc @@ -395,7 +395,7 @@ mjSpec* ParseSpecFromString(std::string_view xml, char* error, int nerror) { } // Main writer function - calls mjXWrite -std::string WriteXML(const mjSpec* spec, char* error, int nerror) { +std::string WriteXML(const mjModel* m, const mjSpec* spec, char* error, int nerror) { LocaleOverride locale_override; // check for empty model @@ -405,7 +405,7 @@ std::string WriteXML(const mjSpec* spec, char* error, int nerror) { } mjXWriter writer; - writer.SetModel(spec); + writer.SetModel(spec, m); try { return writer.Write(error, nerror); diff --git a/src/xml/xml.h b/src/xml/xml.h index d83f026a..bc615d90 100644 --- a/src/xml/xml.h +++ b/src/xml/xml.h @@ -29,6 +29,6 @@ mjSpec* ParseXML(const char* filename, const mjVFS* vfs, char* error, int nerror mjSpec* ParseSpecFromString(std::string_view xml, char* error = nullptr, int nerror = 0); // Main writer function -std::string WriteXML(const mjSpec* spec, char* error, int nerror); +std::string WriteXML(const mjModel* m, const mjSpec* spec, char* error, int nerror); #endif // MUJOCO_SRC_XML_XML_H_ diff --git a/src/xml/xml_api.cc b/src/xml/xml_api.cc index 31deeec8..f808c23b 100644 --- a/src/xml/xml_api.cc +++ b/src/xml/xml_api.cc @@ -62,8 +62,7 @@ std::optional GlobalModel::ToXML(const mjModel* m, char* error, mjCopyError(error, "No XML model loaded", error_sz); return std::nullopt; } - mj_copyBack(spec_, m); - std::string result = WriteXML(spec_, error, error_sz); + std::string result = WriteXML(m, spec_, error, error_sz); if (result.empty()) { return std::nullopt; } @@ -229,7 +228,7 @@ mjSpec* mj_parseXMLString(const char* xml, const mjVFS* vfs, char* error, int er // save spec to XML file, return 1 on success, 0 otherwise int mj_saveXML(const mjSpec* s, const char* filename, char* error, int error_sz) { - std::string result = WriteXML(s, error, error_sz); + std::string result = WriteXML(NULL, s, error, error_sz); if (result.empty()) { return 0; } @@ -245,7 +244,7 @@ int mj_saveXML(const mjSpec* s, const char* filename, char* error, int error_sz) // save spec to string, return 1 on success, 0 otherwise int mj_saveXMLString(const mjSpec* s, char* xml, int xml_sz, char* error, int error_sz) { - std::string result = WriteXML(s, error, error_sz); + std::string result = WriteXML(NULL, s, error, error_sz); if (result.size() >= xml_sz) { std::string error_msg = "Output string too short, should be at least " + std::to_string(result.size()+1); diff --git a/src/xml/xml_base.cc b/src/xml/xml_base.cc index 0563d248..1a1dd1b9 100644 --- a/src/xml/xml_base.cc +++ b/src/xml/xml_base.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include "xml/xml_util.h" #include "tinyxml2.h" @@ -43,7 +44,7 @@ mjXBase::mjXBase() { // set model field -void mjXBase::SetModel(const mjSpec* _model) { +void mjXBase::SetModel(const mjSpec* _model, const mjModel* m) { spec = (mjSpec*)_model; } diff --git a/src/xml/xml_base.h b/src/xml/xml_base.h index 40df63b5..23268ea0 100644 --- a/src/xml/xml_base.h +++ b/src/xml/xml_base.h @@ -88,7 +88,7 @@ class mjXBase : public mjXUtil { }; // set the model allocated externally - virtual void SetModel(const mjSpec*); + virtual void SetModel(const mjSpec*, const mjModel* = nullptr); // read alternative orientation specification static int ReadAlternative(tinyxml2::XMLElement* elem, mjsOrientation& alt); diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index f3f7b085..e4805fef 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -853,9 +853,12 @@ mjXWriter::mjXWriter(void) { // cast model -void mjXWriter::SetModel(const mjSpec* spec) { - if (spec) { - model = (mjCModel*)spec->element; +void mjXWriter::SetModel(const mjSpec* _spec, const mjModel* m) { + if (_spec) { + model = (mjCModel*)_spec->element; + } + if (m) { + model->CopyBack(m); } } diff --git a/src/xml/xml_native_writer.h b/src/xml/xml_native_writer.h index b1d90910..b4941429 100644 --- a/src/xml/xml_native_writer.h +++ b/src/xml/xml_native_writer.h @@ -19,6 +19,7 @@ #include #include +#include #include #include "user/user_objects.h" #include "xml/xml_base.h" @@ -28,7 +29,7 @@ class mjXWriter : public mjXBase { public: mjXWriter(); // constructor virtual ~mjXWriter() = default; // destructor - void SetModel(const mjSpec* spec); + void SetModel(const mjSpec* _spec, const mjModel* m = nullptr); // write XML document to string std::string Write(char *error, std::size_t error_sz);