ADMB Documentation  11.1.2274
 All Classes Files Functions Variables Typedefs Friends Defines
fvar_a20.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: fvar_a20.cpp 1942 2014-04-28 22:22:45Z johnoel $
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 
00029 dvar_vector& dvar_vector::operator=(const dvar_vector& t)
00030  {
00031    if (!(*this))
00032    {
00033      allocatec(t);
00034    }
00035 #  if defined (AD_FAST_ASSIGN)
00036    else if (!(shape->ncopies))
00037    {
00038      deallocate();
00039      allocatec(t);
00040    }
00041 #  endif
00042    else
00043    {
00044      int mmin=indexmin();
00045      int mmax=indexmax();
00046      if (mmin != t.indexmin() || mmax != t.indexmax())
00047      {
00048        cerr << " Incompatible bounds in dvar_vector& dvar_vector::operator ="
00049          " (const dvar_vector& t)\n";
00050        ad_exit(21);
00051      }
00052      if (va != t.va)
00053      {
00054      #ifdef OPT_LIB
00055        int mmin=indexmin();
00056        int mmax=indexmax();
00057        memcpy(&elem_value(mmin),&t.elem_value(mmin),
00058          (mmax-mmin+1)*sizeof(double));
00059      #else
00060        #ifndef USE_ASSEMBLER
00061          for (int i=mmin; i<=mmax; i++)
00062          {
00063            va[i].x = (t.va[i]).x;
00064          }
00065        #else
00066          int min=t.indexmin();
00067          int n=t.indexmax()-min+1;
00068          dw_block_move(&(this->elem_value(min)),&(t.elem_value(min)),n);
00069        #endif
00070       #endif
00071 
00072        // The derivative list considerations
00073        save_identifier_string("bbbb");
00074        t.save_dvar_vector_position();
00075        this->save_dvar_vector_position();
00076        save_identifier_string("aaaa");
00077        gradient_structure::GRAD_STACK1->
00078          set_gradient_stack(dv_assign);
00079      }
00080    }
00081    return (*this);
00082  }
00083 
00084 void dv_eqprev(void);
00085 
00090 dvar_vector& dvar_vector::operator=(const prevariable& t)
00091  {
00092    int mmin=indexmin();
00093    int mmax=indexmax();
00094    for (int i=mmin; i<=mmax; i++)
00095    {
00096      va[i].x = value(t);
00097    }
00098 
00099    // The derivative list considerations
00100    save_identifier_string("dddd");
00101    t.save_prevariable_position();
00102    this->save_dvar_vector_position();
00103    save_identifier_string("ssss");
00104    gradient_structure::GRAD_STACK1->
00105      set_gradient_stack(dv_eqprev);
00106    return (*this);
00107  }
00108 
00109 void dv_eqdoub(void);
00110 
00115 dvar_vector& dvar_vector::operator=(const double t)
00116  {
00117    int mmin=indexmin();
00118    int mmax=indexmax();
00119    for (int i=mmin; i<=mmax; i++)
00120    {
00121      va[i].x = t;
00122    }
00123    // The derivative list considerations
00124    save_identifier_string("trut");
00125    this->save_dvar_vector_position();
00126    save_identifier_string("ssss");
00127    gradient_structure::GRAD_STACK1->
00128      set_gradient_stack(dv_eqdoub);
00129    return (*this);
00130  }
00131 
00136 void dv_eqdoub(void)
00137 {
00138   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00139   verify_identifier_string("ssss");
00140   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00141   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00142   verify_identifier_string("trut");
00143 }
00144 
00149 void dv_eqprev(void)
00150 {
00151   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00152   verify_identifier_string("ssss");
00153   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00154   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00155   prevariable_position t_pos=restore_prevariable_position();
00156   verify_identifier_string("dddd");
00157   double dft=0.;
00158   for (int i=dftmp.indexmin();i<=dftmp.indexmax();i++)
00159   {
00160     //vtmp.elem(i)=t;
00161     dft+=dftmp.elem(i);
00162   }
00163   save_double_derivative(dft,t_pos);
00164 }
00165 
00170 void dv_assign(void)
00171 {
00172   // int ierr=fsetpos(gradient_structure::get_fp(),&filepos);
00173   verify_identifier_string("aaaa");
00174   dvar_vector_position tmp_pos=restore_dvar_vector_position();
00175   dvector dftmp=restore_dvar_vector_derivatives(tmp_pos);
00176   dvar_vector_position t_pos=restore_dvar_vector_position();
00177   verify_identifier_string("bbbb");
00178   dvector dft(dftmp.indexmin(),dftmp.indexmax());
00179 #ifdef OPT_LIB
00180   int mmin=dftmp.indexmin();
00181   int mmax=dftmp.indexmax();
00182   memcpy(&dft.elem(mmin),&dftmp.elem(mmin),(mmax-mmin+1)*sizeof(double));
00183 
00184 #else
00185 #ifndef USE_ASSEMBLER
00186   int mmin=dftmp.indexmin();
00187   int mmax=dftmp.indexmax();
00188   for (int i=mmin;i<=mmax;i++)
00189   {
00190     //vtmp.elem(i)=value(v1.elem(i))+value(v2.elem(i));
00191     dft.elem(i)=dftmp.elem(i);
00192   }
00193 #else
00194   int mmin=dftmp.indexmin();
00195   int n=dftmp.indexmax()-mmin+1;
00196      dw_block_move(&(dft.elem(mmin)),&(dftmp.elem(mmin)),n);
00197 #endif
00198 #endif
00199 
00200   dft.save_dvector_derivatives(t_pos);
00201 }