Changeset 2993


Ignore:
Timestamp:
Oct 23, 2013 8:21:30 AM (6 years ago)
Author:
bradbell
Message:

opt_check.sh: Optimization bug plus comments as to how to fix.
optimize.hpp: fix bug in choosing where to insert CSkipOp.
optimize.cpp: fix some tests were not being run (by mistake).

Location:
trunk
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/cppad/local/optimize.hpp

    r2991 r2993  
    256256        /// index for right comparison operand
    257257        size_t right;
     258        /// maximum variable index between left and right
     259        size_t max_left_right;
    258260        /// set of variables to skip on true
    259261        CppAD::vector<size_t> skip_var_true;
     
    15601562                                info.n_op_true  = 0;
    15611563                                info.n_op_false = 0;
    1562                                 size_t index = cskip_info.size();
     1564                                //
     1565                                size_t index    = 0;
     1566                                if( arg[1] & 1 )
     1567                                {       index = std::max(index, info.left);
     1568                                        tape[info.left].connect_type = yes_connected;
     1569                                }
     1570                                if( arg[1] & 2 )
     1571                                {       index = std::max(index, info.right);
     1572                                        tape[info.right].connect_type = yes_connected;
     1573                                }
     1574                                CPPAD_ASSERT_UNKNOWN( index > 0 );
     1575                                info.max_left_right = index;
     1576                                //
     1577                                index = cskip_info.size();
    15631578                                cskip_info.push_back(info);
    1564 
    1565                                 mask = 1;
    1566                                 for(i = 2; i < 6; i++)
    1567                                 {       CPPAD_ASSERT_UNKNOWN( size_t(arg[i]) < i_var );
    1568                                         if( arg[1] & mask )
    1569                                         {       if( i == 2 || i == 3 )
    1570                                                         tape[arg[i]].connect_type = yes_connected;
    1571                                                 else
    1572                                                 {       tape[arg[i]].connect_index = index;
    1573                                                         if( i == 4 )
    1574                                                                 tape[arg[i]].connect_type =
    1575                                                                                 cexp_true_connected;
    1576                                                         else
    1577                                                         {       // i == 5
    1578                                                                 tape[arg[i]].connect_type =
    1579                                                                                 cexp_false_connected;
    1580                                                         }
    1581                                                 }
    1582                                         }
    1583                                         mask = mask << 1;
     1579                                //
     1580                                if( arg[1] & 4 )
     1581                                {       tape[arg[4]].connect_index = index;
     1582                                        tape[arg[4]].connect_type = cexp_true_connected;
     1583                                }
     1584                                if( arg[1] & 8 )
     1585                                {       tape[arg[5]].connect_index = index;
     1586                                        tape[arg[5]].connect_type = cexp_false_connected;
    15841587                                }
    15851588                        }
     
    18881891                {       j     = cskip_info_order[cskip_info_next];
    18891892                        if( NumRes(op) > 0 )
    1890                         {       skip &= cskip_info[j].left < i_var;
    1891                                 skip &= cskip_info[j].right < i_var;
    1892                         }
     1893                                skip &= cskip_info[j].max_left_right < i_var;
    18931894                        else
    1894                         {       skip &= cskip_info[j].left <= i_var;
    1895                                 skip &= cskip_info[j].right <= i_var;
    1896                         }
     1895                                skip &= cskip_info[j].max_left_right <= i_var;
    18971896                }
    18981897                if( skip )
  • trunk/test_more/optimize.cpp

    r2991 r2993  
    7272                x[1] = 3.;
    7373                y    = f.Forward(0, x);
    74                 ok   = y[0] == x[0] - x[1];
     74                ok  &= y[0] == x[0] - x[1];
    7575
    7676                // after optimize can skip either call to g or call to h
     
    104104       
    105105                // Create a checkpoint version of the function g
    106                 vector< AD<double> > ax(2), ay(1), az(1);
     106                vector< AD<double> > ax(2), ay(2), az(1);
    107107                ax[0] = 0.;
    108108                ax[1] = 1.;
     
    119119               
    120120                // create function object f : ax -> az
    121                 CppAD::ADFun<double> f;
    122                 f.Dependent(ax, az);
     121                CppAD::ADFun<double> f(ax, az);
    123122
    124123                // number of variables before optimization
     124                // (include ay[0] and ay[1])
    125125                size_t n_before = f.size_var();
    126126               
     
    128128                f.optimize();
    129129
    130                 // number of variables before optimization
     130                // number of variables after optimization
     131                // (does not include ay[0] and ay[1])
    131132                size_t n_after = f.size_var();
    132                 ok            &= n_after + 1 == n_before;
     133                ok            &= n_after + 2 == n_before;
    133134       
    134135                // check optimization works ok
     
    137138                x[1] = 3.;
    138139                z    = f.Forward(0, x);
    139                 ok   = z[0] == x[0] - x[1];
     140                ok  &= z[0] == x[0] - x[1];
    140141               
    141142                return ok;
     
    13211322        ok     &= atomic_cond_exp();
    13221323        // check optimizing out atomic arguments
     1324        ok     &= atomic_no_used();
    13231325        ok     &= atomic_arguments();
    13241326        // check reverse dependency analysis optimization
     
    13451347        // case where results are not identically equal
    13461348        ok     &= not_identically_equal();
    1347 
     1349        //
    13481350        CppAD::user_atomic<double>::clear();
    13491351        return ok;
Note: See TracChangeset for help on using the changeset viewer.