inline AD<Base> AD<Base>::erf (void) const { AD<Base> result; result.value_ = CppAD::erf(value_); CPPAD_ASSERT_UNKNOWN( Parameter(result) ); if( Variable(*this) ) { CPPAD_ASSERT_UNKNOWN( NumArg(ErfOp) == 3 ); ADTape<Base> *tape = tape_this(); // arg[0] = argument to erf function tape->Rec_.PutArg(taddr_); // arg[1] = zero addr_t p = tape->Rec_.PutPar( Base(0) ); tape->Rec_.PutArg(p); // arg[2] = 2 / sqrt(pi) p = tape->Rec_.PutPar(Base( 1.0 / std::sqrt( std::atan(1.0) ) )); tape->Rec_.PutArg(p); // result.taddr_ = tape->Rec_.PutOp(ErfOp); result.tape_id_ = tape->id_; } return result; }
AD<Base> AD<Base>::Sign (void) const { AD<Base> result; result.value_ = sign(value_); CPPAD_ASSERT_UNKNOWN( Parameter(result) ); if( Variable(*this) ) { // add this operation to the tape CPPAD_ASSERT_UNKNOWN( NumRes(SignOp) == 1 ); CPPAD_ASSERT_UNKNOWN( NumArg(SignOp) == 1 ); ADTape<Base> *tape = tape_this(); // corresponding operand address tape->Rec_.PutArg(taddr_); // put operator in the tape result.taddr_ = tape->Rec_.PutOp(SignOp); // make result a variable result.id_ = tape->id_; } return result; }