Go to file
Varun Agrawal 4c410fcd0e Squashed 'wrap/' changes from 07330d100..d9ae5ce03
d9ae5ce03 Merge pull request #118 from borglab/feature/matlab-multi-files
9adddf7dd update the main script for matlab wrapping
0b0398d46 remove debug statements since they aren't needed for now
df064a364 support for parsing mutiple interface files for Matlab wrapping
1929e197c add test for parsing multiple interface files
bac442056 Merge pull request #117 from borglab/fix/matlab-refactor
331f4a8ce update tests to remove redundant code
5426e3af4 generate all content from within the wrap function
f78612bf9 make directory check common
b7acd7a1f fixed import and test setup
88007b153 Merge pull request #116 from borglab/feature/matlab-refactor
a074896e6 utils -> mixins
414557e00 structure
187100439 update gitignore
adbc55aea don't use class attributes in matlab wrapper
f45ba5b2d broke down some large functions into smaller ones
7756f0548 add mixin for checks and call method to wrap global functions
a318e2a67 Merge pull request #115 from borglab/feature/multiple-modules
b02b74c3d convert matlab_wrapper to a submodule
be8641e83 improved function naming in tests
02ddbfbb0 update tests and docs
dfbded2c7 small fixes
e9ec5af07 update docs
d124e2cfb wrap multiple files
7c7342f86 update cmake to take in new changes for multiple modules
54850f724 Merge pull request #114 from borglab/fix/remove-py35
71ee98321 add mypy annotations
ccaea6294 remove support for python 3.5

git-subtree-dir: wrap
git-subtree-split: d9ae5ce036c4315db3c28b12db9c73eae246f314
2021-07-11 08:10:35 -07:00
.github/workflows Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
cmake Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
docs Squashed 'wrap/' changes from aae9b4605..3eff76f60 2021-03-24 00:36:02 -04:00
gtwrap Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
pybind11 Squashed 'wrap/' changes from 49d831588..314b121fd 2020-09-16 18:03:25 -04:00
scripts Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
sphinx Squashed 'wrap/' content from commit 21ee82f75 2020-08-17 14:44:43 -04:00
templates Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
tests Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
utilities Squashed 'wrap/' content from commit 21ee82f75 2020-08-17 14:44:43 -04:00
.gitignore Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
CMakeLists.txt Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
DOCS.md Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07:00
LICENSE Squashed 'wrap/' changes from dfa624e77..09f8bbf71 2021-01-04 13:11:36 -05:00
README.md Squashed 'wrap/' changes from 07330d100..d9ae5ce03 2021-07-11 08:10:35 -07: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 0124bcc45..07330d100 2021-06-16 13:51:43 -04: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)

set(interface_files ${PROJECT_SOURCE_DIR}/cpp/${PROJECT_NAME}.h)

pybind_wrap(${PROJECT_NAME}_py # target
            "${interface_files}" # list of interface header files
            "${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.

Git subtree and Contributing

*WARNING*: Running the ./update_wrap.sh script from the GTSAM repo creates 2 new commits in GTSAM. Be sure to NOT push these directly to master/develop. Preferably, open up a new PR with these updates (see below).

The wrap library is included in GTSAM as a git subtree. This means that sometimes the wrap library can have new features or changes that are not yet reflected in GTSAM. There are two options to get the most up-to-date versions of wrap:

  1. Clone and install the wrap repository. For external projects, make sure cmake is using the external wrap rather than the one pre-packaged with GTSAM.
  2. Run ./update_wrap.sh from the root of GTSAM's repository to pull in the newest version of wrap to your local GTSAM installation. See the warning above about this script automatically creating commits.

To make a PR on GTSAM with the most recent wrap updates, create a new branch/fork then pull in the most recent wrap changes using ./update_wrap.sh. You should find that two new commits have been made: a squash and a merge from master. You can push these (to the non-develop branch) and open a PR.

For any code contributions to the wrap project, please make them on the wrap repository.