Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into feature/pf-funcs-c…
Browse files Browse the repository at this point in the history
…onstexpr
  • Loading branch information
SteveBronder committed Jul 29, 2024
2 parents d5de333 + f120c5e commit 855546a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 33 deletions.
6 changes: 3 additions & 3 deletions stan/math/prim/fun/serializer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,9 @@ deserializer<T> to_deserializer(const std::vector<T>& vals) {
* @param vals values to deserialize
* @return deserializer based on specified values
*/
template <typename T>
deserializer<T> to_deserializer(const Eigen::Matrix<T, -1, 1>& vals) {
return deserializer<T>(vals);
template <typename T, require_eigen_vector_t<T>* = nullptr>
deserializer<scalar_type_t<T>> to_deserializer(const T& vals) {
return deserializer<scalar_type_t<T>>(vals);
}

template <typename T>
Expand Down
49 changes: 19 additions & 30 deletions stan/math/prim/functor/finite_diff_gradient_auto.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,41 +46,30 @@ namespace math {
* @param[out] fx function applied to argument
* @param[out] grad_fx gradient of function at argument
*/
template <typename F, typename VectorT,
template <typename F, typename VectorT, typename GradVectorT,
typename ScalarT = return_type_t<VectorT>>
void finite_diff_gradient_auto(const F& f, const VectorT& x, ScalarT& fx,
VectorT& grad_fx) {
VectorT x_temp(x);
void finite_diff_gradient_auto(const F& f, VectorT&& x, ScalarT& fx,
GradVectorT& grad_fx) {
using EigT = Eigen::Matrix<ScalarT, -1, 1>;
static constexpr int h_scale[6] = {3, 2, 1, -3, -2, -1};
static constexpr int mults[6] = {1, -9, 45, -1, 9, -45};

fx = f(x);
grad_fx.resize(x.size());
for (int i = 0; i < x.size(); ++i) {
double h = finite_diff_stepsize(value_of_rec(x[i]));
Eigen::Map<EigT> grad_map(grad_fx.data(), grad_fx.size());

grad_map = EigT::NullaryExpr(x.size(), [&f, &x](Eigen::Index i) {
double h = finite_diff_stepsize(value_of_rec(x[i]));
ScalarT delta_f = 0;

x_temp[i] = x[i] + 3 * h;
delta_f += f(x_temp);

x_temp[i] = x[i] + 2 * h;
delta_f -= 9 * f(x_temp);

x_temp[i] = x[i] + h;
delta_f += 45 * f(x_temp);

x_temp[i] = x[i] + -3 * h;
delta_f -= f(x_temp);

x_temp[i] = x[i] + -2 * h;
delta_f += 9 * f(x_temp);

x_temp[i] = x[i] - h;
delta_f -= 45 * f(x_temp);

delta_f /= 60 * h;

x_temp[i] = x[i];
grad_fx[i] = delta_f;
}
for (int j = 0; j < 6; ++j) {
auto x_temp
= EigT::NullaryExpr(x.size(), [&x, &i, &h, &j](Eigen::Index k) {
return k == i ? x[i] + h * h_scale[j] : x[k];
});
delta_f += f(std::move(x_temp)) * mults[j];
}
return delta_f / (60 * h);
});
}

} // namespace math
Expand Down

0 comments on commit 855546a

Please sign in to comment.