Changeset 2975


Ignore:
Timestamp:
Oct 19, 2013 7:36:31 PM (6 years ago)
Author:
bradbell
Message:

Backout change to trunk between revisions 2972 and 2973.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/cppad/local/optimize.hpp

    r2973 r2975  
    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$$
     95There are some subtitle issue with optimized $cref atomic$$ functions
     96$latex v = g(u)$$.
     97$list number$$
     98The $cref atomic_rev_sparse_jac$$ function is be used to determine
     99which components of $icode u$$ affect the dependent variables of $icode f$$.
     100Currently this always uses $code std::set<size_t>$$ for the sparsity patterns.
     101It should use the current setting of
     102$cref/atomic_sparsity/atomic_option/atomic_sparsity/$$ for the
     103atomic function $latex g(u)$$.
     104$lnext
     105If $icode%u%[%i%]%$$ does not affect the value of
     106the dependent variables for $icode f$$,
     107the value of $icode%u%[%i%]%$$ is set to $cref nan$$.
     108$lend
     109
    93110
    94111$head Checking Optimization$$
     
    11681185
    11691186        // work space used by UserOp.
    1170 # ifndef NDEBUG
     1187        typedef std::set<size_t> size_set;
     1188        size_t user_q     = 0;       // maximum set element plus one
     1189        vector< size_set > user_r;   // sparsity pattern for the argument x
     1190        vector< size_set > user_s;   // sparisty pattern for the result y
    11711191        size_t user_index = 0;       // indentifier for this user_atomic operation
    11721192        size_t user_id    = 0;       // user identifier for this call to operator
    1173 # endif
    11741193        size_t user_i     = 0;       // index in result vector
    11751194        size_t user_j     = 0;       // index in argument vector
     
    13601379                        CPPAD_ASSERT_UNKNOWN( NumArg( UserOp ) == 4 );
    13611380                        if( user_state == user_end )
    1362                         {
    1363 # ifndef NDEBUG
    1364                                 user_index = arg[0];
     1381                        {       user_index = arg[0];
    13651382                                user_id    = arg[1];
    1366 # endif
    13671383                                user_n     = arg[2];
    13681384                                user_m     = arg[3];
     1385                                user_q     = 1;
     1386                                if(user_s.size() != user_n )
     1387                                        user_s.resize(user_n);
     1388                                if(user_r.size() != user_m )
     1389                                        user_r.resize(user_m);
    13691390                                user_j     = user_n;
    13701391                                user_i     = user_m;
     
    14011422                        CPPAD_ASSERT_UNKNOWN( 0 < arg[0] );
    14021423                        --user_j;
    1403                         if( user_keep.top() )
    1404                                 tape[arg[0]].connect = yes_connected;
     1424                        if( ! user_s[user_j].empty() )
     1425                        {       tape[arg[0]].connect = yes_connected;
     1426                                user_keep.top() = true;
     1427                        }
    14051428                        if( user_j == 0 )
    14061429                                user_state = user_start;
     
    14141437                        CPPAD_ASSERT_UNKNOWN( size_t(arg[0]) < num_par );
    14151438                        --user_i;
     1439                        user_r[user_i].clear();
    14161440                        if( user_i == 0 )
     1441                        {       // call users function for this operation
     1442                                atomic_base<Base>* atom =
     1443                                        atomic_base<Base>::class_object(user_index);
     1444                                atom->set_id(user_id);
     1445                                atom->rev_sparse_jac(
     1446                                        user_q, user_r, user_s
     1447                                );
    14171448                                user_state = user_arg;
     1449                        }
    14181450                        break;
    14191451
     
    14231455                        CPPAD_ASSERT_UNKNOWN( 0 < user_i && user_i <= user_m );
    14241456                        --user_i;
     1457                        user_r[user_i].clear();
    14251458                        if( tape[i_var].connect != not_connected )
    1426                                 user_keep.top() = true;
     1459                                user_r[user_i].insert(0);
    14271460                        if( user_i == 0 )
     1461                        {       // call users function for this operation
     1462                                atomic_base<Base>* atom =
     1463                                        atomic_base<Base>::class_object(user_index);
     1464                                atom->set_id(user_id);
     1465                                atom->rev_sparse_jac(
     1466                                        user_q, user_r, user_s
     1467                                );
    14281468                                user_state = user_arg;
     1469                        }
    14291470                        break;
    14301471                        // ============================================================
  • trunk/omh/whats_new/whats_new_13.omh

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