29 #include <gtsam/base/utilities.h> 31 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 32 #include <boost/serialization/base_object.hpp> 35 #include <type_traits> 49 #define OptionalNone static_cast<Matrix*>(nullptr) 78 typedef std::shared_ptr<This> shared_ptr;
89 template<
typename CONTAINER>
99 DefaultKeyFormatter)
const override;
120 virtual double error(
const Values& c)
const;
129 virtual size_t dim()
const = 0;
144 virtual std::shared_ptr<GaussianFactor>
145 linearize(
const Values& c)
const = 0;
155 throw std::runtime_error(
"NonlinearFactor::clone(): Attempting to clone factor with no clone() implemented!");
164 virtual shared_ptr rekey(
const std::map<Key,Key>& rekey_mapping)
const;
170 virtual shared_ptr rekey(
const KeyVector& new_keys)
const;
202 typedef NonlinearFactor
Base;
220 template<
typename CONTAINER>
222 Base(keys), noiseModel_(noiseModel) {}
233 void print(
const std::string& s =
"",
234 const KeyFormatter& keyFormatter = DefaultKeyFormatter)
const override;
237 bool equals(
const NonlinearFactor& f,
double tol = 1e-9)
const override;
240 size_t dim()
const override {
241 return noiseModel_->dim();
264 return unwhitenedError(x, &H);
271 Vector whitenedError(
const Values& c)
const;
276 Vector unweightedWhitenedError(
const Values& c)
const;
281 double weight(
const Values& c)
const;
289 double error(
const Values& c)
const override;
296 std::shared_ptr<GaussianFactor> linearize(
const Values& x)
const override;
305 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 307 friend class boost::serialization::access;
308 template<
class ARCHIVE>
309 void serialize(ARCHIVE & ar,
const unsigned int ) {
310 ar & boost::serialization::make_nvp(
"NonlinearFactor",
311 boost::serialization::base_object<Base>(*
this));
312 ar & BOOST_SERIALIZATION_NVP(noiseModel_);
332 template <
typename,
typename...>
334 template <
typename T1>
339 template <
typename T1,
typename T2>
344 template <
typename T1,
typename T2,
typename T3>
350 template <
typename T1,
typename T2,
typename T3,
typename T4>
357 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
365 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
366 typename T6,
typename... TExtra>
430 template <
class... ValueTypes>
436 enum { N =
sizeof...(ValueTypes) };
447 template <
typename From,
typename To>
448 using IsConvertible =
449 typename std::enable_if<std::is_convertible<From, To>::value,
void>::type;
452 using IndexIsValid =
typename std::enable_if<(I >= 1) && (I <= N),
455 template <
typename Container>
456 using ContainerElementType =
457 typename std::decay<decltype(*std::declval<Container>().begin())>::type;
458 template <
typename Container>
459 using IsContainerOfKeys = IsConvertible<ContainerElementType<Container>,
Key>;
465 template <
typename Ret,
typename ...Args>
467 std::is_convertible<Args, Matrix&>::value), Ret>;
469 template<
typename Arg>
470 using IsMatrixPointer = std::is_same<typename std::decay_t<Arg>, Matrix*>;
472 template<
typename Arg>
473 using IsNullpointer = std::is_same<typename std::decay_t<Arg>, std::nullptr_t>;
479 template <
typename Ret,
typename ...Args>
481 (IsMatrixPointer<Args>::value || IsNullpointer<Args>::value)), Ret>;
488 template <
typename T =
void>
489 using OptionalMatrixTypeT = Matrix*;
493 template <
typename T>
500 template <
typename T =
void>
501 using MatrixTypeT = Matrix;
523 template <
int I,
typename = IndexIsVal
id<I>>
525 typename std::tuple_element<I - 1, std::tuple<ValueTypes...>>::type;
543 KeyType<ValueTypes>... keys)
544 :
Base(noiseModel,
std::array<
Key, N>{keys...}) {}
553 template <
typename CONTAINER = std::initializer_list<Key>,
554 typename = IsContainerOfKeys<CONTAINER>>
556 :
Base(noiseModel, keys) {
557 if (keys.size() != N) {
558 throw std::invalid_argument(
559 "NoiseModelFactorN: wrong number of keys given");
583 static_assert(I <= N,
"Index out of bounds");
639 virtual Vector evaluateError(
const ValueTypes&... x,
640 OptionalMatrixTypeT<ValueTypes>... H)
const = 0;
649 Vector
evaluateError(
const ValueTypes&... x, MatrixTypeT<ValueTypes>&... H)
const {
650 return evaluateError(x..., (&H)...);
664 return evaluateError(x..., OptionalMatrixTypeT<ValueTypes>()...);
671 template <
typename... OptionalJacArgs,
typename = IndexIsValid<
sizeof...(OptionalJacArgs) + 1>>
673 OptionalJacArgs&&... H)
const {
674 return evaluateError(x..., (&H)...);
681 template <
typename... OptionalJacArgs,
typename = IndexIsValid<
sizeof...(OptionalJacArgs) + 1>>
683 OptionalJacArgs&&... H)
const {
687 return evaluateError(x...,
688 std::forward<OptionalJacArgs>(H)..., static_cast<OptionalMatrixType>(
OptionalNone));
700 template <std::size_t... Indices>
701 inline Vector unwhitenedError(
705 if (this->active(x)) {
707 return evaluateError(x.
at<ValueTypes>(keys_[Indices])...,
710 return evaluateError(x.
at<ValueTypes>(keys_[Indices])...);
713 return Vector::Zero(this->dim());
717 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 719 friend class boost::serialization::access;
720 template <
class ARCHIVE>
721 void serialize(ARCHIVE& ar,
const unsigned int ) {
722 ar& boost::serialization::make_nvp(
723 "NoiseModelFactor", boost::serialization::base_object<Base>(*
this));
731 inline Key key1()
const {
735 inline Key key2()
const {
736 static_assert(I <= N,
"Index out of bounds");
740 inline Key key3()
const {
741 static_assert(I <= N,
"Index out of bounds");
745 inline Key key4()
const {
746 static_assert(I <= N,
"Index out of bounds");
750 inline Key key5()
const {
751 static_assert(I <= N,
"Index out of bounds");
755 inline Key key6()
const {
756 static_assert(I <= N,
"Index out of bounds");
764 #define NoiseModelFactor1 NoiseModelFactorN 765 #define NoiseModelFactor2 NoiseModelFactorN 766 #define NoiseModelFactor3 NoiseModelFactorN 767 #define NoiseModelFactor4 NoiseModelFactorN 768 #define NoiseModelFactor5 NoiseModelFactorN 769 #define NoiseModelFactor6 NoiseModelFactorN Definition: HybridValues.h:38
typename std::enable_if< B, T >::type enable_if_t
An shorthand alias for accessing the ::type inside std::enable_if that can be used in a template dire...
Definition: make_shared.h:30
Definition: NonlinearFactor.h:431
NoiseModelFactorN(const SharedNoiseModel &noiseModel, KeyType< ValueTypes >... keys)
Definition: NonlinearFactor.h:542
std::vector< Matrix > * OptionalMatrixVecType
Definition: NonlinearFactor.h:61
size_t dim() const override
Definition: NonlinearFactor.h:240
AreAllMatrixRefs< Vector, OptionalJacArgs... > evaluateError(const ValueTypes &... x, OptionalJacArgs &&... H) const
Definition: NonlinearFactor.h:672
A non-templated config holding any types of Manifold-group elements.
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
Definition: NonlinearFactor.h:340
const ValueType at(Key j) const
Definition: Values-inl.h:204
Definition: Testable.h:152
Key key() const
Definition: NonlinearFactor.h:582
Definition: NonlinearFactor.h:68
Vector unwhitenedError(const Values &x, std::vector< Matrix > &H) const
Definition: NonlinearFactor.h:263
NoiseModelFactor()
Definition: NonlinearFactor.h:212
NonlinearFactor()
Definition: NonlinearFactor.h:84
~NoiseModelFactor() override
Definition: NonlinearFactor.h:215
Definition: NonlinearFactor.h:197
#define OptionalNone
Definition: NonlinearFactor.h:49
Vector evaluateError(const ValueTypes &... x) const
Definition: NonlinearFactor.h:663
Definition: Testable.h:112
const SharedNoiseModel & noiseModel() const
access to the noise model
Definition: NonlinearFactor.h:245
Matrix * OptionalMatrixType
Definition: NonlinearFactor.h:55
Definition: NonlinearFactor.h:345
AreAllMatrixPtrs< Vector, OptionalJacArgs... > evaluateError(const ValueTypes &... x, OptionalJacArgs &&... H) const
Definition: NonlinearFactor.h:682
NoiseModelFactor(const SharedNoiseModel &noiseModel, const CONTAINER &keys)
Definition: NonlinearFactor.h:221
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
NoiseModelFactorN(const SharedNoiseModel &noiseModel, CONTAINER keys)
Definition: NonlinearFactor.h:555
std::enable_if_t<(... &&(IsMatrixPointer< Args >::value||IsNullpointer< Args >::value)), Ret > AreAllMatrixPtrs
Definition: NonlinearFactor.h:481
Definition: utilities.h:35
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
Vector evaluateError(const ValueTypes &... x, MatrixTypeT< ValueTypes > &... H) const
Definition: NonlinearFactor.h:649
Definition: chartTesting.h:28
Vector unwhitenedError(const Values &x, OptionalMatrixVecType H=nullptr) const override
Definition: NonlinearFactor.h:606
std::shared_ptr< This > shared_ptr
Definition: NonlinearFactor.h:209
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:86
virtual Vector unwhitenedError(const Values &x, OptionalMatrixVecType H=nullptr) const =0
NoiseModelFactorN()
Default Constructor for I/O.
Definition: NonlinearFactor.h:533
Definition: NonlinearFactor.h:358
virtual bool active(const Values &) const
Definition: NonlinearFactor.h:141
Definition: NonlinearFactor.h:333
typename std::tuple_element< I - 1, std::tuple< ValueTypes... > >::type ValueType
Definition: NonlinearFactor.h:525
virtual bool sendable() const
Definition: NonlinearFactor.h:176
Definition: utilities.h:49
Definition: NonlinearFactor.h:351
Special class for optional Jacobian arguments.
Definition: NonlinearFactor.h:335
std::enable_if_t<(... &&std::is_convertible< Args, Matrix & >::value), Ret > AreAllMatrixRefs
Definition: NonlinearFactor.h:467
virtual shared_ptr clone() const
Definition: NonlinearFactor.h:153
NoiseModelFactor(const SharedNoiseModel &noiseModel)
Definition: NonlinearFactor.h:229
NonlinearFactor(const CONTAINER &keys)
Definition: NonlinearFactor.h:90
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
noiseModel::Base::shared_ptr SharedNoiseModel
Definition: NoiseModel.h:741
The base class for all factors.