ADMB Documentation  11.1.2535
 All Classes Files Functions Variables Typedefs Friends Defines
fvar_a17.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: fvar_a17.cpp 1919 2014-04-22 22:02:01Z johnoel $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California
00006  */
00011 #include "fvar.hpp"
00012 #ifdef _MSC_VER
00013 #include <memory.h>
00014 #endif
00015 
00016 void dvdv_add(void);
00017 
00022 dvar_vector operator+(const dvar_vector& v1, const dvar_vector& v2)
00023 {
00024   if (v1.indexmin()!=v2.indexmin()||v1.indexmax()!=v2.indexmax())
00025   {
00026     cerr << "Incompatible bounds in "
00027     "prevariable operator + (const dvar_vector& v1, const dvar_vector& v2)"
00028     << endl;
00029     ad_exit(1);
00030   }
00031   //dvector cv1=value(v1);
00032   //dvector cv2=value(v2);
00033   kkludge_object kkk;
00034   dvar_vector vtmp(v1.indexmin(),v1.indexmax(),kkk);
00035 #ifdef OPT_LIB
00036     int mmin=v1.indexmin();
00037     int mmax=v1.indexmax();
00038     const double * pv1=&v1.elem_value(mmin);
00039     const double * pv1m=&v1.elem_value(mmax);
00040     const double * pv2=&v2.elem_value(mmin);
00041     double * pt=&vtmp.elem_value(mmin);
00042     do
00043     {
00044       *pt++ = *pv1++ + *pv2++;
00045     }
00046     while (pv1<=pv1m);
00047 
00048 #else
00049   #ifndef USE_ASSEMBLER
00050     int mmin=v1.indexmin();
00051     int mmax=v1.indexmax();
00052     for (int i=mmin;i<=mmax;i++)
00053     {
00054       vtmp.elem_value(i)=v1.elem_value(i)+v2.elem_value(i);
00055     }
00056   #else
00057     int min=v1.indexmin();
00058     int n=v1.indexmax()-min+1;
00059     dp_vector_add(&(vtmp.elem_value(min)),&(v1.elem_value(min)),
00060       &(v2.elem_value(min)),n);
00061   #endif
00062 #endif
00063 
00064   //dvar_vector vtmp=nograd_assign(tmp);
00065 
00066   // The derivative list considerations
00067   save_identifier_string("bbbb");
00068   v1.save_dvar_vector_position();
00069   v2.save_dvar_vector_position();
00070   vtmp.save_dvar_vector_position();
00071   save_identifier_string("aaaa");
00072   gradient_structure::GRAD_STACK1->
00073             set_gradient_stack(dvdv_add);
00074   return vtmp;
00075 }
00076 
00081 void dvdv_add(void)
00082 {
00083   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00084   verify_identifier_string("aaaa");
00085   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00086   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00087   dvar_vector_position v2pos=restore_dvar_vector_position();
00088   dvar_vector_position v1pos=restore_dvar_vector_position();
00089   verify_identifier_string("bbbb");
00090   int mmin=dftmp.indexmin();
00091   int mmax=dftmp.indexmax();
00092   dvector dfv1(mmin,mmax);
00093   dvector dfv2(mmin,mmax);
00094 #ifdef OPT_LIB
00095   memcpy(&dfv1.elem(mmin),&dftmp.elem(mmin),(mmax-mmin+1)*sizeof(double));
00096   memcpy(&dfv2.elem(mmin),&dftmp.elem(mmin),(mmax-mmin+1)*sizeof(double));
00097 #else
00098   for (int i=dftmp.indexmin();i<=dftmp.indexmax();i++)
00099   {
00100     //vtmp.elem(i)=value(v1.elem(i))+value(v2.elem(i));
00101     dfv1(i)=dftmp.elem(i);
00102     dfv2(i)=dftmp.elem(i);
00103   }
00104 #endif
00105   dfv1.save_dvector_derivatives(v1pos);
00106   dfv2.save_dvector_derivatives(v2pos);
00107   //ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00108 }