Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011
00012
00013
00014 #include "fvar.hpp"
00015
00016 #ifdef __TURBOC__
00017 #pragma hdrstop
00018 #include <iostream.h>
00019 #endif
00020
00021 #ifdef __ZTC__
00022 #include <iostream.hpp>
00023 #endif
00024
00025
00026 void dvdv_elem_div(void);
00027
00032 dvar_vector elem_div(const dvar_vector& v1, const dvar_vector& v2)
00033 {
00034 RETURN_ARRAYS_INCREMENT();
00035 if (v1.indexmin()!=v2.indexmin()||v1.indexmax()!=v2.indexmax())
00036 {
00037 cerr << "Incompatible bounds in "
00038 "dvar_vector elem_prod(const dvar_vector& v1, const dvar_vector& v2)"
00039 << endl;
00040 ad_exit(1);
00041 }
00042 dvar_vector tmp(v1.indexmin(),v1.indexmax());
00043 dvector tmp_inv(v1.indexmin(),v1.indexmax());
00044
00045 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00046 {
00047 tmp_inv.elem(i)=1./v2.elem_value(i);
00048 tmp.elem_value(i)=v1.elem_value(i)*tmp_inv.elem(i);
00049 }
00050
00051
00052 save_identifier_string("bbbb");
00053 v1.save_dvar_vector_value();
00054 v1.save_dvar_vector_position();
00055 save_identifier_string("wwww");
00056 tmp_inv.save_dvector_value();
00057 tmp_inv.save_dvector_position();
00058 save_identifier_string("vvvv");
00059 v2.save_dvar_vector_position();
00060 save_identifier_string("uuuu");
00061 tmp.save_dvar_vector_position();
00062 save_identifier_string("aaaa");
00063 gradient_structure::GRAD_STACK1->set_gradient_stack(dvdv_elem_div);
00064 RETURN_ARRAYS_DECREMENT();
00065 return tmp;
00066 }
00067
00072 void dvdv_elem_div(void)
00073 {
00074
00075 verify_identifier_string("aaaa");
00076 dvar_vector_position tmppos=restore_dvar_vector_position();
00077 dvector dftmp=restore_dvar_vector_derivatives(tmppos);
00078 verify_identifier_string("uuuu");
00079 dvar_vector_position v2pos=restore_dvar_vector_position();
00080 verify_identifier_string("vvvv");
00081 dvector_position tmp_divpos=restore_dvector_position();
00082 dvector tmp_div=restore_dvector_value(tmp_divpos);
00083 verify_identifier_string("wwww");
00084 dvar_vector_position v1pos=restore_dvar_vector_position();
00085 dvector cv1=restore_dvar_vector_value(v1pos);
00086 verify_identifier_string("bbbb");
00087 dvector dfv1(cv1.indexmin(),cv1.indexmax());
00088 dvector dfv2(tmp_div.indexmin(),tmp_div.indexmax());
00089 for (int i=cv1.indexmin();i<=cv1.indexmax();i++)
00090 {
00091
00092 double& xx=tmp_div.elem(i);
00093 dfv1(i)=dftmp.elem(i)*xx;
00094 dfv2(i)=-dftmp.elem(i)*cv1.elem(i)*xx*xx;
00095 }
00096 dfv1.save_dvector_derivatives(v1pos);
00097 dfv2.save_dvector_derivatives(v2pos);
00098
00099 }
00100
00101 void dvcv_elem_div(void);
00102
00107 dvar_vector elem_div(const dvar_vector& v1, const dvector& v2)
00108 {
00109 RETURN_ARRAYS_INCREMENT();
00110 if (v1.indexmin()!=v2.indexmin()||v1.indexmax()!=v2.indexmax())
00111 {
00112 cerr << "Incompatible bounds in "
00113 "dvar_vector elem_prod(const dvar_vector& v1, const dvar_vector& v2)"
00114 << endl;
00115 ad_exit(1);
00116 }
00117 dvar_vector tmp(v1.indexmin(),v1.indexmax());
00118 dvector tmp_inv(v1.indexmin(),v1.indexmax());
00119
00120 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00121 {
00122 tmp_inv.elem(i)=1./v2.elem(i);
00123 tmp.elem_value(i)=v1.elem_value(i)*tmp_inv.elem(i);
00124 }
00125
00126
00127 save_identifier_string("bbbb");
00128 v1.save_dvar_vector_value();
00129 v1.save_dvar_vector_position();
00130 save_identifier_string("wwww");
00131 tmp_inv.save_dvector_value();
00132 tmp_inv.save_dvector_position();
00133 save_identifier_string("vvvv");
00134 tmp.save_dvar_vector_position();
00135 save_identifier_string("aaaa");
00136 gradient_structure::GRAD_STACK1->set_gradient_stack(dvcv_elem_div);
00137 RETURN_ARRAYS_DECREMENT();
00138 return tmp;
00139 }
00140
00145 void dvcv_elem_div(void)
00146 {
00147
00148 verify_identifier_string("aaaa");
00149 dvar_vector_position tmppos=restore_dvar_vector_position();
00150 dvector dftmp=restore_dvar_vector_derivatives(tmppos);
00151 verify_identifier_string("vvvv");
00152 dvector_position tmp_divpos=restore_dvector_position();
00153 dvector tmp_div=restore_dvector_value(tmp_divpos);
00154 verify_identifier_string("wwww");
00155 dvar_vector_position v1pos=restore_dvar_vector_position();
00156 dvector cv1=restore_dvar_vector_value(v1pos);
00157 verify_identifier_string("bbbb");
00158 dvector dfv1(cv1.indexmin(),cv1.indexmax());
00159 for (int i=cv1.indexmin();i<=cv1.indexmax();i++)
00160 {
00161 dfv1(i)=dftmp.elem(i)*tmp_div.elem(i);
00162 }
00163 dfv1.save_dvector_derivatives(v1pos);
00164
00165 }
00166
00167 void cvdv_elem_div(void);
00168
00173 dvar_vector elem_div(const dvector& v1, const dvar_vector& v2)
00174 {
00175 RETURN_ARRAYS_INCREMENT();
00176 if (v1.indexmin()!=v2.indexmin()||v1.indexmax()!=v2.indexmax())
00177 {
00178 cerr << "Incompatible bounds in "
00179 "dvar_vector elem_prod(const dvar_vector& v1, const dvar_vector& v2)"
00180 << endl;
00181 ad_exit(1);
00182 }
00183 dvar_vector tmp(v1.indexmin(),v1.indexmax());
00184 dvector tmp_inv(v1.indexmin(),v1.indexmax());
00185
00186 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00187 {
00188 double x=1./v2.elem_value(i);
00189 tmp.elem_value(i)=v1.elem(i)*x;
00190 tmp_inv.elem(i)=-tmp.elem_value(i)*x;
00191 }
00192
00193
00194 save_identifier_string("bbbb");
00195 tmp_inv.save_dvector_value();
00196 tmp_inv.save_dvector_position();
00197 save_identifier_string("vvvv");
00198 v2.save_dvar_vector_position();
00199 save_identifier_string("uuuu");
00200 tmp.save_dvar_vector_position();
00201 save_identifier_string("aaaa");
00202 gradient_structure::GRAD_STACK1->set_gradient_stack(cvdv_elem_div);
00203 RETURN_ARRAYS_DECREMENT();
00204 return tmp;
00205 }
00206
00211 void cvdv_elem_div(void)
00212 {
00213
00214 verify_identifier_string("aaaa");
00215 dvar_vector_position tmppos=restore_dvar_vector_position();
00216 dvector dftmp=restore_dvar_vector_derivatives(tmppos);
00217 verify_identifier_string("uuuu");
00218 dvar_vector_position v2pos=restore_dvar_vector_position();
00219 verify_identifier_string("vvvv");
00220 dvector_position tmp_divpos=restore_dvector_position();
00221 dvector tmp_div=restore_dvector_value(tmp_divpos);
00222 verify_identifier_string("bbbb");
00223 dvector dfv2(tmp_div.indexmin(),tmp_div.indexmax());
00224 for (int i=dfv2.indexmin();i<=dfv2.indexmax();i++)
00225 {
00226
00227 dfv2(i)=dftmp.elem(i)*tmp_div.elem(i);
00228 }
00229 dfv2.save_dvector_derivatives(v2pos);
00230
00231 }
00232