Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include "fvar.hpp"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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 void DF_dvsin(void);
00059
00064 dvar_vector sin(const dvar_vector& v1)
00065 {
00066
00067 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00068 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00069 {
00070 vtmp.elem_value(i)=sin(v1.elem_value(i));
00071 }
00072
00073 save_identifier_string("ddd");
00074 v1.save_dvar_vector_value();
00075 v1.save_dvar_vector_position();
00076 vtmp.save_dvar_vector_position();
00077 save_identifier_string("eee");
00078 gradient_structure::GRAD_STACK1->
00079 set_gradient_stack(DF_dvsin);
00080 return vtmp;
00081 }
00082
00087 void DF_dvsin(void)
00088 {
00089
00090 verify_identifier_string("eee");
00091 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00092 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00093 dvar_vector_position v1pos=restore_dvar_vector_position();
00094 dvector v1=restore_dvar_vector_value(v1pos);
00095 verify_identifier_string("ddd");
00096 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00097 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00098 {
00099
00100 dfv1(i)=dfvtmp(i)*cos(v1.elem(i));
00101 }
00102 dfv1.save_dvector_derivatives(v1pos);
00103
00104 }
00105
00106 void DF_dvexp(void);
00107
00112 dvar_vector exp(const dvar_vector& v1)
00113 {
00114
00115 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00116 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00117 {
00118 vtmp.elem_value(i)=exp(v1.elem_value(i));
00119 }
00120
00121 save_identifier_string("ddd");
00122 v1.save_dvar_vector_position();
00123 vtmp.save_dvar_vector_value();
00124 vtmp.save_dvar_vector_position();
00125 save_identifier_string("hee");
00126 gradient_structure::GRAD_STACK1->
00127 set_gradient_stack(DF_dvexp);
00128 return vtmp;
00129 }
00130
00135 void DF_dvexp(void)
00136 {
00137
00138 verify_identifier_string("hee");
00139 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00140 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00141 dvector vtmp=restore_dvar_vector_value(tmp_pos);
00142 dvar_vector_position v1pos=restore_dvar_vector_position();
00143 verify_identifier_string("ddd");
00144 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00145 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00146 {
00147
00148 dfv1(i)=dfvtmp(i)*vtmp.elem(i);
00149 }
00150 dfv1.save_dvector_derivatives(v1pos);
00151
00152 }
00153
00154
00155 void DF_dvcos(void);
00156
00161 dvar_vector cos(const dvar_vector& v1)
00162 {
00163
00164 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00165 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00166 {
00167 vtmp.elem_value(i)=cos(v1.elem_value(i));
00168 }
00169
00170 save_identifier_string("ddd");
00171 v1.save_dvar_vector_value();
00172 v1.save_dvar_vector_position();
00173 vtmp.save_dvar_vector_position();
00174 save_identifier_string("cee");
00175 gradient_structure::GRAD_STACK1->
00176 set_gradient_stack(DF_dvcos);
00177 return vtmp;
00178 }
00179
00184 void DF_dvcos(void)
00185 {
00186
00187 verify_identifier_string("cee");
00188 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00189 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00190 dvar_vector_position v1pos=restore_dvar_vector_position();
00191 dvector v1=restore_dvar_vector_value(v1pos);
00192 verify_identifier_string("ddd");
00193 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00194 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00195 {
00196
00197 dfv1(i)=-dfvtmp(i)*sin(v1.elem(i));
00198 }
00199 dfv1.save_dvector_derivatives(v1pos);
00200
00201 }
00202
00203 void DF_dvlog(void);
00204
00209 dvar_vector log(const dvar_vector& v1)
00210 {
00211
00212 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00213 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00214 {
00215 vtmp.elem_value(i)=log(v1.elem_value(i));
00216 }
00217
00218 save_identifier_string("cdd");
00219 v1.save_dvar_vector_value();
00220 v1.save_dvar_vector_position();
00221 vtmp.save_dvar_vector_position();
00222 save_identifier_string("eee");
00223 gradient_structure::GRAD_STACK1->
00224 set_gradient_stack(DF_dvlog);
00225 return vtmp;
00226 }
00227
00228 int ad_debug_arithmetic=1;
00229
00234 void DF_dvlog(void)
00235 {
00236
00237 verify_identifier_string("eee");
00238 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00239 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00240 dvar_vector_position v1pos=restore_dvar_vector_position();
00241 dvector v1=restore_dvar_vector_value(v1pos);
00242 verify_identifier_string("cdd");
00243 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00244 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00245 {
00246 # ifndef OPT_LIB
00247 if (ad_debug_arithmetic==1)
00248 if (v1.elem(i)==0.0 || fabs(v1.elem(i))<1.e-150 ||
00249 dfvtmp(i) > 1.e+150)
00250 {
00251 cerr << "Possible overflow in DF_dvlog" << endl;
00252 }
00253
00254 # endif
00255 dfv1(i)=dfvtmp(i)/(v1.elem(i));
00256 }
00257 dfv1.save_dvector_derivatives(v1pos);
00258
00259 }
00260
00261 void DF_dvtan(void);
00262
00267 dvar_vector tan(const dvar_vector& v1)
00268 {
00269
00270 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00271 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00272 {
00273 vtmp.elem_value(i)=tan(v1.elem_value(i));
00274 }
00275
00276 save_identifier_string("ddd");
00277 v1.save_dvar_vector_value();
00278 v1.save_dvar_vector_position();
00279 vtmp.save_dvar_vector_position();
00280 save_identifier_string("xee");
00281 gradient_structure::GRAD_STACK1->
00282 set_gradient_stack(DF_dvtan);
00283 return vtmp;
00284 }
00285
00290 void DF_dvtan(void)
00291 {
00292
00293 verify_identifier_string("xee");
00294 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00295 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00296 dvar_vector_position v1pos=restore_dvar_vector_position();
00297 dvector v1=restore_dvar_vector_value(v1pos);
00298 verify_identifier_string("ddd");
00299 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00300 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00301 {
00302
00303 dfv1(i)=dfvtmp(i)/pow(cos(v1.elem(i)),2);
00304 }
00305 dfv1.save_dvector_derivatives(v1pos);
00306
00307 }
00308
00309 void DF_dvatan(void);
00310
00315 dvar_vector atan(const dvar_vector& v1)
00316 {
00317
00318 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00319 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00320 {
00321 vtmp.elem_value(i)=atan(v1.elem_value(i));
00322 }
00323
00324 save_identifier_string("udd");
00325 v1.save_dvar_vector_value();
00326 v1.save_dvar_vector_position();
00327 vtmp.save_dvar_vector_position();
00328 save_identifier_string("eee");
00329 gradient_structure::GRAD_STACK1->
00330 set_gradient_stack(DF_dvatan);
00331 return vtmp;
00332 }
00333
00338 void DF_dvatan(void)
00339 {
00340
00341 verify_identifier_string("eee");
00342 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00343 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00344 dvar_vector_position v1pos=restore_dvar_vector_position();
00345 dvector v1=restore_dvar_vector_value(v1pos);
00346 verify_identifier_string("udd");
00347 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00348 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00349 {
00350
00351 dfv1(i)=dfvtmp(i)/(1.+pow(v1.elem(i),2));
00352 }
00353 dfv1.save_dvector_derivatives(v1pos);
00354
00355 }
00356
00357 void DF_dvsqrt(void);
00358
00363 dvar_vector sqrt(const dvar_vector& v1)
00364 {
00365
00366 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00367 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00368 {
00369 vtmp.elem_value(i)=sqrt(v1.elem_value(i));
00370 }
00371
00372 save_identifier_string("ddd");
00373 v1.save_dvar_vector_value();
00374 v1.save_dvar_vector_position();
00375 vtmp.save_dvar_vector_position();
00376 save_identifier_string("eve");
00377 gradient_structure::GRAD_STACK1->
00378 set_gradient_stack(DF_dvsqrt);
00379 return vtmp;
00380 }
00381
00386 dvar_vector sqr(const dvar_vector& v1)
00387 {
00388
00389 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00390 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00391 {
00392 vtmp.elem_value(i)=sqrt(v1.elem_value(i));
00393 }
00394
00395 save_identifier_string("ddd");
00396 v1.save_dvar_vector_value();
00397 v1.save_dvar_vector_position();
00398 vtmp.save_dvar_vector_position();
00399 save_identifier_string("eve");
00400 gradient_structure::GRAD_STACK1->
00401 set_gradient_stack(DF_dvsqrt);
00402 return vtmp;
00403 }
00404
00409 void DF_dvsqrt(void)
00410 {
00411
00412 verify_identifier_string("eve");
00413 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00414 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00415 dvar_vector_position v1pos=restore_dvar_vector_position();
00416 dvector v1=restore_dvar_vector_value(v1pos);
00417 verify_identifier_string("ddd");
00418 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00419 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00420 {
00421
00422 dfv1(i)=dfvtmp(i)/(2*sqrt(v1.elem(i)));
00423 }
00424 dfv1.save_dvector_derivatives(v1pos);
00425
00426 }
00427
00428 void DF_dvpow(void);
00429
00434 dvar_vector pow(const dvar_vector& v1, CGNU_DOUBLE e)
00435 {
00436
00437 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00438 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00439 {
00440 vtmp.elem_value(i)=pow(v1.elem_value(i),e);
00441 }
00442
00443 save_identifier_string("ddf");
00444 v1.save_dvar_vector_value();
00445 save_double_value(e);
00446 v1.save_dvar_vector_position();
00447 vtmp.save_dvar_vector_position();
00448 save_identifier_string("eef");
00449 gradient_structure::GRAD_STACK1->
00450 set_gradient_stack(DF_dvpow);
00451 return vtmp;
00452 }
00453
00458 void DF_dvpow(void)
00459 {
00460
00461 verify_identifier_string("eef");
00462 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00463 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00464 dvar_vector_position v1pos=restore_dvar_vector_position();
00465 double e=restore_double_value();
00466 dvector v1=restore_dvar_vector_value(v1pos);
00467 verify_identifier_string("ddf");
00468 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00469 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00470 {
00471
00472 dfv1(i)=dfvtmp(i)*e*pow(v1.elem(i),e-1);
00473 }
00474 dfv1.save_dvector_derivatives(v1pos);
00475
00476 }
00477
00478
00479
00480
00481
00482 void DF_dvdvpow(void);
00483
00488 dvar_vector pow(const dvar_vector& v1, const prevariable& e)
00489 {
00490
00491 double ce=value(e);
00492 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00493 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00494 {
00495 vtmp.elem_value(i)=pow(v1.elem_value(i),ce);
00496 }
00497
00498 save_identifier_string("ddg");
00499 e.save_prevariable_value();
00500 e.save_prevariable_position();
00501 v1.save_dvar_vector_value();
00502 v1.save_dvar_vector_position();
00503 vtmp.save_dvar_vector_position();
00504 save_identifier_string("eeg");
00505 gradient_structure::GRAD_STACK1->
00506 set_gradient_stack(DF_dvdvpow);
00507 return vtmp;
00508 }
00509
00514 void DF_dvdvpow(void)
00515 {
00516
00517
00518 verify_identifier_string("eeg");
00519 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00520 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00521 dvar_vector_position v1pos=restore_dvar_vector_position();
00522 dvector v1=restore_dvar_vector_value(v1pos);
00523 prevariable_position epos=restore_prevariable_position();
00524 double e=restore_prevariable_value();
00525 verify_identifier_string("ddg");
00526 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00527 double dfe=0.;
00528 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00529 {
00530 double tmp=pow(v1.elem(i),e-1);
00531
00532 dfv1(i)=dfvtmp(i)*e*tmp;
00533 dfe+=dfvtmp(i)*v1.elem(i)*tmp*log(v1.elem(i));
00534 }
00535 dfv1.save_dvector_derivatives(v1pos);
00536 save_double_derivative(dfe,epos);
00537
00538 }
00539
00540 void DF_dvcpow(void);
00541
00546 dvar_vector pow(const dvar_vector& v1,int e)
00547 {
00548
00549 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00550 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00551 {
00552 vtmp.elem_value(i)=pow(v1.elem_value(i),e);
00553 }
00554
00555 save_identifier_string("ddf");
00556 v1.save_dvar_vector_value();
00557 save_double_value(double(e));
00558 v1.save_dvar_vector_position();
00559 vtmp.save_dvar_vector_position();
00560 save_identifier_string("eef");
00561 gradient_structure::GRAD_STACK1->
00562 set_gradient_stack(DF_dvcpow);
00563 return vtmp;
00564 }
00565
00570 void DF_dvcpow(void)
00571 {
00572
00573 verify_identifier_string("eef");
00574 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00575 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00576 dvar_vector_position v1pos=restore_dvar_vector_position();
00577 double e=restore_double_value();
00578 dvector v1=restore_dvar_vector_value(v1pos);
00579 verify_identifier_string("ddf");
00580 dvector dfv1(dfvtmp.indexmin(),dfvtmp.indexmax());
00581 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00582 {
00583
00584 dfv1(i)=dfvtmp(i)*e*pow(v1.elem(i),e-1);
00585 }
00586 dfv1.save_dvector_derivatives(v1pos);
00587
00588 }
00589
00590 void DF_cdvpow(void);
00591
00596 dvar_vector pow(const dvector& v1,const prevariable& e)
00597 {
00598
00599 double ce=value(e);
00600 dvar_vector vtmp(v1.indexmin(),v1.indexmax());
00601 for (int i=v1.indexmin();i<=v1.indexmax();i++)
00602 {
00603 vtmp.elem_value(i)=pow(v1.elem(i),ce);
00604 }
00605
00606 save_identifier_string("eddg");
00607 e.save_prevariable_value();
00608 e.save_prevariable_position();
00609 v1.save_dvector_value();
00610 v1.save_dvector_position();
00611 vtmp.save_dvar_vector_position();
00612 save_identifier_string("feeg");
00613 gradient_structure::GRAD_STACK1->
00614 set_gradient_stack(DF_cdvpow);
00615 return vtmp;
00616 }
00617
00622 void DF_cdvpow(void)
00623 {
00624
00625
00626 verify_identifier_string("feeg");
00627 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00628 dvector dfvtmp=restore_dvar_vector_derivatives(tmp_pos);
00629 dvector_position v1pos=restore_dvector_position();
00630 dvector v1=restore_dvector_value(v1pos);
00631 prevariable_position epos=restore_prevariable_position();
00632 double e=restore_prevariable_value();
00633 verify_identifier_string("eddg");
00634
00635 double dfe=0.;
00636 for (int i=dfvtmp.indexmin();i<=dfvtmp.indexmax();i++)
00637 {
00638 double tmp=pow(v1.elem(i),e);
00639
00640
00641 dfe+=dfvtmp(i)*tmp*log(v1.elem(i));
00642 }
00643
00644 save_double_derivative(dfe,epos);
00645
00646 }
00647 dvar_vector pow(const dvector& x,const dvar_vector& a)
00648 {
00649 RETURN_ARRAYS_INCREMENT();
00650 dvar_vector y(x.indexmin(), x.indexmax());
00651
00652 for(int i=x.indexmin(); i<=x.indexmax(); i++)
00653 {
00654 y(i)=pow(x(i),a(i));
00655 }
00656
00657 RETURN_ARRAYS_DECREMENT();
00658 return(y);
00659 }