35 root_(new internal::ConstantExpression<T>(value)) {
40 root_(new internal::LeafExpression<T>(key)) {
45 root_(new internal::LeafExpression<T>(symbol)) {
50 root_(new internal::LeafExpression<T>(
Symbol(c, j))) {
58 root_(new internal::UnaryExpression<T, A>(function, expression)) {
63 template<
typename A1,
typename A2>
67 new internal::BinaryExpression<T, A1, A2>(function, expression1,
73 template<
typename A1,
typename A2,
typename A3>
78 new internal::TernaryExpression<T, A1, A2, A3>(function, expression1,
79 expression2, expression3)) {
88 new internal::UnaryExpression<T, A>(
std::bind(method,
89 std::placeholders::_1,
std::placeholders::_2),
95 template<
typename A1,
typename A2>
101 new internal::BinaryExpression<T, A1, A2>(
102 std::bind(method,
std::placeholders::_1,
103 std::placeholders::_2,
std::placeholders::_3,
104 std::placeholders::_4),
105 expression1, expression2)) {
110 template<
typename A1,
typename A2,
typename A3>
112 T (A1::*method)(
const A2&,
const A3&,
118 new internal::TernaryExpression<T, A1, A2, A3>(
119 std::bind(method,
std::placeholders::_1,
120 std::placeholders::_2,
std::placeholders::_3,
121 std::placeholders::_4,
std::placeholders::_5,
122 std::placeholders::_6),
123 expression1, expression2, expression3)) {
128 return root_->
keys();
143 std::vector<Matrix>* H)
const {
146 const auto [keys, dims] = keysAndDims();
147 return valueAndDerivatives(values, keys, dims, *H);
150 return root_->value(values);
169 std::vector<Matrix>& H)
const {
172 assert(H.size()==keys.size());
181 T result = valueAndJacobianMap(values, jacobianMap);
184 for (
DenseIndex i = 0; i < static_cast<DenseIndex>(keys.size()); i++)
197 inline std::unique_ptr<internal::ExecutionTraceStorage[]> allocAligned(
size_t size) {
198 const size_t alignedSize = (size + internal::TraceAlignment - 1) / internal::TraceAlignment;
199 return std::unique_ptr<internal::ExecutionTraceStorage[]>(
200 new internal::ExecutionTraceStorage[alignedSize]);
208 const size_t size = traceSize();
209 auto traceStorage = allocAligned(size);
215 T value(this->traceExecution(values, trace, reinterpret_cast<char *>(traceStorage.get())));
220 }
catch (
const std::bad_alloc &e) {
221 std::cerr <<
"valueAndJacobianMap exception: " << e.what() <<
'\n';
229 std::map<Key, int> map;
231 size_t n = map.size();
234 auto key_it = pair.first.begin();
235 auto dim_it = pair.second.begin();
236 for (
const auto& [key, value] : map) {
247 typedef T result_type;
251 return x.compose(y, H1, H2);
257 double operator()(
const double& x,
const double& y,
260 if (H1) H1->setConstant(y);
261 if (H2) H2->setConstant(x);
276 std::placeholders::_2, std::placeholders::_3,
277 std::placeholders::_4),
278 expression1, expression2);
284 std::vector<Expression<T> > unknowns;
286 for (
size_t i = start; i < start + n; i++)
291 template <
typename T>
293 :
Expression<T>(std::make_shared<internal::ScalarMultiplyNode<T>>(s, e)) {}
296 template <
typename T>
298 :
Expression<T>(std::make_shared<internal::BinarySumNode<T>>(e1, e2)) {}
300 template <
typename T>
302 root_ = std::make_shared<internal::BinarySumNode<T>>(*
this, e);
std::pair< KeyVector, FastVector< int > > KeysAndDims
Keys and dimensions in same order.
Definition: Expression.h:191
Definition: Expression.h:232
Definition: Expression-inl.h:246
Definition: VerticalBlockMatrix.h:42
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
Definition: FastVector.h:34
Definition: Expression.h:47
Expression< T > operator*(const Expression< T > &expression1, const Expression< T > &expression2)
Construct a product expression, assumes T::compose(T) -> T.
Definition: Expression-inl.h:272
const Matrix & matrix() const
Definition: VerticalBlockMatrix.h:188
std::vector< Expression< T > > createUnknowns(size_t n, char c, size_t start)
Construct an array of leaves.
Definition: Expression-inl.h:283
Definition: Expression.h:219
ptrdiff_t DenseIndex
The index type for Eigen objects.
Definition: types.h:108
Definition: JacobianMap.h:32
void startReverseAD1(JacobianMap &jacobians) const
Definition: ExecutionTrace.h:157
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
Definition: chartTesting.h:28
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:86
Definition: OptionalJacobian.h:38
std::set< Key > keys() const
Return keys that play in this expression.
Definition: Expression-inl.h:127
Expression()
Default constructor, for serialization.
Definition: Expression.h:188
void dims(std::map< Key, int > &map) const
Return dimensions for each argument, as a map.
Definition: Expression-inl.h:132
Definition: Expression.h:39
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
T traceExecution(const Values &values, internal::ExecutionTrace< T > &trace, char *traceStorage) const
trace execution, very unsafe
Definition: Expression-inl.h:191
size_t traceSize() const
Return size needed for memory buffer in traceExecution.
Definition: Expression-inl.h:160