testNonlinearInequalityConstraint.cpp
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
20 #include <gtsam/base/Testable.h>
25 
26 #include "constrainedExample.h"
27 
28 using namespace gtsam;
32 
33 // Test methods of DoubleExpressionEquality.
35  // create constraint from double expression
36  // g(x1, x2) = x1 + x1^3 + x2 + x2^2, from Vanderbergh slides
37  double sigma = 0.1;
38  auto g = x1 + pow(x1, 3) + x2 + pow(x2, 2);
41 
42  // Check dimension is 1 for scalar g.
43  EXPECT_LONGS_EQUAL(1, constraint_geq->dim());
44  EXPECT_LONGS_EQUAL(1, constraint_leq->dim());
45 
46  // Check keys include x1, x2.
47  KeyVector expected_keys{x1_key, x2_key};
48  EXPECT(assert_container_equality(expected_keys, constraint_leq->keys()));
49 
50  // Create 3 sets of values for testing.
51  Values values1, values2, values3;
52  values1.insert(x1_key, -1.0);
53  values1.insert(x2_key, 1.0);
54  values2.insert(x1_key, 1.0);
55  values2.insert(x2_key, 1.0);
56  values3.insert(x1_key, -2.0);
57  values3.insert(x2_key, 1.0);
58 
59  // Check that expression evaluation at different values.
60  EXPECT(assert_equal(Vector1(0.0), constraint_leq->unwhitenedExpr(values1)));
61  EXPECT(assert_equal(Vector1(4.0), constraint_leq->unwhitenedExpr(values2)));
62  EXPECT(assert_equal(Vector1(-8.0), constraint_leq->unwhitenedExpr(values3)));
63  EXPECT(assert_equal(Vector1(0.0), constraint_geq->unwhitenedExpr(values1)));
64  EXPECT(assert_equal(Vector1(-4.0), constraint_geq->unwhitenedExpr(values2)));
65  EXPECT(assert_equal(Vector1(8.0), constraint_geq->unwhitenedExpr(values3)));
66 
67  // Check that constraint violation at different values.
68  EXPECT(assert_equal(Vector1(0.0), constraint_leq->unwhitenedError(values1)));
69  EXPECT(assert_equal(Vector1(4.0), constraint_leq->unwhitenedError(values2)));
70  EXPECT(assert_equal(Vector1(0.0), constraint_leq->unwhitenedError(values3)));
71  EXPECT(assert_equal(Vector1(0.0), constraint_geq->unwhitenedError(values1)));
72  EXPECT(assert_equal(Vector1(0.0), constraint_geq->unwhitenedError(values2)));
73  EXPECT(assert_equal(Vector1(8.0), constraint_geq->unwhitenedError(values3)));
74 
75  // Check feasible.
76  EXPECT(constraint_leq->feasible(values1));
77  EXPECT(!constraint_leq->feasible(values2));
78  EXPECT(constraint_leq->feasible(values3));
79  EXPECT(constraint_geq->feasible(values1));
80  EXPECT(constraint_geq->feasible(values2));
81  EXPECT(!constraint_geq->feasible(values3));
82 
83  // Check active.
84  EXPECT(constraint_leq->active(values1));
85  EXPECT(constraint_leq->active(values2));
86  EXPECT(!constraint_leq->active(values3));
87  EXPECT(constraint_geq->active(values1));
88  EXPECT(!constraint_geq->active(values2));
89  EXPECT(constraint_geq->active(values3));
90 
91  // Check whitenedError of penalty factor.
92  // Expected to be sqrt(mu) / sigma * ramp(g(x))
93  double mu = 9.0;
94  auto penalty_leq = constraint_leq->penaltyFactor(mu);
95  auto penalty_geq = constraint_geq->penaltyFactor(mu);
96  EXPECT(assert_equal(Vector1(0.0), penalty_leq->whitenedError(values1)));
97  EXPECT(assert_equal(Vector1(120.0), penalty_leq->whitenedError(values2)));
98  EXPECT(assert_equal(Vector1(0.0), penalty_leq->whitenedError(values3)));
99  EXPECT(assert_equal(Vector1(0.0), penalty_geq->whitenedError(values1)));
100  EXPECT(assert_equal(Vector1(0.0), penalty_geq->whitenedError(values2)));
101  EXPECT(assert_equal(Vector1(240.0), penalty_geq->whitenedError(values3)));
102 
103  // Check create equality constraint
104  auto constraint_eq1 = constraint_leq->createEqualityConstraint();
105  auto constraint_eq2 = constraint_geq->createEqualityConstraint();
106  EXPECT(assert_equal(0.0, constraint_eq1->error(values1)));
107  EXPECT(assert_equal(800.0, constraint_eq1->error(values2)));
108  EXPECT(assert_equal(3200.0, constraint_eq1->error(values3)));
109  EXPECT(assert_equal(0.0, constraint_eq2->error(values1)));
110  EXPECT(assert_equal(800.0, constraint_eq2->error(values2)));
111  EXPECT(assert_equal(3200.0, constraint_eq2->error(values3)));
112 }
113 
114 int main() {
115  TestResult tr;
116  return TestRegistry::runAllTests(tr);
117 }
TestRegistry::runAllTests
static int runAllTests(TestResult &result)
Definition: TestRegistry.cpp:27
constrained_example::x1_key
Symbol x1_key('x', 1)
Keys for creating expressions.
gtsam::Vector1
Eigen::Matrix< double, 1, 1 > Vector1
Definition: Vector.h:42
constrained_example::x2_key
Symbol x2_key('x', 2)
constrained_example::x1
Double_ x1(x1_key)
EXPECT_LONGS_EQUAL
#define EXPECT_LONGS_EQUAL(expected, actual)
Definition: Test.h:154
Testable.h
Concept check for values that can be used in unit tests.
EXPECT
#define EXPECT(condition)
Definition: Test.h:150
TestHarness.h
mu
double mu
Definition: testBoundingConstraint.cpp:37
gtsam::ScalarExpressionInequalityConstraint::LeqZero
static ScalarExpressionInequalityConstraint::shared_ptr LeqZero(const Double_ &expression, const double &sigma)
Definition: NonlinearInequalityConstraint.cpp:86
gtsam::KeyVector
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:92
gtsam::ScalarExpressionInequalityConstraint
Definition: NonlinearInequalityConstraint.h:78
TestableAssertions.h
Provides additional testing facilities for common data structures.
sampling::sigma
static const double sigma
Definition: testGaussianBayesNet.cpp:170
numericalDerivative.h
Some functions to compute numerical derivatives.
x1
Pose3 x1
Definition: testPose3.cpp:692
constrained_example::x2
Double_ x2(x2_key)
constrainedExample.h
Simple constrained optimization scenarios.
main
int main()
Definition: testNonlinearInequalityConstraint.cpp:114
constrained_example::pow
Double_ pow(const Double_ &x, const double &c)
Pow function.
Definition: constrainedExample.h:56
factorTesting.h
Evaluate derivatives of a nonlinear factor numerically.
ceres::pow
Jet< T, N > pow(const Jet< T, N > &f, double g)
Definition: jet.h:570
g
void g(const string &key, int i)
Definition: testBTree.cpp:41
TestResult
Definition: TestResult.h:26
gtsam::NonlinearInequalityConstraint
Definition: NonlinearInequalityConstraint.h:30
gtsam
traits
Definition: SFMdata.h:40
gtsam::TEST
TEST(SmartFactorBase, Pinhole)
Definition: testSmartFactorBase.cpp:38
gtsam::Values
Definition: Values.h:65
gtsam::assert_container_equality
bool assert_container_equality(const std::map< size_t, V2 > &expected, const std::map< size_t, V2 > &actual)
Definition: TestableAssertions.h:238
gtsam::ScalarExpressionInequalityConstraint::GeqZero
static ScalarExpressionInequalityConstraint::shared_ptr GeqZero(const Double_ &expression, const double &sigma)
Definition: NonlinearInequalityConstraint.cpp:79
gtsam::Values::insert
void insert(Key j, const Value &val)
Definition: Values.cpp:156
gtsam::assert_equal
bool assert_equal(const Matrix &expected, const Matrix &actual, double tol)
Definition: Matrix.cpp:41
NonlinearInequalityConstraint.h
Nonlinear inequality constraints in constrained optimization.
x2
Pose3 x2(Rot3::Ypr(0.0, 0.0, 0.0), l2)


gtsam
Author(s):
autogenerated on Fri Mar 28 2025 03:07:28