gtsam 4.1.1
gtsam
|
A Gaussian factor using the canonical parameters (information form)
HessianFactor implements a general quadratic factor of the form
\[ E(x) = 0.5 x^T G x - x^T g + 0.5 f \]
that stores the matrix \( G \), the vector \( g \), and the constant term \( f \).
When \( G \) is positive semidefinite, this factor represents a Gaussian, in which case \( G \) is the information matrix \( \Lambda \), \( g \) is the information vector \( \eta \), and \( f \) is the residual sum-square-error at the mean, when \( x = \mu \).
Indeed, the negative log-likelihood of a Gaussian is (up to a constant) \( E(x) = 0.5(x-\mu)^T P^{-1} (x-\mu) \) with \( \mu \) the mean and \( P \) the covariance matrix. Expanding the product we get
\[ E(x) = 0.5 x^T P^{-1} x - x^T P^{-1} \mu + 0.5 \mu^T P^{-1} \mu \]
We define the Information matrix (or Hessian) \( \Lambda = P^{-1} \) and the information vector \( \eta = P^{-1} \mu = \Lambda \mu \) to arrive at the canonical form of the Gaussian:
\[ E(x) = 0.5 x^T \Lambda x - x^T \eta + 0.5 \mu^T \Lambda \mu \]
This factor is one of the factors that can be in a GaussianFactorGraph. It may be returned from NonlinearFactor::linearize(), but is also used internally to store the Hessian during Cholesky elimination.
This can represent a quadratic factor with characteristics that cannot be represented using a JacobianFactor (which has the form \( E(x) = \Vert Ax - b \Vert^2 \) and stores the Jacobian \( A \) and error vector \( b \), i.e. is a sum-of-squares factor). For example, a HessianFactor need not be positive semidefinite, it can be indefinite or even negative semidefinite.
If a HessianFactor is indefinite or negative semi-definite, then in order for solving the linear system to be possible, the Hessian of the full system must be positive definite (i.e. when all small Hessians are combined, the result must be positive definite). If this is not the case, an error will occur during elimination.
This class stores G, g, and f as an augmented matrix HessianFactor::matrix_. The upper-left n x n blocks of HessianFactor::matrix_ store the upper-right triangle of G, the upper-right-most column of length n of HessianFactor::matrix_ stores g, and the lower-right entry of HessianFactor::matrix_ stores f, i.e.
Blocks can be accessed as follows:
Public Member Functions | |
HessianFactor () | |
default constructor for I/O | |
HessianFactor (Key j, const Matrix &G, const Vector &g, double f) | |
Construct a unary factor. More... | |
HessianFactor (Key j, const Vector &mu, const Matrix &Sigma) | |
Construct a unary factor, given a mean and covariance matrix. More... | |
HessianFactor (Key j1, Key j2, const Matrix &G11, const Matrix &G12, const Vector &g1, const Matrix &G22, const Vector &g2, double f) | |
Construct a binary factor. More... | |
HessianFactor (Key j1, Key j2, Key j3, const Matrix &G11, const Matrix &G12, const Matrix &G13, const Vector &g1, const Matrix &G22, const Matrix &G23, const Vector &g2, const Matrix &G33, const Vector &g3, double f) | |
Construct a ternary factor. More... | |
HessianFactor (const KeyVector &js, const std::vector< Matrix > &Gs, const std::vector< Vector > &gs, double f) | |
Construct an n-way factor. More... | |
template<typename KEYS > | |
HessianFactor (const KEYS &keys, const SymmetricBlockMatrix &augmentedInformation) | |
Constructor with an arbitrary number of keys and with the augmented information matrix specified as a block matrix. | |
HessianFactor (const JacobianFactor &cg) | |
Construct from a JacobianFactor (or from a GaussianConditional since it derives from it) | |
HessianFactor (const GaussianFactor &factor) | |
Attempt to construct from any GaussianFactor - currently supports JacobianFactor, HessianFactor, GaussianConditional, or any derived classes. | |
HessianFactor (const GaussianFactorGraph &factors, const Scatter &scatter) | |
Combine a set of factors into a single dense HessianFactor. | |
HessianFactor (const GaussianFactorGraph &factors) | |
Combine a set of factors into a single dense HessianFactor. | |
~HessianFactor () override | |
Destructor. | |
GaussianFactor::shared_ptr | clone () const override |
Clone this HessianFactor. More... | |
void | print (const std::string &s="", const KeyFormatter &formatter=DefaultKeyFormatter) const override |
Print the factor for debugging and testing (implementing Testable) More... | |
bool | equals (const GaussianFactor &lf, double tol=1e-9) const override |
Compare to another factor for testing (implementing Testable) More... | |
double | error (const VectorValues &c) const override |
Evaluate the factor error f(x). More... | |
DenseIndex | getDim (const_iterator variable) const override |
Return the dimension of the variable pointed to by the given key iterator todo: Remove this in favor of keeping track of dimensions with variables? More... | |
size_t | rows () const |
Return the number of columns and rows of the Hessian matrix, including the information vector. | |
GaussianFactor::shared_ptr | negate () const override |
Construct the corresponding anti-factor to negate information stored stored in this factor. More... | |
bool | empty () const override |
Check if the factor is empty. More... | |
double | constantTerm () const |
Return the constant term \( f \) as described above. More... | |
double & | constantTerm () |
Return the constant term \( f \) as described above. More... | |
SymmetricBlockMatrix::constBlock | linearTerm (const_iterator j) const |
Return the part of linear term \( g \) as described above corresponding to the requested variable. More... | |
SymmetricBlockMatrix::constBlock | linearTerm () const |
Return the complete linear term \( g \) as described above. More... | |
SymmetricBlockMatrix::Block | linearTerm () |
Return the complete linear term \( g \) as described above. More... | |
const SymmetricBlockMatrix & | info () const |
Return underlying information matrix. | |
SymmetricBlockMatrix & | info () |
Return non-const information matrix. More... | |
Matrix | augmentedInformation () const override |
Return the augmented information matrix represented by this GaussianFactor. More... | |
Eigen::SelfAdjointView< SymmetricBlockMatrix::constBlock, Eigen::Upper > | informationView () const |
Return self-adjoint view onto the information matrix (NOT augmented). | |
Matrix | information () const override |
Return the non-augmented information matrix represented by this GaussianFactor. More... | |
void | hessianDiagonalAdd (VectorValues &d) const override |
Add the current diagonal to a VectorValues instance. More... | |
void | hessianDiagonal (double *d) const override |
Raw memory access version of hessianDiagonal. More... | |
std::map< Key, Matrix > | hessianBlockDiagonal () const override |
Return the block diagonal of the Hessian for this factor. More... | |
std::pair< Matrix, Vector > | jacobian () const override |
Return (dense) matrix associated with factor. More... | |
Matrix | augmentedJacobian () const override |
Return (dense) matrix associated with factor The returned system is an augmented matrix: [A b]. More... | |
void | updateHessian (const KeyVector &keys, SymmetricBlockMatrix *info) const override |
Update an information matrix by adding the information corresponding to this factor (used internally during elimination). More... | |
void | updateHessian (HessianFactor *other) const |
Update another Hessian factor. More... | |
void | multiplyHessianAdd (double alpha, const VectorValues &x, VectorValues &y) const override |
y += alpha * A'*A*x More... | |
VectorValues | gradientAtZero () const override |
eta for Hessian More... | |
void | gradientAtZero (double *d) const override |
Raw memory access version of gradientAtZero. More... | |
Vector | gradient (Key key, const VectorValues &x) const override |
Compute the gradient at a key: \grad f(x_i) = \sum_j G_ij*x_j - g_i. More... | |
boost::shared_ptr< GaussianConditional > | eliminateCholesky (const Ordering &keys) |
In-place elimination that returns a conditional on (ordered) keys specified, and leaves this factor to be on the remaining keys (separator) only. More... | |
VectorValues | solve () |
Solve the system A'*A delta = A'*b in-place, return delta as VectorValues. | |
Public Member Functions inherited from gtsam::GaussianFactor | |
GaussianFactor () | |
Default constructor creates empty factor. | |
template<typename CONTAINER > | |
GaussianFactor (const CONTAINER &keys) | |
Construct from container of keys. More... | |
virtual | ~GaussianFactor () |
Destructor. | |
void | print (const std::string &s="", const KeyFormatter &formatter=DefaultKeyFormatter) const override=0 |
print More... | |
virtual bool | equals (const GaussianFactor &lf, double tol=1e-9) const =0 |
Equals for testable. More... | |
virtual double | error (const VectorValues &c) const =0 |
Print for testable. More... | |
virtual DenseIndex | getDim (const_iterator variable) const =0 |
0.5*(A*x-b)'D(A*x-b) More... | |
virtual Matrix | augmentedJacobian () const =0 |
Return a dense \( [ \;A\;b\; ] \in \mathbb{R}^{m \times n+1} \) Jacobian matrix, augmented with b with the noise models baked into A and b. More... | |
virtual std::pair< Matrix, Vector > | jacobian () const =0 |
Return the dense Jacobian \( A \) and right-hand-side \( b \), with the noise models baked into A and b. More... | |
virtual Matrix | augmentedInformation () const =0 |
Return the augmented information matrix represented by this GaussianFactor. More... | |
virtual Matrix | information () const =0 |
Return the non-augmented information matrix represented by this GaussianFactor. More... | |
VectorValues | hessianDiagonal () const |
Return the diagonal of the Hessian for this factor. | |
virtual void | hessianDiagonalAdd (VectorValues &d) const =0 |
Add the current diagonal to a VectorValues instance. More... | |
virtual void | hessianDiagonal (double *d) const =0 |
Raw memory access version of hessianDiagonal. More... | |
virtual std::map< Key, Matrix > | hessianBlockDiagonal () const =0 |
Return the block diagonal of the Hessian for this factor. More... | |
virtual GaussianFactor::shared_ptr | clone () const =0 |
Clone a factor (make a deep copy) More... | |
virtual bool | empty () const =0 |
Test whether the factor is empty. More... | |
virtual GaussianFactor::shared_ptr | negate () const =0 |
Construct the corresponding anti-factor to negate information stored stored in this factor. More... | |
virtual void | updateHessian (const KeyVector &keys, SymmetricBlockMatrix *info) const =0 |
Update an information matrix by adding the information corresponding to this factor (used internally during elimination). More... | |
virtual void | multiplyHessianAdd (double alpha, const VectorValues &x, VectorValues &y) const =0 |
y += alpha * A'*A*x More... | |
virtual VectorValues | gradientAtZero () const =0 |
A'*b for Jacobian, eta for Hessian. More... | |
virtual void | gradientAtZero (double *d) const =0 |
Raw memory access version of gradientAtZero. More... | |
virtual Vector | gradient (Key key, const VectorValues &x) const =0 |
Gradient wrt a key at any values. More... | |
Public Member Functions inherited from gtsam::Factor | |
virtual | ~Factor ()=default |
Default destructor. | |
KeyVector & | keys () |
iterator | begin () |
Iterator at beginning of involved variable keys. | |
iterator | end () |
Iterator at end of involved variable keys. | |
virtual void | printKeys (const std::string &s="Factor", const KeyFormatter &formatter=DefaultKeyFormatter) const |
print only keys More... | |
Key | front () const |
First key. | |
Key | back () const |
Last key. | |
const_iterator | find (Key key) const |
find | |
const KeyVector & | keys () const |
Access the factor's involved variable keys. | |
const_iterator | begin () const |
Iterator at beginning of involved variable keys. | |
const_iterator | end () const |
Iterator at end of involved variable keys. | |
size_t | size () const |
Public Types | |
typedef GaussianFactor | Base |
Typedef to base class. | |
typedef HessianFactor | This |
Typedef to this class. | |
typedef boost::shared_ptr< This > | shared_ptr |
A shared_ptr to this class. | |
typedef SymmetricBlockMatrix::Block | Block |
A block from the Hessian matrix. | |
typedef SymmetricBlockMatrix::constBlock | constBlock |
A block from the Hessian matrix (const version) | |
Public Types inherited from gtsam::GaussianFactor | |
typedef GaussianFactor | This |
This class. | |
typedef boost::shared_ptr< This > | shared_ptr |
shared_ptr to this class | |
typedef Factor | Base |
Our base class. | |
Public Types inherited from gtsam::Factor | |
typedef KeyVector::iterator | iterator |
Iterator over keys. | |
typedef KeyVector::const_iterator | const_iterator |
Const iterator over keys. | |
Protected Attributes | |
SymmetricBlockMatrix | info_ |
The full augmented information matrix, s.t. the quadratic error is 0.5*[x -1]'H[x -1]. | |
Protected Attributes inherited from gtsam::Factor | |
KeyVector | keys_ |
The keys involved in this factor. | |
Friends | |
class | NonlinearFactorGraph |
class | NonlinearClusterTree |
class | boost::serialization::access |
Serialization function. | |
Additional Inherited Members | |
Static Public Member Functions inherited from gtsam::GaussianFactor | |
template<typename CONTAINER > | |
static DenseIndex | Slot (const CONTAINER &keys, Key key) |
Protected Member Functions inherited from gtsam::Factor | |
Factor () | |
Default constructor for I/O. | |
template<typename CONTAINER > | |
Factor (const CONTAINER &keys) | |
Construct factor from container of keys. More... | |
template<typename ITERATOR > | |
Factor (ITERATOR first, ITERATOR last) | |
Construct factor from iterator keys. More... | |
bool | equals (const This &other, double tol=1e-9) const |
check equality | |
Static Protected Member Functions inherited from gtsam::Factor | |
template<typename CONTAINER > | |
static Factor | FromKeys (const CONTAINER &keys) |
Construct factor from container of keys. More... | |
template<typename ITERATOR > | |
static Factor | FromIterators (ITERATOR first, ITERATOR last) |
Construct factor from iterator keys. More... | |
gtsam::HessianFactor::HessianFactor | ( | Key | j, |
const Matrix & | G, | ||
const Vector & | g, | ||
double | f | ||
) |
Construct a unary factor.
G is the quadratic term (Hessian matrix), g the linear term (a vector), and f the constant term. The quadratic error is: 0.5*(f - 2*x'*g + x'*G*x)
gtsam::HessianFactor::HessianFactor | ( | Key | j, |
const Vector & | mu, | ||
const Matrix & | Sigma | ||
) |
Construct a unary factor, given a mean and covariance matrix.
error is 0.5*(x-mu)'inv(Sigma)(x-mu)
gtsam::HessianFactor::HessianFactor | ( | Key | j1, |
Key | j2, | ||
const Matrix & | G11, | ||
const Matrix & | G12, | ||
const Vector & | g1, | ||
const Matrix & | G22, | ||
const Vector & | g2, | ||
double | f | ||
) |
Construct a binary factor.
Gxx are the upper-triangle blocks of the quadratic term (the Hessian matrix), gx the pieces of the linear vector term, and f the constant term. JacobianFactor error is
\[ 0.5* (Ax-b)' M (Ax-b) = 0.5*x'A'MAx - x'A'Mb + 0.5*b'Mb \]
HessianFactor error is
\[ 0.5*(x'Gx - 2x'g + f) = 0.5*x'Gx - x'*g + 0.5*f \]
So, with \( A = [A1 A2] \) and \( G=A*'M*A = [A1';A2']*M*[A1 A2] \) we have
gtsam::HessianFactor::HessianFactor | ( | Key | j1, |
Key | j2, | ||
Key | j3, | ||
const Matrix & | G11, | ||
const Matrix & | G12, | ||
const Matrix & | G13, | ||
const Vector & | g1, | ||
const Matrix & | G22, | ||
const Matrix & | G23, | ||
const Vector & | g2, | ||
const Matrix & | G33, | ||
const Vector & | g3, | ||
double | f | ||
) |
Construct a ternary factor.
Gxx are the upper-triangle blocks of the quadratic term (the Hessian matrix), gx the pieces of the linear vector term, and f the constant term.
gtsam::HessianFactor::HessianFactor | ( | const KeyVector & | js, |
const std::vector< Matrix > & | Gs, | ||
const std::vector< Vector > & | gs, | ||
double | f | ||
) |
Construct an n-way factor.
Gs contains the upper-triangle blocks of the quadratic term (the Hessian matrix) provided in row-order, gs the pieces of the linear vector term, and f the constant term.
|
overridevirtual |
Return the augmented information matrix represented by this GaussianFactor.
The augmented information matrix contains the information matrix with an additional column holding the information vector, and an additional row holding the transpose of the information vector. The lower-right entry contains the constant error term (when \( \delta x = 0 \)). The augmented information matrix is described in more detail in HessianFactor, which in fact stores an augmented information matrix.
For HessianFactor, this is the same as info() except that this function returns a complete symmetric matrix whereas info() returns a matrix where only the upper triangle is valid, but should be interpreted as symmetric. This is because info() returns only a reference to the internal representation of the augmented information matrix, which stores only the upper triangle.
Implements gtsam::GaussianFactor.
|
overridevirtual |
Return (dense) matrix associated with factor The returned system is an augmented matrix: [A b].
set | weight to use whitening to bake in weights |
Implements gtsam::GaussianFactor.
|
inlineoverridevirtual |
Clone this HessianFactor.
Implements gtsam::GaussianFactor.
|
inline |
Return the constant term \( f \) as described above.
|
inline |
Return the constant term \( f \) as described above.
boost::shared_ptr< GaussianConditional > gtsam::HessianFactor::eliminateCholesky | ( | const Ordering & | keys | ) |
In-place elimination that returns a conditional on (ordered) keys specified, and leaves this factor to be on the remaining keys (separator) only.
Does dense partial Cholesky.
|
inlineoverridevirtual |
|
overridevirtual |
Compare to another factor for testing (implementing Testable)
Implements gtsam::GaussianFactor.
|
overridevirtual |
Evaluate the factor error f(x).
returns 0.5*[x -1]'H[x -1] (also see constructor documentation)
Implements gtsam::GaussianFactor.
|
inlineoverridevirtual |
Return the dimension of the variable pointed to by the given key iterator todo: Remove this in favor of keeping track of dimensions with variables?
variable | An iterator pointing to the slot in this factor. You can use, for example, begin() + 2 to get the 3rd variable in this factor. |
Implements gtsam::GaussianFactor.
|
overridevirtual |
Compute the gradient at a key: \grad f(x_i) = \sum_j G_ij*x_j - g_i.
Implements gtsam::GaussianFactor.
|
overridevirtual |
eta for Hessian
Implements gtsam::GaussianFactor.
|
overridevirtual |
Raw memory access version of gradientAtZero.
Implements gtsam::GaussianFactor.
Reimplemented in gtsam::RegularHessianFactor< D >.
|
overridevirtual |
Return the block diagonal of the Hessian for this factor.
Implements gtsam::GaussianFactor.
|
overridevirtual |
Raw memory access version of hessianDiagonal.
Implements gtsam::GaussianFactor.
Reimplemented in gtsam::RegularHessianFactor< D >.
|
overridevirtual |
Add the current diagonal to a VectorValues instance.
Implements gtsam::GaussianFactor.
|
inline |
Return non-const information matrix.
TODO(gareth): Review the sanity of having non-const access to this.
|
overridevirtual |
Return the non-augmented information matrix represented by this GaussianFactor.
Implements gtsam::GaussianFactor.
|
overridevirtual |
Return (dense) matrix associated with factor.
Implements gtsam::GaussianFactor.
|
inline |
Return the complete linear term \( g \) as described above.
|
inline |
Return the complete linear term \( g \) as described above.
|
inline |
Return the part of linear term \( g \) as described above corresponding to the requested variable.
j | Which block row to get, as an iterator pointing to the slot in this factor. You can use, for example, begin() + 2 to get the 3rd variable in this factor. |
|
overridevirtual |
y += alpha * A'*A*x
Implements gtsam::GaussianFactor.
Reimplemented in gtsam::RegularHessianFactor< D >.
|
overridevirtual |
Construct the corresponding anti-factor to negate information stored stored in this factor.
Implements gtsam::GaussianFactor.
|
overridevirtual |
Print the factor for debugging and testing (implementing Testable)
Implements gtsam::GaussianFactor.
|
overridevirtual |
Update an information matrix by adding the information corresponding to this factor (used internally during elimination).
keys | THe ordered vector of keys for the information matrix to be updated |
info | The information matrix to be updated |
Implements gtsam::GaussianFactor.
|
inline |
Update another Hessian factor.
other | the HessianFactor to be updated |