1 # ifndef CPPAD_CORE_ABS_NORMAL_FUN_HPP
2 # define CPPAD_CORE_ABS_NORMAL_FUN_HPP
289 # define NOT_YET_COMPILING 0
291 template <
class Base>
293 {
using namespace local;
303 const addr_t* arg = CPPAD_NULL;
307 play_.get_op_info(i_op, op, arg, i_var);
310 bool more_operators =
true;
311 while( more_operators )
314 play_.get_op_info(++i_op, op, arg, i_var);
319 f_abs_arg.push_back( arg[0] );
320 f_abs_res.push_back( i_var );
330 more_operators =
false;
345 const size_t num_var = play_.num_var_rec();
349 std::numeric_limits<addr_t>::max() >= num_var
352 for(i_var = 0; i_var < num_var; i_var++)
353 f2g_var[i_var] =
addr_t( num_var );
357 play_.get_op_info(i_op, op, arg, i_var);
359 more_operators =
true;
360 while( more_operators )
368 f2g_var[i_var] = rec.PutOp(op);
374 f2g_var[i_var] = rec.PutOp(op);
379 more_operators =
false;
383 play_.get_op_info(++i_op, op, arg, i_var);
390 for(index_abs = 0; index_abs < f_abs_res.size(); index_abs++)
391 f2g_var[ f_abs_res[index_abs] ] = rec.PutOp(
InvOp);
397 const Base* f_parameter = play_.GetPar();
400 more_operators =
true;
402 while( more_operators )
424 new_arg[0] = rec.PutPar( f_parameter[ arg[0] ] );
425 rec.PutArg( new_arg[0] );
426 f2g_var[i_var] = rec.PutOp(op);
455 new_arg[0] = f2g_var[ arg[0] ];
456 rec.PutArg( new_arg[0] );
457 f2g_var[i_var] = rec.PutOp( op );
466 rec.PutArg( rec.PutPar( Base(0.0) ) );
467 rec.PutArg( rec.PutPar(
470 f2g_var[i_var] = rec.PutOp(op);
480 new_arg[0] = f2g_var[ arg[0] ];
481 new_arg[1] = rec.PutPar( f_parameter[ arg[1] ] );
482 rec.PutArg( new_arg[0], new_arg[1] );
483 f2g_var[i_var] = rec.PutOp(op);
490 new_arg[1] = f2g_var[ arg[1] ];
491 rec.PutArg( new_arg[0], new_arg[1] );
492 f2g_var[i_var] = rec.PutOp(op);
505 new_arg[0] = rec.PutPar( f_parameter[ arg[0] ] );
506 new_arg[1] = f2g_var[ arg[1] ];
507 rec.PutArg( new_arg[0], new_arg[1] );
508 f2g_var[i_var] = rec.PutOp(op);
520 new_arg[0] = f2g_var[ arg[0] ];
521 new_arg[1] = f2g_var[ arg[1] ];
522 rec.PutArg( new_arg[0], new_arg[1] );
523 f2g_var[i_var] = rec.PutOp(op);
532 for(
size_t i = 2; i < 6; i++)
533 {
if( arg[1] & mask )
535 new_arg[i] = f2g_var[ arg[i] ];
538 new_arg[i] = rec.PutPar( f_parameter[ arg[i] ] );
549 f2g_var[i_var] = rec.PutOp(op);
557 more_operators =
false;
567 new_arg[0] = rec.PutPar( f_parameter[ arg[0] ] );
568 new_arg[1] = f2g_var[ arg[1] ];
569 rec.PutArg(new_arg[0], new_arg[1]);
576 new_arg[0] = f2g_var[ arg[0] ];
577 new_arg[1] = rec.PutPar( f_parameter[ arg[1] ] );
578 rec.PutArg(new_arg[0], new_arg[1]);
587 new_arg[0] = f2g_var[ arg[0] ];
588 new_arg[1] = f2g_var[ arg[1] ];
589 rec.PutArg(new_arg[0], new_arg[1]);
605 new_arg[1] = f2g_var[ arg[1] ];
608 { new_arg[1] = rec.PutPar( f_parameter[ arg[1] ] );
615 new_arg[3] = f2g_var[ arg[3] ];
618 { new_arg[3] = rec.PutPar( f_parameter[ arg[3] ] );
620 new_arg[2] = rec.PutTxt( play_.GetTxt( arg[2] ) );
621 new_arg[4] = rec.PutTxt( play_.GetTxt( arg[4] ) );
648 f2g_var[i_var] = rec.PutLoadOp(op);
656 new_arg[1] = f2g_var[ arg[1] ];
663 f2g_var[i_var] = rec.PutLoadOp(op);
670 new_arg[1] = rec.PutPar( f_parameter[ arg[1] ] );
671 new_arg[2] = rec.PutPar( f_parameter[ arg[2] ] );
685 new_arg[1] = f2g_var[ arg[1] ];
686 new_arg[2] = rec.PutPar( f_parameter[ arg[2] ] );
700 new_arg[1] = rec.PutPar( f_parameter[ arg[1] ] );
701 new_arg[2] = f2g_var[ arg[2] ];
716 new_arg[1] = f2g_var[ arg[1] ];
717 new_arg[2] = f2g_var[ arg[2] ];
731 rec.PutArg(arg[0], arg[1], arg[2], arg[3]);
737 new_arg[0] = rec.PutPar( f_parameter[ arg[0] ] );
738 rec.PutArg(new_arg[0]);
745 new_arg[0] = f2g_var[ arg[0] ];
746 rec.PutArg(new_arg[0]);
752 new_arg[0] = rec.PutPar( f_parameter[ arg[0] ] );
753 rec.PutArg(new_arg[0]);
759 f2g_var[i_var] = rec.PutOp(
UsrrvOp);
768 play_.get_op_info(++i_op, op, arg, i_var);
786 size_t s = f_abs_res.size();
790 for(
size_t j = 0; j < n; j++)
794 for(
size_t j = 0; j < s; j++)
795 { g.
ind_taddr_[n + j] = f2g_var[ f_abs_res[j] ];
803 for(
size_t i = 0; i < m; i++)
807 for(
size_t i = 0; i < s; i++)
808 { g.
dep_taddr_[m + i] = f2g_var[ f_abs_arg[i] ];
814 for(
size_t i = 0; i < m; i++)
816 for(
size_t i = 0; i < s; i++)
831 g.
play_.get(rec, n + s);
837 g.
play_.num_op_rec(),
838 g.
play_.num_var_rec()
851 for(
size_t i = 0; i < s; i++)
local::sparse_list for_jac_sparse_set_
Set results of the forward mode Jacobian sparsity calculations for_jac_sparse_set_.n_set() != 0 implies for_sparse_pack_ is empty.
Class used to hold function objects.
size_t num_order_taylor_
number of orders stored in taylor_
The CppAD Simple Vector template class.
size_t cap_order_taylor_
maximum number of orders that will fit in taylor_
CPPAD_TAPE_ADDR_TYPE addr_t
local::sparse_pack for_jac_sparse_pack_
Packed results of the forward mode Jacobian sparsity calculations. for_jac_sparse_pack_.n_set() != 0 implies other sparsity results are empty.
void abs_normal_fun(ADFun &g, ADFun &a) const
std::complex< double > atan(const std::complex< double > &x)
size_t NumArg(OpCode op)
Number of arguments for a specified operator.
CppAD::vector< size_t > ind_taddr_
tape address for the independent variables
void resize(size_t n)
change the number of elements in this vector.
size_t NumRes(OpCode op)
Number of variables resulting from the specified operation.
local::player< Base > play_
the operation sequence corresponding to this object
size_t size(void) const
number of elements currently in this vector.
OpCode
Type used to distinguish different AD< Base > atomic operations.
size_t num_var_tape_
number of variables in the recording (play_)
AD< Base > sqrt(const AD< Base > &x)
local::pod_vector< bool > cskip_op_
which operations can be conditionally skipped Set during forward pass of order zero ...
#define CPPAD_ASSERT_UNKNOWN(exp)
Check that exp is true, if not terminate execution.
#define CPPAD_ASSERT_NARG_NRES(op, n_arg, n_res)
Check that operator op has the specified number of of arguments and results.
CppAD::vector< bool > dep_parameter_
which dependent variables are actually parameters
CppAD::vector< size_t > dep_taddr_
tape address and parameter flag for the dependent variables
local::pod_vector< Base > taylor_
results of the forward mode calculations
local::subgraph::subgraph_info subgraph_info_
subgraph information for this object