gtsam/cpp/NonlinearConstraint-inl.h

119 lines
4.2 KiB
C++

/*
* @file NonlinearConstraint-inl.h
* @brief Implementation for NonlinearConstraints
* @author alexgc
*/
#pragma once
#include <iostream>
#include "NonlinearConstraint.h"
namespace gtsam {
/* ************************************************************************* */
// Implementations of unary nonlinear constraints
/* ************************************************************************* */
/* ************************************************************************* */
template <class Config>
void NonlinearConstraint1<Config>::print(const std::string& s) const {
std::cout << "NonlinearConstraint1 [" << s << "]:\n"
<< " key: " << key_ << "\n"
<< " p: " << this->p_ << "\n"
<< " lambda key: " << this->lagrange_key_ << std::endl;
}
/* ************************************************************************* */
template <class Config>
bool NonlinearConstraint1<Config>::equals(const Factor<Config>& f, double tol) const {
const NonlinearConstraint1<Config>* p = dynamic_cast<const NonlinearConstraint1<Config>*> (&f);
if (p == NULL) return false;
if (key_ != p->key_) return false;
if (this->lagrange_key_ != p->lagrange_key_) return false;
if (g_ != p->g_) return false;
if (gradG_ != p->gradG_) return false;
return this->p_ == p->p_;
}
/* ************************************************************************* */
template <class Config>
std::pair<GaussianFactor::shared_ptr, GaussianFactor::shared_ptr>
NonlinearConstraint1<Config>::linearize(const Config& config, const VectorConfig& lagrange) const {
// extract lagrange multiplier
Vector lambda = lagrange[this->lagrange_key_];
// find the error
Vector g = g_(config, key_);
// construct the gradient
Matrix grad = gradG_(config, key_);
// construct probabilistic factor
Matrix A1 = vector_scale(grad, lambda);
GaussianFactor::shared_ptr factor(new
GaussianFactor(key_, A1, this->lagrange_key_, eye(this->p_), zero(this->p_), 1.0));
// construct the constraint
GaussianFactor::shared_ptr constraint(new GaussianFactor(key_, grad, g, 0.0));
return std::make_pair(factor, constraint);
}
/* ************************************************************************* */
// Implementations of binary nonlinear constraints
/* ************************************************************************* */
/* ************************************************************************* */
template <class Config>
void NonlinearConstraint2<Config>::print(const std::string& s) const {
std::cout << "NonlinearConstraint2 [" << s << "]:\n"
<< " key1: " << key1_ << "\n"
<< " key2: " << key2_ << "\n"
<< " p: " << this->p_ << "\n"
<< " lambda key: " << this->lagrange_key_ << std::endl;
}
/* ************************************************************************* */
template <class Config>
bool NonlinearConstraint2<Config>::equals(const Factor<Config>& f, double tol) const {
const NonlinearConstraint2<Config>* p = dynamic_cast<const NonlinearConstraint2<Config>*> (&f);
if (p == NULL) return false;
if (key1_ != p->key1_) return false;
if (key2_ != p->key2_) return false;
if (this->lagrange_key_ != p->lagrange_key_) return false;
if (g_ != p->g_) return false;
if (gradG1_ != p->gradG1_) return false;
if (gradG2_ != p->gradG2_) return false;
return this->p_ == p->p_;
}
/* ************************************************************************* */
template <class Config>
std::pair<GaussianFactor::shared_ptr, GaussianFactor::shared_ptr>
NonlinearConstraint2<Config>::linearize(const Config& config, const VectorConfig& lagrange) const {
// extract lagrange multiplier
Vector lambda = lagrange[this->lagrange_key_];
// find the error
Vector g = g_(config, key1_, key2_);
// construct the gradients
Matrix grad1 = gradG1_(config, key1_);
Matrix grad2 = gradG2_(config, key2_);
// construct probabilistic factor
Matrix A1 = vector_scale(grad1, lambda);
Matrix A2 = vector_scale(grad2, lambda);
GaussianFactor::shared_ptr factor(new
GaussianFactor(key1_, A1, key2_, A2,
this->lagrange_key_, eye(this->p_), zero(this->p_), 1.0));
// construct the constraint
GaussianFactor::shared_ptr constraint(new GaussianFactor(key1_, grad1, key2_, grad2, g, 0.0));
return std::make_pair(factor, constraint);
}
}