Changeset 2982


Ignore:
Timestamp:
Oct 20, 2013 11:42:27 PM (6 years ago)
Author:
bradbell
Message:

Move user atomic information into structure with op addresses
(not using this addresses yet).

File:
1 edited

Legend:

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

    r2981 r2982  
    262262        /// index in the argument recording of first argument for this CSkipOp
    263263        size_t i_arg;
     264};
     265/*!
     266Connection information for a user atomic function
     267*/
     268struct optimize_user_info {
     269        /// type of connection for this atomic function
     270        optimize_connection_type connect_type;
     271        /// If this is an conditional connection, this is the index
     272        /// of the correpsonding CondExpOp
     273        size_t connect_index;
     274        /// If this is a conditional connection, this is the operator
     275        /// index of the beginning of the atomic call sequence; i.e.,
     276        /// the first UserOp.
     277        size_t new_op_begin;
     278        /// If this is a conditional connection, this is one more than the
     279        ///  operator index of the ending of the atomic call sequence; i.e.,
     280        /// the second UserOp.
     281        size_t new_op_end;
    264282};
    265283
     
    12741292        // During reverse mode, compute type of connection for each call to
    12751293        // a user atomic function.
    1276         std::stack<optimize_connection_type> user_connect_type;
    1277         std::stack<size_t>                   user_connect_index;
     1294        CppAD::vector<optimize_user_info>    user_info;
     1295        size_t                               user_curr = 0;
    12781296
    12791297        /// During reverse mode, information for each CSkip operation
     
    16191637                                user_i     = user_m;
    16201638                                user_state = user_ret;
    1621                                 user_connect_type.push( not_connected );
    1622                                 user_connect_index.push( 0 );
     1639                                //
     1640                                optimize_user_info info;
     1641                                info.connect_type = not_connected;
     1642                                user_info.push_back(info);
    16231643                        }
    16241644                        else
     
    16291649                                CPPAD_ASSERT_UNKNOWN( user_m     == size_t(arg[3]) );
    16301650                                user_state = user_end;
     1651                                //
     1652                                CPPAD_ASSERT_UNKNOWN( user_curr + 1 == user_info.size() );
     1653                                user_curr         = user_info.size();
    16311654               }
    16321655                        break;
     
    16521675                        --user_j;
    16531676                        if( ! user_s[user_j].empty() )
    1654                         {       tape[arg[0]].connect_type = yes_connected;
    1655                                 user_connect_type.top()   = yes_connected;
     1677                        {       tape[arg[0]].connect_type          = yes_connected;
     1678                                user_info[user_curr].connect_type  = yes_connected;
    16561679                        }
    16571680                        if( user_j == 0 )
     
    16921715                                case sum_connected:
    16931716                                case csum_connected:
    1694                                 user_connect_type.top() = yes_connected;
     1717                                user_info[user_curr].connect_type = yes_connected;
    16951718                                user_r[user_i].insert(0);
    16961719                                break;
     
    16981721                                case cexp_true_connected:
    16991722                                case cexp_false_connected:
    1700                                 if( user_connect_type.top() == not_connected )
    1701                                 {       user_connect_type.top()  = connect_type;
    1702                                         user_connect_index.top() = connect_index;
     1723                                if( user_info[user_curr].connect_type == not_connected )
     1724                                {       user_info[user_curr].connect_type  = connect_type;
     1725                                        user_info[user_curr].connect_index = connect_index;
    17031726                                }
    1704                                 flag  = user_connect_type.top() != connect_type;
    1705                                 flag |= user_connect_index.top() != connect_index;
     1727                                flag  = user_info[user_curr].connect_type != connect_type;
     1728                                flag |= user_info[user_curr].connect_index!=connect_index;
    17061729                                if( flag )
    1707                                         user_connect_type.top() = yes_connected;
     1730                                        user_info[user_curr].connect_type = yes_connected;
    17081731                                user_r[user_i].insert(0);
    17091732                                break;
     
    18031826        // start playing the operations in the forward direction
    18041827        play->start_forward(op, arg, i_op, i_var);
     1828        CPPAD_ASSERT_UNKNOWN( user_curr == user_info.size() );
    18051829
    18061830        // playing forward skips BeginOp at the beginning, but not EndOp at
     
    18111835        tape[i_var].new_var = rec->PutOp(BeginOp);
    18121836        rec->PutArg(0);
     1837
    18131838
    18141839        // temporary buffer for new argument values
     
    18941919                        case UsrrpOp:
    18951920                        case UsrrvOp:
    1896                         keep = user_connect_type.top() != not_connected;
     1921                        keep = true;
    18971922                        break;
    18981923
     
    22422267                        CPPAD_ASSERT_NARG_NRES(op, 4, 0);
    22432268                        if( user_state == user_start )
    2244                                 user_state = user_arg;
     2269                        {       user_state = user_arg;
     2270                                CPPAD_ASSERT_UNKNOWN( user_curr > 0 );
     2271                                user_curr--;
     2272                                user_info[user_curr].new_op_begin = i_op;
     2273                        }
    22452274                        else
    22462275                        {       user_state = user_start;
    2247                                 user_connect_type.pop();       
    2248                                 user_connect_index.pop();
     2276                                user_info[user_curr].new_op_end = i_op;
    22492277                        }
    22502278                        // user_index, user_id, user_n, user_m
    2251                         rec->PutArg(arg[0], arg[1], arg[2], arg[3]);
    2252                         rec->PutOp(UserOp);
     2279                        if( user_info[user_curr].connect_type != not_connected )
     2280                        {       rec->PutArg(arg[0], arg[1], arg[2], arg[3]);
     2281                                rec->PutOp(UserOp);
     2282                        }
    22532283                        break;
    22542284
    22552285                        case UsrapOp:
    22562286                        CPPAD_ASSERT_NARG_NRES(op, 1, 0);
    2257                         new_arg[0] = rec->PutPar( play->GetPar(arg[0]) );
    2258                         rec->PutArg(new_arg[0]);
    2259                         rec->PutOp(UsrapOp);
     2287                        if( user_info[user_curr].connect_type != not_connected )
     2288                        {       new_arg[0] = rec->PutPar( play->GetPar(arg[0]) );
     2289                                rec->PutArg(new_arg[0]);
     2290                                rec->PutOp(UsrapOp);
     2291                        }
    22602292                        break;
    22612293
    22622294                        case UsravOp:
    22632295                        CPPAD_ASSERT_NARG_NRES(op, 1, 0);
    2264                         new_arg[0] = tape[arg[0]].new_var;
    2265                         if( size_t(new_arg[0]) < num_var )
    2266                         {       rec->PutArg(new_arg[0]);
    2267                                 rec->PutOp(UsravOp);
    2268                         }
    2269                         else
    2270                         {       // This argument does not affect the result and
    2271                                 // has been optimized out so use nan in its place.
    2272                                 new_arg[0] = rec->PutPar( nan(Base(0)) );
    2273                                 rec->PutArg(new_arg[0]);
    2274                                 rec->PutOp(UsrapOp);
     2296                        if( user_info[user_curr].connect_type != not_connected )
     2297                        {       new_arg[0] = tape[arg[0]].new_var;
     2298                                if( size_t(new_arg[0]) < num_var )
     2299                                {       rec->PutArg(new_arg[0]);
     2300                                        rec->PutOp(UsravOp);
     2301                                }
     2302                                else
     2303                                {       // This argument does not affect the result and
     2304                                        // has been optimized out so use nan in its place.
     2305                                        new_arg[0] = rec->PutPar( nan(Base(0)) );
     2306                                        rec->PutArg(new_arg[0]);
     2307                                        rec->PutOp(UsrapOp);
     2308                                }
    22752309                        }
    22762310                        break;
     
    22782312                        case UsrrpOp:
    22792313                        CPPAD_ASSERT_NARG_NRES(op, 1, 0);
    2280                         new_arg[0] = rec->PutPar( play->GetPar(arg[0]) );
    2281                         rec->PutArg(new_arg[0]);
    2282                         rec->PutOp(UsrrpOp);
     2314                        if( user_info[user_curr].connect_type != not_connected )
     2315                        {       new_arg[0] = rec->PutPar( play->GetPar(arg[0]) );
     2316                                rec->PutArg(new_arg[0]);
     2317                                rec->PutOp(UsrrpOp);
     2318                        }
    22832319                        break;
    22842320                       
    22852321                        case UsrrvOp:
    22862322                        CPPAD_ASSERT_NARG_NRES(op, 0, 1);
    2287                         tape[i_var].new_op  = rec->num_rec_op();
    2288                         tape[i_var].new_var = rec->PutOp(UsrrvOp);
     2323                        if( user_info[user_curr].connect_type != not_connected )
     2324                        {       tape[i_var].new_op  = rec->num_rec_op();
     2325                                tape[i_var].new_var = rec->PutOp(UsrrvOp);
     2326                        }
    22892327                        break;
    22902328                        // ---------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.