Go to file
Varun Agrawal db373dfa52 Squashed 'wrap/' changes from bae34fac8..b80bc63cf
b80bc63cf Merge pull request #90 from borglab/fix/tpl_dependency
015b12da5 Merge pull request #86 from borglab/feature/optionalargs
362851980 address review comments
e461ca50e Merge pull request #89 from borglab/fix/template_iostream
2d413db57 add pybind cpp generation dependency on tpl file
79881c25e include pybind11 iostream for ostream_redirect in example tpl
5e8323c25 fix test fixture
95495726a Merge branch 'master' into feature/optionalargs
5af826840 clean up the _py_args_names method to reduce copy-pasta
844ff9229 add identifier parsing to _type
c3adca7a4 remove extra spaces from Type repr
350b531d7 slight test improvement
fd4f37578 cleaner default argument parsing
6013deacb overpowered default argument parsing rule
dbcda0ea2 fix unit tests for __repr__ ref  vs ptr
1c23c42e4 fix pointer vs const ref in __repr__
9b40350f1 update matlab tests
df7e9023c handle __repr__ with default arguments
092ef489b update pybind_wrapper for default arguments
3a2d7aa8a unit test default argument pybind
61a2b114e implement default argument parser
c2b92ffec unit test for parsing default arguments

git-subtree-dir: wrap
git-subtree-split: b80bc63cf466f9751e8059c0abb4a4d73b23efbe
2021-04-16 21:07:09 -04:00
.github/workflows Squashed 'wrap/' changes from 3eff76f60..548e61b1f 2021-03-24 16:14:55 -04:00
cmake Squashed 'wrap/' changes from bae34fac8..b80bc63cf 2021-04-16 21:07:09 -04:00
docs Squashed 'wrap/' changes from aae9b4605..3eff76f60 2021-03-24 00:36:02 -04:00
gtwrap Squashed 'wrap/' changes from bae34fac8..b80bc63cf 2021-04-16 21:07:09 -04:00
pybind11 Squashed 'wrap/' changes from 49d831588..314b121fd 2020-09-16 18:03:25 -04:00
scripts Squashed 'wrap/' changes from b0eb968f2..d19cda546 2021-03-13 12:01:28 -05:00
sphinx Squashed 'wrap/' content from commit 21ee82f75 2020-08-17 14:44:43 -04:00
templates Squashed 'wrap/' changes from bae34fac8..b80bc63cf 2021-04-16 21:07:09 -04:00
tests Squashed 'wrap/' changes from bae34fac8..b80bc63cf 2021-04-16 21:07:09 -04:00
utilities Squashed 'wrap/' content from commit 21ee82f75 2020-08-17 14:44:43 -04:00
.gitignore Squashed 'wrap/' changes from 96ccdfd0b..5ddaff8ba 2021-04-01 23:20:12 -04:00
CMakeLists.txt Squashed 'wrap/' changes from 96ccdfd0b..5ddaff8ba 2021-04-01 23:20:12 -04:00
DOCS.md Squashed 'wrap/' changes from 5ddaff8ba..bae34fac8 2021-04-12 19:08:29 -04:00
LICENSE Squashed 'wrap/' changes from dfa624e77..09f8bbf71 2021-01-04 13:11:36 -05:00
README.md Squashed 'wrap/' changes from b0eb968f2..d19cda546 2021-03-13 12:01:28 -05:00
matlab.h Squashed 'wrap/' content from commit 21ee82f75 2020-08-17 14:44:43 -04:00
requirements.txt Squashed 'wrap/' changes from aae9b4605..3eff76f60 2021-03-24 00:36:02 -04:00
setup.py Squashed 'wrap/' changes from 186ed2c79..85d34351c 2021-01-13 10:54:22 -05:00

README.md

WRAP

The wrap library wraps the GTSAM library into a Python library or MATLAB toolbox. It was designed to be more general than just wrapping GTSAM. For notes on creating a wrap interface, see gtsam.h for what features can be wrapped into a toolbox, as well as the current state of the toolbox for GTSAM.

Prerequisites

Pybind11 and pyparsing

  1. This library uses pybind11, which is included as a subdirectory in GTSAM.
  2. The interface_parser.py in this library uses pyparsing to parse the interface file gtsam.h. Please install it first in your current Python environment before attempting the build.
python3 -m pip install pyparsing

Getting Started

Clone this repository to your local machine and perform the standard CMake install:

mkdir build && cd build
cmake ..
make install # use sudo if needed

Using wrap in your project is straightforward from here. In your CMakeLists.txt file, you just need to add the following:

find_package(gtwrap)

pybind_wrap(${PROJECT_NAME}_py # target
            ${PROJECT_SOURCE_DIR}/cpp/${PROJECT_NAME}.h # interface header file
            "${PROJECT_NAME}.cpp" # the generated cpp
            "${PROJECT_NAME}" # module_name
            "${PROJECT_MODULE_NAME}" # top namespace in the cpp file e.g. gtsam
            "${ignore}" # ignore classes
            ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.tpl # the wrapping template file
            ${PROJECT_NAME} # libs
            "${PROJECT_NAME}" # dependencies
            ON # use boost
            )

For more information, please follow our tutorial.

Documentation

Documentation for wrapping C++ code can be found here.

Python Wrapper

WARNING: On macOS, you have to statically build GTSAM to use the wrapper.

  1. Set GTSAM_BUILD_PYTHON=ON while configuring the build with cmake.

  2. What you can do in the build folder:

    1. Just run python then import GTSAM and play around:

      import gtsam
      gtsam.__dir__()
      
    2. Run the unittests:

      python -m unittest discover
      
    3. Edit the unittests in python/gtsam/*.py and simply rerun the test. They were symlinked to <build_folder>/gtsam/*.py to facilitate fast development. python -m unittest gtsam/tests/test_Pose3.py - NOTE: You might need to re-run cmake .. if files are deleted or added.

  3. Do make install and cd <gtsam_install_folder>/python. Here, you can:

    1. Run the unittests:
      python setup.py test
      
    2. Install gtsam to your current Python environment.
      python setup.py install
      
      • NOTE: It's a good idea to create a virtual environment otherwise it will be installed in your system Python's site-packages.

Matlab Wrapper

In the CMake, simply include the MatlabWrap.cmake file.

include(MatlabWrap)

This cmake file defines functions for generating MATLAB wrappers.

  • wrap_and_install_library(interfaceHeader linkLibraries extraIncludeDirs extraMexFlags) Generates wrap code and compiles the wrapper.

Usage example:

`wrap_and_install_library("lba.h" "" "" "")`

Arguments:

  • interfaceHeader: The relative or absolute path to the wrapper interface definition file.
  • linkLibraries: Any additional libraries to link. Your project library (e.g. lba), libraries it depends on, and any necessary MATLAB libraries will be linked automatically. So normally, leave this empty.
  • extraIncludeDirs: Any additional include paths required by dependent libraries that have not already been added by include_directories. Again, normally, leave this empty.
  • extraMexFlags: Any additional flags to pass to the compiler when building the wrap code. Normally, leave this empty.