Go to the documentation of this file.00001
00002
00003
00004
00005
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
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
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
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
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
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
00166 dft+=dftmp.elem(i);
00167 }
00168 save_double_derivative(dft,t_pos);
00169 }
00170
00175 void dv_assign(void)
00176 {
00177
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
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 }