本文整理汇总了C++中Vector_set::end方法的典型用法代码示例。如果您正苦于以下问题:C++ Vector_set::end方法的具体用法?C++ Vector_set::end怎么用?C++ Vector_set::end使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Vector_set
的用法示例。
在下文中一共展示了Vector_set::end方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: forward_sparse_hessian_pow_op
inline void forward_sparse_hessian_pow_op(
const addr_t* arg ,
Vector_set& for_jac_sparsity ,
Vector_set& for_hes_sparsity )
{ // --------------------------------------------------
// set of independent variables that v0 depends on
for_jac_sparsity.begin(arg[0]);
// loop over dependent variables with non-zero partial
size_t i_x = for_jac_sparsity.next_element();
while( i_x < for_jac_sparsity.end() )
{ // N(i_x) = N(i_x) union L(v0)
for_hes_sparsity.binary_union(i_x, i_x, arg[0], for_jac_sparsity);
// N(i_x) = N(i_x) union L(v1)
for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
i_x = for_jac_sparsity.next_element();
}
// --------------------------------------------------
// set of independent variables that v1 depends on
for_jac_sparsity.begin(arg[1]);
// loop over dependent variables with non-zero partial
i_x = for_jac_sparsity.next_element();
while( i_x < for_jac_sparsity.end() )
{ // N(i_x) = N(i_x) union L(v0)
for_hes_sparsity.binary_union(i_x, i_x, arg[0], for_jac_sparsity);
// N(i_x) = N(i_x) union L(v1)
for_hes_sparsity.binary_union(i_x, i_x, arg[1], for_jac_sparsity);
i_x = for_jac_sparsity.next_element();
}
return;
}
示例2: forward_sparse_hessian_nonlinear_unary_op
inline void forward_sparse_hessian_nonlinear_unary_op(
size_t i_v ,
const Vector_set& for_jac_sparsity ,
Vector_set& for_hes_sparsity )
{
// set of independent variables that v depends on
typename Vector_set::const_iterator itr(for_jac_sparsity, i_v);
// next independent variables that v depends on
size_t i_x = *itr;
// loop over dependent variables with non-zero partial
while( i_x < for_jac_sparsity.end() )
{ // N(i_x) = N(i_x) union L(i_v)
for_hes_sparsity.binary_union(i_x, i_x, i_v, for_jac_sparsity);
i_x = *(++itr);
}
return;
}
示例3: ForJacSweep
void ForJacSweep(
size_t n ,
size_t numvar ,
player<Base>* play ,
Vector_set& var_sparsity )
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = 0;
size_t i, j, k;
// check numvar argument
CPPAD_ASSERT_UNKNOWN( play->num_rec_var() == numvar );
CPPAD_ASSERT_UNKNOWN( var_sparsity.n_set() == numvar );
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_rec_par();
// cum_sparsity accumulates sparsity pattern a cummulative sum
size_t limit = var_sparsity.end();
// vecad_sparsity contains a sparsity pattern from each VecAD object
// to all the other variables.
// vecad_ind maps a VecAD index (the beginning of the
// VecAD object) to its from index in vecad_sparsity
size_t num_vecad_ind = play->num_rec_vecad_ind();
size_t num_vecad_vec = play->num_rec_vecad_vec();
Vector_set vecad_sparsity;
vecad_sparsity.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set to proper index for this VecAD
vecad_ind[j] = i;
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec; // invalid index
// start of next VecAD
j += length + 1;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_rec_vecad_ind() );
}
// work space used by UserOp.
typedef std::set<size_t> size_set;
const size_t user_q = limit; // maximum element plus one
size_set::iterator set_itr; // iterator for a standard set
size_set::iterator set_end; // end of iterator sequence
vector< size_set > user_r; // sparsity pattern for the argument x
vector< size_set > user_s; // sparisty pattern for the result y
size_t user_index = 0; // indentifier for this user_atomic operation
size_t user_id = 0; // user identifier for this call to operator
size_t user_i = 0; // index in result vector
size_t user_j = 0; // index in argument vector
size_t user_m = 0; // size of result vector
size_t user_n = 0; // size of arugment vector
// next expected operator in a UserOp sequence
enum { user_start, user_arg, user_ret, user_end } user_state = user_start;
# if CPPAD_FOR_JAC_SWEEP_TRACE
std::cout << std::endl;
CppAD::vector<bool> z_value(limit);
# endif
// skip the BeginOp at the beginning of the recording
play->start_forward(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == BeginOp );
while(op != EndOp)
{
// this op
play->next_forward(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( (i_op > n) | (op == InvOp) );
CPPAD_ASSERT_UNKNOWN( (i_op <= n) | (op != InvOp) );
// rest of information depends on the case
switch( op )
{
case AbsOp:
CPPAD_ASSERT_NARG_NRES(op, 1, 1);
forward_sparse_jacobian_unary_op(
i_var, arg[0], var_sparsity
);
break;
// -------------------------------------------------
case AddvvOp:
CPPAD_ASSERT_NARG_NRES(op, 2, 1);
forward_sparse_jacobian_binary_op(
i_var, arg, var_sparsity
);
break;
// -------------------------------------------------
//.........这里部分代码省略.........
示例4: for_hes
void for_hes(
const local::player<Base>* play,
size_t n,
size_t numvar,
const Vector_set& for_jac_sparse,
const Vector_set& rev_jac_sparse,
Vector_set& for_hes_sparse,
const RecBase& not_used_rec_base
)
{
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
size_t i, j, k;
// check numvar argument
size_t limit = n+1;
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( for_hes_sparse.n_set() == limit );
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
// upper limit exclusive for set elements
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.end() == limit );
CPPAD_ASSERT_UNKNOWN( for_hes_sparse.end() == limit );
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index for the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparse;
pod_vector<size_t> vecad_ind;
pod_vector<bool> vecad_jac;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_sparse.resize(num_vecad_vec, limit);
vecad_ind.extend(num_vecad_ind);
vecad_jac.extend(num_vecad_vec);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set vecad_ind to proper index for this VecAD
vecad_ind[j] = i;
// make all other values for this vector invalid
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec;
// start of next VecAD
j += length + 1;
// initialize this vector's reverse jacobian value
vecad_jac[i] = false;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// ------------------------------------------------------------------------
// work space used by AFunOp.
vector<Base> atom_x; //// value of parameter arguments to function
vector<ad_type_enum> type_x; // argument types
pod_vector<size_t> atom_ix; // variable index (on tape) for each argument
pod_vector<size_t> atom_iy; // variable index (on tape) for each result
//
// information set by atomic forward (initialization to avoid warnings)
size_t atom_index=0, atom_old=0, atom_m=0, atom_n=0, atom_i=0, atom_j=0;
// information set by atomic forward (necessary initialization)
enum_atom_state atom_state = start_atom;
// -------------------------------------------------------------------------
//
// pointer to the beginning of the parameter vector
// (used by atomic functions)
const Base* parameter = CPPAD_NULL;
if( num_par > 0 )
parameter = play->GetPar();
//
// which parametes are dynamic
const pod_vector<bool>& dyn_par_is( play->dyn_par_is() );
//
// skip the BeginOp at the beginning of the recording
play::const_sequential_iterator itr = play->begin();
// op_info
OpCode op;
size_t i_var;
const Addr* arg;
itr.op_info(op, arg, i_var);
CPPAD_ASSERT_UNKNOWN( op == BeginOp );
# if CPPAD_FOR_HES_TRACE
vector<size_t> atom_funrp; // parameter index for FunrpOp operators
std::cout << std::endl;
CppAD::vectorBool zf_value(limit);
CppAD::vectorBool zh_value(limit * limit);
# endif
bool flag; // temporary for use in switch cases below
bool more_operators = true;
while(more_operators)
{
// next op
(++itr).op_info(op, arg, i_var);
// does the Hessian in question have a non-zero derivative
// with respect to this variable
//.........这里部分代码省略.........
示例5: RevHesSweep
void RevHesSweep(
size_t n,
size_t numvar,
player<Base> *play,
Vector_set& for_jac_sparse, // should be const
bool* RevJac,
Vector_set& rev_hes_sparse
)
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = CPPAD_NULL;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
size_t i, j, k;
// check numvar argument
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( rev_hes_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
// upper limit exclusive for set elements
size_t limit = rev_hes_sparse.end();
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.end() == limit );
// check number of sets match
CPPAD_ASSERT_UNKNOWN(
for_jac_sparse.n_set() == rev_hes_sparse.n_set()
);
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index for the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparse;
vecad_sparse.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
pod_vector<bool> vecad_jac;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
vecad_jac.extend(num_vecad_vec);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set vecad_ind to proper index for this VecAD
vecad_ind[j] = i;
// make all other values for this vector invalid
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec;
// start of next VecAD
j += length + 1;
// initialize this vector's reverse jacobian value
vecad_jac[i] = false;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// work space used by UserOp.
vector<size_t> user_ix; // variable indices for argument vector x
typedef std::set<size_t> size_set;
size_set::iterator set_itr; // iterator for a standard set
size_set::iterator set_end; // end of iterator sequence
vector< size_set > set_r; // forward Jacobian sparsity for x
vector< size_set > set_u; // reverse Hessian sparsity for y
vector< size_set > set_v; // reverse Hessian sparsity for x
//
vector<bool> bool_r; // bool forward Jacobian sparsity for x
vector<bool> bool_u; // bool reverse Hessian sparsity for y
vector<bool> bool_v; // bool reverse Hessian sparsity for x
//
vectorBool pack_r; // pack forward Jacobian sparsity for x
vectorBool pack_u; // pack reverse Hessian sparsity for y
vectorBool pack_v; // pack reverse Hessian sparsity for x
//
vector<bool> user_vx; // which components of x are variables
vector<bool> user_s; // reverse Jacobian sparsity for y
vector<bool> user_t; // reverse Jacobian sparsity for x
const size_t user_q = limit; // maximum element plus one
size_t user_index = 0; // indentifier for this atomic operation
size_t user_id = 0; // user identifier for this call to operator
size_t user_i = 0; // index in result vector
size_t user_j = 0; // index in argument vector
size_t user_m = 0; // size of result vector
size_t user_n = 0; // size of arugment vector
//
atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
bool user_pack = false; // sparsity pattern type is pack
bool user_bool = false; // sparsity pattern type is bool
bool user_set = false; // sparsity pattern type is set
# ifndef NDEBUG
bool user_ok = false; // atomic op return value
# endif
//.........这里部分代码省略.........
示例6: ForHesSweep
void ForHesSweep(
size_t n,
size_t numvar,
player<Base> *play,
Vector_set& for_jac_sparse, // should be const
Vector_set& rev_jac_sparse, // should be const
Vector_set& for_hes_sparse
)
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = CPPAD_NULL;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
size_t i, j, k;
// check numvar argument
size_t limit = n+1;
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( for_hes_sparse.n_set() == limit );
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
// upper limit exclusive for set elements
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.end() == limit );
CPPAD_ASSERT_UNKNOWN( for_hes_sparse.end() == limit );
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index for the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparse;
vecad_sparse.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
pod_vector<bool> vecad_jac;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
vecad_jac.extend(num_vecad_vec);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set vecad_ind to proper index for this VecAD
vecad_ind[j] = i;
// make all other values for this vector invalid
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec;
// start of next VecAD
j += length + 1;
// initialize this vector's reverse jacobian value
vecad_jac[i] = false;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// work space used by UserOp.
vector<size_t> user_ix; // variable indices for argument vector x
vector<Base> user_x; // parameters in x as integers
//
//
typedef std::set<size_t> size_set;
vector< size_set > set_h; // forward Hessian sparsity
vector<bool> bool_h; // forward Hessian sparsity
vectorBool pack_h; // forward Hessian sparstiy
//
vector<bool> user_vx; // which components of x are variables
vector<bool> user_r; // forward Jacobian sparsity for x
vector<bool> user_s; // reverse Jacobian sparsity for y
//
size_t user_index = 0; // indentifier for this atomic operation
size_t user_id = 0; // user identifier for this call to operator
size_t user_i = 0; // index in result vector
size_t user_j = 0; // index in argument vector
size_t user_m = 0; // size of result vector
size_t user_n = 0; // size of arugment vector
//
atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
bool user_pack = false; // sparsity pattern type is pack
bool user_bool = false; // sparsity pattern type is bool
bool user_set = false; // sparsity pattern type is set
bool user_ok = false; // atomic op return value
// next expected operator in a UserOp sequence
enum { user_start, user_arg, user_ret, user_end } user_state = user_start;
//
// pointer to the beginning of the parameter vector
// (used by user atomic functions)
const Base* parameter = CPPAD_NULL;
if( num_par > 0 )
parameter = play->GetPar();
// Initialize
play->forward_start(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == BeginOp );
bool more_operators = true;
//.........这里部分代码省略.........
示例7: ForHesSweep
void ForHesSweep(
size_t n,
size_t numvar,
local::player<Base>* play,
const Vector_set& for_jac_sparse,
const Vector_set& rev_jac_sparse,
Vector_set& for_hes_sparse
)
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = CPPAD_NULL;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
size_t i, j, k;
// check numvar argument
size_t limit = n+1;
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( for_hes_sparse.n_set() == limit );
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
// upper limit exclusive for set elements
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.end() == limit );
CPPAD_ASSERT_UNKNOWN( for_hes_sparse.end() == limit );
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index for the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparse;
vecad_sparse.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
pod_vector<bool> vecad_jac;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
vecad_jac.extend(num_vecad_vec);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set vecad_ind to proper index for this VecAD
vecad_ind[j] = i;
// make all other values for this vector invalid
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec;
// start of next VecAD
j += length + 1;
// initialize this vector's reverse jacobian value
vecad_jac[i] = false;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// ------------------------------------------------------------------------
// user's atomic op calculator
atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
//
// work space used by UserOp.
vector<Base> user_x; // value of parameter arguments to function
vector<size_t> user_ix; // variable index (on tape) for each argument
vector<size_t> user_iy; // variable index (on tape) for each result
//
// information set by forward_user (initialization to avoid warnings)
size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
// information set by forward_user (necessary initialization)
enum_user_state user_state = start_user;
// -------------------------------------------------------------------------
//
// pointer to the beginning of the parameter vector
// (used by user atomic functions)
const Base* parameter = CPPAD_NULL;
if( num_par > 0 )
parameter = play->GetPar();
// Initialize
play->forward_start(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == BeginOp );
bool more_operators = true;
# if CPPAD_FOR_HES_SWEEP_TRACE
vector<size_t> user_usrrp; // parameter index for UsrrpOp operators
CppAD::vectorBool zf_value(limit);
CppAD::vectorBool zh_value(limit * limit);
# endif
bool flag; // temporary for use in switch cases below
while(more_operators)
{
// next op
play->forward_next(op, arg, i_op, i_var);
# ifndef NDEBUG
if( i_op <= n )
{ CPPAD_ASSERT_UNKNOWN((op == InvOp) | (op == BeginOp));
}
else CPPAD_ASSERT_UNKNOWN((op != InvOp) & (op != BeginOp));
//.........这里部分代码省略.........
示例8: RevJacSweep
void RevJacSweep(
bool nz_compare,
size_t n,
size_t numvar,
player<Base> *play,
Vector_set& var_sparsity
)
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = CPPAD_NULL;
size_t i, j, k;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
// check numvar argument
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( var_sparsity.n_set() == numvar );
// upper limit (exclusive) for elements in the set
size_t limit = var_sparsity.end();
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index of the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparsity;
vecad_sparsity.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set to proper index for this VecAD
vecad_ind[j] = i;
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec; // invalid index
// start of next VecAD
j += length + 1;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// work space used by UserOp.
typedef std::set<size_t> size_set;
size_set::iterator set_itr; // iterator for a standard set
size_set::iterator set_end; // end of iterator sequence
vector< size_set > set_r; // set sparsity pattern for the argument x
vector< size_set > set_s; // set sparisty pattern for the result y
//
vector<bool> bool_r; // bool sparsity pattern for the argument x
vector<bool> bool_s; // bool sparisty pattern for the result y
//
const size_t user_q = limit; // maximum element plus one
size_t user_index = 0; // indentifier for this atomic operation
size_t user_id = 0; // user identifier for this call to operator
size_t user_i = 0; // index in result vector
size_t user_j = 0; // index in argument vector
size_t user_m = 0; // size of result vector
size_t user_n = 0; // size of arugment vector
//
atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
bool user_bool = false; // use bool or set sparsity ?
# ifndef NDEBUG
bool user_ok = false; // atomic op return value
# endif
// next expected operator in a UserOp sequence
enum { user_start, user_arg, user_ret, user_end } user_state = user_end;
// Initialize
play->reverse_start(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == EndOp );
# if CPPAD_REV_JAC_SWEEP_TRACE
std::cout << std::endl;
CppAD::vectorBool z_value(limit);
# endif
bool more_operators = true;
while(more_operators)
{
// next op
play->reverse_next(op, arg, i_op, i_var);
# ifndef NDEBUG
if( i_op <= n )
{ CPPAD_ASSERT_UNKNOWN((op == InvOp) | (op == BeginOp));
}
else CPPAD_ASSERT_UNKNOWN((op != InvOp) & (op != BeginOp));
# endif
// rest of information depends on the case
switch( op )
{
//.........这里部分代码省略.........
示例9: RevHesSweep
void RevHesSweep(
size_t n,
size_t numvar,
local::player<Base>* play,
const Vector_set& for_jac_sparse,
bool* RevJac,
Vector_set& rev_hes_sparse
)
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = CPPAD_NULL;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
size_t i, j, k;
// check numvar argument
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( rev_hes_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
// upper limit exclusive for set elements
size_t limit = rev_hes_sparse.end();
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.end() == limit );
// check number of sets match
CPPAD_ASSERT_UNKNOWN(
for_jac_sparse.n_set() == rev_hes_sparse.n_set()
);
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index for the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparse;
vecad_sparse.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
pod_vector<bool> vecad_jac;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
vecad_jac.extend(num_vecad_vec);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set vecad_ind to proper index for this VecAD
vecad_ind[j] = i;
// make all other values for this vector invalid
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec;
// start of next VecAD
j += length + 1;
// initialize this vector's reverse jacobian value
vecad_jac[i] = false;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// ----------------------------------------------------------------------
// user's atomic op calculator
atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
//
// work space used by UserOp.
vector<Base> user_x; // parameters in x as integers
vector<size_t> user_ix; // variable indices for argument vector
vector<size_t> user_iy; // variable indices for result vector
//
// information set by forward_user (initialization to avoid warnings)
size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
// information set by forward_user (necessary initialization)
enum_user_state user_state = end_user; // proper initialization
// ----------------------------------------------------------------------
//
// pointer to the beginning of the parameter vector
// (used by atomic functions
const Base* parameter = CPPAD_NULL;
if( num_par > 0 )
parameter = play->GetPar();
//
// Initialize
play->reverse_start(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == EndOp );
# if CPPAD_REV_HES_SWEEP_TRACE
std::cout << std::endl;
CppAD::vectorBool zf_value(limit);
CppAD::vectorBool zh_value(limit);
# endif
bool more_operators = true;
while(more_operators)
{ bool flag; // temporary for use in switch cases
//
// next op
play->reverse_next(op, arg, i_op, i_var);
//.........这里部分代码省略.........
示例10: RevHesSweep
void RevHesSweep(
size_t n,
size_t numvar,
player<Base> *play,
Vector_set& for_jac_sparse, // should be const
bool* RevJac,
Vector_set& rev_hes_sparse
)
{
OpCode op;
size_t i_op;
size_t i_var;
const size_t *arg = 0;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_rec_par();
size_t i, j, k;
// check numvar argument
CPPAD_ASSERT_UNKNOWN( play->num_rec_var() == numvar );
CPPAD_ASSERT_UNKNOWN( for_jac_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( rev_hes_sparse.n_set() == numvar );
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
// upper limit exclusive for set elements
size_t limit = rev_hes_sparse.end();
CPPAD_ASSERT_UNKNOWN( rev_hes_sparse.end() == limit );
// check number of sets match
CPPAD_ASSERT_UNKNOWN(
for_jac_sparse.n_set() == rev_hes_sparse.n_set()
);
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index for the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_rec_vecad_ind();
size_t num_vecad_vec = play->num_rec_vecad_vec();
Vector_set vecad_sparse;
vecad_sparse.resize(num_vecad_vec, limit);
size_t* vecad_ind = CPPAD_NULL;
bool* vecad_jac = CPPAD_NULL;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind = CPPAD_TRACK_NEW_VEC(num_vecad_ind, vecad_ind);
vecad_jac = CPPAD_TRACK_NEW_VEC(num_vecad_vec, vecad_jac);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set vecad_ind to proper index for this VecAD
vecad_ind[j] = i;
// make all other values for this vector invalid
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec;
// start of next VecAD
j += length + 1;
// initialize this vector's reverse jacobian value
vecad_jac[i] = false;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_rec_vecad_ind() );
}
// Initialize
play->start_reverse(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == EndOp );
# if CPPAD_REV_HES_SWEEP_TRACE
std::cout << std::endl;
CppAD::vectorBool zf_value(limit);
CppAD::vectorBool zh_value(limit);
# endif
while(op != BeginOp)
{
// next op
play->next_reverse(op, arg, i_op, i_var);
# ifndef NDEBUG
if( i_op <= n )
{ CPPAD_ASSERT_UNKNOWN((op == InvOp) | (op == BeginOp));
}
else CPPAD_ASSERT_UNKNOWN((op != InvOp) & (op != BeginOp));
# endif
// rest of information depends on the case
switch( op )
{
case AbsOp:
CPPAD_ASSERT_NARG_NRES(op, 1, 1)
reverse_sparse_hessian_linear_unary_op(
i_var, arg[0], RevJac, for_jac_sparse, rev_hes_sparse
);
break;
// -------------------------------------------------
case AddvvOp:
CPPAD_ASSERT_NARG_NRES(op, 2, 1)
reverse_sparse_hessian_addsub_op(
i_var, arg, RevJac, for_jac_sparse, rev_hes_sparse
);
//.........这里部分代码省略.........
示例11: RevJacSweep
void RevJacSweep(
bool dependency,
size_t n,
size_t numvar,
local::player<Base>* play,
Vector_set& var_sparsity
)
{
OpCode op;
size_t i_op;
size_t i_var;
const addr_t* arg = CPPAD_NULL;
size_t i, j, k;
// length of the parameter vector (used by CppAD assert macros)
const size_t num_par = play->num_par_rec();
// check numvar argument
CPPAD_ASSERT_UNKNOWN( numvar > 0 );
CPPAD_ASSERT_UNKNOWN( play->num_var_rec() == numvar );
CPPAD_ASSERT_UNKNOWN( var_sparsity.n_set() == numvar );
// upper limit (exclusive) for elements in the set
size_t limit = var_sparsity.end();
// vecad_sparsity contains a sparsity pattern for each VecAD object.
// vecad_ind maps a VecAD index (beginning of the VecAD object)
// to the index of the corresponding set in vecad_sparsity.
size_t num_vecad_ind = play->num_vec_ind_rec();
size_t num_vecad_vec = play->num_vecad_vec_rec();
Vector_set vecad_sparsity;
vecad_sparsity.resize(num_vecad_vec, limit);
pod_vector<size_t> vecad_ind;
if( num_vecad_vec > 0 )
{ size_t length;
vecad_ind.extend(num_vecad_ind);
j = 0;
for(i = 0; i < num_vecad_vec; i++)
{ // length of this VecAD
length = play->GetVecInd(j);
// set to proper index for this VecAD
vecad_ind[j] = i;
for(k = 1; k <= length; k++)
vecad_ind[j+k] = num_vecad_vec; // invalid index
// start of next VecAD
j += length + 1;
}
CPPAD_ASSERT_UNKNOWN( j == play->num_vec_ind_rec() );
}
// ----------------------------------------------------------------------
// user's atomic op calculator
atomic_base<Base>* user_atom = CPPAD_NULL; // user's atomic op calculator
//
// work space used by UserOp.
vector<Base> user_x; // parameters in x as integers
vector<size_t> user_ix; // variable indices for argument vector
vector<size_t> user_iy; // variable indices for result vector
//
// information set by forward_user (initialization to avoid warnings)
size_t user_old=0, user_m=0, user_n=0, user_i=0, user_j=0;
// information set by forward_user (necessary initialization)
enum_user_state user_state = end_user; // proper initialization
// ----------------------------------------------------------------------
//
// pointer to the beginning of the parameter vector
// (used by atomic functions
const Base* parameter = CPPAD_NULL;
if( num_par > 0 )
parameter = play->GetPar();
//
// Initialize
play->reverse_start(op, arg, i_op, i_var);
CPPAD_ASSERT_UNKNOWN( op == EndOp );
# if CPPAD_REV_JAC_SWEEP_TRACE
std::cout << std::endl;
CppAD::vectorBool z_value(limit);
# endif
bool more_operators = true;
while(more_operators)
{ bool flag; // temporary for use in switch cases
//
// next op
play->reverse_next(op, arg, i_op, i_var);
# ifndef NDEBUG
if( i_op <= n )
{ CPPAD_ASSERT_UNKNOWN((op == InvOp) | (op == BeginOp));
}
else CPPAD_ASSERT_UNKNOWN((op != InvOp) & (op != BeginOp));
# endif
// rest of information depends on the case
switch( op )
{
case AbsOp:
CPPAD_ASSERT_NARG_NRES(op, 1, 1);
reverse_sparse_jacobian_unary_op(
i_var, arg[0], var_sparsity
//.........这里部分代码省略.........