23 #include <gtsam/config.h> 47 GTSAM_CONCEPT_ASSERT(IsTestable<T>);
51 typedef ExpressionFactor<T> This;
52 static const int Dim = traits<T>::dimension;
63 typedef std::shared_ptr<ExpressionFactor<T> > shared_ptr;
85 void print(
const std::string& s =
"",
86 const KeyFormatter& keyFormatter = DefaultKeyFormatter)
const override {
112 const T value = expression_.
value(x);
120 return std::shared_ptr<JacobianFactor>();
124 if (noiseModel_ && noiseModel_->isConstrained()) {
126 noiseModel_)->unit();
130 std::shared_ptr<JacobianFactor> factor(
148 Vector b = Ab(
size()).col(0);
149 noiseModel_->WhitenSystem(Ab.
matrix(), b);
152 return std::move(factor);
156 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
158 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
174 throw std::invalid_argument(
"ExpressionFactor: no NoiseModel.");
175 if (noiseModel_->dim() != Dim)
176 throw std::invalid_argument(
177 "ExpressionFactor was created with a NoiseModel of incorrect dimension.");
185 std::tie(
keys_, dims_) = expression_.keysAndDims();
190 std::map<Key, int> keyedDims;
191 expression_.
dims(keyedDims);
192 for (
Key key :
keys_) dims_.push_back(keyedDims[key]);
199 throw std::runtime_error(
"ExpressionFactor::expression not provided: cannot deserialize.");
203 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 204 template <
class Archive>
206 void save(Archive& ar,
const unsigned int )
const {
208 ar << boost::serialization::make_nvp(
"measured_", this->measured_);
213 template <
class Archive>
214 void load(Archive& ar,
const unsigned int ) {
216 ar >> boost::serialization::make_nvp(
"measured_", this->measured_);
221 BOOST_SERIALIZATION_SPLIT_MEMBER()
223 friend class boost::serialization::access;
227 enum { NeedsToAlign = (
sizeof(T) % 16) == 0 };
234 template <
typename T>
248 template <
typename T,
typename... Args>
251 static const std::size_t NARY_EXPRESSION_SIZE =
sizeof...(Args);
252 using ArrayNKeys = std::array<Key, NARY_EXPRESSION_SIZE>;
264 throw std::runtime_error(
265 "ExpressionFactorN::expression not provided: cannot deserialize.");
274 const T &measurement)
276 for (
const auto &key : keys)
290 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 291 friend class boost::serialization::access;
292 template <
class ARCHIVE>
293 void serialize(ARCHIVE &ar,
const unsigned int ) {
294 ar &boost::serialization::make_nvp(
301 template <
typename T,
typename... Args>
303 :
public Testable<ExpressionFactorN<T, Args...>> {};
std::vector< Matrix > * OptionalMatrixVecType
Definition: NonlinearFactor.h:61
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition: ExpressionFactor.h:156
bool equals(const NonlinearFactor &f, double tol=1e-9) const override
Concept check for values that can be used in unit tests.
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
virtual Expression< T > expression(const ArrayNKeys &keys) const
Definition: ExpressionFactor.h:263
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print relies on Testable traits being defined for T
Definition: ExpressionFactor.h:85
Definition: VerticalBlockMatrix.h:42
size_t size() const
Definition: Factor.h:159
Definition: Testable.h:152
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
Definition: FastVector.h:34
Definition: NonlinearFactor.h:68
void initialize(const Expression< T > &expression)
Initialize with constructor arguments.
Definition: ExpressionFactor.h:172
Definition: Expression.h:47
const Matrix & matrix() const
Definition: VerticalBlockMatrix.h:188
KeyVector keys_
The keys involved in this factor.
Definition: Factor.h:87
T valueAndJacobianMap(const Values &values, internal::JacobianMap &jacobians) const
brief Return value and derivatives, reverse AD version
Definition: Expression-inl.h:204
virtual Expression< T > expression() const
Definition: ExpressionFactor.h:198
ExpressionFactor(const SharedNoiseModel &noiseModel, const T &measurement, const Expression< T > &expression)
Definition: ExpressionFactor.h:72
ExpressionFactor(const SharedNoiseModel &noiseModel, const T &measurement)
Default constructor, for serialization.
Definition: ExpressionFactor.h:166
Definition: JacobianMap.h:32
Expressions for Block Automatic Differentiation.
Definition: NonlinearFactor.h:197
#define GTSAM_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
Definition: types.h:293
const T & measured() const
Definition: ExpressionFactor.h:82
~ExpressionFactor() override
Destructor.
Definition: ExpressionFactor.h:79
const SharedNoiseModel & noiseModel() const
access to the noise model
Definition: NonlinearFactor.h:245
Vector unwhitenedError(const Values &x, OptionalMatrixVecType H=nullptr) const override
Definition: ExpressionFactor.h:104
GTSAM_EXPORT void save(const Matrix &A, const std::string &s, const std::string &filename)
FastVector< int > dims_
dimensions of the Jacobian matrices
Definition: ExpressionFactor.h:56
T valueAndDerivatives(const Values &values, const KeyVector &keys, const FastVector< int > &dims, std::vector< Matrix > &H) const
private version that takes keys and dimensions, returns derivatives
Definition: Expression-inl.h:167
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
Definition: JacobianFactor.h:91
Definition: chartTesting.h:28
virtual Vector unwhitenedError(const Values &x, OptionalMatrixVecType H=nullptr) const =0
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Non-linear factor base classes.
virtual bool active(const Values &) const
Definition: NonlinearFactor.h:141
bool equals(const NonlinearFactor &f, double tol) const override
equals relies on Testable traits being defined for T
Definition: ExpressionFactor.h:92
T value(const Values &values, std::vector< Matrix > *H=nullptr) const
Return value and optional derivatives, reverse AD version Notes: this is not terribly efficient...
Definition: Expression-inl.h:142
Expression< T > expression_
the expression that is AD enabled
Definition: ExpressionFactor.h:55
ExpressionFactorN(const ArrayNKeys &keys, const SharedNoiseModel &noiseModel, const T &measurement)
Constructor takes care of keys, but still need to call initialize.
Definition: ExpressionFactor.h:273
const KeyVector & keys() const
Access the factor's involved variable keys.
Definition: Factor.h:142
T measured_
the measurement to be compared with the expression
Definition: ExpressionFactor.h:54
void dims(std::map< Key, int > &map) const
Return dimensions for each argument, as a map.
Definition: Expression-inl.h:132
Definition: ExpressionFactor.h:249
std::shared_ptr< GaussianFactor > linearize(const Values &x) const override
Definition: ExpressionFactor.h:117
Definition: Expression.h:36
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
Definition: NoiseModel.h:390
noiseModel::Base::shared_ptr SharedNoiseModel
Definition: NoiseModel.h:741