Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include "fvar.hpp"
00012 #ifdef _MSC_VER
00013 #include <memory.h>
00014 #endif
00015 #ifndef OPT_LIB
00016 #include <cassert>
00017 #endif
00018
00019 void dvdv_add(void);
00020
00025 dvar_vector operator+(const dvar_vector& v1, const dvar_vector& v2)
00026 {
00027 if (v1.indexmin()!=v2.indexmin()||v1.indexmax()!=v2.indexmax())
00028 {
00029 cerr << "Incompatible bounds in "
00030 "prevariable operator + (const dvar_vector& v1, const dvar_vector& v2)"
00031 << endl;
00032 ad_exit(1);
00033 }
00034
00035
00036 kkludge_object kkk;
00037 dvar_vector vtmp(v1.indexmin(),v1.indexmax(),kkk);
00038 #ifdef OPT_LIB
00039 int mmin=v1.indexmin();
00040 int mmax=v1.indexmax();
00041 const double * pv1=&v1.elem_value(mmin);
00042 const double * pv1m=&v1.elem_value(mmax);
00043 const double * pv2=&v2.elem_value(mmin);
00044 double * pt=&vtmp.elem_value(mmin);
00045 do
00046 {
00047 *pt++ = *pv1++ + *pv2++;
00048 }
00049 while (pv1<=pv1m);
00050
00051 #else
00052 #ifndef USE_ASSEMBLER
00053 int mmin=v1.indexmin();
00054 int mmax=v1.indexmax();
00055 for (int i=mmin;i<=mmax;i++)
00056 {
00057 vtmp.elem_value(i)=v1.elem_value(i)+v2.elem_value(i);
00058 }
00059 #else
00060 int min=v1.indexmin();
00061 int n=v1.indexmax()-min+1;
00062 dp_vector_add(&(vtmp.elem_value(min)),&(v1.elem_value(min)),
00063 &(v2.elem_value(min)),n);
00064 #endif
00065 #endif
00066
00067
00068
00069
00070 save_identifier_string("bbbb");
00071 v1.save_dvar_vector_position();
00072 v2.save_dvar_vector_position();
00073 vtmp.save_dvar_vector_position();
00074 save_identifier_string("aaaa");
00075 gradient_structure::GRAD_STACK1->
00076 set_gradient_stack(dvdv_add);
00077 return vtmp;
00078 }
00079
00084 void dvdv_add(void)
00085 {
00086
00087 verify_identifier_string("aaaa");
00088 dvar_vector_position tmp_pos=restore_dvar_vector_position();
00089 dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00090 dvar_vector_position v2pos=restore_dvar_vector_position();
00091 dvar_vector_position v1pos=restore_dvar_vector_position();
00092 verify_identifier_string("bbbb");
00093 int mmin=dftmp.indexmin();
00094 int mmax=dftmp.indexmax();
00095 #ifndef OPT_LIB
00096 assert(mmax >= mmin);
00097 #endif
00098 dvector dfv1(mmin,mmax);
00099 dvector dfv2(mmin,mmax);
00100 #ifdef OPT_LIB
00101 size_t size = (size_t)(mmax - mmin + 1);
00102 memcpy(&dfv1.elem(mmin),&dftmp.elem(mmin), size * sizeof(double));
00103 memcpy(&dfv2.elem(mmin),&dftmp.elem(mmin), size * sizeof(double));
00104 #else
00105 for (int i=dftmp.indexmin();i<=dftmp.indexmax();i++)
00106 {
00107
00108 dfv1(i)=dftmp.elem(i);
00109 dfv2(i)=dftmp.elem(i);
00110 }
00111 #endif
00112 dfv1.save_dvector_derivatives(v1pos);
00113 dfv2.save_dvector_derivatives(v2pos);
00114
00115 }