ADMB Documentation  11.2.2853
 All Classes Files Functions Variables Typedefs Friends Defines
fvar_a17.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: fvar_a17.cpp 2593 2014-11-07 22:22:16Z 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 #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   //dvector cv1=value(v1);
00035   //dvector cv2=value(v2);
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   //dvar_vector vtmp=nograd_assign(tmp);
00068 
00069   // The derivative list considerations
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   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
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     //vtmp.elem(i)=value(v1.elem(i))+value(v2.elem(i));
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   //ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00115 }