Changeset 2980


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

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

Location:
branches/opt_cond_exp/cppad/local
Files:
3 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        }
  • branches/opt_cond_exp/cppad/local/player.hpp

    r2967 r2980  
    227227        /*!
    228228        \brief
    229         Replace an argument index in the recording.
     229        Replace an argument value in the recording.
     230        2DO: change name of this routine to ReplaceArg.
    230231
    231232        \param i
    232         is the index, in argument indices, that is to be replaced.
     233        is the index, in the recording argument vector,
     234        of the value that is to be replaced.
    233235
    234236        \param value
    235         is the new normal index value.
     237        is the new argument value.
    236238        */
    237239        void ReplaceInd(size_t i, size_t value)
  • branches/opt_cond_exp/cppad/local/recorder.hpp

    r2978 r2980  
    110110        inline void PutArg(addr_t arg0, addr_t arg1, addr_t arg2, addr_t arg3,
    111111                addr_t arg4, addr_t arg5);
    112         /// Reserve spacke for a specified number or arguments
    113         inline addr_t* ReserveArg(size_t n_arg);
     112
     113        // Reserve space for a specified number of arguments
     114        inline size_t ReserveArg(size_t n_arg);
     115
     116        // Replace an argument value
     117        void ReplaceArg(size_t i_arg, size_t value);
    114118
    115119        /// Put a character string in the text for this recording.
     
    436440
    437441\return
    438 point to the first argument; i.e., if arg is the return value,
    439 arg[0] throught arg[n_arg-1] are the arguments.
    440 */
    441 template <class Base>
    442 inline addr_t* recorder<Base>::ReserveArg(size_t n_arg)
     442is the index in the argument vector corresponding to the
     443first of the arguments being reserved.
     444*/
     445template <class Base>
     446inline size_t recorder<Base>::ReserveArg(size_t n_arg)
    443447{
    444448        size_t i = rec_op_arg_.extend(n_arg);
    445449        CPPAD_ASSERT_UNKNOWN( rec_op_arg_.size() == i + n_arg );
    446         return rec_op_arg_.data() + i;
    447 }
     450        return i;
     451}
     452
     453/*!
     454\brief
     455Replace an argument value in the recording
     456(intended to fill in reserved values).
     457
     458\param i_arg
     459is the index, in argument vector, for the value that is replaced.
     460
     461\param value
     462is the new value for the argument with the specified index.
     463*/
     464template <class Base>
     465inline void recorder<Base>::ReplaceArg(size_t i_arg, size_t value)
     466{       rec_op_arg_[i_arg] =  static_cast<addr_t>( value ); }
    448467// --------------------------------------------------------------------------
    449468/*!
Note: See TracChangeset for help on using the changeset viewer.