/** * 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; }
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; }