00001 # ifndef CPPAD_SUB_EQ_INCLUDED
00002 # define CPPAD_SUB_EQ_INCLUDED
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 namespace CppAD {
00017 
00018 template <class Base>
00019 AD<Base>& AD<Base>::operator -= (const AD<Base> &right)
00020 {       Base left;
00021 
00022         left   = value_;
00023         value_ -= right.value_;
00024 
00025         if( Parameter(*this) )
00026         {       if( Variable(right) )
00027                 {       right.tape_this()->RecordOp(SubpvOp, 
00028                                 *this, left, right.taddr_
00029                         );
00030                 }
00031         }
00032         else if( Parameter(right) )
00033         {       if( ! IdenticalZero(right) )
00034                 {       tape_this()->RecordOp(SubvpOp, 
00035                                 *this, taddr_, right.value_
00036                         );
00037                 }
00038         }
00039         else
00040         {       CPPAD_ASSERT_KNOWN(
00041                         id_ == right.id_,
00042                         "Subtracting AD objects that are"
00043                         " variables on different tapes."
00044                 );
00045                 tape_this()->RecordOp(SubvvOp, 
00046                         *this, taddr_, right.taddr_
00047                 );
00048         }
00049         return *this;
00050 }
00051 
00052 CPPAD_FOLD_ASSIGNMENT_OPERATOR(-=)
00053 
00054 } 
00055 
00056 # endif