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 00013 void DF_first_diference(void); 00014 00019 dvar_vector first_difference(const dvar_vector& x) 00020 { 00021 if (x.size()<=1) 00022 { 00023 cerr << "Error -- vector size too small" 00024 " in first_difference(const dvar_vector&)" << endl; 00025 ad_exit(1); 00026 } 00027 00028 RETURN_ARRAYS_INCREMENT(); 00029 int mmin=x.indexmin(); 00030 int mmax=x.indexmax()-1; 00031 dvar_vector tmp(mmin,mmax); 00032 for (int i=mmin; i<=mmax; i++) 00033 { 00034 tmp.elem_value(i)=x.elem_value(i+1)-x.elem_value(i); 00035 } 00036 save_identifier_string("CE4"); 00037 x.save_dvar_vector_position(); 00038 tmp.save_dvar_vector_position(); 00039 save_identifier_string("CE1"); 00040 gradient_structure::GRAD_STACK1-> 00041 set_gradient_stack(DF_first_diference); 00042 RETURN_ARRAYS_DECREMENT(); 00043 return(tmp); 00044 } 00045 00050 void DF_first_diference(void) 00051 { 00052 verify_identifier_string("CE1"); 00053 dvar_vector_position tmp_pos=restore_dvar_vector_position(); 00054 dvar_vector_position x_pos=restore_dvar_vector_position(); 00055 verify_identifier_string("CE4"); 00056 dvector dftmp=restore_dvar_vector_derivatives(tmp_pos); 00057 dvector dfx(x_pos.indexmin(),x_pos.indexmax()); 00058 dfx.initialize(); 00059 for (int i=dfx.indexmax()-1; i>=dfx.indexmin(); i--) 00060 { 00061 // tmp.elem_value(i)=x.elem_value(i+1)-x.elem_value(i); 00062 dfx.elem(i+1)+=dftmp.elem(i); 00063 dfx.elem(i)-=dftmp.elem(i); 00064 } 00065 dfx.save_dvector_derivatives(x_pos); 00066 }
Generated on Tue Mar 8 2016 19:51:33 for ADMB Documentation by 1.8.0 |