60 lines
2.3 KiB
C++
60 lines
2.3 KiB
C++
/**
|
|
* @file Factor-inl.h
|
|
* @brief
|
|
* @author Richard Roberts
|
|
* @created Sep 1, 2010
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <gtsam/inference/Factor.h>
|
|
|
|
#include <boost/foreach.hpp>
|
|
#include <boost/make_shared.hpp>
|
|
#include <boost/iterator/transform_iterator.hpp>
|
|
#include <boost/lambda/bind.hpp>
|
|
#include <boost/lambda/lambda.hpp>
|
|
|
|
namespace gtsam {
|
|
|
|
///* ************************************************************************* */
|
|
//template<class ConditionalType>
|
|
//Factor::Factor(const boost::shared_ptr<ConditionalType>& c) {
|
|
// keys_.resize(c->parents().size()+1);
|
|
// keys_[0] = c->key();
|
|
// size_t j = 1;
|
|
// BOOST_FOREACH(const Index parent, c->parents()) {
|
|
// keys_[j++] = parent;
|
|
// }
|
|
// checkSorted();
|
|
//}
|
|
|
|
/* ************************************************************************* */
|
|
template<class KeyIterator> Factor::Factor(KeyIterator beginKey, KeyIterator endKey) :
|
|
keys_(beginKey, endKey) { assertInvariants(); }
|
|
|
|
/* ************************************************************************* */
|
|
template<class FactorGraphType, class VariableIndexStorage>
|
|
Factor::shared_ptr Factor::Combine(const FactorGraphType& factorGraph,
|
|
const VariableIndex<VariableIndexStorage>& variableIndex, const std::vector<size_t>& factors,
|
|
const std::vector<Index>& variables, const std::vector<std::vector<size_t> >& variablePositions) {
|
|
|
|
return shared_ptr(new Factor(variables.begin(), variables.end()));
|
|
}
|
|
|
|
/* ************************************************************************* */
|
|
template<class MapAllocator>
|
|
Factor::shared_ptr Factor::Combine(const FactorGraph<Factor>& factors, const std::map<Index, std::vector<Index>, std::less<Index>, MapAllocator>& variableSlots) {
|
|
typedef const std::map<Index, std::vector<Index>, std::less<Index>, MapAllocator> VariableSlots;
|
|
typedef typeof(boost::lambda::bind(&VariableSlots::value_type::first, boost::lambda::_1)) FirstGetter;
|
|
typedef boost::transform_iterator<
|
|
FirstGetter, typename VariableSlots::const_iterator,
|
|
Index, Index> IndexIterator;
|
|
FirstGetter firstGetter(boost::lambda::bind(&VariableSlots::value_type::first, boost::lambda::_1));
|
|
IndexIterator keysBegin(variableSlots.begin(), firstGetter);
|
|
IndexIterator keysEnd(variableSlots.end(), firstGetter);
|
|
return shared_ptr(new Factor(keysBegin, keysEnd));
|
|
}
|
|
|
|
}
|