Sleipnir C++ API
Loading...
Searching...
No Matches
gradient.hpp
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <algorithm>
6#include <utility>
7
8#include <Eigen/SparseCore>
9
10#include "sleipnir/autodiff/jacobian.hpp"
11#include "sleipnir/autodiff/variable.hpp"
12#include "sleipnir/autodiff/variable_matrix.hpp"
13#include "sleipnir/util/concepts.hpp"
14#include "sleipnir/util/symbol_exports.hpp"
15
16namespace slp {
17
25template <typename Scalar>
26class Gradient {
27 public:
33 : m_jacobian{std::move(variable), std::move(wrt)} {}
34
41 : m_jacobian{VariableMatrix{std::move(variable)}, std::move(wrt)} {}
42
49 VariableMatrix<Scalar> get() const { return m_jacobian.get().T(); }
50
54 const Eigen::SparseVector<Scalar>& value() {
55 const auto& J = m_jacobian.value();
56
57 if (m_g.rows() == 0) {
58 m_g = J.transpose();
59 } else {
60 // J's sparsity pattern is constant, so m_g's indices from the first
61 // transpose are still valid. J is column-major with one row, so each
62 // column holds at most one value and the values are sorted by column
63 // index. This matches m_g's index order, so we can copy the values
64 // directly.
65 std::copy_n(J.valuePtr(), J.nonZeros(), m_g.valuePtr());
66 }
67
68 return m_g;
69 }
70
71 private:
72 Eigen::SparseVector<Scalar> m_g;
73
74 Jacobian<Scalar> m_jacobian;
75};
76
77extern template class EXPORT_TEMPLATE_DECLARE(SLEIPNIR_DLLEXPORT)
78Gradient<double>;
79
80} // namespace slp
Definition gradient.hpp:26
const Eigen::SparseVector< Scalar > & value()
Definition gradient.hpp:54
Gradient(Variable< Scalar > variable, SleipnirMatrixLike< Scalar > auto wrt)
Definition gradient.hpp:40
VariableMatrix< Scalar > get() const
Definition gradient.hpp:49
Gradient(Variable< Scalar > variable, Variable< Scalar > wrt)
Definition gradient.hpp:32
Definition jacobian.hpp:31
Definition variable_matrix.hpp:37
Definition variable.hpp:56
Definition concepts.hpp:33