20#include <gtsam/config.h>
22#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V43
70 GTSAM_CONCEPT_LIE_TYPE(VALUE)
72 typedef NoiseModelFactorN<VALUE> Base;
73 typedef PartialPriorFactor<VALUE> This;
74 typedef FunctorizedFactor<Vector, VALUE> InternalFactor;
77 std::vector<size_t> indices_;
78 InternalFactor internalFactor_;
81 static InternalFactor MakeInternalFactor(
82 Key key,
const Vector& prior,
const SharedNoiseModel& model,
83 const std::vector<size_t>& indices) {
85 [indices](
const T& value,
86 OptionalJacobian<Eigen::Dynamic, Eigen::Dynamic> H = {}) {
87 constexpr int Dim = traits<T>::dimension;
88 Eigen::Matrix<double, Dim, Dim> Hlocal;
91#ifdef GTSAM_ROT3_EXPMAP
92 const Vector fullTangent = traits<T>::Local(
93 traits<T>::Identity(), value, {}, H ? &Hlocal :
nullptr);
95 const Vector fullTangent =
96 traits<T>::Logmap(value, H ? &Hlocal :
nullptr);
100 H->setZero(indices.size(), Dim);
101 for (
size_t i = 0; i < indices.size(); ++i) {
102 H->row(i) = Hlocal.row(indices.at(i));
106 Vector partialTangent(indices.size());
107 for (
size_t i = 0; i < indices.size(); ++i) {
108 partialTangent(i) = fullTangent(indices.at(i));
110 return partialTangent;
112 return MakeFunctorizedFactor<T>(key, prior, model, projection);
116 void initializeInternalFactor() {
118 MakeInternalFactor(this->key1(), prior_, this->noiseModel(), indices_);
125 PartialPriorFactor(Key key,
const SharedNoiseModel& model)
127 internalFactor_(MakeInternalFactor(key, prior_, model, indices_)) {}
132 using Base::evaluateError;
135 PartialPriorFactor() {}
138 PartialPriorFactor(Key key,
size_t idx,
double prior,
139 const SharedNoiseModel& model)
141 prior_(Vector{{prior}}),
143 internalFactor_(MakeInternalFactor(key, prior_, model, indices_)) {
144 assert(model->dim() == 1);
148 PartialPriorFactor(
Key key,
const std::vector<size_t>& indices,
const Vector& prior,
153 internalFactor_(MakeInternalFactor(key, prior_, model, indices_)) {
154 assert((
size_t)prior_.size() == indices_.size());
155 assert(model->dim() == (
size_t)prior.size());
158 ~PartialPriorFactor()
override {}
161 gtsam::NonlinearFactor::shared_ptr clone()
const override {
162 return std::static_pointer_cast<gtsam::NonlinearFactor>(
163 gtsam::NonlinearFactor::shared_ptr(
new This(*
this))); }
169 Base::print(s, keyFormatter);
171 std::cout <<
"Indices: ";
172 for (
const int i : indices_) {
173 std::cout << i <<
" ";
175 std::cout << std::endl;
180 const This *e =
dynamic_cast<const This*
> (&expected);
181 return e !=
nullptr && Base::equals(*e, tol) &&
183 this->indices_ == e->indices_;
190 return internalFactor_.evaluateError(p, H);
194 const Vector& prior()
const {
return prior_; }
195 const std::vector<size_t>& indices()
const {
return indices_; }
198#if GTSAM_ENABLE_BOOST_SERIALIZATION
200 friend class boost::serialization::access;
201 template <
class ARCHIVE>
202 void save(ARCHIVE& ar,
const unsigned int )
const {
204 ar & boost::serialization::make_nvp(
"NoiseModelFactor1",
205 boost::serialization::base_object<Base>(*
this));
206 ar & BOOST_SERIALIZATION_NVP(prior_);
207 ar & BOOST_SERIALIZATION_NVP(indices_);
210 template <
class ARCHIVE>
211 void load(ARCHIVE& ar,
const unsigned int ) {
213 ar & boost::serialization::make_nvp(
"NoiseModelFactor1",
214 boost::serialization::base_object<Base>(*
this));
215 ar & BOOST_SERIALIZATION_NVP(prior_);
216 ar & BOOST_SERIALIZATION_NVP(indices_);
217 initializeInternalFactor();
220 BOOST_SERIALIZATION_SPLIT_MEMBER()
Base class and basic functions for Lie types.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
Definition Key.cpp:30
Matrix * OptionalMatrixType
This typedef will be used everywhere boost::optional<Matrix&> reference was used previously.
Definition NonlinearFactor.h:57
void save(const Matrix &A, const string &s, const string &filename)
save a matrix to file, which can be loaded by matlab
Definition Matrix.cpp:154
NoiseModelFactorT< Vector, ValueTypes... > NoiseModelFactorN
Noise model factor with N value types and dynamic-sized error vector.
Definition NoiseModelFactorN.h:561
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
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
noiseModel::Base::shared_ptr SharedNoiseModel
Aliases.
Definition NoiseModel.h:846
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
bool equal_with_abs_tol(const Eigen::DenseBase< MATRIX > &A, const Eigen::DenseBase< MATRIX > &B, double tol=1e-9)
equals with a tolerance
Definition Matrix.h:81
Template to create a binary predicate.
Definition Testable.h:112
Nonlinear factor base class.
Definition NonlinearFactor.h:70