Changeset 3364


Ignore:
Timestamp:
Sep 26, 2014 11:09:47 PM (6 years ago)
Author:
bradbell
Message:

atomic_atomic.sh: This bug has been fixed.
opt_atomic.sh: new bug being demonstrated.
template.sh: template file for creating new bug report.
optimize.hpp: fix spelling in error message.

Location:
trunk
Files:
1 edited
1 copied
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/bug/opt_atomic.sh

    r3312 r3364  
    1111# Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
    1212# -----------------------------------------------------------------------------
    13 # Missing error message when result of an atomic fucntion is used as
    14 # argument to another atomic function (and the tape is optimized)
     13cat << EOF
     14Assert during optimization of an atomic function.
     15EOF
     16cat << EOF > bug.$$
     17# include <cppad/cppad.hpp>
     18# include <example/atomic/reciprocal.cpp>  // Get an atomic test function
     19using namespace CppAD;
     20
     21int main(){
     22  vector<AD<double> > x(2);
     23  vector<AD<double> > y(1);
     24  x[0]=1; x[1]=1;
     25  AD<double> zero=0.0; 
     26  // Create the atomic reciprocal object
     27  atomic_reciprocal afun("atomic_reciprocal");
     28  vector< AD<double> > ax(1);
     29  vector< AD<double> > ay(1);
     30  Independent(x);
     31  ax[0] = x[0] + x[1];
     32  afun(ax,ay);
     33  y[0] = CondExpGt(ay[0],zero,zero,ay[0]);
     34  ADFun<double> F(x,y);
     35 
     36  F.optimize();  // <-- Line that cause problem
     37}
     38EOF
    1539# -----------------------------------------------------------------------------
    1640if [ ! -e build ]
     
    2145echo "$0"
    2246name=`echo $0 | sed -e 's|.*/||' -e 's|\..*||'`
    23 cat << EOF > $name.cpp
    24 # include <cppad/cppad.hpp>
    25 # define DEFINE_REVERSE_SPARSE_JACOBIAN 0 // change to 1 and program will work
    26 
    27 namespace {
    28         using CppAD::vector;
    29         using CppAD::AD;
    30 
    31         class atomic_user : public CppAD::atomic_base<double> {
    32         public:
    33                 atomic_user(const std::string& name) :
    34                         CppAD::atomic_base<double>(name) {}
    35         private:
    36                 virtual bool forward(
    37                         size_t                     q , // lowest order Taylor coeff
    38                         size_t                     p , // highest order Taylor coeff
    39                         const vector<bool>&       vx , // which x elements are variables
    40                         vector<bool>&             vy , // which y elements are variables
    41                         const vector<double>&     tx , // input vector of x
    42                         vector<double>&           ty ) // output vector of y
    43                 {
    44                         if( vx.size() > 0 )
    45                                 vy[0] = vx[0];
    46        
    47                         if ((q <= 0) && (p == 0))
    48                         {       ty[0] = tx[0];     
    49                                 return true;
    50                         }
    51                         return false;
    52                 }
    53 
    54 # if DEFINE_REVERSE_SPARSE_JACOBIAN
    55                 // reverse Jacobian set sparsity routine called by CppAD
    56                 // This function needed because using optimize.
    57                 virtual bool rev_sparse_jac(
    58                         size_t                                q  ,
    59                         const vector< std::set<size_t> >&     rt ,
    60                               vector< std::set<size_t> >&     st )
    61                 {       // This function needed if using RevSparseJac (or optimize)
    62                         size_t n = st.size();
    63                         size_t m = rt.size();
    64                         assert( n == 1 );
    65                         assert( m == 1 );
    66        
    67                         // sparsity for S(x)^T = f'(x)^T * R^T is same as for R^T
    68                         st[0] = rt[0];
    69        
    70                         return true;
    71                 }
    72 # endif
    73 
    74         }; // end class
    75 }
    76 int main()  {
    77         atomic_user func("atomic_user");
    78         size_t n = 1;
    79         vector< AD<double> > ax(n), ay(1), au(1), av(1);
    80         vector<double> x(n), y_before(1), y_after(1);
    81 
    82         ax[0] = x[0] = 3.0;
    83         CppAD::Independent(ax);
    84         //
    85         au[0] = ax[0];
    86         func(au, av);
    87         //
    88         au[0] = av[0];
    89         func(au, av);
    90         //
    91         ay[0] = av[0];
    92 
    93         CppAD::ADFun<double> f;
    94         f.Dependent(ax,ay);
    95 
    96         std::cout << "-----------------------------------------------------\n";
    97         std::cout << "Expect an erorr message about missing rev_sparse_jac:\n";
    98         std::cout << "-----------------------------------------------------\n";
    99         f.optimize();
    100         y_after = f.Forward(0,x);
    101 
    102         return(0);
    103 }
    104 EOF
     47mv ../bug.$$ $name.cpp
    10548echo "g++ -I../.. --std=c++11 -g $name.cpp -o $name"
    10649g++ -I../.. --std=c++11 -g $name.cpp -o $name
     
    10851echo "./$name"
    10952./$name
    110 #
    111 echo "rm $name $name.cpp"
    112 rm $name $name.cpp
  • trunk/bug/template.sh

    r3312 r3364  
    1111# Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
    1212# -----------------------------------------------------------------------------
    13 # Missing error message when result of an atomic fucntion is used as
    14 # argument to another atomic function (and the tape is optimized)
     13cat << EOF
     14Description
     15EOF
     16cat << EOF > bug.$$
     17# include <iostream>
     18int main(void)
     19{       // C++ source code
     20        using std::cout;
     21
     22        cout << "1. svn copy template.sh <name>.sh\n";
     23        cout << "2. Edit <name>.sh replacing description and C++ source code\n";
     24        cout << "3. Run ./<name>.sh\n";
     25        cout << "where <name> is a name that describes the bug\n";
     26       
     27        return 0;
     28}
     29EOF
    1530# -----------------------------------------------------------------------------
    1631if [ ! -e build ]
     
    2136echo "$0"
    2237name=`echo $0 | sed -e 's|.*/||' -e 's|\..*||'`
    23 cat << EOF > $name.cpp
    24 # include <cppad/cppad.hpp>
    25 # define DEFINE_REVERSE_SPARSE_JACOBIAN 0 // change to 1 and program will work
    26 
    27 namespace {
    28         using CppAD::vector;
    29         using CppAD::AD;
    30 
    31         class atomic_user : public CppAD::atomic_base<double> {
    32         public:
    33                 atomic_user(const std::string& name) :
    34                         CppAD::atomic_base<double>(name) {}
    35         private:
    36                 virtual bool forward(
    37                         size_t                     q , // lowest order Taylor coeff
    38                         size_t                     p , // highest order Taylor coeff
    39                         const vector<bool>&       vx , // which x elements are variables
    40                         vector<bool>&             vy , // which y elements are variables
    41                         const vector<double>&     tx , // input vector of x
    42                         vector<double>&           ty ) // output vector of y
    43                 {
    44                         if( vx.size() > 0 )
    45                                 vy[0] = vx[0];
    46        
    47                         if ((q <= 0) && (p == 0))
    48                         {       ty[0] = tx[0];     
    49                                 return true;
    50                         }
    51                         return false;
    52                 }
    53 
    54 # if DEFINE_REVERSE_SPARSE_JACOBIAN
    55                 // reverse Jacobian set sparsity routine called by CppAD
    56                 // This function needed because using optimize.
    57                 virtual bool rev_sparse_jac(
    58                         size_t                                q  ,
    59                         const vector< std::set<size_t> >&     rt ,
    60                               vector< std::set<size_t> >&     st )
    61                 {       // This function needed if using RevSparseJac (or optimize)
    62                         size_t n = st.size();
    63                         size_t m = rt.size();
    64                         assert( n == 1 );
    65                         assert( m == 1 );
    66        
    67                         // sparsity for S(x)^T = f'(x)^T * R^T is same as for R^T
    68                         st[0] = rt[0];
    69        
    70                         return true;
    71                 }
    72 # endif
    73 
    74         }; // end class
    75 }
    76 int main()  {
    77         atomic_user func("atomic_user");
    78         size_t n = 1;
    79         vector< AD<double> > ax(n), ay(1), au(1), av(1);
    80         vector<double> x(n), y_before(1), y_after(1);
    81 
    82         ax[0] = x[0] = 3.0;
    83         CppAD::Independent(ax);
    84         //
    85         au[0] = ax[0];
    86         func(au, av);
    87         //
    88         au[0] = av[0];
    89         func(au, av);
    90         //
    91         ay[0] = av[0];
    92 
    93         CppAD::ADFun<double> f;
    94         f.Dependent(ax,ay);
    95 
    96         std::cout << "-----------------------------------------------------\n";
    97         std::cout << "Expect an erorr message about missing rev_sparse_jac:\n";
    98         std::cout << "-----------------------------------------------------\n";
    99         f.optimize();
    100         y_after = f.Forward(0,x);
    101 
    102         return(0);
    103 }
    104 EOF
     38mv ../bug.$$ $name.cpp
    10539echo "g++ -I../.. --std=c++11 -g $name.cpp -o $name"
    10640g++ -I../.. --std=c++11 -g $name.cpp -o $name
     
    10842echo "./$name"
    10943./$name
    110 #
    111 echo "rm $name $name.cpp"
    112 rm $name $name.cpp
  • trunk/cppad/local/optimize.hpp

    r3359 r3364  
    18931893                                                " that contains the atomic function\n\t";
    18941894                                        s += user_atom->afun_name();
    1895                                         s += "\nCurrent atomoic_sparsity is set to";
     1895                                        s += "\nCurrent atomic_sparsity is set to";
    18961896                                        //
    18971897                                        if( user_set )
Note: See TracChangeset for help on using the changeset viewer.