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