1 #ifndef STAN_MATH_REV_MAT_FUN_MULTIPLY_HPP
2 #define STAN_MATH_REV_MAT_FUN_MULTIPLY_HPP
12 #include <boost/utility/enable_if.hpp>
13 #include <boost/type_traits.hpp>
14 #include <boost/math/tools/promotion.hpp>
25 template <
typename T1,
typename T2>
28 (boost::is_scalar<T1>::value || boost::is_same<T1, var>::value)
29 && (boost::is_scalar<T2>::value || boost::is_same<T2, var>::value),
30 typename boost::math::tools::promote_args<T1, T2>::type>::type
41 template<
typename T1,
typename T2,
int R2,
int C2>
42 inline Eigen::Matrix<var, R2, C2>
43 multiply(
const T1& c,
const Eigen::Matrix<T2, R2, C2>& m) {
55 template<
typename T1,
int R1,
int C1,
typename T2>
56 inline Eigen::Matrix<var, R1, C1>
57 multiply(
const Eigen::Matrix<T1, R1, C1>& m,
const T2& c) {
71 template<
typename T1,
int R1,
int C1,
typename T2,
int R2,
int C2>
73 boost::enable_if_c< boost::is_same<T1, var>::value ||
74 boost::is_same<T2, var>::value,
75 Eigen::Matrix<var, R1, C2> >::type
77 const Eigen::Matrix<T2, R2, C2>& m2) {
81 Eigen::Matrix<var, R1, C2> result(m1.rows(), m2.cols());
82 for (
int i = 0; i < m1.rows(); i++) {
83 typename Eigen::Matrix<T1, R1, C1>::ConstRowXpr crow(m1.row(i));
84 for (
int j = 0; j < m2.cols(); j++) {
85 typename Eigen::Matrix<T2, R2, C2>::ConstColXpr ccol(m2.col(j));
88 result(i, j) =
var(
new dot_product_vari<T1, T2>(crow, ccol));
90 dot_product_vari<T1, T2> *v2
91 =
static_cast<dot_product_vari<T1, T2>*
>(result(0, j).vi_);
93 =
var(
new dot_product_vari<T1, T2>(crow, ccol, NULL, v2));
97 dot_product_vari<T1, T2> *v1
98 =
static_cast<dot_product_vari<T1, T2>*
>(result(i, 0).vi_);
100 =
var(
new dot_product_vari<T1, T2>(crow, ccol, v1, NULL));
102 dot_product_vari<T1, T2> *v1
103 =
static_cast<dot_product_vari<T1, T2>*
>(result(i, 0).vi_);
104 dot_product_vari<T1, T2> *v2
105 =
static_cast<dot_product_vari<T1, T2>*
>(result(0, j).vi_);
107 =
var(
new dot_product_vari<T1, T2>(crow, ccol, v1, v2));
124 template <
typename T1,
int C1,
typename T2,
int R2>
126 boost::enable_if_c< boost::is_same<T1, var>::value ||
127 boost::is_same<T2, var>::value, var >::type
129 const Eigen::Matrix<T2, R2, 1>& v) {
130 if (rv.size() != v.size())
Eigen::Matrix< fvar< T >, R1, C1 > multiply(const Eigen::Matrix< fvar< T >, R1, C1 > &m, const fvar< T > &c)
Independent (input) and dependent (output) variables for gradients.
var to_var(const double &x)
Converts argument to an automatic differentiation variable.
bool check_multiplicable(const char *function, const char *name1, const T1 &y1, const char *name2, const T2 &y2)
Return true if the matrices can be multiplied.
fvar< T > dot_product(const Eigen::Matrix< fvar< T >, R1, C1 > &v1, const Eigen::Matrix< fvar< T >, R2, C2 > &v2)
void domain_error(const char *function, const char *name, const T &y, const char *msg1, const char *msg2)
Throw a domain error with a consistently formatted message.