Ignore:
Timestamp:
Oct 20, 2013 7:33:35 PM (7 years ago)
Author:
bradbell
Message:

Use index instead of pointer because pointer can become invalid when vector grows.

File:
1 edited

Legend:

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

    r2979 r2980  
    260260        /// set of operations to skip on false
    261261        CppAD::vector<size_t> skip_on_false;
    262         /// pointer to space reserved for the arguments
    263         addr_t* arg;
     262        /// index in the argument recording of first argument for this CSkipOp
     263        size_t i_arg;
    264264};
    265265
     
    18461846                                size_t n_true  = info.skip_on_true.size();
    18471847                                size_t n_false = info.skip_on_false.size();
     1848                                size_t n_arg   = 7 + n_true + n_false;
    18481849                                // reserve space for the arguments to this operator but
    18491850                                // delay setting them until we have all the new addresses
    1850                                 cskip_info[j].arg = rec->ReserveArg(7 + n_true + n_false);
     1851                                cskip_info[j].i_arg = rec->ReserveArg(n_arg);
     1852                                CPPAD_ASSERT_UNKNOWN( cskip_info[i].i_arg > 0 );
    18511853                                rec->PutOp(CSkipOp);
    18521854                        }
    1853                         else    cskip_info[j].arg = CPPAD_NULL;
     1855                        else    cskip_info[j].i_arg = 0;
    18541856                }
    18551857
     
    23162318        for(i = 0; i < cskip_info.size(); i++)
    23172319        {       optimize_cskip_info info = cskip_info[i];
    2318                 if( info.arg != CPPAD_NULL )
     2320                if( info.i_arg > 0 )
    23192321                {       size_t n_true  = info.skip_on_true.size();
    23202322                        size_t n_false = info.skip_on_false.size();
    2321                         info.arg[0] = static_cast<addr_t>( info.cop );
    2322                         info.arg[1] = static_cast<addr_t>( info.flag );
    2323                         info.arg[2] = static_cast<addr_t>( info.left );
    2324                         info.arg[3] = static_cast<addr_t>( info.right );
    2325                         info.arg[4] = static_cast<addr_t>( n_true );
    2326                         info.arg[5] = static_cast<addr_t>( n_false );
     2323                        size_t i_arg   = info.i_arg;
     2324                        rec->ReplaceArg(i_arg++, info.cop   );
     2325                        rec->ReplaceArg(i_arg++, info.flag  );
     2326                        rec->ReplaceArg(i_arg++, info.left  );
     2327                        rec->ReplaceArg(i_arg++, info.right );
     2328                        rec->ReplaceArg(i_arg++, n_true     );
     2329                        rec->ReplaceArg(i_arg++, n_false    );
    23272330                        for(j = 0; j < n_true; j++)
    23282331                        {       i_var = info.skip_on_true[j];
    23292332                                CPPAD_ASSERT_UNKNOWN( tape[i_var].new_op > 0 );
    2330                                 info.arg[6 + j] = tape[i_var].new_op;
     2333                                rec->ReplaceArg(i_arg++, tape[i_var].new_op );
    23312334                        }
    23322335                        for(j = 0; j < n_false; j++)
    23332336                        {       i_var = info.skip_on_false[j];
    23342337                                CPPAD_ASSERT_UNKNOWN( tape[i_var].new_op > 0 );
    2335                                 info.arg[6 + n_true + j] = tape[i_var].new_op;
     2338                                rec->ReplaceArg(i_arg++, tape[i_var].new_op );
    23362339                        }
    2337                         info.arg[6 + n_true + n_false] =
    2338                                 static_cast<addr_t>(n_true + n_false);
     2340                        rec->ReplaceArg(i_arg++, n_true + n_false);
     2341# ifndef NDEBUG
     2342                        size_t n_arg   = 7 + n_true + n_false;
     2343                        CPPAD_ASSERT_UNKNOWN( info.i_arg + n_arg == i_arg );
     2344# endif
    23392345                }
    23402346        }
Note: See TracChangeset for help on using the changeset viewer.