Example #1
0
 void
 hessian(const F& f,
         const Eigen::Matrix<double, Eigen::Dynamic, 1>& x,
         double& fx,
         Eigen::Matrix<double, Eigen::Dynamic, 1>& grad,
         Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& H) {
   H.resize(x.size(), x.size());
   grad.resize(x.size());
   try {
     for (int i = 0; i < x.size(); ++i) {
       start_nested();
       Eigen::Matrix<fvar<var>, Eigen::Dynamic, 1> x_fvar(x.size());
       for (int j = 0; j < x.size(); ++j)
         x_fvar(j) = fvar<var>(x(j), i == j);
       fvar<var> fx_fvar = f(x_fvar);
       grad(i) = fx_fvar.d_.val();
       if (i == 0) fx = fx_fvar.val_.val();
       stan::math::grad(fx_fvar.d_.vi_);
       for (int j = 0; j < x.size(); ++j)
         H(i, j) = x_fvar(j).val_.adj();
       stan::math::recover_memory_nested();
     }
   } catch (const std::exception& e) {
     stan::math::recover_memory_nested();
     throw;
   }
 }
Example #2
0
 void
 partial_derivative(const F& f,
                    const Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
                    int n,
                    T& fx,
                    T& dfx_dxn) {
   Eigen::Matrix<fvar<T>, Eigen::Dynamic, 1> x_fvar(x.size());
   for (int i = 0; i < x.size(); ++i)
     x_fvar(i) = fvar<T>(x(i), i == n);
   fvar<T> fx_fvar = f(x_fvar);
   fx = fx_fvar.val_;
   dfx_dxn = fx_fvar.d_;
 }
Example #3
0
 void
 hessian(const F& f,
         const Eigen::Matrix<T, Eigen::Dynamic, 1>& x,
         T& fx,
         Eigen::Matrix<T, Eigen::Dynamic, 1>& grad,
         Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& H) {
   H.resize(x.size(), x.size());
   grad.resize(x.size());
   Eigen::Matrix<fvar<fvar<T> >, Eigen::Dynamic, 1> x_fvar(x.size());
   for (int i = 0; i < x.size(); ++i) {
     for (int j = i; j < x.size(); ++j) {
       for (int k = 0; k < x.size(); ++k)
         x_fvar(k) = fvar<fvar<T> >(fvar<T>(x(k), j == k),
                                    fvar<T>(i == k, 0));
       fvar<fvar<T> > fx_fvar = f(x_fvar);
       if (j == 0)
         fx = fx_fvar.val_.val_;
       if (i == j)
         grad(i) = fx_fvar.d_.val_;
       H(i, j) = fx_fvar.d_.d_;
       H(j, i) = H(i, j);
     }
   }
 }