| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * @file NonlinearConstraint-inl.h | 
					
						
							|  |  |  |  * @brief Implementation for NonlinearConstraints | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  |  * @author Alex Cunningham | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | #include <boost/bind.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | #include "NonlinearConstraint.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 06:29:00 +08:00
										 |  |  | #define INSTANTIATE_NONLINEAR_CONSTRAINT(C) \
 | 
					
						
							|  |  |  |   INSTANTIATE_FACTOR_GRAPH(NonlinearConstraint<C>); \ | 
					
						
							|  |  |  |   template class NonlinearConstraint<C>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // Implementations of base class
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | template <class Config> | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | NonlinearConstraint<Config>::NonlinearConstraint(const LagrangeKey& lagrange_key, | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 					size_t dim_lagrange, | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 					bool isEquality) : | 
					
						
							| 
									
										
										
										
											2010-02-24 02:37:17 +08:00
										 |  |  | 	NonlinearFactor<Config>(noiseModel::Unit::Create(2*dim_lagrange)), | 
					
						
							| 
									
										
										
										
											2010-02-09 09:52:36 +08:00
										 |  |  | 	lagrange_key_(lagrange_key), p_(dim_lagrange), isEquality_(isEquality) { | 
					
						
							|  |  |  | 	this->keys_.push_back(lagrange_key_); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-29 02:35:36 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | template <class Config> | 
					
						
							|  |  |  | bool NonlinearConstraint<Config>::active(const Config& config) const { | 
					
						
							| 
									
										
										
										
											2010-01-18 13:38:53 +08:00
										 |  |  | 	return !(!isEquality_ && greaterThanOrEqual(unwhitenedError(config), zero(p_))); | 
					
						
							| 
									
										
										
										
											2009-11-29 02:35:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // Implementations of unary nonlinear constraints
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key, class X> | 
					
						
							|  |  |  | NonlinearConstraint1<Config, Key, X>::NonlinearConstraint1( | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 			Vector (*g)(const Config& config), | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 			const Key& key, | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 			Matrix (*gradG)(const Config& config), | 
					
						
							| 
									
										
										
										
											2009-11-24 06:10:52 +08:00
										 |  |  | 			size_t dim_constraint, | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 			const LagrangeKey& lagrange_key, | 
					
						
							| 
									
										
										
										
											2009-11-29 02:35:36 +08:00
										 |  |  | 			bool isEquality) : | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 				NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | 
					
						
							|  |  |  | 				g_(boost::bind(g, _1)), G_(boost::bind(gradG, _1)), key_(key) | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-09 09:52:36 +08:00
										 |  |  | 	this->keys_.push_back(key); | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key, class X> | 
					
						
							|  |  |  | NonlinearConstraint1<Config, Key, X>::NonlinearConstraint1( | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 		boost::function<Vector(const Config& config)> g, | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 			const Key& key, | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 			boost::function<Matrix(const Config& config)> gradG, | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 			size_t dim_constraint, | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 			const LagrangeKey& lagrange_key, | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 			bool isEquality) : | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 				NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | 
					
						
							|  |  |  | 				g_(g), G_(gradG), key_(key) | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-09 09:52:36 +08:00
										 |  |  | 	this->keys_.push_back(key); | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-11-24 06:10:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key, class X> | 
					
						
							|  |  |  | void NonlinearConstraint1<Config, Key, X>::print(const std::string& s) const { | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 	std::cout << "NonlinearConstraint1 [" << s << "]: Dim: " << this->p_ << "\n" | 
					
						
							|  |  |  | 			  << "  Key         : " << (std::string) this->key_ << "\n" | 
					
						
							|  |  |  | 			  << "  Lagrange Key: " << (std::string) this->lagrange_key_ << "\n"; | 
					
						
							|  |  |  | 	if (this->isEquality_) | 
					
						
							|  |  |  | 		std::cout << "  Equality Factor" << std::endl; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		std::cout << "  Inequality Factor" << std::endl; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key, class X> | 
					
						
							|  |  |  | bool NonlinearConstraint1<Config, Key, X>::equals(const Factor<Config>& f, double tol) const { | 
					
						
							|  |  |  | 	const NonlinearConstraint1<Config, Key, X>* p = dynamic_cast<const NonlinearConstraint1<Config, Key, X>*> (&f); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 	if (p == NULL) return false; | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 	if (!(key_ == p->key_)) return false; | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	if (!(this->lagrange_key_.equals(p->lagrange_key_))) return false; | 
					
						
							| 
									
										
										
										
											2009-11-29 02:35:36 +08:00
										 |  |  | 	if (this->isEquality_ != p->isEquality_) return false; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 	return this->p_ == p->p_; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key, class X> | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | GaussianFactor::shared_ptr | 
					
						
							|  |  |  | NonlinearConstraint1<Config, Key, X>::linearize(const Config& config) const { | 
					
						
							|  |  |  | 	const size_t p = this->p_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 	// extract lagrange multiplier
 | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	Vector lambda = config[this->lagrange_key_]; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// find the error
 | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 	Vector g = g_(config); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// construct the gradient
 | 
					
						
							| 
									
										
										
										
											2009-12-18 11:05:47 +08:00
										 |  |  | 	Matrix grad = G_(config); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	// construct combined factor
 | 
					
						
							|  |  |  | 	Matrix Ax = zeros(grad.size1()*2, grad.size2()); | 
					
						
							|  |  |  | 	insertSub(Ax, vector_scale(lambda, grad), 0, 0); | 
					
						
							|  |  |  | 	insertSub(Ax, grad, grad.size1(), 0); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	Matrix AL = eye(p*2, p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector rhs = zero(p*2); | 
					
						
							|  |  |  | 	subInsert(rhs, -1*g, p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// construct a mixed constraint model
 | 
					
						
							|  |  |  | 	Vector sigmas = zero(p*2); | 
					
						
							|  |  |  | 	subInsert(sigmas, ones(p), 0); | 
					
						
							|  |  |  | 	SharedDiagonal mixedConstraint = noiseModel::Constrained::MixedSigmas(sigmas); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GaussianFactor::shared_ptr factor(new | 
					
						
							|  |  |  | 			GaussianFactor(key_, Ax, this->lagrange_key_, AL, rhs, mixedConstraint)); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	return factor; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // Implementations of binary nonlinear constraints
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-24 06:10:52 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key1, class X1, class Key2, class X2> | 
					
						
							|  |  |  | NonlinearConstraint2<Config, Key1, X1, Key2, X2>::NonlinearConstraint2( | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 		Vector (*g)(const Config& config), | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 		const Key1& key1, | 
					
						
							| 
									
										
										
										
											2009-12-18 11:05:47 +08:00
										 |  |  | 		Matrix (*G1)(const Config& config), | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 		const Key2& key2, | 
					
						
							| 
									
										
										
										
											2009-12-18 11:05:47 +08:00
										 |  |  | 		Matrix (*G2)(const Config& config), | 
					
						
							| 
									
										
										
										
											2009-11-24 06:10:52 +08:00
										 |  |  | 		size_t dim_constraint, | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 		const LagrangeKey& lagrange_key, | 
					
						
							| 
									
										
										
										
											2009-11-29 02:35:36 +08:00
										 |  |  | 		bool isEquality) : | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 			NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | 
					
						
							|  |  |  | 			g_(boost::bind(g, _1)), G1_(boost::bind(G1, _1)), G2_(boost::bind(G2, _1)), | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 			key1_(key1), key2_(key2) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-09 09:52:36 +08:00
										 |  |  | 	this->keys_.push_back(key1); | 
					
						
							|  |  |  | 	this->keys_.push_back(key2); | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key1, class X1, class Key2, class X2> | 
					
						
							|  |  |  | NonlinearConstraint2<Config, Key1, X1, Key2, X2>::NonlinearConstraint2( | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 		boost::function<Vector(const Config& config)> g, | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 		const Key1& key1, | 
					
						
							| 
									
										
										
										
											2009-12-18 11:05:47 +08:00
										 |  |  | 		boost::function<Matrix(const Config& config)> G1, | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 		const Key2& key2, | 
					
						
							| 
									
										
										
										
											2009-12-18 11:05:47 +08:00
										 |  |  | 		boost::function<Matrix(const Config& config)> G2, | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 		size_t dim_constraint, | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 		const LagrangeKey& lagrange_key, | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 		bool isEquality)  : | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 				NonlinearConstraint<Config>(lagrange_key, dim_constraint, isEquality), | 
					
						
							|  |  |  | 				g_(g), G1_(G1), G2_(G2), | 
					
						
							| 
									
										
										
										
											2009-12-02 03:45:47 +08:00
										 |  |  | 				key1_(key1), key2_(key2) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-09 09:52:36 +08:00
										 |  |  | 	this->keys_.push_back(key1); | 
					
						
							|  |  |  | 	this->keys_.push_back(key2); | 
					
						
							| 
									
										
										
										
											2009-11-24 06:10:52 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key1, class X1, class Key2, class X2> | 
					
						
							|  |  |  | void NonlinearConstraint2<Config, Key1, X1, Key2, X2>::print(const std::string& s) const { | 
					
						
							| 
									
										
										
										
											2010-02-07 09:18:17 +08:00
										 |  |  | 	std::cout << "NonlinearConstraint2 [" << s << "]: Dim: " << this->p_ << "\n" | 
					
						
							|  |  |  | 			  << "  Key1        : " << (std::string) this->key1_ << "\n" | 
					
						
							|  |  |  | 			  << "  Key2        : " << (std::string) this->key2_ << "\n" | 
					
						
							|  |  |  | 			  << "  Lagrange Key: " << (std::string) this->lagrange_key_ << "\n"; | 
					
						
							|  |  |  | 	if (this->isEquality_) | 
					
						
							|  |  |  | 		std::cout << "  Equality Factor" << std::endl; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		std::cout << "  Inequality Factor" << std::endl; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template <class Config, class Key1, class X1, class Key2, class X2> | 
					
						
							|  |  |  | bool NonlinearConstraint2<Config, Key1, X1, Key2, X2>::equals(const Factor<Config>& f, double tol) const { | 
					
						
							|  |  |  | 	const NonlinearConstraint2<Config, Key1, X1, Key2, X2>* p = dynamic_cast<const NonlinearConstraint2<Config, Key1, X1, Key2, X2>*> (&f); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 	if (p == NULL) return false; | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | 	if (!(key1_ == p->key1_)) return false; | 
					
						
							|  |  |  | 	if (!(key2_ == p->key2_)) return false; | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	if (!(this->lagrange_key_.equals(p->lagrange_key_))) return false; | 
					
						
							| 
									
										
										
										
											2009-11-29 02:35:36 +08:00
										 |  |  | 	if (this->isEquality_ != p->isEquality_) return false; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 	return this->p_ == p->p_; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-19 13:33:44 +08:00
										 |  |  | template<class Config, class Key1, class X1, class Key2, class X2> | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | GaussianFactor::shared_ptr | 
					
						
							|  |  |  | NonlinearConstraint2<Config, Key1, X1, Key2, X2>::linearize(const Config& config) const { | 
					
						
							| 
									
										
										
										
											2010-02-06 13:14:52 +08:00
										 |  |  | 	const size_t p = this->p_; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 	// extract lagrange multiplier
 | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	Vector lambda = config[this->lagrange_key_]; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// find the error
 | 
					
						
							| 
									
										
										
										
											2009-12-18 10:39:02 +08:00
										 |  |  | 	Vector g = g_(config); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// construct the gradients
 | 
					
						
							| 
									
										
										
										
											2009-12-18 11:05:47 +08:00
										 |  |  | 	Matrix grad1 = G1_(config); | 
					
						
							|  |  |  | 	Matrix grad2 = G2_(config); | 
					
						
							| 
									
										
										
										
											2009-11-20 11:50:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 13:14:52 +08:00
										 |  |  | 	// create matrices
 | 
					
						
							|  |  |  | 	Matrix Ax1 = zeros(grad1.size1()*2, grad1.size2()), | 
					
						
							|  |  |  | 		   Ax2 = zeros(grad2.size1()*2, grad2.size2()), | 
					
						
							|  |  |  | 		   AL = eye(p*2, p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// insert matrix components
 | 
					
						
							|  |  |  | 	insertSub(Ax1, vector_scale(lambda, grad1), 0, 0); | 
					
						
							|  |  |  | 	insertSub(Ax1, grad1, grad1.size1(), 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	insertSub(Ax2, vector_scale(lambda, grad2), 0, 0); | 
					
						
							|  |  |  | 	insertSub(Ax2, grad2, grad2.size1(), 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector rhs = zero(p*2); | 
					
						
							|  |  |  | 	subInsert(rhs, -1*g, p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// construct a mixed constraint model
 | 
					
						
							|  |  |  | 	Vector sigmas = zero(p*2); | 
					
						
							|  |  |  | 	subInsert(sigmas, ones(p), 0); | 
					
						
							|  |  |  | 	SharedDiagonal mixedConstraint = noiseModel::Constrained::MixedSigmas(sigmas); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GaussianFactor::shared_ptr factor(new | 
					
						
							|  |  |  | 			GaussianFactor(key1_, Ax1, key2_, Ax2, this->lagrange_key_, AL, rhs, mixedConstraint)); | 
					
						
							| 
									
										
										
										
											2010-02-05 00:08:11 +08:00
										 |  |  | 	return factor; | 
					
						
							| 
									
										
										
										
											2009-11-20 11:04:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |