Merge pull request #1281 from borglab/feature/python_nlhg
Add wrapping for hybrid nonlinearrelease/4.3a0
						commit
						41b535461a
					
				| 
						 | 
				
			
			@ -26,6 +26,12 @@ void HybridNonlinearFactorGraph::add(
 | 
			
		|||
  FactorGraph::add(boost::make_shared<HybridNonlinearFactor>(factor));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
void HybridNonlinearFactorGraph::add(
 | 
			
		||||
    boost::shared_ptr<DiscreteFactor> factor) {
 | 
			
		||||
  FactorGraph::add(boost::make_shared<HybridDiscreteFactor>(factor));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
void HybridNonlinearFactorGraph::print(const std::string& s,
 | 
			
		||||
                                       const KeyFormatter& keyFormatter) const {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,6 +112,9 @@ class GTSAM_EXPORT HybridNonlinearFactorGraph : public HybridFactorGraph {
 | 
			
		|||
  /// Add a nonlinear factor as a shared ptr.
 | 
			
		||||
  void add(boost::shared_ptr<NonlinearFactor> factor);
 | 
			
		||||
 | 
			
		||||
  /// Add a discrete factor as a shared ptr.
 | 
			
		||||
  void add(boost::shared_ptr<DiscreteFactor> factor);
 | 
			
		||||
 | 
			
		||||
  /// Print the factor graph.
 | 
			
		||||
  void print(
 | 
			
		||||
      const std::string& s = "HybridNonlinearFactorGraph",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,17 @@ virtual class HybridConditional {
 | 
			
		|||
  bool equals(const gtsam::HybridConditional& other, double tol = 1e-9) const;
 | 
			
		||||
  size_t nrFrontals() const;
 | 
			
		||||
  size_t nrParents() const;
 | 
			
		||||
  Factor* inner();
 | 
			
		||||
  gtsam::Factor* inner();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <gtsam/hybrid/HybridDiscreteFactor.h>
 | 
			
		||||
virtual class HybridDiscreteFactor {
 | 
			
		||||
  HybridDiscreteFactor(gtsam::DecisionTreeFactor dtf);
 | 
			
		||||
  void print(string s = "HybridDiscreteFactor\n",
 | 
			
		||||
             const gtsam::KeyFormatter& keyFormatter =
 | 
			
		||||
                 gtsam::DefaultKeyFormatter) const;
 | 
			
		||||
  bool equals(const gtsam::HybridDiscreteFactor& other, double tol = 1e-9) const;
 | 
			
		||||
  gtsam::Factor* inner();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <gtsam/hybrid/GaussianMixtureFactor.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -132,6 +142,7 @@ class HybridGaussianFactorGraph {
 | 
			
		|||
  void add(gtsam::JacobianFactor* factor);
 | 
			
		||||
 | 
			
		||||
  bool empty() const;
 | 
			
		||||
  void remove(size_t i);
 | 
			
		||||
  size_t size() const;
 | 
			
		||||
  gtsam::KeySet keys() const;
 | 
			
		||||
  const gtsam::HybridFactor* at(size_t i) const;
 | 
			
		||||
| 
						 | 
				
			
			@ -159,4 +170,50 @@ class HybridGaussianFactorGraph {
 | 
			
		|||
      const gtsam::DotWriter& writer = gtsam::DotWriter()) const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <gtsam/hybrid/HybridNonlinearFactorGraph.h>
 | 
			
		||||
class HybridNonlinearFactorGraph {
 | 
			
		||||
  HybridNonlinearFactorGraph();
 | 
			
		||||
  HybridNonlinearFactorGraph(const gtsam::HybridNonlinearFactorGraph& graph);
 | 
			
		||||
  void push_back(gtsam::HybridFactor* factor);
 | 
			
		||||
  void push_back(gtsam::NonlinearFactor* factor);
 | 
			
		||||
  void push_back(gtsam::HybridDiscreteFactor* factor);
 | 
			
		||||
  void add(gtsam::NonlinearFactor* factor);
 | 
			
		||||
  void add(gtsam::DiscreteFactor* factor);
 | 
			
		||||
  gtsam::HybridGaussianFactorGraph linearize(const gtsam::Values& continuousValues) const;
 | 
			
		||||
 | 
			
		||||
  bool empty() const;
 | 
			
		||||
  void remove(size_t i);
 | 
			
		||||
  size_t size() const;
 | 
			
		||||
  gtsam::KeySet keys() const;
 | 
			
		||||
  const gtsam::HybridFactor* at(size_t i) const;
 | 
			
		||||
 | 
			
		||||
  void print(string s = "HybridNonlinearFactorGraph\n",
 | 
			
		||||
       const gtsam::KeyFormatter& keyFormatter =
 | 
			
		||||
       gtsam::DefaultKeyFormatter) const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#include <gtsam/hybrid/MixtureFactor.h>
 | 
			
		||||
class MixtureFactor : gtsam::HybridFactor {
 | 
			
		||||
  MixtureFactor(const gtsam::KeyVector& keys, const gtsam::DiscreteKeys& discreteKeys,
 | 
			
		||||
                const gtsam::DecisionTree<gtsam::Key, gtsam::NonlinearFactor*>& factors, bool normalized = false);
 | 
			
		||||
 | 
			
		||||
  template <FACTOR = {gtsam::NonlinearFactor}>
 | 
			
		||||
  MixtureFactor(const gtsam::KeyVector& keys, const gtsam::DiscreteKeys& discreteKeys,
 | 
			
		||||
                const std::vector<FACTOR*>& factors,
 | 
			
		||||
                bool normalized = false);
 | 
			
		||||
 | 
			
		||||
  double error(const gtsam::Values& continuousVals,
 | 
			
		||||
               const gtsam::DiscreteValues& discreteVals) const;
 | 
			
		||||
 | 
			
		||||
  double nonlinearFactorLogNormalizingConstant(const gtsam::NonlinearFactor* factor,
 | 
			
		||||
                                               const gtsam::Values& values) const;
 | 
			
		||||
 | 
			
		||||
  GaussianMixtureFactor* linearize(
 | 
			
		||||
      const gtsam::Values& continuousVals) const;
 | 
			
		||||
 | 
			
		||||
  void print(string s = "MixtureFactor\n",
 | 
			
		||||
             const gtsam::KeyFormatter& keyFormatter =
 | 
			
		||||
                 gtsam::DefaultKeyFormatter) const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace gtsam
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,5 +10,12 @@
 | 
			
		|||
 * Without this they will be automatically converted to a Python object, and all
 | 
			
		||||
 * mutations on Python side will not be reflected on C++.
 | 
			
		||||
 */
 | 
			
		||||
#include <pybind11/stl.h>
 | 
			
		||||
 | 
			
		||||
#ifdef GTSAM_ALLOCATOR_TBB
 | 
			
		||||
PYBIND11_MAKE_OPAQUE(std::vector<gtsam::Key, tbb::tbb_allocator<gtsam::Key>>);
 | 
			
		||||
#else
 | 
			
		||||
PYBIND11_MAKE_OPAQUE(std::vector<gtsam::Key>);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
PYBIND11_MAKE_OPAQUE(std::vector<gtsam::GaussianFactor::shared_ptr>);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
"""
 | 
			
		||||
GTSAM Copyright 2010-2019, Georgia Tech Research Corporation,
 | 
			
		||||
Atlanta, Georgia 30332-0415
 | 
			
		||||
All Rights Reserved
 | 
			
		||||
 | 
			
		||||
See LICENSE for the license information
 | 
			
		||||
 | 
			
		||||
Unit tests for Hybrid Nonlinear Factor Graphs.
 | 
			
		||||
Author: Fan Jiang
 | 
			
		||||
"""
 | 
			
		||||
# pylint: disable=invalid-name, no-name-in-module, no-member
 | 
			
		||||
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
 | 
			
		||||
import unittest
 | 
			
		||||
 | 
			
		||||
import gtsam
 | 
			
		||||
import numpy as np
 | 
			
		||||
from gtsam.symbol_shorthand import C, X
 | 
			
		||||
from gtsam.utils.test_case import GtsamTestCase
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestHybridGaussianFactorGraph(GtsamTestCase):
 | 
			
		||||
    """Unit tests for HybridGaussianFactorGraph."""
 | 
			
		||||
 | 
			
		||||
    def test_nonlinear_hybrid(self):
 | 
			
		||||
        nlfg = gtsam.HybridNonlinearFactorGraph()
 | 
			
		||||
        dk = gtsam.DiscreteKeys()
 | 
			
		||||
        dk.push_back((10, 2))
 | 
			
		||||
        nlfg.add(gtsam.BetweenFactorPoint3(1, 2, gtsam.Point3(1, 2, 3), gtsam.noiseModel.Diagonal.Variances([1, 1, 1])))
 | 
			
		||||
        nlfg.add(
 | 
			
		||||
            gtsam.PriorFactorPoint3(2, gtsam.Point3(1, 2, 3), gtsam.noiseModel.Diagonal.Variances([0.5, 0.5, 0.5])))
 | 
			
		||||
        nlfg.push_back(
 | 
			
		||||
            gtsam.MixtureFactor([1], dk, [
 | 
			
		||||
                gtsam.PriorFactorPoint3(1, gtsam.Point3(0, 0, 0),
 | 
			
		||||
                                        gtsam.noiseModel.Unit.Create(3)),
 | 
			
		||||
                gtsam.PriorFactorPoint3(1, gtsam.Point3(1, 2, 1),
 | 
			
		||||
                                        gtsam.noiseModel.Unit.Create(3))
 | 
			
		||||
            ]))
 | 
			
		||||
        nlfg.add(gtsam.DecisionTreeFactor((10, 2), "1 3"))
 | 
			
		||||
        values = gtsam.Values()
 | 
			
		||||
        values.insert_point3(1, gtsam.Point3(0, 0, 0))
 | 
			
		||||
        values.insert_point3(2, gtsam.Point3(2, 3, 1))
 | 
			
		||||
        hfg = nlfg.linearize(values)
 | 
			
		||||
        o = gtsam.Ordering()
 | 
			
		||||
        o.push_back(1)
 | 
			
		||||
        o.push_back(2)
 | 
			
		||||
        o.push_back(10)
 | 
			
		||||
        hbn = hfg.eliminateSequential(o)
 | 
			
		||||
        hbv = hbn.optimize()
 | 
			
		||||
        self.assertEqual(hbv.atDiscrete(10), 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    unittest.main()
 | 
			
		||||
		Loading…
	
		Reference in New Issue