Changeset 2962


Ignore:
Timestamp:
Oct 17, 2013 5:24:17 PM (6 years ago)
Author:
bradbell
Message:

Finish adding conditional expressions to reverse mode pass.

op_code.hpp: add commnets for atomic function operands.
optimize.hpp: add Divv, Mulvv, Powvv and atomic functions to pass.

Location:
branches/opt_cond_exp/cppad/local
Files:
2 edited

Legend:

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

    r2961 r2962  
    125125        // user atomic operation codes
    126126        UserOp,   //  start of a user atomic operaiton
     127        // arg[0] = index of the operation if atomic_base<Base> class
     128        // arg[1] = extra information passed trough by deprecated old atomic class
     129        // arg[2] = number of arguments to this atomic function
     130        // arg[3] = number of results for this atomic function
    127131        UsrapOp,  //  this user atomic argument is a parameter
    128132        UsravOp,  //  this user atomic argument is a variable
  • branches/opt_cond_exp/cppad/local/optimize.hpp

    r2961 r2962  
    12301230        enum { user_start, user_arg, user_ret, user_end } user_state;
    12311231
    1232         // During reverse mode, push true if user operation is connected,
    1233         // push false otherwise. During forward mode, use to determine if
    1234         // we are keeping this operation and then pop.
    1235         std::stack<bool> user_keep;
     1232        // During reverse mode, compute type of connection for each call to
     1233        // a user atomic function.
     1234        std::stack<optimize_connection_type> user_connect_type;
     1235        std::stack<size_t>                   user_connect_index;
    12361236
    12371237        // Initialize a reverse mode sweep through the operation sequence
     
    14491449                        case MulvvOp:
    14501450                        case PowvvOp:
    1451                         if( tape[i_var].connect_type != not_connected )
    1452                         {
    1453                                 tape[arg[0]].connect_type = yes_connected;
    1454                                 tape[arg[1]].connect_type = yes_connected;
     1451                        for(i = 0; i < 2; i++) switch( connect_type )
     1452                        {       case not_connected:
     1453                                break;
     1454
     1455                                case yes_connected:
     1456                                case sum_connected:
     1457                                case csum_connected:
     1458                                tape[arg[i]].connect_type = yes_connected;
     1459                                break;
     1460
     1461                                case cexp_true_connected:
     1462                                case cexp_false_connected:
     1463                                if( tape[arg[i]].connect_type == not_connected )
     1464                                {       tape[arg[i]].connect_type  = connect_type;
     1465                                        tape[arg[i]].connect_index = connect_index;
     1466                                }
     1467                                flag  = tape[arg[i]].connect_type  != connect_type;
     1468                                flag |= tape[arg[i]].connect_index != connect_index;
     1469                                if( flag )
     1470                                        tape[arg[i]].connect_type = yes_connected;
     1471                                break;
     1472
     1473                                default:
     1474                                CPPAD_ASSERT_UNKNOWN(false);
    14551475                        }
    14561476                        break; // --------------------------------------------
     
    15451565                                user_i     = user_m;
    15461566                                user_state = user_ret;
    1547                                 user_keep.push(false);
     1567                                user_connect_type.push( not_connected );
     1568                                user_connect_index.push( 0 );
    15481569                        }
    15491570                        else
     
    15781599                        if( ! user_s[user_j].empty() )
    15791600                        {       tape[arg[0]].connect_type = yes_connected;
    1580                                 user_keep.top() = true;
     1601                                user_connect_type.top()   = yes_connected;
    15811602                        }
    15821603                        if( user_j == 0 )
     
    16101631                        --user_i;
    16111632                        user_r[user_i].clear();
    1612                         if( tape[i_var].connect_type != not_connected )
     1633                        switch( connect_type )
     1634                        {       case not_connected:
     1635                                break;
     1636
     1637                                case yes_connected:
     1638                                case sum_connected:
     1639                                case csum_connected:
     1640                                user_connect_type.top() = yes_connected;
    16131641                                user_r[user_i].insert(0);
     1642                                break;
     1643
     1644                                case cexp_true_connected:
     1645                                case cexp_false_connected:
     1646                                if( user_connect_type.top() == not_connected )
     1647                                {       user_connect_type.top()  = connect_type;
     1648                                        user_connect_index.top() = connect_index;
     1649                                }
     1650                                flag  = user_connect_type.top()  != connect_type;
     1651                                flag |= user_connect_index.top() != connect_index;
     1652                                if( flag )
     1653                                        user_connect_type.top() = yes_connected;
     1654                                user_r[user_i].insert(0);
     1655                                break;
     1656
     1657                                default:
     1658                                CPPAD_ASSERT_UNKNOWN(false);
     1659                        }
    16141660                        if( user_i == 0 )
    16151661                        {       // call users function for this operation
     
    17351781                        case UsrrpOp:
    17361782                        case UsrrvOp:
    1737                         keep = user_keep.top();
     1783                        keep = user_connect_type.top() != not_connected;
    17381784                        break;
    17391785
     
    20692115                        else
    20702116                        {       user_state = user_start;
    2071                                 user_keep.pop();       
     2117                                user_connect_type.pop();       
     2118                                user_connect_index.pop();
    20722119                        }
    20732120                        // user_index, user_id, user_n, user_m
Note: See TracChangeset for help on using the changeset viewer.