dvariable sum(const dvar_matrix& m) { RETURN_ARRAYS_INCREMENT(); dvariable tmp=0.; for (int i=m.rowmin(); i<=m.rowmax(); i++) { tmp+=sum(m.elem(i)); } RETURN_ARRAYS_DECREMENT(); return tmp; }
/** LU decomposition back susbstitution alogrithm for variable object. \param a A dmatrix containing LU decomposition of input matrix. \f$a\f$. \param indx Permutation vector from ludcmp. \param b A dvector containing the RHS, \f$b\f$ of the linear equation \f$A\cdot X = B\f$, to be solved, and containing on return the solution vector \f$X\f$. \n\n The implementation of this algorithm was inspired by "Numerical Recipes in C", 2nd edition, Press, Teukolsky, Vetterling, Flannery, chapter 2 */ void lubksb(dvar_matrix a, const ivector& indx,dvar_vector b) { int i,ii=0,ip,j,iiflag=0; dvariable sum; int lb=a.colmin(); int ub=a.colmax(); for (i=lb;i<=ub;i++) { ip=indx(i); sum=b(ip); b(ip)=b(i); if (iiflag) { for (j=ii;j<=i-1;j++) { sum -= a.elem(i,j)*b.elem(j); } } else if (!ISZERO(value(sum))) { ii=i; iiflag=1; } b(i)=sum; } for (i=ub;i>=lb;i--) { sum=b(i); for (j=i+1;j<=ub;j++) { // !!! remove to show bug sum -= a.elem(i,j)*b.elem(j); } // !!! remove to show bug b.elem(i)=sum/a.elem(i,i); } }
/** * Description not yet available. * \param */ dvar_vector operator*(const dvar_matrix& m, const dvector& x) { RETURN_ARRAYS_INCREMENT(); if (x.indexmin() != m.colmin() || x.indexmax() != m.colmax()) { cerr << " Incompatible array bounds in " "dvar_vector operator * (const dvar_matrix& m, const dvar_vector& x)\n"; ad_exit(21); } kkludge_object kkk; dvar_vector tmp(m.rowmin(),m.rowmax(),kkk); double sum; for (int i=m.rowmin(); i<=m.rowmax(); i++) { sum=0.0; const dvar_vector& tt=m.elem(i); for (int j=x.indexmin(); j<=x.indexmax(); j++) { //sum+=m[i][j]*x[j]; sum+=tt.elem_value(j)*x.elem(j); } tmp.elem_value(i)=sum; } save_identifier_string("PL4"); x.save_dvector_value(); x.save_dvector_position(); m.save_dvar_matrix_position(); tmp.save_dvar_vector_position(); save_identifier_string("PLX"); gradient_structure::GRAD_STACK1-> set_gradient_stack(dmcv_prod); RETURN_ARRAYS_DECREMENT(); return(tmp); }
/** * Description not yet available. * \param */ dvar_vector operator*(const dvector& x, const dvar_matrix& m) { RETURN_ARRAYS_INCREMENT(); if (x.indexmin() != m.rowmin() || x.indexmax() != m.rowmax()) { cerr << " Incompatible array bounds in " "dvar_vector operator*(const dvector& x, const dvar_matrix& m)\n"; ad_exit(21); } dvar_vector tmp(m.colmin(),m.colmax()); dvariable sum; for (int j=m.colmin(); j<=m.colmax(); j++) { sum=0.0; for (int i=x.indexmin(); i<=x.indexmax(); i++) { sum+=x.elem(i)*m.elem(i,j); } tmp[j]=sum; } RETURN_ARRAYS_DECREMENT(); return(tmp); }