gtsam/inference/VariableSlots.h

69 lines
2.4 KiB
C++

/**
* @file VariableSlots.h
* @brief VariableSlots describes the structure of a combined factor in terms of where each block comes from in the source factors.
* @author Richard Roberts
* @created Oct 4, 2010
*/
#pragma once
#include <gtsam/base/types.h>
#include <gtsam/base/Testable.h>
#include <map>
#include <vector>
#include <string>
#include <boost/pool/pool_alloc.hpp>
namespace gtsam {
/**
* A combined factor is assembled as one block of rows for each component
* factor. In each row-block (factor), some of the column-blocks (variables)
* may be empty since factors involving different sets of variables are
* interleaved.
*
* VariableSlots describes the 2D block structure of the combined factor. It
* is essentially a map<Index, vector<size_t> >. The Index is the real
* variable index of the combined factor slot. The vector<size_t> tells, for
* each row-block (factor), which column-block (variable slot) from the
* component factor appears in this block of the combined factor.
*
* As an example, if the combined factor contains variables 1, 3, and 5, then
* "variableSlots[3][2] == 0" indicates that column-block 1 (corresponding to
* variable index 3), row-block 2 (also meaning component factor 2), comes from
* column-block 0 of component factor 2.
*
* Note that in the case of GaussianFactor, the rows of the combined factor are
* further sorted so that the column-block position of the first structural
* non-zero increases monotonically through the rows. This additional process
* is not performed by this class.
*/
// Internal-use-only typedef for the VariableSlots map base class because this is such a long type name
typedef std::map<Index, std::vector<Index>, std::less<Index>,
boost::fast_pool_allocator<std::pair<const Index, std::vector<Index> > > > _VariableSlots_map;
class VariableSlots : public _VariableSlots_map, public Testable<VariableSlots> {
public:
typedef _VariableSlots_map Base;
/**
* Constructor from a set of factors to be combined. Sorts the variables
* and keeps track of which variable from each factor ends up in each slot
* of the combined factor, as described in the class comment.
*/
template<class FG>
VariableSlots(const FG& factorGraph);
/** print */
void print(const std::string& str = "VariableSlots: ") const;
/** equals */
bool equals(const VariableSlots& rhs, double tol = 0.0) const;
};
}