Changeset 2966


Ignore:
Timestamp:
Oct 18, 2013 10:29:19 AM (6 years ago)
Author:
bradbell
Message:

optimize.hpp: put CSkipOP operations on tape (not yet tested).

File:
1 edited

Legend:

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

    r2965 r2966  
    12651265        {       // next op
    12661266                play->next_reverse(op, arg, i_op, i_var);
    1267                 // This if is not necessary becasue last assignment
    1268                 // with this value of i_var will have NumRes(op) > 0
     1267
     1268                // Store the operator corresponding to each variable
    12691269                if( NumRes(op) > 0 )
    12701270                {       tape[i_var].op = op;
     
    17141714        rec->free();
    17151715
     1716        // Determine which variables can be conditionally skipped
     1717        // 2DO: Perhaps we should change NumRes( UserOp ) = 1 , so it
     1718        // also gets a separate skip_on_true and skip_on false value
     1719        for(i = 0; i < num_var; i++)
     1720        {       if( tape[i].connect_type == cexp_true_connected )
     1721                {       j = tape[i].connect_index;
     1722                        cskip_info[j].skip_on_false.push_back(i);
     1723                }
     1724                if( tape[i].connect_type == cexp_false_connected )
     1725                {       j = tape[i].connect_index;
     1726                        cskip_info[j].skip_on_true.push_back(i);
     1727                }
     1728        }
     1729        // Sort the conditional skip information by the maximum of the
     1730        // index for the left and right comparision operands
     1731        CppAD::vector<size_t> cskip_info_order( cskip_info.size() );
     1732        {       CppAD::vector<size_t> keys( cskip_info.size() );
     1733                for(i = 0; i < cskip_info.size(); i++)
     1734                        keys[i] = std::max( cskip_info[i].left, cskip_info[i].right );
     1735                CppAD::index_sort(keys, cskip_info_order);
     1736        }
     1737        size_t cskip_info_next = 0;
     1738
     1739
    17161740        // Initilaize table mapping hash code to variable index in tape
    17171741        // as pointing to the BeginOp at the beginning of the tape
     
    17731797                CPPAD_ASSERT_UNKNOWN( (i_op > n)  | (op == InvOp) );
    17741798                CPPAD_ASSERT_UNKNOWN( (i_op <= n) | (op != InvOp) );
     1799
     1800                // determine if we should insert a conditional skip here
     1801                bool skip = cskip_info_next < cskip_info.size();
     1802                if( skip )
     1803                {       j     = cskip_info_order[cskip_info_next];
     1804                        skip &= cskip_info[j].left < i_var;
     1805                        skip &= cskip_info[j].right < i_var;
     1806                }
     1807                if( skip )
     1808                {       cskip_info_next++;
     1809                        skip &= cskip_info[j].skip_on_true.size() > 0 ||
     1810                                        cskip_info[j].skip_on_false.size() > 0;
     1811                }
     1812                if( skip )
     1813                {       optimize_cskip_info info = cskip_info[j];
     1814                        CPPAD_ASSERT_UNKNOWN( NumRes(CSkipOp) == 0 );
     1815                        CPPAD_ASSERT_UNKNOWN( info.left < i_var );
     1816                        CPPAD_ASSERT_UNKNOWN( info.right < i_var );
     1817                        rec->PutArg(
     1818                                info.cop                  , // arg[0]
     1819                                info.flag                 , // arg[1]
     1820                                info.left                 , // arg[2]
     1821                                info.right                , // arg[3]
     1822                                info.skip_on_true.size()  , // arg[4]
     1823                                info.skip_on_false.size()   // arg[5]
     1824                        );
     1825                        // These are old variable indices and need to be mapped
     1826                        // to new variable indices after forward pass is completed.
     1827                        for(i = 0; i < info.skip_on_true.size(); i++)
     1828                                rec->PutArg( info.skip_on_true[i] );
     1829                        for(i = 0; i < info.skip_on_false.size(); i++)
     1830                                rec->PutArg( info.skip_on_false[i] );
     1831                        //
     1832                        rec->PutOp(CSkipOp);
     1833                }
    17751834
    17761835                // determine if we should keep this operation in the new
Note: See TracChangeset for help on using the changeset viewer.