1 #ifndef __STAN__AGRAD__MATRIX_HPP__
2 #define __STAN__AGRAD__MATRIX_HPP__
17 void fill(std::vector<T>& x,
const var& y) {
18 for (
size_t i = 0; i < x.size(); ++i)
21 template <
int R,
int C>
22 void fill(Eigen::Matrix<var,R,C>& x,
const var& y) {
38 size_t length,
double *dotprod) {
40 for (
size_t i = 0; i <
length; i++)
41 result += v1[i*stride1].vi_->
val_ * v2[i*stride2].
vi_->
val_;
43 return alpha->vi_->
val_ * result;
53 for (
size_t i = 0; i <
length_; i++)
54 v1_[i] = v1[i*stride1].vi_;
55 for (
size_t i = 0; i <
length_; i++)
56 v2_[i] = v2[i*stride2].vi_;
60 for (
size_t i = 0; i <
length_; i++) {
76 template <>
struct NumTraits<stan::agrad::var>
144 RequireInitialization = 0,
157 struct significant_decimals_default_impl<stan::agrad::var,false>
159 static inline int run()
172 struct scalar_product_traits<stan::agrad::var,double> {
181 struct scalar_product_traits<double,stan::agrad::var> {
188 template<
typename Index,
bool ConjugateLhs,
bool ConjugateRhs>
189 struct general_matrix_vector_product<Index,stan::agrad::var,ColMajor,ConjugateLhs,
stan::agrad::var,ConjugateRhs>
193 typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType
ResScalar;
194 enum { LhsStorageOrder = ColMajor };
196 EIGEN_DONT_INLINE
static void run(
202 for (Index i = 0; i <
rows; i++) {
203 res[i*resIncr] +=
stan::agrad::var(
new stan::agrad::gevv_vvv_vari(&alpha,((
int)LhsStorageOrder == (
int)ColMajor)?(&lhs[i]):(&lhs[i*lhsStride]),((
int)LhsStorageOrder == (
int)ColMajor)?(lhsStride):(1),rhs,rhsIncr,cols));
207 template<
typename Index,
bool ConjugateLhs,
bool ConjugateRhs>
208 struct general_matrix_vector_product<Index,stan::agrad::var,RowMajor,ConjugateLhs,
stan::agrad::var,ConjugateRhs>
212 typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType
ResScalar;
213 enum { LhsStorageOrder = RowMajor };
215 EIGEN_DONT_INLINE
static void run(
221 for (Index i = 0; i <
rows; i++) {
222 res[i*resIncr] +=
stan::agrad::var(
new stan::agrad::gevv_vvv_vari(&alpha,((
int)LhsStorageOrder == (
int)ColMajor)?(&lhs[i]):(&lhs[i*lhsStride]),((
int)LhsStorageOrder == (
int)ColMajor)?(lhsStride):(1),rhs,rhsIncr,cols));
226 template<
typename Index,
int LhsStorageOrder,
bool ConjugateLhs,
int RhsStorageOrder,
bool ConjugateRhs>
227 struct general_matrix_matrix_product<Index,stan::agrad::var,LhsStorageOrder,ConjugateLhs,
stan::agrad::var,RhsStorageOrder,ConjugateRhs,ColMajor>
231 typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType
ResScalar;
232 static void run(Index
rows, Index
cols, Index depth,
237 level3_blocking<LhsScalar,RhsScalar>& ,
238 GemmParallelInfo<Index>* )
240 for (Index i = 0; i <
cols; i++) {
241 general_matrix_vector_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,ConjugateRhs>::run(
242 rows,depth,_lhs,lhsStride,
243 &_rhs[((
int)RhsStorageOrder == (
int)ColMajor)?(i*rhsStride):(i)],((
int)RhsStorageOrder == (
int)ColMajor)?(1):(rhsStride),
244 &res[i*resStride],1,alpha);
260 Eigen::Matrix<var,Eigen::Dynamic,Eigen::Dynamic>
268 Eigen::Matrix<var,Eigen::Dynamic,1>
276 Eigen::Matrix<var,1,Eigen::Dynamic>
291 template <
int R,
int C>
293 for (
int i = 0; i < matrix.size(); ++i)
300 template <
typename T>
302 for (
size_t i = 0; i < variables.size(); ++i)
339 for (
int j = 0; j < m.cols(); ++j)
340 for (
int i = 0; i < m.rows(); ++i)
366 for (
int i = 0; i < v.size(); ++i)
393 for (
int i = 0; i < rv.size(); ++i)
427 class dot_self_vari :
public vari {
432 dot_self_vari(vari** v,
size_t size)
433 : vari(var_dot_self(v,size)),
437 template<
typename Derived>
438 dot_self_vari(
const Eigen::DenseBase<Derived> &v) :
439 vari(var_dot_self(v)),
size_(v.size()) {
441 for (
size_t i = 0; i <
size_; i++)
444 template <
int R,
int C>
445 dot_self_vari(
const Eigen::Matrix<var,R,C>& v) :
446 vari(var_dot_self(v)),
size_(v.size()) {
448 for (
size_t i = 0; i <
size_; ++i)
451 inline static double square(
double x) {
return x * x; }
452 inline static double var_dot_self(vari** v,
size_t size) {
454 for (
size_t i = 0; i < size; ++i)
455 sum +=
square(v[i]->val_);
458 template<
typename Derived>
459 double var_dot_self(
const Eigen::DenseBase<Derived> &v) {
461 for (
int i = 0; i < v.size(); ++i)
462 sum +=
square(v(i).vi_->val_);
465 template <
int R,
int C>
466 inline static double var_dot_self(
const Eigen::Matrix<var,R,C> &v) {
468 for (
int i = 0; i < v.size(); ++i)
469 sum +=
square(v(i).vi_->val_);
472 virtual void chain() {
473 for (
size_t i = 0; i <
size_; ++i)
474 v_[i]->adj_ += adj_ * 2.0 *
v_[i]->val_;
478 class sum_v_vari :
public vari{
482 inline static double var_sum(
const var *v,
size_t length) {
484 for (
size_t i = 0; i <
length; i++)
485 result += v[i].vi_->val_;
488 template<
typename Derived>
489 inline static double var_sum(
const Eigen::DenseBase<Derived> &v) {
491 for (
int i = 0; i < v.size(); i++)
492 result += v(i).vi_->val_;
496 template<
typename Derived>
497 sum_v_vari(
const Eigen::DenseBase<Derived> &v) :
498 vari(var_sum(v)),
length_(v.size()) {
500 for (
size_t i = 0; i <
length_; i++)
503 template<
int R1,
int C1>
504 sum_v_vari(
const Eigen::Matrix<var,R1,C1> &v1) :
505 vari(var_sum(v1)), length_(v1.size()) {
507 for (
size_t i = 0; i <
length_; i++)
510 sum_v_vari(
const var *v,
size_t len) :
511 vari(var_sum(v,len)), length_(len) {
513 for (
size_t i = 0; i <
length_; i++)
516 virtual void chain() {
517 for (
size_t i = 0; i <
length_; i++) {
522 class dot_product_vv_vari :
public vari {
527 inline static double var_dot(
const var* v1,
const var* v2,
530 for (
size_t i = 0; i <
length; i++)
531 result += v1[i].vi_->val_ * v2[i].vi_->val_;
534 template<
typename Derived1,
typename Derived2>
535 inline static double var_dot(
const Eigen::DenseBase<Derived1> &v1,
536 const Eigen::DenseBase<Derived2> &v2) {
538 for (
int i = 0; i < v1.size(); i++)
539 result += v1[i].vi_->val_ * v2[i].vi_->val_;
542 inline static double var_dot(vari** v1, vari** v2,
size_t length) {
544 for (
size_t i = 0; i <
length; ++i)
545 result += v1[i]->val_ * v2[i]->val_;
549 dot_product_vv_vari(vari** v1, vari** v2,
size_t length)
550 : vari(var_dot(v1,v2,length)),
556 dot_product_vv_vari(
const var* v1,
const var* v2,
size_t length,
557 dot_product_vv_vari* shared_v1 = NULL,
558 dot_product_vv_vari* shared_v2 = NULL) :
559 vari(var_dot(v1, v2, length)), length_(length) {
560 if (shared_v1 == NULL) {
562 for (
size_t i = 0; i <
length_; i++)
566 v1_ = shared_v1->v1_;
568 if (shared_v2 == NULL) {
570 for (
size_t i = 0; i <
length_; i++)
574 v2_ = shared_v2->v2_;
577 template<
typename Derived1,
typename Derived2>
578 dot_product_vv_vari(
const Eigen::DenseBase<Derived1> &v1,
579 const Eigen::DenseBase<Derived2> &v2,
580 dot_product_vv_vari* shared_v1 = NULL,
581 dot_product_vv_vari* shared_v2 = NULL) :
582 vari(var_dot(v1, v2)), length_(v1.size()) {
583 if (shared_v1 == NULL) {
585 for (
size_t i = 0; i <
length_; i++)
589 v1_ = shared_v1->v1_;
591 if (shared_v2 == NULL) {
593 for (
size_t i = 0; i <
length_; i++)
597 v2_ = shared_v2->v2_;
600 template<
int R1,
int C1,
int R2,
int C2>
601 dot_product_vv_vari(
const Eigen::Matrix<var,R1,C1> &v1,
602 const Eigen::Matrix<var,R2,C2> &v2,
603 dot_product_vv_vari* shared_v1 = NULL,
604 dot_product_vv_vari* shared_v2 = NULL) :
605 vari(var_dot(v1, v2)), length_(v1.size()) {
606 if (shared_v1 == NULL) {
608 for (
size_t i = 0; i <
length_; i++)
612 v1_ = shared_v1->v1_;
614 if (shared_v2 == NULL) {
616 for (
size_t i = 0; i <
length_; i++)
620 v2_ = shared_v2->v2_;
623 virtual void chain() {
624 for (
size_t i = 0; i <
length_; i++) {
625 v1_[i]->adj_ += adj_ *
v2_[i]->val_;
626 v2_[i]->adj_ += adj_ *
v1_[i]->val_;
631 class dot_product_vd_vari :
public vari {
636 inline static double var_dot(
const var* v1,
const double* v2,
639 for (
size_t i = 0; i <
length; i++)
640 result += v1[i].vi_->val_ * v2[i];
643 template<
typename Derived1,
typename Derived2>
644 inline static double var_dot(
const Eigen::DenseBase<Derived1> &v1,
645 const Eigen::DenseBase<Derived2> &v2) {
647 for (
int i = 0; i < v1.size(); i++)
648 result += v1[i].vi_->val_ * v2[i];
652 dot_product_vd_vari(
const var* v1,
const double* v2,
size_t length,
653 dot_product_vd_vari *shared_v1 = NULL,
654 dot_product_vd_vari *shared_v2 = NULL) :
655 vari(var_dot(v1, v2, length)), length_(length) {
656 if (shared_v1 == NULL) {
658 for (
size_t i = 0; i <
length_; i++)
661 v1_ = shared_v1->v1_;
663 if (shared_v2 == NULL) {
665 for (
size_t i = 0; i <
length_; i++)
668 v2_ = shared_v2->v2_;
671 template<
typename Derived1,
typename Derived2>
672 dot_product_vd_vari(
const Eigen::DenseBase<Derived1> &v1,
673 const Eigen::DenseBase<Derived2> &v2,
674 dot_product_vd_vari *shared_v1 = NULL,
675 dot_product_vd_vari *shared_v2 = NULL) :
676 vari(var_dot(v1, v2)), length_(v1.size()) {
677 if (shared_v1 == NULL) {
679 for (
size_t i = 0; i <
length_; i++)
682 v1_ = shared_v1->v1_;
684 if (shared_v2 == NULL) {
686 for (
size_t i = 0; i <
length_; i++)
689 v2_ = shared_v2->v2_;
692 template<
int R1,
int C1,
int R2,
int C2>
693 dot_product_vd_vari(
const Eigen::Matrix<var,R1,C1> &v1,
694 const Eigen::Matrix<double,R2,C2> &v2,
695 dot_product_vd_vari *shared_v1 = NULL,
696 dot_product_vd_vari *shared_v2 = NULL) :
697 vari(var_dot(v1, v2)), length_(v1.size()) {
698 if (shared_v1 == NULL) {
700 for (
size_t i = 0; i <
length_; i++)
703 v1_ = shared_v1->v1_;
705 if (shared_v2 == NULL) {
707 for (
size_t i = 0; i <
length_; i++)
710 v2_ = shared_v2->v2_;
713 virtual void chain() {
714 for (
size_t i = 0; i <
length_; i++) {
715 v1_[i]->adj_ += adj_ *
v2_[i];
732 template<
int R,
int C>
735 return var(
new dot_self_vari(v));
743 template<
int R,
int C>
744 inline Eigen::Matrix<var,1,C>
746 Eigen::Matrix<var,1,C> ret(1,x.cols());
748 for (i = 0; i < x.cols(); i++) {
749 ret(i) =
var(
new dot_self_vari(x.col(i)));
754 template<
int R1,
int C1,
int R2,
int C2>
755 inline Eigen::Matrix<var, 1, C1>
757 const Eigen::Matrix<var, R2, C2>& v2) {
759 Eigen::Matrix<var, 1, C1> ret(1,v1.cols());
761 for (j = 0; j < v1.cols(); ++j) {
762 ret(j) =
var(
new dot_product_vv_vari(v1.col(j),v2.col(j)));
767 template<
int R1,
int C1,
int R2,
int C2>
768 inline Eigen::Matrix<var, 1, C1>
770 const Eigen::Matrix<double, R2, C2>& v2) {
772 Eigen::Matrix<var, 1, C1> ret(1,v1.cols());
774 for (j = 0; j < v1.cols(); ++j) {
775 ret(j) =
var(
new dot_product_vd_vari(v1.col(j),v2.col(j)));
780 template<
int R1,
int C1,
int R2,
int C2>
781 inline Eigen::Matrix<var, 1, C1>
783 const Eigen::Matrix<var, R2, C2>& v2) {
785 Eigen::Matrix<var, 1, C1> ret(1,v1.cols());
787 for (j = 0; j < v1.cols(); ++j) {
788 ret(j) =
var(
new dot_product_vd_vari(v2.col(j),v1.col(j)));
801 template<
int R1,
int C1,
int R2,
int C2>
803 const Eigen::Matrix<var, R2, C2>& v2) {
807 return var(
new dot_product_vv_vari(v1,v2));
818 template<
int R1,
int C1,
int R2,
int C2>
820 const Eigen::Matrix<double, R2, C2>& v2) {
824 return var(
new dot_product_vd_vari(v1,v2));
835 template<
int R1,
int C1,
int R2,
int C2>
837 const Eigen::Matrix<var, R2, C2>& v2) {
841 return var(
new dot_product_vd_vari(v2,v1));
852 return var(
new dot_product_vv_vari(v1, v2, length));
863 return var(
new dot_product_vd_vari(v1, v2, length));
874 return var(
new dot_product_vd_vari(v2, v1, length));
885 const std::vector<var>& v2) {
887 return var(
new dot_product_vv_vari(&v1[0], &v2[0], v1.size()));
898 const std::vector<double>& v2) {
900 return var(
new dot_product_vd_vari(&v1[0], &v2[0], v1.size()));
911 const std::vector<var>& v2) {
913 return var(
new dot_product_vd_vari(&v2[0], &v1[0], v1.size()));
922 template <
int R,
int C>
923 inline var sum(
const Eigen::Matrix<var,R,C>& m) {
926 return var(
new sum_v_vari(m));
929 template <
int R1,
int C1,
int R2,
int C2>
932 Eigen::Matrix<double,R1,C1>
_A;
933 Eigen::Matrix<double,R1,C2>
_C;
940 const Eigen::Matrix<var,R2,C2> &B)
951 _A(i,j) = A(i,j).val();
958 _C(i,j) = B(i,j).val();
962 _C =
_A.colPivHouseholderQr().solve(
_C);
977 for (j = 0; j < adjC.cols(); j++)
978 for (i = 0; i < adjC.rows(); i++)
982 adjB =
_A.transpose().colPivHouseholderQr().solve(adjC);
983 adjA.noalias() = -adjB*
_C.transpose();
985 for (j = 0; j < adjA.cols(); j++)
986 for (i = 0; i < adjA.rows(); i++)
989 for (j = 0; j < adjB.cols(); j++)
990 for (i = 0; i < adjB.rows(); i++)
995 template <
int R1,
int C1,
int R2,
int C2>
998 Eigen::Matrix<double,R1,C1>
_A;
999 Eigen::Matrix<double,R1,C2>
_C;
1005 const Eigen::Matrix<var,R2,C2> &B)
1012 for (j = 0; j <
_variRefB.cols(); j++) {
1013 for (i = 0; i <
_variRefB.rows(); i++) {
1015 _C(i,j) = B(i,j).val();
1019 _C =
_A.colPivHouseholderQr().solve(
_C);
1021 for (j = 0; j <
_variRefC.cols(); j++) {
1022 for (i = 0; i <
_variRefC.rows(); i++) {
1033 for (j = 0; j < adjC.cols(); j++)
1034 for (i = 0; i < adjC.rows(); i++)
1038 adjB =
_A.transpose().colPivHouseholderQr().solve(adjC);
1040 for (j = 0; j < adjB.cols(); j++)
1041 for (i = 0; i < adjB.rows(); i++)
1046 template <
int R1,
int C1,
int R2,
int C2>
1049 Eigen::Matrix<double,R1,C1>
_A;
1050 Eigen::Matrix<double,R1,C2>
_C;
1056 const Eigen::Matrix<double,R2,C2> &B)
1063 for (j = 0; j <
_variRefA.cols(); j++) {
1064 for (i = 0; i <
_variRefA.rows(); i++) {
1066 _A(i,j) = A(i,j).val();
1071 _C =
_A.colPivHouseholderQr().solve(B);
1073 for (j = 0; j <
_variRefC.cols(); j++) {
1074 for (i = 0; i <
_variRefC.rows(); i++) {
1085 for (j = 0; j < adjC.cols(); j++)
1086 for (i = 0; i < adjC.rows(); i++)
1089 adjA = -
_A.transpose().colPivHouseholderQr().solve(adjC*
_C.transpose());
1091 for (j = 0; j < adjA.cols(); j++)
1092 for (i = 0; i < adjA.rows(); i++)
1097 template <
int R1,
int C1,
int R2,
int C2>
1099 Eigen::Matrix<var,R1,C2>
1101 const Eigen::Matrix<var,R2,C2> &b) {
1102 Eigen::Matrix<var,R1,C2> res(b.rows(),b.cols());
1114 for (i = 0; i < res.rows(); i++)
1115 for (j = 0; j < res.cols(); j++)
1116 res(i,j).vi_ = baseVari->
_variRefC(i,j);
1121 template <
int R1,
int C1,
int R2,
int C2>
1123 Eigen::Matrix<var,R1,C2>
1125 const Eigen::Matrix<double,R2,C2> &b) {
1126 Eigen::Matrix<var,R1,C2> res(b.rows(),b.cols());
1138 for (i = 0; i < res.rows(); i++)
1139 for (j = 0; j < res.cols(); j++)
1140 res(i,j).vi_ = baseVari->
_variRefC(i,j);
1145 template <
int R1,
int C1,
int R2,
int C2>
1147 Eigen::Matrix<var,R1,C2>
1149 const Eigen::Matrix<var,R2,C2> &b) {
1150 Eigen::Matrix<var,R1,C2> res(b.rows(),b.cols());
1162 for (i = 0; i < res.rows(); i++)
1163 for (j = 0; j < res.cols(); j++)
1164 res(i,j).vi_ = baseVari->
_variRefC(i,j);
1169 template <
int TriView,
int R1,
int C1,
int R2,
int C2>
1172 Eigen::Matrix<double,R1,C1>
_A;
1173 Eigen::Matrix<double,R1,C2>
_C;
1180 const Eigen::Matrix<var,R2,C2> &B)
1188 for (j = 0; j <
_variRefA.cols(); j++) {
1189 for (i = 0; i <
_variRefA.rows(); i++) {
1191 _A(i,j) = A(i,j).val();
1195 for (j = 0; j <
_variRefB.cols(); j++) {
1196 for (i = 0; i <
_variRefB.rows(); i++) {
1198 _C(i,j) = B(i,j).val();
1202 _C =
_A.template triangularView<TriView>().solve(
_C);
1204 for (j = 0; j <
_variRefC.cols(); j++) {
1205 for (i = 0; i <
_variRefC.rows(); i++) {
1217 for (j = 0; j < adjC.cols(); j++)
1218 for (i = 0; i < adjC.rows(); i++)
1222 adjB =
_A.template triangularView<TriView>().
transpose().solve(adjC);
1223 adjA.noalias() = -adjB*
_C.transpose();
1225 if (TriView == Eigen::Lower) {
1226 for (j = 0; j < adjA.cols(); j++)
1227 for (i = j; i < adjA.rows(); i++)
1230 else if (TriView == Eigen::Upper) {
1231 for (j = 0; j < adjA.cols(); j++)
1232 for (i = 0; i < j+1; i++)
1236 assert(TriView == Eigen::Lower || TriView == Eigen::Upper);
1239 for (j = 0; j < adjB.cols(); j++)
1240 for (i = 0; i < adjB.rows(); i++)
1245 template <
int TriView,
int R1,
int C1,
int R2,
int C2>
1248 Eigen::Matrix<double,R1,C1>
_A;
1249 Eigen::Matrix<double,R1,C2>
_C;
1255 const Eigen::Matrix<var,R2,C2> &B)
1262 for (j = 0; j <
_variRefB.cols(); j++) {
1263 for (i = 0; i <
_variRefB.rows(); i++) {
1265 _C(i,j) = B(i,j).val();
1269 _C =
_A.template triangularView<TriView>().solve(
_C);
1271 for (j = 0; j <
_variRefC.cols(); j++) {
1272 for (i = 0; i <
_variRefC.rows(); i++) {
1283 for (j = 0; j < adjC.cols(); j++)
1284 for (i = 0; i < adjC.rows(); i++)
1288 adjB =
_A.template triangularView<TriView>().
transpose().solve(adjC);
1290 for (j = 0; j < adjB.cols(); j++)
1291 for (i = 0; i < adjB.rows(); i++)
1296 template <
int TriView,
int R1,
int C1,
int R2,
int C2>
1299 Eigen::Matrix<double,R1,C1>
_A;
1300 Eigen::Matrix<double,R1,C2>
_C;
1306 const Eigen::Matrix<double,R2,C2> &B)
1313 for (j = 0; j <
_variRefA.cols(); j++) {
1314 for (i = 0; i <
_variRefA.rows(); i++) {
1316 _A(i,j) = A(i,j).val();
1320 _C =
_A.template triangularView<TriView>().solve(B);
1322 for (j = 0; j <
_variRefC.cols(); j++) {
1323 for (i = 0; i <
_variRefC.rows(); i++) {
1334 for (j = 0; j < adjC.cols(); j++)
1335 for (i = 0; i < adjC.rows(); i++)
1339 adjA.noalias() = -
_A.template triangularView<TriView>().
transpose().solve(adjC*
_C.transpose());
1341 if (TriView == Eigen::Lower) {
1342 for (j = 0; j < adjA.cols(); j++)
1343 for (i = j; i < adjA.rows(); i++)
1346 else if (TriView == Eigen::Upper) {
1347 for (j = 0; j < adjA.cols(); j++)
1348 for (i = 0; i < j+1; i++)
1352 assert(TriView == Eigen::Lower || TriView == Eigen::Upper);
1357 template <
int TriView,
int R1,
int C1,
int R2,
int C2>
1359 Eigen::Matrix<var,R1,C2>
1361 const Eigen::Matrix<var,R2,C2> &b) {
1362 Eigen::Matrix<var,R1,C2> res(b.rows(),b.cols());
1374 for (i = 0; i < res.rows(); i++)
1375 for (j = 0; j < res.cols(); j++)
1376 res(i,j).vi_ = baseVari->
_variRefC(i,j);
1380 template <
int TriView,
int R1,
int C1,
int R2,
int C2>
1382 Eigen::Matrix<var,R1,C2>
1384 const Eigen::Matrix<var,R2,C2> &b) {
1385 Eigen::Matrix<var,R1,C2> res(b.rows(),b.cols());
1397 for (i = 0; i < res.rows(); i++)
1398 for (j = 0; j < res.cols(); j++)
1399 res(i,j).vi_ = baseVari->
_variRefC(i,j);
1403 template <
int TriView,
int R1,
int C1,
int R2,
int C2>
1405 Eigen::Matrix<var,R1,C2>
1407 const Eigen::Matrix<double,R2,C2> &b) {
1408 Eigen::Matrix<var,R1,C2> res(b.rows(),b.cols());
1420 for (i = 0; i < res.rows(); i++)
1421 for (j = 0; j < res.cols(); j++)
1422 res(i,j).vi_ = baseVari->
_variRefC(i,j);
1427 template<
int R,
int C>
1429 Eigen::Matrix<double,R,C> _A;
1430 Eigen::Matrix<vari*,R,C> _adjARef;
1436 for (j = 0; j < A.cols(); j++) {
1437 for (i = 0; i < A.rows(); i++) {
1438 _A(i,j) = A(i,j).val();
1439 _adjARef(i,j) = A(i,j).vi_;
1446 Eigen::Matrix<double,R,C> Ad(A.rows(),A.cols());
1448 for (j = 0; j < A.cols(); j++)
1449 for (i = 0; i < A.rows(); i++)
1450 Ad(i,j) = A(i,j).val();
1451 return Ad.determinant();
1454 Eigen::Matrix<double,R,C> adjA(_A.rows(),_A.cols());
1456 adjA = (
adj_ *
val_) * _A.inverse().transpose();
1457 for (j = 0; j < _adjARef.cols(); j++) {
1458 for (i = 0; i < _adjARef.rows(); i++) {
1459 _adjARef(i,j)->adj_ += adjA(i,j);
1465 template <
int R,
int C>
1471 template<
int R,
int C>
1473 Eigen::Matrix<double,R,C> _A;
1474 Eigen::Matrix<vari*,R,C> _adjARef;
1480 for (j = 0; j < A.cols(); j++) {
1481 for (i = 0; i < A.rows(); i++) {
1482 _A(i,j) = A(i,j).val();
1483 _adjARef(i,j) = A(i,j).vi_;
1490 Eigen::Matrix<double,R,C> Ad(A.rows(),A.cols());
1492 for (j = 0; j < A.cols(); j++)
1493 for (i = 0; i < A.rows(); i++)
1494 Ad(i,j) = A(i,j).val();
1495 return Ad.colPivHouseholderQr().logAbsDeterminant();
1498 Eigen::Matrix<double,R,C> adjA(_A.rows(),_A.cols());
1500 adjA =
adj_ * _A.inverse().transpose();
1501 for (j = 0; j < _adjARef.cols(); j++) {
1502 for (i = 0; i < _adjARef.rows(); i++) {
1503 _adjARef(i,j)->adj_ += adjA(i,j);
1509 template <
int R,
int C>
1526 template <
typename T1,
typename T2>
1538 template <
typename T1,
typename T2,
int R,
int C>
1539 inline Eigen::Matrix<var,R,C>
1540 divide(
const Eigen::Matrix<T1, R,C>& v,
const T2& c) {
1552 template <
typename T1,
typename T2>
1554 typename boost::math::tools::promote_args<T1,T2>::type
1565 template<
typename T1,
typename T2,
int R2,
int C2>
1567 const Eigen::Matrix<T2, R2, C2>& m) {
1579 template<
typename T1,
int R1,
int C1,
typename T2>
1580 inline Eigen::Matrix<var,R1,C1>
multiply(
const Eigen::Matrix<T1, R1, C1>& m,
1595 template<
int R1,
int C1,
int R2,
int C2>
1596 inline Eigen::Matrix<var,R1,C2>
multiply(
const Eigen::Matrix<var,R1,C1>& m1,
1597 const Eigen::Matrix<var,R2,C2>& m2) {
1599 Eigen::Matrix<var,R1,C2> result(m1.rows(),m2.cols());
1600 for (
int i = 0; i < m1.rows(); i++) {
1601 typename Eigen::Matrix<var,R1,C1>::ConstRowXpr crow(m1.row(i));
1602 for (
int j = 0; j < m2.cols(); j++) {
1603 typename Eigen::Matrix<var,R2,C2>::ConstColXpr ccol(m2.col(j));
1606 result(i,j) =
var(
new dot_product_vv_vari(crow,ccol));
1609 dot_product_vv_vari *v2 =
static_cast<dot_product_vv_vari*
>(result(0,j).vi_);
1610 result(i,j) =
var(
new dot_product_vv_vari(crow,ccol,NULL,v2));
1615 dot_product_vv_vari *v1 =
static_cast<dot_product_vv_vari*
>(result(i,0).vi_);
1616 result(i,j) =
var(
new dot_product_vv_vari(crow,ccol,v1));
1619 dot_product_vv_vari *v1 =
static_cast<dot_product_vv_vari*
>(result(i,0).vi_);
1620 dot_product_vv_vari *v2 =
static_cast<dot_product_vv_vari*
>(result(0,j).vi_);
1621 result(i,j) =
var(
new dot_product_vv_vari(crow,ccol,v1,v2));
1639 template<
int R1,
int C1,
int R2,
int C2>
1640 inline Eigen::Matrix<var,R1,C2>
multiply(
const Eigen::Matrix<double,R1,C1>& m1,
1641 const Eigen::Matrix<var,R2,C2>& m2) {
1643 Eigen::Matrix<var,R1,C2> result(m1.rows(),m2.cols());
1644 for (
int i = 0; i < m1.rows(); i++) {
1645 typename Eigen::Matrix<double,R1,C1>::ConstRowXpr crow(m1.row(i));
1646 for (
int j = 0; j < m2.cols(); j++) {
1647 typename Eigen::Matrix<var,R2,C2>::ConstColXpr ccol(m2.col(j));
1651 result(i,j) =
var(
new dot_product_vd_vari(ccol,crow));
1654 dot_product_vd_vari *v2 =
static_cast<dot_product_vd_vari*
>(result(0,j).vi_);
1655 result(i,j) =
var(
new dot_product_vd_vari(ccol,crow,v2,NULL));
1660 dot_product_vd_vari *v1 =
static_cast<dot_product_vd_vari*
>(result(i,0).vi_);
1661 result(i,j) =
var(
new dot_product_vd_vari(ccol,crow,NULL,v1));
1664 dot_product_vd_vari *v1 =
static_cast<dot_product_vd_vari*
>(result(i,0).vi_);
1665 dot_product_vd_vari *v2 =
static_cast<dot_product_vd_vari*
>(result(0,j).vi_);
1666 result(i,j) =
var(
new dot_product_vd_vari(ccol,crow,v2,v1));
1684 template<
int R1,
int C1,
int R2,
int C2>
1685 inline Eigen::Matrix<var,R1,C2>
multiply(
const Eigen::Matrix<var,R1,C1>& m1,
1686 const Eigen::Matrix<double,R2,C2>& m2) {
1688 Eigen::Matrix<var,R1,C2> result(m1.rows(),m2.cols());
1689 for (
int i = 0; i < m1.rows(); i++) {
1690 typename Eigen::Matrix<var,R1,C1>::ConstRowXpr crow(m1.row(i));
1691 for (
int j = 0; j < m2.cols(); j++) {
1692 typename Eigen::Matrix<double,R2,C2>::ConstColXpr ccol(m2.col(j));
1696 result(i,j) =
var(
new dot_product_vd_vari(crow,ccol));
1699 dot_product_vd_vari *v2 =
static_cast<dot_product_vd_vari*
>(result(0,j).vi_);
1700 result(i,j) =
var(
new dot_product_vd_vari(crow,ccol,NULL,v2));
1705 dot_product_vd_vari *v1 =
static_cast<dot_product_vd_vari*
>(result(i,0).vi_);
1706 result(i,j) =
var(
new dot_product_vd_vari(crow,ccol,v1,NULL));
1709 dot_product_vd_vari *v1 =
static_cast<dot_product_vd_vari*
>(result(i,0).vi_);
1710 dot_product_vd_vari *v2 =
static_cast<dot_product_vd_vari*
>(result(0,j).vi_);
1711 result(i,j) =
var(
new dot_product_vd_vari(crow,ccol,v1,v2));
1728 template <
int C1,
int R2>
1730 const Eigen::Matrix<var, R2, 1>& v) {
1731 if (rv.size() != v.size())
1732 throw std::domain_error(
"row vector and vector must be same length in multiply");
1744 template <
int C1,
int R2>
1746 const Eigen::Matrix<var, R2, 1>& v) {
1759 template <
int C1,
int R2>
1761 const Eigen::Matrix<double, R2, 1>& v) {
1772 if (K == 0)
return LLt;
1779 Knz = (K-J)*J + (J * (J + 1)) / 2;
1781 Knz = (K * (K + 1)) / 2;
1784 for (
int m = 0; m < K; ++m)
1785 for (
int n = 0; n < ((J < (m+1))?J:(m+1)); ++n) {
1786 vs[pos++] = L(m,n).vi_;
1788 for (
int m = 0, mpos=0; m < K; ++m, mpos += (J < m)?J:m) {
1789 LLt(m,m) =
var(
new dot_self_vari(vs + mpos, (J < (m+1))?J:(m+1)));
1790 for (
int n = 0, npos = 0; n < m; ++n, npos += (J < n)?J:n) {
1791 LLt(m,n) = LLt(n,m) =
var(
new dot_product_vv_vari(vs + mpos, vs + npos, (J < (n+1))?J:(n+1)));
1808 return M * M.transpose();
1819 for (
int m = 0; m < M.rows(); ++m)
1820 for (
int n = 0; n < M.cols(); ++n)
1821 vs[pos++] = M(m,n).vi_;
1822 for (
int m = 0; m < M.rows(); ++m)
1823 MMt(m,m) =
var(
new dot_self_vari(vs + m * M.cols(),M.cols()));
1824 for (
int m = 0; m < M.rows(); ++m) {
1825 for (
int n = 0; n < m; ++n) {
1826 MMt(m,n) =
var(
new dot_product_vv_vari(vs + m * M.cols(),
1829 MMt(n,m) = MMt(m,n);
1863 template <
typename LHS,
typename RHS>
1866 for (
size_t i = 0; i < x.size(); ++i)
1869 template <
typename LHS,
typename RHS,
int R,
int C>
1871 const Eigen::Matrix<RHS,R,C>& y) {
1874 for (size_type n = 0; n < x.cols(); ++n)
1875 for (size_type m = 0; m < x.rows(); ++m)
1879 template <
typename LHS,
typename RHS>
1885 template <
bool PromoteRHS,
typename LHS,
typename RHS>
1887 static inline void assign(LHS& ,
const RHS& ) {
1888 throw std::domain_error(
"should not call base class of assigner");
1892 template <
typename LHS,
typename RHS>
1899 template <
typename LHS,
typename RHS>
1907 template <
typename LHS,
typename RHS>