Go to file
Varun Agrawal 56bede07cd Squashed 'wrap/' changes from 0124bcc45..07330d100
07330d100 Merge pull request #113 from borglab/fix/reserved-keywords
ec6b8f037 update test
f022ba516 update and ignore reserved keywords for both functions and methods
4f988e5ad Merge pull request #112 from borglab/fix/cleanup
55bba2e6d fix variable annotations
61720ca0b support python 3.5 in the CI
0975d6529 version bump
e8109917c use args.list() instead of args.args_list
6d0a91d7d renames args_names to names
4ce060b44 Merge pull request #111 from borglab/fix/default-bug
ce7eea318 updated tests to capture bug
b7650ec07 Fix bug for default in methods
4108854c7 Merge pull request #107 from borglab/feature/print
528ee64ce Merge pull request #110 from borglab/fix/variable-annotation
e069f8bfc use old style variable annotation
5fd300116 update test fixture
a25c2df0f use separate function to wrap global functions
58499a74b Merge pull request #106 from borglab/feature/consistent_names
2fe92b693 rename from cpp_class to to_cpp
3a3ba5963 Merge pull request #105 from borglab/cleanup
e27a7b833 unskip tests
0db1839c4 Merge pull request #104 from borglab/feature/forward-class-declaration
e3e7fbb27 remove unused imports
a3c125065 encapsulate parsing and instantiation within wrap method in a functional way
69bbbe992 wrap instantiated declaration
dbc44e7d5 added test for forward declaration typedef
6bec3cb8b add template instantation for typedefs of forward declarations
8d70c15ed updated Declaration to allow for wrapping
0637c2b3f remove print debugging statement
deb8291ac allow forward declarations to be used for typedefs
69d660899 Merge pull request #101 from borglab/feature/object-default-parameters
ec5555e56 formatting and docs
cdaabc043 Merge branch 'feature/object-default-parameters' of github.com:borglab/wrap into feature/object-default-parameters
8ab0b0fa7 new parsing rule
0638a1937 update DEFAULT_ARG rule to support vector initializer list
83d2b761c update tests
7bb8c5494 more tests
1eaf6ba4a refactor default arg feature and add more tests
94f373ca9 tests
534e8a6dd support object types as default arguments
05e8ea855 Merge pull request #99 from borglab/fix/default_arg_0
1fdfeae6a address review comments
25b109c3f fix matlab unit test
6bb1b0c46 fix declaration order in unit test "expected"
7ee2d5fa4 don't unquote QuotedStrings that way we don't have to deal with strings manually.
c915f4963 failing unit test : literals are not wrapped properly
d47b6e8be default arg of 0 - interface_parser unit test
ccf693641 fix for allow default arg of 0
3534c06e9 unit tests for default arg of 0

git-subtree-dir: wrap
git-subtree-split: 07330d10022130e4284743341ac9d54a0dcb3d9f
2021-06-16 13:51:43 -04:00
.github/workflows Squashed 'wrap/' changes from 0124bcc45..07330d100 2021-06-16 13:51:43 -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 0124bcc45..07330d100 2021-06-16 13:51:43 -04:00
pybind11 Squashed 'wrap/' changes from 49d831588..314b121fd 2020-09-16 18:03:25 -04:00
scripts Squashed 'wrap/' changes from 0124bcc45..07330d100 2021-06-16 13:51:43 -04:00
sphinx Squashed 'wrap/' content from commit 21ee82f75 2020-08-17 14:44:43 -04:00
templates Squashed 'wrap/' changes from 903694b77..b2144a712 2021-04-20 17:05:32 -04:00
tests Squashed 'wrap/' changes from 0124bcc45..07330d100 2021-06-16 13:51:43 -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 903694b77..b2144a712 2021-04-20 17:05:32 -04:00
DOCS.md Squashed 'wrap/' changes from 0124bcc45..07330d100 2021-06-16 13:51:43 -04:00
LICENSE Squashed 'wrap/' changes from dfa624e77..09f8bbf71 2021-01-04 13:11:36 -05:00
README.md Squashed 'wrap/' changes from b2144a712..0124bcc45 2021-04-21 00:01:05 -04: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)

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.

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.