ADMB Documentation  11.5.3197
 All Classes Files Functions Variables Typedefs Friends Defines
fvar_a20.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id$
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California
00006  */
00011 #include "fvar.hpp"
00012 #if defined(__TURBOC__)
00013   #pragma hdrstop
00014    #include <alloc.h>
00015 #endif
00016 
00017 #include <stdlib.h>
00018 
00019 void dv_assign(void);
00020 
00021 #ifdef _MSC_VER
00022   #include <memory.h>
00023 #endif
00024 
00025 #ifndef OPT_LIB
00026   #include <cassert>
00027 #endif
00028 
00033 dvar_vector& dvar_vector::operator=(const dvar_vector& t)
00034  {
00035    if (!(*this))
00036    {
00037      allocatec(t);
00038    }
00039 #if defined (AD_FAST_ASSIGN)
00040    else if (!(shape->ncopies))
00041    {
00042      deallocate();
00043      allocatec(t);
00044    }
00045 #endif
00046    else
00047    {
00048      int mmin=indexmin();
00049      int mmax=indexmax();
00050 #ifndef OPT_LIB
00051      assert(mmax >= mmin);
00052 #endif
00053      if (mmin != t.indexmin() || mmax != t.indexmax())
00054      {
00055        cerr << " Incompatible bounds in dvar_vector& dvar_vector::operator ="
00056          " (const dvar_vector& t)\n";
00057        ad_exit(21);
00058      }
00059      if (va != t.va)
00060      {
00061 #ifdef OPT_LIB
00062        size_t size = (size_t)(mmax - mmin + 1);
00063        memcpy(&elem_value(mmin), &t.elem_value(mmin), size * sizeof(double));
00064 #else
00065        #ifndef USE_ASSEMBLER
00066          for (int i=mmin; i<=mmax; i++)
00067          {
00068            va[i].x = (t.va[i]).x;
00069          }
00070        #else
00071          int min=t.indexmin();
00072          int n=t.indexmax()-min+1;
00073          dw_block_move(&(this->elem_value(min)),&(t.elem_value(min)),n);
00074        #endif
00075 #endif
00076 
00077        // The derivative list considerations
00078        save_identifier_string("bbbb");
00079        t.save_dvar_vector_position();
00080        this->save_dvar_vector_position();
00081        save_identifier_string("aaaa");
00082        gradient_structure::GRAD_STACK1->
00083          set_gradient_stack(dv_assign);
00084      }
00085    }
00086    return (*this);
00087  }
00088 
00089 void dv_eqprev(void);
00090 
00095 dvar_vector& dvar_vector::operator=(const prevariable& t)
00096  {
00097    int mmin=indexmin();
00098    int mmax=indexmax();
00099    for (int i=mmin; i<=mmax; i++)
00100    {
00101      va[i].x = value(t);
00102    }
00103 
00104    // The derivative list considerations
00105    save_identifier_string("dddd");
00106    t.save_prevariable_position();
00107    this->save_dvar_vector_position();
00108    save_identifier_string("ssss");
00109    gradient_structure::GRAD_STACK1->
00110      set_gradient_stack(dv_eqprev);
00111    return (*this);
00112  }
00113 
00114 void dv_eqdoub(void);
00115 
00120 dvar_vector& dvar_vector::operator=(const double t)
00121  {
00122    int mmin=indexmin();
00123    int mmax=indexmax();
00124    for (int i=mmin; i<=mmax; i++)
00125    {
00126      va[i].x = t;
00127    }
00128    // The derivative list considerations
00129    save_identifier_string("trut");
00130    this->save_dvar_vector_position();
00131    save_identifier_string("ssss");
00132    gradient_structure::GRAD_STACK1->
00133      set_gradient_stack(dv_eqdoub);
00134    return (*this);
00135  }
00136 
00141 void dv_eqdoub(void)
00142 {
00143   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00144   verify_identifier_string("ssss");
00145   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00146   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00147   verify_identifier_string("trut");
00148 }
00149 
00154 void dv_eqprev(void)
00155 {
00156   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00157   verify_identifier_string("ssss");
00158   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00159   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00160   prevariable_position t_pos=restore_prevariable_position();
00161   verify_identifier_string("dddd");
00162   double dft=0.;
00163   for (int i=dftmp.indexmin();i<=dftmp.indexmax();i++)
00164   {
00165     //vtmp.elem(i)=t;
00166     dft+=dftmp.elem(i);
00167   }
00168   save_double_derivative(dft,t_pos);
00169 }
00170 
00175 void dv_assign(void)
00176 {
00177   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00178   verify_identifier_string("aaaa");
00179   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00180   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00181   dvar_vector_position t_pos=restore_dvar_vector_position();
00182   verify_identifier_string("bbbb");
00183   dvector dft(dftmp.indexmin(),dftmp.indexmax());
00184 #ifndef OPT_LIB
00185   assert(dftmp.indexmax() >= dftmp.indexmin());
00186 #endif
00187 #ifdef OPT_LIB
00188   int mmin=dftmp.indexmin();
00189   int mmax=dftmp.indexmax();
00190   size_t size = (size_t)(mmax - mmin + 1);
00191   memcpy(&dft.elem(mmin),&dftmp.elem(mmin), size * sizeof(double));
00192 
00193 #else
00194   #ifndef USE_ASSEMBLER
00195   int mmin=dftmp.indexmin();
00196   int mmax=dftmp.indexmax();
00197   for (int i=mmin;i<=mmax;i++)
00198   {
00199     //vtmp.elem(i)=value(v1.elem(i))+value(v2.elem(i));
00200     dft.elem(i)=dftmp.elem(i);
00201   }
00202   #else
00203   int mmin=dftmp.indexmin();
00204   int n=dftmp.indexmax()-mmin+1;
00205      dw_block_move(&(dft.elem(mmin)),&(dftmp.elem(mmin)),n);
00206   #endif
00207 #endif
00208 
00209   dft.save_dvector_derivatives(t_pos);
00210 }