Stan Math Library  2.20.0
reverse mode automatic differentiation
categorical_logit_lpmf.hpp
Go to the documentation of this file.
1 #ifndef STAN_MATH_PRIM_MAT_PROB_CATEGORICAL_LOGIT_LPMF_HPP
2 #define STAN_MATH_PRIM_MAT_PROB_CATEGORICAL_LOGIT_LPMF_HPP
3 
11 #include <boost/math/tools/promotion.hpp>
12 #include <vector>
13 
14 namespace stan {
15 namespace math {
16 
17 // CategoricalLog(n|theta) [0 < n <= N, theta unconstrained], no checking
18 template <bool propto, typename T_prob>
19 typename boost::math::tools::promote_args<T_prob>::type categorical_logit_lpmf(
20  int n, const Eigen::Matrix<T_prob, Eigen::Dynamic, 1>& beta) {
21  static const char* function = "categorical_logit_lpmf";
22 
23  check_bounded(function, "categorical outcome out of support", n, 1,
24  beta.size());
25  check_finite(function, "log odds parameter", beta);
26 
28  return 0.0;
29 
30  // FIXME: wasteful vs. creating term (n-1) if not vectorized
31  return beta(n - 1) - log_sum_exp(beta); // == log_softmax(beta)(n-1);
32 }
33 
34 template <typename T_prob>
35 inline typename boost::math::tools::promote_args<T_prob>::type
37  const Eigen::Matrix<T_prob, Eigen::Dynamic, 1>& beta) {
38  return categorical_logit_lpmf<false>(n, beta);
39 }
40 
41 template <bool propto, typename T_prob>
42 typename boost::math::tools::promote_args<T_prob>::type categorical_logit_lpmf(
43  const std::vector<int>& ns,
44  const Eigen::Matrix<T_prob, Eigen::Dynamic, 1>& beta) {
45  static const char* function = "categorical_logit_lpmf";
46 
47  for (const auto& x : ns)
48  check_bounded(function, "categorical outcome out of support", x, 1,
49  beta.size());
50  check_finite(function, "log odds parameter", beta);
51 
53  return 0.0;
54 
55  if (ns.empty())
56  return 0.0;
57 
58  Eigen::Matrix<T_prob, Eigen::Dynamic, 1> log_softmax_beta = log_softmax(beta);
59 
60  // FIXME: replace with more efficient sum()
61  Eigen::Matrix<typename boost::math::tools::promote_args<T_prob>::type,
62  Eigen::Dynamic, 1>
63  results(ns.size());
64  for (size_t i = 0; i < ns.size(); ++i)
65  results[i] = log_softmax_beta(ns[i] - 1);
66  return sum(results);
67 }
68 
69 template <typename T_prob>
70 inline typename boost::math::tools::promote_args<T_prob>::type
71 categorical_logit_lpmf(const std::vector<int>& ns,
72  const Eigen::Matrix<T_prob, Eigen::Dynamic, 1>& beta) {
73  return categorical_logit_lpmf<false>(ns, beta);
74 }
75 
76 } // namespace math
77 } // namespace stan
78 #endif
fvar< T > sum(const std::vector< fvar< T > > &m)
Return the sum of the entries of the specified standard vector.
Definition: sum.hpp:20
void check_finite(const char *function, const char *name, const T_y &y)
Check if y is finite.
void check_bounded(const char *function, const char *name, const T_y &y, const T_low &low, const T_high &high)
Check if the value is between the low and high values, inclusively.
Eigen::Matrix< fvar< T >, Eigen::Dynamic, 1 > log_softmax(const Eigen::Matrix< fvar< T >, Eigen::Dynamic, 1 > &alpha)
Definition: log_softmax.hpp:14
fvar< T > log_sum_exp(const std::vector< fvar< T > > &v)
Definition: log_sum_exp.hpp:12
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
boost::math::tools::promote_args< T_prob >::type categorical_logit_lpmf(int n, const Eigen::Matrix< T_prob, Eigen::Dynamic, 1 > &beta)
fvar< T > beta(const fvar< T > &x1, const fvar< T > &x2)
Return fvar with the beta function applied to the specified arguments and its gradient.
Definition: beta.hpp:51

     [ Stan Home Page ] © 2011–2018, Stan Development Team.