void eig(const MAT& A, VEC& Sig) { using namespace boost::numeric::bindings; matrix<double, column_major> Ac = A; int m = A.size1(), n = A.size2(); int maxDim = std::max(m,n), minDim = std::min(m,n); Sig.resize(minDim); matrix<double, column_major> U(m,m), SigI(n,m), VT(n,n); lapack::gesvd('A','A', Ac, Sig, U, VT); }
TEST(AgradRev,multiply_log_double_var){ double a = 2.2; AVAR b = 3.3; AVAR f = multiply_log(a,b); EXPECT_FLOAT_EQ(2.2*std::log(3.3),f.val()) << "Reasonable values"; AVEC x = createAVEC(b); VEC g; f.grad(x,g); EXPECT_FLOAT_EQ(a/b.val(),g[0]); a = 0.0; b = 0.0; f = multiply_log(a,b); EXPECT_FLOAT_EQ(0.0,f.val()) << "a and b both 0"; x = createAVEC(b); g.resize(0); f.grad(x,g); EXPECT_FLOAT_EQ(std::numeric_limits<double>::infinity(),g[0]); }
TEST(AgradRev,multiply_log_var_double){ AVAR a = 2.2; double b = 3.3; AVAR f = multiply_log(a,b); EXPECT_FLOAT_EQ(2.2*std::log(3.3),f.val()) << "Reasonable values"; AVEC x = createAVEC(a); VEC g; f.grad(x,g); EXPECT_FLOAT_EQ(std::log(b),g[0]); a = 0.0; b = 0.0; f = multiply_log(a,b); EXPECT_FLOAT_EQ(0.0,f.val()) << "a and b both 0"; x = createAVEC(a); g.resize(0); f.grad(x,g); EXPECT_FLOAT_EQ(std::log(b),g[0]); }