// $Id$ # ifndef CPPAD_CORE_DIV_EQ_HPP # define CPPAD_CORE_DIV_EQ_HPP /* -------------------------------------------------------------------------- CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-16 Bradley M. Bell CppAD is distributed under multiple licenses. This distribution is under the terms of the Eclipse Public License Version 1.0. A copy of this license is included in the COPYING file of this distribution. Please visit http://www.coin-or.org/CppAD/ for information on other licenses. -------------------------------------------------------------------------- */ // BEGIN CppAD namespace namespace CppAD { template AD& AD::operator /= (const AD &right) { // compute the Base part Base left; left = value_; value_ /= right.value_; // check if there is a recording in progress local::ADTape* tape = AD::tape_ptr(); if( tape == CPPAD_NULL ) return *this; tape_id_t tape_id = tape->id_; // tape_id cannot match the default value for tape_id_; i.e., 0 CPPAD_ASSERT_UNKNOWN( tape_id > 0 ); bool var_left = tape_id_ == tape_id; bool var_right = right.tape_id_ == tape_id; if( var_left ) { if( var_right ) { // this = variable / variable CPPAD_ASSERT_UNKNOWN( local::NumRes(local::DivvvOp) == 1 ); CPPAD_ASSERT_UNKNOWN( local::NumArg(local::DivvvOp) == 2 ); // put operand addresses in tape tape->Rec_.PutArg(taddr_, right.taddr_); // put operator in the tape taddr_ = tape->Rec_.PutOp(local::DivvvOp); // make this a variable CPPAD_ASSERT_UNKNOWN( tape_id_ == tape_id ); } else if( IdenticalOne( right.value_ ) ) { // this = variable * 1 } else { // this = variable / parameter CPPAD_ASSERT_UNKNOWN( local::NumRes(local::DivvpOp) == 1 ); CPPAD_ASSERT_UNKNOWN( local::NumArg(local::DivvpOp) == 2 ); // put operand addresses in tape addr_t p = tape->Rec_.PutPar(right.value_); tape->Rec_.PutArg(taddr_, p); // put operator in the tape taddr_ = tape->Rec_.PutOp(local::DivvpOp); // make this a variable CPPAD_ASSERT_UNKNOWN( tape_id_ == tape_id ); } } else if( var_right ) { if( IdenticalZero(left) ) { // this = 0 / variable } else { // this = parameter / variable CPPAD_ASSERT_UNKNOWN( local::NumRes(local::DivpvOp) == 1 ); CPPAD_ASSERT_UNKNOWN( local::NumArg(local::DivpvOp) == 2 ); // put operand addresses in tape addr_t p = tape->Rec_.PutPar(left); tape->Rec_.PutArg(p, right.taddr_); // put operator in the tape taddr_ = tape->Rec_.PutOp(local::DivpvOp); // make this a variable tape_id_ = tape_id; } } return *this; } CPPAD_FOLD_ASSIGNMENT_OPERATOR(/=) } // END CppAD namespace # endif