1 #ifndef STAN_MATH_FWD_SCAL_FUN_LOG_MIX_HPP 2 #define STAN_MATH_FWD_SCAL_FUN_LOG_MIX_HPP 7 #include <boost/math/tools/promotion.hpp> 26 template <
typename T_theta,
typename T_lambda1,
typename T_lambda2,
int N>
29 const T_lambda1& lambda1,
30 const T_lambda2& lambda2,
32 boost::math::tools::promote_args<
33 T_theta, T_lambda1, T_lambda2>::type
34 (&partials_array)[N]) {
37 using boost::math::tools::promote_args;
38 typedef typename promote_args<T_theta, T_lambda1, T_lambda2>::type
41 typename promote_args<T_lambda1, T_lambda2>::type lam2_m_lam1
43 typename promote_args<T_lambda1, T_lambda2>::type exp_lam2_m_lam1
45 typename promote_args<T_lambda1, T_lambda2>::type one_m_exp_lam2_m_lam1
46 = 1.0 - exp_lam2_m_lam1;
47 typename promote_args<double, T_theta>::type one_m_t = 1.0 - theta;
48 partial_return_type one_m_t_prod_exp_lam2_m_lam1
49 = one_m_t * exp_lam2_m_lam1;
50 partial_return_type t_plus_one_m_t_prod_exp_lam2_m_lam1
51 = theta + one_m_t_prod_exp_lam2_m_lam1;
52 partial_return_type one_d_t_plus_one_m_t_prod_exp_lam2_m_lam1
53 = 1.0 / t_plus_one_m_t_prod_exp_lam2_m_lam1;
55 unsigned int offset = 0;
56 if (is_same<T_theta, partial_return_type>::value) {
57 partials_array[offset]
58 = one_m_exp_lam2_m_lam1
59 * one_d_t_plus_one_m_t_prod_exp_lam2_m_lam1;
62 if (is_same<T_lambda1, partial_return_type>::value) {
63 partials_array[offset]
64 = theta * one_d_t_plus_one_m_t_prod_exp_lam2_m_lam1;
67 if (is_same<T_lambda2, partial_return_type>::value) {
68 partials_array[offset]
69 = one_m_t_prod_exp_lam2_m_lam1
70 * one_d_t_plus_one_m_t_prod_exp_lam2_m_lam1;
113 template <
typename T>
119 fvar<T> partial_deriv_array[3];
123 + lambda1.
d_ *
value_of(partial_deriv_array[1])
124 + lambda2.
d_ *
value_of(partial_deriv_array[2]));
126 fvar<T> partial_deriv_array[3];
128 partial_deriv_array);
131 + lambda1.
d_ *
value_of(partial_deriv_array[2])
132 + lambda2.
d_ *
value_of(partial_deriv_array[1]));
136 template <
typename T>
141 if (lambda1.
val_ > lambda2) {
142 fvar<T> partial_deriv_array[2];
144 partial_deriv_array);
147 + lambda1.
d_ *
value_of(partial_deriv_array[1]));
149 fvar<T> partial_deriv_array[2];
151 partial_deriv_array);
154 + lambda1.
d_ *
value_of(partial_deriv_array[1]));
163 if (lambda1 > lambda2.
val_) {
164 fvar<T> partial_deriv_array[2];
166 partial_deriv_array);
169 + lambda2.
d_ *
value_of(partial_deriv_array[1]));
171 fvar<T> partial_deriv_array[2];
173 partial_deriv_array);
176 + lambda2.
d_ *
value_of(partial_deriv_array[1]));
186 fvar<T> partial_deriv_array[2];
190 + lambda2.
d_ *
value_of(partial_deriv_array[1]));
192 fvar<T> partial_deriv_array[2];
194 partial_deriv_array);
197 + lambda2.
d_ *
value_of(partial_deriv_array[0]));
205 if (lambda1 > lambda2) {
206 fvar<T> partial_deriv_array[1];
211 fvar<T> partial_deriv_array[1];
213 partial_deriv_array);
215 -theta.
d_ *
value_of(partial_deriv_array[0]));
223 if (lambda1.
val_ > lambda2) {
224 fvar<T> partial_deriv_array[1];
227 lambda1.
d_ *
value_of(partial_deriv_array[0]));
229 fvar<T> partial_deriv_array[1];
231 partial_deriv_array);
233 lambda1.
d_ *
value_of(partial_deriv_array[0]));
241 if (lambda1 > lambda2.
val_) {
242 fvar<T> partial_deriv_array[1];
245 lambda2.
d_ *
value_of(partial_deriv_array[0]));
247 fvar<T> partial_deriv_array[1];
249 partial_deriv_array);
251 lambda2.
d_ *
value_of(partial_deriv_array[0]));
T value_of(const fvar< T > &v)
Return the value of the specified variable.
fvar< T > exp(const fvar< T > &x)
void log_mix_partial_helper(const T_theta &theta, const T_lambda1 &lambda1, const T_lambda2 &lambda2, typename boost::math::tools::promote_args< T_theta, T_lambda1, T_lambda2 >::type(&partials_array)[N])
fvar< T > log_mix(const fvar< T > &theta, const fvar< T > &lambda1, const fvar< T > &lambda2)
Return the log mixture density with specified mixing proportion and log densities and its derivative ...