/**
 * Extract the gradient from my_matrixfun()
 */
void test_matrix(){
   std::cout << "== test_matrix() ==" << std::endl;
   // use with normal floats
   Eigen::VectorXd a(3),b(3);
   a.setLinSpaced(0.,1.);
   b.setLinSpaced(1.,2.);
   double c = my_matrixfun(a,b);
   std::cout << "Result: " << c << std::endl;

   // use with AutoDiffScalar
   typedef Eigen::AutoDiffScalar<Eigen::VectorXd> AScalar;
   typedef Eigen::Matrix<AScalar,Eigen::Dynamic,1> AVector;
   AVector Aa(a.size()),Ab(b.size());
   // copy value from non-active example
   for(int i=0;i<a.size();i++)Aa(i).value() = a(i);
   for(int i=0;i<b.size();i++)Ab(i).value() = b(i);
   // initialize derivative vectors
   const int derivative_num = a.size() + b.size();
   int derivative_idx = 0;
   for(int i=0;i<Aa.size();i++){
       Aa(i).derivatives() = 
          Eigen::VectorXd::Unit(derivative_num, derivative_idx);
       derivative_idx++;
   }
   for(int i=0;i<Ab.size();i++){
       Ab(i).derivatives() = 
          Eigen::VectorXd::Unit(derivative_num, derivative_idx);
       derivative_idx++;
   }

   AScalar Ac = my_matrixfun(Aa,Ab);
   std::cout << "Result: " << Ac.value() << std::endl;
   std::cout << "Gradient: " << 
       Ac.derivatives().transpose() << std::endl;
}
int main()
{
  const int sz=7;
    CArray A(sz);
    A(0) = complex<float>(1,2);
    A(1) = complex<float>(3,4);

    Array<float,1> Ar = real(A);
    BZTEST(int(Ar(0)) == 1 && int(Ar(1)) == 3);

    Array<float,1> Ai = imag(A);
    BZTEST(int(Ai(0)) == 2 && int(Ai(1)) == 4);

    CArray Ac(sz);
    Ac = conj(A);

    BZTEST(Ac(0) == complex<float>(1,-2));
    BZTEST(Ac(1) == complex<float>(3,-4));

    Array<float,1> Ab(sz);
    Ab = abs(A);
    BZTEST(fabs(Ab(0) - 2.236068) < eps);
    BZTEST(fabs(Ab(1) - 5.0) < eps);

    Ab = arg(A);
    BZTEST(fabs(Ab(0) - atan(2.0)) < eps);
    BZTEST(fabs(Ab(1) - atan(4.0/3.0)) < eps);

    Array<float,1> r(sz), theta(sz);
    r(0) = 4.0f;
    r(1) = 15.0f;
    theta(0) = float(3.141592/3.0);
    theta(1) = float(3.0*3.141592/2.0);
    Ac = blitz::polar(r,theta);
    BZTEST(fabs(real(Ac(0)) - 2) < eps);
    BZTEST(fabs(imag(Ac(0)) - 3.4641012) < eps);
    BZTEST(fabs(real(Ac(1)) - 0.0) < eps);
    BZTEST(fabs(imag(Ac(1)) + 15.0) < eps);

    Array<complex<long double>,1> A11(5),B11(5),C11(5);
    A11=1,2,3,4,5;
    B11=1,2,3,4,5;
    C11=A11+B11;
    BZTEST(fabs(real(C11(0)) - 2.) < eps);
    C11=A11/B11;
    BZTEST(fabs(real(C11(1)) - 1.) < eps);
    C11=1.0l/A11;
    BZTEST(fabs(real(C11(2)) - 1/3.) < eps);
    C11=A11/1.0l;
    BZTEST(fabs(real(C11(3)) - 4.) < eps);
    C11=complex<long double>(0,1)/A11;
    BZTEST(fabs(imag(C11(4)) - 1/5.) < eps);
    C11=A11/complex<long double>(0,1);
    BZTEST(fabs(imag(C11(0)) - -1.) < eps);

    return 0;
}
/**
 * Generating the gradient and the hessian from my_matrixfun
 */
void test_matrix_twice(){
   std::cout << "== test_matrix_twice() ==" << std::endl;
   // use with normal floats
   Eigen::VectorXd a(3),b(3);
   a.setLinSpaced(0.,1.);
   b.setLinSpaced(1.,2.);
   double c = my_matrixfun(a,b);
   std::cout << "Result: " << c << std::endl;

   // use with AutoDiffScalar
   typedef Eigen::Matrix<double,Eigen::Dynamic,1> inner_derivative_type;
   typedef Eigen::AutoDiffScalar<inner_derivative_type> inner_active_scalar;
   typedef Eigen::Matrix<inner_active_scalar,Eigen::Dynamic,1> outer_derivative_type;
   typedef Eigen::AutoDiffScalar<outer_derivative_type> outer_active_scalar;
   typedef Eigen::Matrix<outer_active_scalar,Eigen::Dynamic,1> AVector;
   AVector Aa(a.size()),Ab(b.size());
   // copy value from non-active example
   for(int i=0;i<a.size();i++)Aa(i).value().value() = a(i);
   for(int i=0;i<b.size();i++)Ab(i).value().value() = b(i);
   // initialize derivative vectors
   const int derivative_num = a.size() + b.size();
   int derivative_idx = 0;
   for(int i=0;i<Aa.size();i++){
       init_twice_active_var(Aa(i),derivative_num,derivative_idx);
       derivative_idx++;
   }
   for(int i=0;i<Ab.size();i++){
       init_twice_active_var(Ab(i),derivative_num,derivative_idx);
       derivative_idx++;
   }

   outer_active_scalar Ac = my_matrixfun(Aa,Ab);
   std::cout << "Result: " << Ac.value().value() << std::endl;
   std::cout << "Gradient: " << 
       Ac.value().derivatives().transpose() << std::endl;

   std::cout << "Hessian" << std::endl;
   Eigen::MatrixXd hessian(Ac.derivatives().size(),Ac.derivatives().size());
   for(int idx=0;idx<Ac.derivatives().size();idx++){
       hessian.middleRows(idx,1) = 
           Ac.derivatives()(idx).derivatives().transpose();
   }
   std::cout << hessian << std::endl;
}
/**
 * This describes the basic use of Eigen::AutoDiffScalar
 */
void basic_use_autodiff_scalar(){
   std::cout << "== basic_use_autodiff_scalar() ==" << std::endl;
   typedef Eigen::AutoDiffScalar<Eigen::VectorXd> AScalar;
   // AScalar stores a scalar and a derivative vector.
   
   // Instantiate an AutoDiffScalar variable with a normal Scalar
   double s = 0.3;
   AScalar As(s);

   // Get the value from the Instance
   std::cout << "value: " << As.value() << std::endl;

   // The derivative vector
   As.derivatives();   // gives you a reference of 
               // the contained derivative vector
   
   // Resize the derivative vector
   As.derivatives().resize(2);
   /**
    * Important note:
    * All ActiveScalars which are used in one computation must have
    * either a common derivative vector length or a zero-length
    * derivative vector.
    */

   // Set the initial derivative vector
   As.derivatives() = Eigen::VectorXd::Unit(2,0);
   std::cout << "Derivative vector : " << 
       As.derivatives().transpose() << std::endl;

   // Instantiate another AScalar
   AScalar Ab(4);
   Ab.derivatives() = Eigen::VectorXd::Unit(2,1);

   // Do the most simple calculation
   AScalar Ac = As * Ab;

   std::cout << "Result/Ac.value()" << Ac.value() << std::endl;
   std::cout << "Gradient: " << Ac.derivatives().transpose() << std::endl;
}
Esempio n. 5
0
void BlockMatrixTest::testOperators1()
{
  std::cout << "--> Test: operators1." <<std::endl;
  double tol = 1e-10;
  SP::SiconosMatrix Ab(new BlockMatrix(m, 2, 3));
  SP::SiconosMatrix Cb(new BlockMatrix(*Ab));
  SP::SiconosMatrix A(new SimpleMatrix(5, 7));

  for (unsigned int i = 0; i < 5 ; ++i)
    for (unsigned int j = 0; j < 7; ++j)
      (*A)(i, j) = i + j;

  double a = 2.3;
  int a1 = 2;

  // Block *= scal or /= scal
  *Cb *= a;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - a * (*Ab)(i, j)) < tol , true);

  *Cb *= a1;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - a1 * a * (*Ab)(i, j)) < tol , true);

  *Cb /= a;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - a1 * (*Ab)(i, j)) < tol , true);
  *Cb /= a1;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - (*Ab)(i, j)) < tol , true);

  // Block +=  Simple
  *Cb += *A;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - (*Ab)(i, j) - (*A)(i, j)) < tol , true);

  // Block -=  Block
  *Cb -= *Ab;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - (*A)(i, j)) < tol , true);

  // Block += Block
  *Cb += *Ab;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - (*Ab)(i, j) - (*A)(i, j)) < tol , true);

  // Block -= Simple
  *Cb -= *A;
  for (unsigned int i = 0; i < Cb->size(0); ++i)
    for (unsigned int j = 0 ; j < Cb->size(1); ++j)
      CPPUNIT_ASSERT_EQUAL_MESSAGE("testOperators1: ", fabs((*Cb)(i, j) - (*Ab)(i, j)) < tol , true);

  std::cout << "-->  test operators1 ended with success." <<std::endl;
}