Merge pull request #739 from borglab/feature/wrapupdate_multipleinterfacefiles
						commit
						f95cc0b3a4
					
				|  | @ -8,6 +8,8 @@ The interface to the toolbox is generated automatically by the wrap tool which d | ||||||
| The tool generates matlab proxy objects together with all the native functions for wrapping and unwrapping scalar and non scalar types and objects. | The tool generates matlab proxy objects together with all the native functions for wrapping and unwrapping scalar and non scalar types and objects. | ||||||
| The interface generated by the wrap tool also redirects the standard output stream (cout) to matlab's console. | The interface generated by the wrap tool also redirects the standard output stream (cout) to matlab's console. | ||||||
| 
 | 
 | ||||||
|  | For instructions on updating the version of the [wrap library](https://github.com/borglab/wrap) included in GTSAM to the latest version, please refer to the [wrap README](https://github.com/borglab/wrap/blob/master/README.md#git-subtree-and-contributing) | ||||||
|  | 
 | ||||||
| ## Ubuntu | ## Ubuntu | ||||||
| 
 | 
 | ||||||
| If you have a newer Ubuntu system (later than 10.04), you must make a small modification to your MATLAB installation, due to MATLAB being distributed with an old version of the C++ standard library. Delete or rename all files starting with `libstdc++` in your MATLAB installation directory, in paths: | If you have a newer Ubuntu system (later than 10.04), you must make a small modification to your MATLAB installation, due to MATLAB being distributed with an old version of the C++ standard library. Delete or rename all files starting with `libstdc++` in your MATLAB installation directory, in paths: | ||||||
|  |  | ||||||
|  | @ -4,6 +4,8 @@ | ||||||
| 
 | 
 | ||||||
| This is the Python wrapper around the GTSAM C++ library. We use our custom [wrap library](https://github.com/borglab/wrap) to generate the bindings to the underlying C++ code. | This is the Python wrapper around the GTSAM C++ library. We use our custom [wrap library](https://github.com/borglab/wrap) to generate the bindings to the underlying C++ code. | ||||||
| 
 | 
 | ||||||
|  | For instructions on updating the version of the [wrap library](https://github.com/borglab/wrap) included in GTSAM to the latest version, please refer to the [wrap README](https://github.com/borglab/wrap/blob/master/README.md#git-subtree-and-contributing) | ||||||
|  | 
 | ||||||
| ## Requirements | ## Requirements | ||||||
| 
 | 
 | ||||||
| - If you want to build the GTSAM python library for a specific python version (eg 3.6), | - If you want to build the GTSAM python library for a specific python version (eg 3.6), | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| #include <pybind11/eigen.h> | #include <pybind11/eigen.h> | ||||||
| #include <pybind11/stl_bind.h> | #include <pybind11/stl_bind.h> | ||||||
| #include <pybind11/pybind11.h> | #include <pybind11/pybind11.h> | ||||||
|  | #include <pybind11/iostream.h> | ||||||
| #include "gtsam/config.h" | #include "gtsam/config.h" | ||||||
| #include "gtsam/base/serialization.h" | #include "gtsam/base/serialization.h" | ||||||
| #include "gtsam/nonlinear/utilities.h"  // for RedirectCout. | #include "gtsam/nonlinear/utilities.h"  // for RedirectCout. | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| #include <pybind11/eigen.h> | #include <pybind11/eigen.h> | ||||||
| #include <pybind11/stl_bind.h> | #include <pybind11/stl_bind.h> | ||||||
| #include <pybind11/pybind11.h> | #include <pybind11/pybind11.h> | ||||||
|  | #include <pybind11/iostream.h> | ||||||
| #include "gtsam/base/serialization.h" | #include "gtsam/base/serialization.h" | ||||||
| #include "gtsam/nonlinear/utilities.h"  // for RedirectCout. | #include "gtsam/nonlinear/utilities.h"  // for RedirectCout. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -98,6 +98,7 @@ The python wrapper supports keyword arguments for functions/methods. Hence, the | ||||||
| - Virtual inheritance | - Virtual inheritance | ||||||
|     - Specify fully-qualified base classes, i.e. `virtual class Derived : ns::Base {` where `ns` is the namespace. |     - Specify fully-qualified base classes, i.e. `virtual class Derived : ns::Base {` where `ns` is the namespace. | ||||||
|     - Mark with `virtual` keyword, e.g. `virtual class Base {`, and also `virtual class Derived : ns::Base {`. |     - Mark with `virtual` keyword, e.g. `virtual class Base {`, and also `virtual class Derived : ns::Base {`. | ||||||
|  |     - Base classes can be templated, e.g. `virtual class Dog: ns::Animal<Pet> {};`. This is useful when you want to inherit from specialized classes. | ||||||
|     - Forward declarations must also be marked virtual, e.g. `virtual class ns::Base;` and |     - Forward declarations must also be marked virtual, e.g. `virtual class ns::Base;` and | ||||||
|       also `virtual class ns::Derived;`. |       also `virtual class ns::Derived;`. | ||||||
|     - Pure virtual (abstract) classes should list no constructors in the interface file. |     - Pure virtual (abstract) classes should list no constructors in the interface file. | ||||||
|  |  | ||||||
|  | @ -103,3 +103,37 @@ macro(gtwrap_get_python_version) | ||||||
|   configure_python_variables() |   configure_python_variables() | ||||||
| 
 | 
 | ||||||
| endmacro() | endmacro() | ||||||
|  | 
 | ||||||
|  | # Concatenate multiple wrapper interface headers into one. | ||||||
|  | # The concatenation will be (re)performed if and only if any interface files | ||||||
|  | # change. | ||||||
|  | # | ||||||
|  | # Arguments: | ||||||
|  | # ~~~ | ||||||
|  | # destination: The concatenated master interface header file will be placed here. | ||||||
|  | # inputs (optional): All the input interface header files | ||||||
|  | function(combine_interface_headers | ||||||
|  |          destination | ||||||
|  |          #inputs | ||||||
|  |          ) | ||||||
|  |   # check if any interface headers changed | ||||||
|  |   foreach(INTERFACE_FILE ${ARGN}) | ||||||
|  |     if(NOT EXISTS ${destination} OR | ||||||
|  |       ${INTERFACE_FILE} IS_NEWER_THAN ${destination}) | ||||||
|  |       set(UPDATE_INTERFACE TRUE) | ||||||
|  |     endif() | ||||||
|  |     # trigger cmake on file change | ||||||
|  |     set_property(DIRECTORY | ||||||
|  |                  APPEND | ||||||
|  |                  PROPERTY CMAKE_CONFIGURE_DEPENDS ${INTERFACE_FILE}) | ||||||
|  |   endforeach() | ||||||
|  |   # if so, then update the overall interface file | ||||||
|  |   if (UPDATE_INTERFACE) | ||||||
|  |     file(WRITE ${destination} "") | ||||||
|  |     # append additional interface headers to end of gtdynamics.i | ||||||
|  |     foreach(INTERFACE_FILE ${ARGN}) | ||||||
|  |       file(READ ${INTERFACE_FILE} interface_contents) | ||||||
|  |       file(APPEND ${destination} "${interface_contents}") | ||||||
|  |     endforeach() | ||||||
|  |   endif() | ||||||
|  | endfunction() | ||||||
|  |  | ||||||
|  | @ -279,7 +279,7 @@ class Class: | ||||||
|                 elif isinstance(m, Operator): |                 elif isinstance(m, Operator): | ||||||
|                     self.operators.append(m) |                     self.operators.append(m) | ||||||
| 
 | 
 | ||||||
|     _parent = COLON + Typename.rule("parent_class") |     _parent = COLON + (TemplatedType.rule ^ Typename.rule)("parent_class") | ||||||
|     rule = ( |     rule = ( | ||||||
|         Optional(Template.rule("template"))  # |         Optional(Template.rule("template"))  # | ||||||
|         + Optional(VIRTUAL("is_virtual"))  # |         + Optional(VIRTUAL("is_virtual"))  # | ||||||
|  | @ -319,11 +319,16 @@ class Class: | ||||||
|         self.is_virtual = is_virtual |         self.is_virtual = is_virtual | ||||||
|         self.name = name |         self.name = name | ||||||
|         if parent_class: |         if parent_class: | ||||||
|  |             # If it is in an iterable, extract the parent class. | ||||||
|             if isinstance(parent_class, Iterable): |             if isinstance(parent_class, Iterable): | ||||||
|                 self.parent_class = parent_class[0] |                 parent_class = parent_class[0] | ||||||
|             else: |  | ||||||
|                 self.parent_class = parent_class |  | ||||||
| 
 | 
 | ||||||
|  |             # If the base class is a TemplatedType, | ||||||
|  |             # we want the instantiated Typename | ||||||
|  |             if isinstance(parent_class, TemplatedType): | ||||||
|  |                 parent_class = parent_class.typename | ||||||
|  | 
 | ||||||
|  |             self.parent_class = parent_class | ||||||
|         else: |         else: | ||||||
|             self.parent_class = '' |             self.parent_class = '' | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -125,6 +125,11 @@ class PybindWrapper: | ||||||
|                )) |                )) | ||||||
| 
 | 
 | ||||||
|         if method.name == 'print': |         if method.name == 'print': | ||||||
|  |             # Redirect stdout - see pybind docs for why this is a good idea: | ||||||
|  |             # https://pybind11.readthedocs.io/en/stable/advanced/pycpp/utilities.html#capturing-standard-output-from-ostream | ||||||
|  |             ret = ret.replace('self->', 'py::scoped_ostream_redirect output; self->') | ||||||
|  | 
 | ||||||
|  |             # __repr__() uses print's implementation: | ||||||
|             type_list = method.args.to_cpp(self.use_boost) |             type_list = method.args.to_cpp(self.use_boost) | ||||||
|             if len(type_list) > 0 and type_list[0].strip() == 'string': |             if len(type_list) > 0 and type_list[0].strip() == 'string': | ||||||
|                 ret += '''{prefix}.def("__repr__", |                 ret += '''{prefix}.def("__repr__", | ||||||
|  |  | ||||||
|  | @ -50,6 +50,8 @@ typedef std::set<boost::shared_ptr<MyTemplatePoint2>*> Collector_MyTemplatePoint | ||||||
| static Collector_MyTemplatePoint2 collector_MyTemplatePoint2; | static Collector_MyTemplatePoint2 collector_MyTemplatePoint2; | ||||||
| typedef std::set<boost::shared_ptr<MyTemplateMatrix>*> Collector_MyTemplateMatrix; | typedef std::set<boost::shared_ptr<MyTemplateMatrix>*> Collector_MyTemplateMatrix; | ||||||
| static Collector_MyTemplateMatrix collector_MyTemplateMatrix; | static Collector_MyTemplateMatrix collector_MyTemplateMatrix; | ||||||
|  | typedef std::set<boost::shared_ptr<ForwardKinematicsFactor>*> Collector_ForwardKinematicsFactor; | ||||||
|  | static Collector_ForwardKinematicsFactor collector_ForwardKinematicsFactor; | ||||||
| 
 | 
 | ||||||
| void _deleteAllObjects() | void _deleteAllObjects() | ||||||
| { | { | ||||||
|  | @ -141,6 +143,12 @@ void _deleteAllObjects() | ||||||
|     collector_MyTemplateMatrix.erase(iter++); |     collector_MyTemplateMatrix.erase(iter++); | ||||||
|     anyDeleted = true; |     anyDeleted = true; | ||||||
|   } } |   } } | ||||||
|  |   { for(Collector_ForwardKinematicsFactor::iterator iter = collector_ForwardKinematicsFactor.begin(); | ||||||
|  |       iter != collector_ForwardKinematicsFactor.end(); ) { | ||||||
|  |     delete *iter; | ||||||
|  |     collector_ForwardKinematicsFactor.erase(iter++); | ||||||
|  |     anyDeleted = true; | ||||||
|  |   } } | ||||||
|   if(anyDeleted) |   if(anyDeleted) | ||||||
|     cout << |     cout << | ||||||
|       "WARNING:  Wrap modules with variables in the workspace have been reloaded due to\n" |       "WARNING:  Wrap modules with variables in the workspace have been reloaded due to\n" | ||||||
|  | @ -156,6 +164,7 @@ void _inheritance_RTTIRegister() { | ||||||
|     types.insert(std::make_pair(typeid(MyBase).name(), "MyBase")); |     types.insert(std::make_pair(typeid(MyBase).name(), "MyBase")); | ||||||
|     types.insert(std::make_pair(typeid(MyTemplatePoint2).name(), "MyTemplatePoint2")); |     types.insert(std::make_pair(typeid(MyTemplatePoint2).name(), "MyTemplatePoint2")); | ||||||
|     types.insert(std::make_pair(typeid(MyTemplateMatrix).name(), "MyTemplateMatrix")); |     types.insert(std::make_pair(typeid(MyTemplateMatrix).name(), "MyTemplateMatrix")); | ||||||
|  |     types.insert(std::make_pair(typeid(ForwardKinematicsFactor).name(), "ForwardKinematicsFactor")); | ||||||
| 
 | 
 | ||||||
|     mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); |     mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); | ||||||
|     if(!registry) |     if(!registry) | ||||||
|  | @ -555,6 +564,40 @@ void MyTemplateMatrix_Level_34(int nargout, mxArray *out[], int nargin, const mx | ||||||
|   out[0] = wrap_shared_ptr(boost::make_shared<MyTemplate<Matrix>>(MyTemplate<gtsam::Matrix>::Level(K)),"MyTemplateMatrix", false); |   out[0] = wrap_shared_ptr(boost::make_shared<MyTemplate<Matrix>>(MyTemplate<gtsam::Matrix>::Level(K)),"MyTemplateMatrix", false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Test_set_container_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) | ||||||
|  | { | ||||||
|  |   checkArguments("set_container",nargout,nargin-1,1); | ||||||
|  |   auto obj = unwrap_shared_ptr<Test>(in[0], "ptr_Test"); | ||||||
|  |   boost::shared_ptr<std::vector<testing::Test>> container = unwrap_shared_ptr< std::vector<testing::Test> >(in[1], "ptr_stdvectorTest"); | ||||||
|  |   obj->set_container(*container); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ForwardKinematicsFactor_collectorInsertAndMakeBase_35(int nargout, mxArray *out[], int nargin, const mxArray *in[]) | ||||||
|  | { | ||||||
|  |   mexAtExit(&_deleteAllObjects); | ||||||
|  |   typedef boost::shared_ptr<ForwardKinematicsFactor> Shared; | ||||||
|  | 
 | ||||||
|  |   Shared *self = *reinterpret_cast<Shared**> (mxGetData(in[0])); | ||||||
|  |   collector_ForwardKinematicsFactor.insert(self); | ||||||
|  | 
 | ||||||
|  |   typedef boost::shared_ptr<gtsam::BetweenFactor<gtsam::Pose3>> SharedBase; | ||||||
|  |   out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); | ||||||
|  |   *reinterpret_cast<SharedBase**>(mxGetData(out[0])) = new SharedBase(*self); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ForwardKinematicsFactor_deconstructor_37(int nargout, mxArray *out[], int nargin, const mxArray *in[]) | ||||||
|  | { | ||||||
|  |   typedef boost::shared_ptr<ForwardKinematicsFactor> Shared; | ||||||
|  |   checkArguments("delete_ForwardKinematicsFactor",nargout,nargin,1); | ||||||
|  |   Shared *self = *reinterpret_cast<Shared**>(mxGetData(in[0])); | ||||||
|  |   Collector_ForwardKinematicsFactor::iterator item; | ||||||
|  |   item = collector_ForwardKinematicsFactor.find(self); | ||||||
|  |   if(item != collector_ForwardKinematicsFactor.end()) { | ||||||
|  |     delete self; | ||||||
|  |     collector_ForwardKinematicsFactor.erase(item); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) | void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) | ||||||
| { | { | ||||||
|  | @ -672,6 +715,15 @@ void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) | ||||||
|     case 34: |     case 34: | ||||||
|       MyTemplateMatrix_Level_34(nargout, out, nargin-1, in+1); |       MyTemplateMatrix_Level_34(nargout, out, nargin-1, in+1); | ||||||
|       break; |       break; | ||||||
|  |     case 35: | ||||||
|  |       Test_set_container_35(nargout, out, nargin-1, in+1); | ||||||
|  |       break; | ||||||
|  |     case 36: | ||||||
|  |       ForwardKinematicsFactor_collectorInsertAndMakeBase_35(nargout, out, nargin-1, in+1); | ||||||
|  |       break; | ||||||
|  |     case 37: | ||||||
|  |       ForwardKinematicsFactor_deconstructor_37(nargout, out, nargin-1, in+1); | ||||||
|  |       break; | ||||||
|     } |     } | ||||||
|   } catch(const std::exception& e) { |   } catch(const std::exception& e) { | ||||||
|     mexErrMsgTxt(("Exception from gtsam:\n" + std::string(e.what()) + "\n").c_str()); |     mexErrMsgTxt(("Exception from gtsam:\n" + std::string(e.what()) + "\n").c_str()); | ||||||
|  |  | ||||||
|  | @ -55,6 +55,8 @@ typedef std::set<boost::shared_ptr<MyTemplatePoint2>*> Collector_MyTemplatePoint | ||||||
| static Collector_MyTemplatePoint2 collector_MyTemplatePoint2; | static Collector_MyTemplatePoint2 collector_MyTemplatePoint2; | ||||||
| typedef std::set<boost::shared_ptr<MyTemplateMatrix>*> Collector_MyTemplateMatrix; | typedef std::set<boost::shared_ptr<MyTemplateMatrix>*> Collector_MyTemplateMatrix; | ||||||
| static Collector_MyTemplateMatrix collector_MyTemplateMatrix; | static Collector_MyTemplateMatrix collector_MyTemplateMatrix; | ||||||
|  | typedef std::set<boost::shared_ptr<ForwardKinematicsFactor>*> Collector_ForwardKinematicsFactor; | ||||||
|  | static Collector_ForwardKinematicsFactor collector_ForwardKinematicsFactor; | ||||||
| typedef std::set<boost::shared_ptr<ns1::ClassA>*> Collector_ns1ClassA; | typedef std::set<boost::shared_ptr<ns1::ClassA>*> Collector_ns1ClassA; | ||||||
| static Collector_ns1ClassA collector_ns1ClassA; | static Collector_ns1ClassA collector_ns1ClassA; | ||||||
| typedef std::set<boost::shared_ptr<ns1::ClassB>*> Collector_ns1ClassB; | typedef std::set<boost::shared_ptr<ns1::ClassB>*> Collector_ns1ClassB; | ||||||
|  | @ -158,6 +160,12 @@ void _deleteAllObjects() | ||||||
|     collector_MyTemplateMatrix.erase(iter++); |     collector_MyTemplateMatrix.erase(iter++); | ||||||
|     anyDeleted = true; |     anyDeleted = true; | ||||||
|   } } |   } } | ||||||
|  |   { for(Collector_ForwardKinematicsFactor::iterator iter = collector_ForwardKinematicsFactor.begin(); | ||||||
|  |       iter != collector_ForwardKinematicsFactor.end(); ) { | ||||||
|  |     delete *iter; | ||||||
|  |     collector_ForwardKinematicsFactor.erase(iter++); | ||||||
|  |     anyDeleted = true; | ||||||
|  |   } } | ||||||
|   { for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); |   { for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); | ||||||
|       iter != collector_ns1ClassA.end(); ) { |       iter != collector_ns1ClassA.end(); ) { | ||||||
|     delete *iter; |     delete *iter; | ||||||
|  | @ -209,6 +217,7 @@ void _namespaces_RTTIRegister() { | ||||||
|     types.insert(std::make_pair(typeid(MyBase).name(), "MyBase")); |     types.insert(std::make_pair(typeid(MyBase).name(), "MyBase")); | ||||||
|     types.insert(std::make_pair(typeid(MyTemplatePoint2).name(), "MyTemplatePoint2")); |     types.insert(std::make_pair(typeid(MyTemplatePoint2).name(), "MyTemplatePoint2")); | ||||||
|     types.insert(std::make_pair(typeid(MyTemplateMatrix).name(), "MyTemplateMatrix")); |     types.insert(std::make_pair(typeid(MyTemplateMatrix).name(), "MyTemplateMatrix")); | ||||||
|  |     types.insert(std::make_pair(typeid(ForwardKinematicsFactor).name(), "ForwardKinematicsFactor")); | ||||||
| 
 | 
 | ||||||
|     mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); |     mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); | ||||||
|     if(!registry) |     if(!registry) | ||||||
|  |  | ||||||
|  | @ -58,6 +58,8 @@ typedef std::set<boost::shared_ptr<MyTemplatePoint2>*> Collector_MyTemplatePoint | ||||||
| static Collector_MyTemplatePoint2 collector_MyTemplatePoint2; | static Collector_MyTemplatePoint2 collector_MyTemplatePoint2; | ||||||
| typedef std::set<boost::shared_ptr<MyTemplateMatrix>*> Collector_MyTemplateMatrix; | typedef std::set<boost::shared_ptr<MyTemplateMatrix>*> Collector_MyTemplateMatrix; | ||||||
| static Collector_MyTemplateMatrix collector_MyTemplateMatrix; | static Collector_MyTemplateMatrix collector_MyTemplateMatrix; | ||||||
|  | typedef std::set<boost::shared_ptr<ForwardKinematicsFactor>*> Collector_ForwardKinematicsFactor; | ||||||
|  | static Collector_ForwardKinematicsFactor collector_ForwardKinematicsFactor; | ||||||
| typedef std::set<boost::shared_ptr<ns1::ClassA>*> Collector_ns1ClassA; | typedef std::set<boost::shared_ptr<ns1::ClassA>*> Collector_ns1ClassA; | ||||||
| static Collector_ns1ClassA collector_ns1ClassA; | static Collector_ns1ClassA collector_ns1ClassA; | ||||||
| typedef std::set<boost::shared_ptr<ns1::ClassB>*> Collector_ns1ClassB; | typedef std::set<boost::shared_ptr<ns1::ClassB>*> Collector_ns1ClassB; | ||||||
|  | @ -169,6 +171,12 @@ void _deleteAllObjects() | ||||||
|     collector_MyTemplateMatrix.erase(iter++); |     collector_MyTemplateMatrix.erase(iter++); | ||||||
|     anyDeleted = true; |     anyDeleted = true; | ||||||
|   } } |   } } | ||||||
|  |   { for(Collector_ForwardKinematicsFactor::iterator iter = collector_ForwardKinematicsFactor.begin(); | ||||||
|  |       iter != collector_ForwardKinematicsFactor.end(); ) { | ||||||
|  |     delete *iter; | ||||||
|  |     collector_ForwardKinematicsFactor.erase(iter++); | ||||||
|  |     anyDeleted = true; | ||||||
|  |   } } | ||||||
|   { for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); |   { for(Collector_ns1ClassA::iterator iter = collector_ns1ClassA.begin(); | ||||||
|       iter != collector_ns1ClassA.end(); ) { |       iter != collector_ns1ClassA.end(); ) { | ||||||
|     delete *iter; |     delete *iter; | ||||||
|  | @ -244,6 +252,7 @@ void _special_cases_RTTIRegister() { | ||||||
|     types.insert(std::make_pair(typeid(MyBase).name(), "MyBase")); |     types.insert(std::make_pair(typeid(MyBase).name(), "MyBase")); | ||||||
|     types.insert(std::make_pair(typeid(MyTemplatePoint2).name(), "MyTemplatePoint2")); |     types.insert(std::make_pair(typeid(MyTemplatePoint2).name(), "MyTemplatePoint2")); | ||||||
|     types.insert(std::make_pair(typeid(MyTemplateMatrix).name(), "MyTemplateMatrix")); |     types.insert(std::make_pair(typeid(MyTemplateMatrix).name(), "MyTemplateMatrix")); | ||||||
|  |     types.insert(std::make_pair(typeid(ForwardKinematicsFactor).name(), "ForwardKinematicsFactor")); | ||||||
| 
 | 
 | ||||||
|     mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); |     mxArray *registry = mexGetVariable("global", "gtsamwrap_rttiRegistry"); | ||||||
|     if(!registry) |     if(!registry) | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ PYBIND11_MODULE(class_py, m_) { | ||||||
|         .def("create_ptrs",[](Test* self){return self->create_ptrs();}) |         .def("create_ptrs",[](Test* self){return self->create_ptrs();}) | ||||||
|         .def("create_MixedPtrs",[](Test* self){return self->create_MixedPtrs();}) |         .def("create_MixedPtrs",[](Test* self){return self->create_MixedPtrs();}) | ||||||
|         .def("return_ptrs",[](Test* self, std::shared_ptr<Test> p1, std::shared_ptr<Test> p2){return self->return_ptrs(p1, p2);}, py::arg("p1"), py::arg("p2")) |         .def("return_ptrs",[](Test* self, std::shared_ptr<Test> p1, std::shared_ptr<Test> p2){return self->return_ptrs(p1, p2);}, py::arg("p1"), py::arg("p2")) | ||||||
|         .def("print_",[](Test* self){ self->print();}) |         .def("print_",[](Test* self){ py::scoped_ostream_redirect output; self->print();}) | ||||||
|         .def("__repr__", |         .def("__repr__", | ||||||
|                     [](const Test &a) { |                     [](const Test &a) { | ||||||
|                         gtsam::RedirectCout redirect; |                         gtsam::RedirectCout redirect; | ||||||
|  |  | ||||||
|  | @ -54,6 +54,8 @@ PYBIND11_MODULE(inheritance_py, m_) { | ||||||
|         .def("return_ptrs",[](MyTemplate<gtsam::Matrix>* self, const std::shared_ptr<gtsam::Matrix> p1, const std::shared_ptr<gtsam::Matrix> p2){return self->return_ptrs(p1, p2);}, py::arg("p1"), py::arg("p2")) |         .def("return_ptrs",[](MyTemplate<gtsam::Matrix>* self, const std::shared_ptr<gtsam::Matrix> p1, const std::shared_ptr<gtsam::Matrix> p2){return self->return_ptrs(p1, p2);}, py::arg("p1"), py::arg("p2")) | ||||||
|         .def_static("Level",[](const gtsam::Matrix& K){return MyTemplate<gtsam::Matrix>::Level(K);}, py::arg("K")); |         .def_static("Level",[](const gtsam::Matrix& K){return MyTemplate<gtsam::Matrix>::Level(K);}, py::arg("K")); | ||||||
| 
 | 
 | ||||||
|  |     py::class_<ForwardKinematicsFactor, gtsam::BetweenFactor<gtsam::Pose3>, std::shared_ptr<ForwardKinematicsFactor>>(m_, "ForwardKinematicsFactor"); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #include "python/specializations.h" | #include "python/specializations.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,3 +22,6 @@ virtual class MyTemplate : MyBase { | ||||||
| 
 | 
 | ||||||
|   static This Level(const T& K); |   static This Level(const T& K); | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | virtual class ForwardKinematicsFactor : gtsam::BetweenFactor<gtsam::Pose3> {}; | ||||||
|  |  | ||||||
|  | @ -388,6 +388,15 @@ class TestInterfaceParser(unittest.TestCase): | ||||||
|                          ret.parent_class.namespaces) |                          ret.parent_class.namespaces) | ||||||
|         self.assertTrue(ret.is_virtual) |         self.assertTrue(ret.is_virtual) | ||||||
| 
 | 
 | ||||||
|  |         ret = Class.rule.parseString( | ||||||
|  |             "class ForwardKinematicsFactor : gtsam::BetweenFactor<gtsam::Pose3> {};" | ||||||
|  |         )[0] | ||||||
|  |         self.assertEqual("ForwardKinematicsFactor", ret.name) | ||||||
|  |         self.assertEqual("BetweenFactor", ret.parent_class.name) | ||||||
|  |         self.assertEqual(["gtsam"], ret.parent_class.namespaces) | ||||||
|  |         self.assertEqual("Pose3", ret.parent_class.instantiations[0].name) | ||||||
|  |         self.assertEqual(["gtsam"], ret.parent_class.instantiations[0].namespaces) | ||||||
|  | 
 | ||||||
|     def test_include(self): |     def test_include(self): | ||||||
|         """Test for include statements.""" |         """Test for include statements.""" | ||||||
|         include = Include.rule.parseString( |         include = Include.rule.parseString( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue