Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011
00012
00013 #include "fvar.hpp"
00014
00015 #ifdef __TURBOC__
00016 #pragma hdrstop
00017 #include <iostream.h>
00018 #endif
00019
00020 #ifdef __ZTC__
00021 #include <iostream.hpp>
00022 #endif
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00082 dvar_matrix operator*(const dvar_matrix& m1, const dvar_matrix& m2)
00083 {
00084 if (m1.colmin() != m2.rowmin() || m1.colmax() != m2.rowmax())
00085 {
00086 cerr << " Incompatible array bounds in "
00087 "dmatrix operator*(const dmatrix& x, const dmatrix& m)\n";
00088 ad_exit(21);
00089 }
00090
00091
00092 dmatrix tmp(m1.rowmin(),m1.rowmax(), m2.colmin(), m2.colmax());
00093 double sum;
00094
00095
00096 for (int j=m2.colmin(); j<=m2.colmax(); j++)
00097 {
00098 dvector m2col=column_value(m2,j);
00099
00100 for (int i=m1.rowmin(); i<=m1.rowmax(); i++)
00101 {
00102 sum=value(m1(i))*m2col;
00103 tmp(i,j)=sum;
00104 }
00105 }
00106
00107 dvar_matrix vtmp=nograd_assign(tmp);
00108 save_identifier_string("TEST1");
00109 m1.save_dvar_matrix_value();
00110 m1.save_dvar_matrix_position();
00111 m2.save_dvar_matrix_value();
00112 m2.save_dvar_matrix_position();
00113 vtmp.save_dvar_matrix_position();
00114 save_identifier_string("TEST6");
00115 gradient_structure::GRAD_STACK1->
00116 set_gradient_stack(dmdm_prod);
00117 return vtmp;
00118 }
00119
00124 void dmdm_prod(void)
00125 {
00126 verify_identifier_string("TEST6");
00127 dvar_matrix_position vpos=restore_dvar_matrix_position();
00128 dmatrix dftmp=restore_dvar_matrix_derivatives(vpos);
00129 dvar_matrix_position m2pos=restore_dvar_matrix_position();
00130 dmatrix cm2=restore_dvar_matrix_value(m2pos);
00131 dvar_matrix_position m1pos=restore_dvar_matrix_position();
00132 dmatrix cm1=restore_dvar_matrix_value(m1pos);
00133 verify_identifier_string("TEST1");
00134 dmatrix dfm1(m1pos);
00135 dmatrix dfm2(m2pos);
00136 double dfsum;
00137 dfm1.initialize();
00138 dfm2.initialize();
00139 for (int j=cm2.colmin(); j<=cm2.colmax(); j++)
00140 {
00141 for (int i=cm1.rowmin(); i<=cm1.rowmax(); i++)
00142 {
00143
00144 dfsum=dftmp.elem(i,j);
00145 for (int k=cm1.colmin(); k<=cm1.colmax(); k++)
00146 {
00147
00148 dfm1.elem(i,k)+=dfsum * cm2.elem(k,j);
00149 dfm2.elem(k,j)+=dfsum * cm1.elem(i,k);
00150 }
00151 }
00152 }
00153 dfm1.save_dmatrix_derivatives(m1pos);
00154 dfm2.save_dmatrix_derivatives(m2pos);
00155
00156 }