Changeset 2972


Ignore:
Timestamp:
Oct 19, 2013 8:33:47 AM (6 years ago)
Author:
bradbell
Message:

Simplify code that optimizes atomic function operations.

Location:
branches/opt_cond_exp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/opt_cond_exp/cppad/local/optimize.hpp

    r2967 r2972  
    9191Hence the return value of $cref CompareChange$$ will always be zero
    9292for an optimized tape (even if $code NDEBUG$$ is not defined).
    93 
    94 $head Atomic Functions$$
    95 There are some subtitle issue with optimized $cref atomic$$ functions
    96 $latex v = g(u)$$.
    97 $list number$$
    98 The $cref atomic_rev_sparse_jac$$ function is be used to determine
    99 which components of $icode u$$ affect the dependent variables of $icode f$$.
    100 Currently this always uses $code std::set<size_t>$$ for the sparsity patterns.
    101 It should use the current setting of
    102 $cref/atomic_sparsity/atomic_option/atomic_sparsity/$$ for the
    103 atomic function $latex g(u)$$.
    104 $lnext
    105 If $icode%u%[%i%]%$$ does not affect the value of
    106 the dependent variables for $icode f$$,
    107 the value of $icode%u%[%i%]%$$ is set to $cref nan$$.
    108 $lend
    109 
    11093
    11194$head Checking Optimization$$
     
    12371220
    12381221        // work space used by UserOp.
    1239         typedef std::set<size_t> size_set;
    1240         size_t user_q     = 0;       // maximum set element plus one
    1241         vector< size_set > user_r;   // sparsity pattern for the argument x
    1242         vector< size_set > user_s;   // sparisty pattern for the result y
     1222# ifndef NDEBUG
    12431223        size_t user_index = 0;       // indentifier for this user_atomic operation
    12441224        size_t user_id    = 0;       // user identifier for this call to operator
     1225# endif
    12451226        size_t user_i     = 0;       // index in result vector
    12461227        size_t user_j     = 0;       // index in argument vector
     
    15851566                        CPPAD_ASSERT_UNKNOWN( NumArg( UserOp ) == 4 );
    15861567                        if( user_state == user_end )
    1587                         {       user_index = arg[0];
     1568                        {       
     1569# ifndef NDEBUG
     1570                                user_index = arg[0];
    15881571                                user_id    = arg[1];
     1572# endif
    15891573                                user_n     = arg[2];
    15901574                                user_m     = arg[3];
    1591                                 user_q     = 1;
    1592                                 if(user_s.size() != user_n )
    1593                                         user_s.resize(user_n);
    1594                                 if(user_r.size() != user_m )
    1595                                         user_r.resize(user_m);
    15961575                                user_j     = user_n;
    15971576                                user_i     = user_m;
     
    16291608                        CPPAD_ASSERT_UNKNOWN( 0 < arg[0] );
    16301609                        --user_j;
    1631                         if( ! user_s[user_j].empty() )
    1632                         {       tape[arg[0]].connect_type = yes_connected;
    1633                                 user_connect_type.top()   = yes_connected;
    1634                         }
     1610                        tape[arg[0]].connect_type  = user_connect_type.top();
     1611                        tape[arg[0]].connect_index = user_connect_index.top();
    16351612                        if( user_j == 0 )
    16361613                                user_state = user_start;
     
    16441621                        CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
    16451622                        --user_i;
    1646                         user_r[user_i].clear();
    16471623                        if( user_i == 0 )
    1648                         {       // call users function for this operation
    1649                                 atomic_base<Base>* atom =
    1650                                         atomic_base<Base>::class_object(user_index);
    1651                                 atom->set_id(user_id);
    1652                                 atom->rev_sparse_jac(
    1653                                         user_q, user_r, user_s
    1654                                 );
    16551624                                user_state = user_arg;
    1656                         }
    16571625                        break;
    16581626
     
    16621630                        CPPAD_ASSERT_UNKNOWN( 0 < user_i && user_i <= user_m );
    16631631                        --user_i;
    1664                         user_r[user_i].clear();
    16651632                        switch( connect_type )
    16661633                        {       case not_connected:
     
    16711638                                case csum_connected:
    16721639                                user_connect_type.top() = yes_connected;
    1673                                 user_r[user_i].insert(0);
    16741640                                break;
    16751641
     
    16841650                                if( flag )
    16851651                                        user_connect_type.top() = yes_connected;
    1686                                 user_r[user_i].insert(0);
    16871652                                break;
    16881653
     
    16911656                        }
    16921657                        if( user_i == 0 )
    1693                         {       // call users function for this operation
    1694                                 atomic_base<Base>* atom =
    1695                                         atomic_base<Base>::class_object(user_index);
    1696                                 atom->set_id(user_id);
    1697                                 atom->rev_sparse_jac(
    1698                                         user_q, user_r, user_s
    1699                                 );
    17001658                                user_state = user_arg;
    1701                         }
    17021659                        break;
    17031660                        // ============================================================
  • branches/opt_cond_exp/omh/whats_new/whats_new_13.omh

    r2960 r2972  
    5656assist you in learning about changes between various versions of CppAD.
    5757
     58$head 10-19$$
     59Remove the requirement that if $cref optimize$$ is used,
     60all the $cref/user atomic/atomic_base/$$ functions must define
     61$cref atomic_rev_sparse_jac$$.
     62
    5863$head 10-16$$
    5964Fix bug in $cref/Tracing/WishList/Tracing/$$ $cref atomic$$ functions.
     
    167172$lnext
    168173Use this option to remove the need to handel $code nan$$ as a special
    169 case in $cref checkpoint$$ functions that
    170 $cref/atomic functions/optimize/Atomic Functions/$$ in within
    171 another function is optimized.
     174case in $cref checkpoint$$ and $cref atomic_base$$ functions.
    172175$lnext
    173176Check $cref/reverse/reverse_any/$$  mode results when
     
    183186This has been fixed.
    184187In addition, documentation about using $code optimize$$
    185 with $cref/atomic functions/optimize/Atomic Functions/$$ has been added.
     188with $cref atomic_base$$ functions has been added.
     189(This connection and documentation was later removed.)
    186190
    187191$head 08-06$$
Note: See TracChangeset for help on using the changeset viewer.