TEST(MetaTraits, DoubleVectorView_true_false) { using std::vector; using stan::DoubleVectorView; using Eigen::Matrix; using Eigen::Dynamic; double a_double(1); std::vector<double> a_std_vector(3); Matrix<double,Dynamic,1> a_vector(4); Matrix<double,1,Dynamic> a_row_vector(5); DoubleVectorView<true,false> dvv1(length(a_double)); EXPECT_FLOAT_EQ(0.0, dvv1[0]); EXPECT_FLOAT_EQ(0.0, dvv1[1]); EXPECT_FLOAT_EQ(0.0, dvv1[100]); DoubleVectorView<true,false> dvv2(length(a_std_vector)); EXPECT_FLOAT_EQ(0.0, dvv2[0]); EXPECT_FLOAT_EQ(0.0, dvv2[1]); EXPECT_FLOAT_EQ(0.0, dvv2[2]); DoubleVectorView<true,false> dvv3(length(a_vector)); EXPECT_FLOAT_EQ(0.0, dvv3[0]); EXPECT_FLOAT_EQ(0.0, dvv3[1]); EXPECT_FLOAT_EQ(0.0, dvv3[2]); DoubleVectorView<true,false> dvv4(length(a_row_vector)); EXPECT_FLOAT_EQ(0.0, dvv4[0]); EXPECT_FLOAT_EQ(0.0, dvv4[1]); EXPECT_FLOAT_EQ(0.0, dvv4[2]); }
TEST(MetaTraits, VectorBuilderHelper_true_false) { using stan::VectorBuilderHelper; using stan::length; using Eigen::Matrix; using Eigen::Dynamic; Matrix<double,Dynamic,1> a_vector(4); Matrix<double,1,Dynamic> a_row_vector(5); VectorBuilderHelper<double,true,false> dvv3(length(a_vector)); EXPECT_FLOAT_EQ(0.0, dvv3[0]); EXPECT_FLOAT_EQ(0.0, dvv3[1]); EXPECT_FLOAT_EQ(0.0, dvv3[2]); double data3 = 0; EXPECT_NO_THROW(data3 = dvv3.data()); EXPECT_FLOAT_EQ(0.0, data3); VectorBuilderHelper<double,true,false> dvv4(length(a_row_vector)); EXPECT_FLOAT_EQ(0.0, dvv4[0]); EXPECT_FLOAT_EQ(0.0, dvv4[1]); EXPECT_FLOAT_EQ(0.0, dvv4[2]); double data4 = 0; EXPECT_NO_THROW(data4 = dvv4.data()); EXPECT_FLOAT_EQ(0.0, data4); }
TEST(MetaTraits, VectorBuilder_true_true) { using std::vector; using stan::VectorBuilder; using stan::math::var; using stan::length; var a_var(1); std::vector<var> a_std_vector(3); VectorBuilder<true,double,std::vector<var> > dvv1(length(a_var)); dvv1[0] = 0.0; EXPECT_FLOAT_EQ(0.0, dvv1[0]); std::vector<double> data1; EXPECT_NO_THROW(data1 = dvv1.data()); EXPECT_EQ(length(a_var), data1.size()); VectorBuilder<true,double,std::vector<var> > dvv2(length(a_std_vector)); dvv2[0] = 0.0; dvv2[1] = 1.0; dvv2[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv2[0]); EXPECT_FLOAT_EQ(1.0, dvv2[1]); EXPECT_FLOAT_EQ(2.0, dvv2[2]); std::vector<double> data2; EXPECT_NO_THROW(data2 = dvv2.data()); EXPECT_EQ(length(a_std_vector), data2.size()); }
TEST(MetaTraits, VectorBuilder_true_true) { using stan::VectorBuilder; using Eigen::Matrix; using Eigen::Dynamic; using stan::math::var; using stan::length; Matrix<var,Dynamic,1> a_vector(4); Matrix<var,1,Dynamic> a_row_vector(5); VectorBuilder<true,double,Matrix<var,Dynamic,1> > dvv3(length(a_vector)); dvv3[0] = 0.0; dvv3[1] = 1.0; dvv3[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv3[0]); EXPECT_FLOAT_EQ(1.0, dvv3[1]); EXPECT_FLOAT_EQ(2.0, dvv3[2]); std::vector<double> data3; EXPECT_NO_THROW(data3 = dvv3.data()); EXPECT_EQ(length(a_vector), data3.size()); VectorBuilder<true,double,Matrix<var,1,Dynamic> > dvv4(length(a_row_vector)); dvv4[0] = 0.0; dvv4[1] = 1.0; dvv4[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv4[0]); EXPECT_FLOAT_EQ(1.0, dvv4[1]); EXPECT_FLOAT_EQ(2.0, dvv4[2]); std::vector<double> data4; EXPECT_NO_THROW(data4 = dvv4.data()); EXPECT_EQ(length(a_row_vector), data4.size()); }
TEST(MetaTraits, get) { using stan::get; EXPECT_FLOAT_EQ(2.0, get(2.0,1)); std::vector<double> x(3); x[1] = 5.0; EXPECT_EQ(5.0, get(x,1)); Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m(2,3); m << 1, 3, 5, 2, 4, 6; EXPECT_EQ(1.0, get(m,0)); EXPECT_EQ(3.0, get(m,2)); EXPECT_EQ(6.0, get(m,5)); Eigen::Matrix<double,Eigen::Dynamic,1> rv(2); rv << 1, 2; EXPECT_EQ(1.0, get(rv,0)); EXPECT_EQ(2.0, get(rv,1)); Eigen::Matrix<double,1,Eigen::Dynamic> v(2); v << 1, 2; EXPECT_EQ(1.0, get(v,0)); EXPECT_EQ(2.0, get(v,1)); }
TEST(MetaTraits, length) { using stan::length; Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m(2,3); m << 1, 2, 3, 4, 5, 6; EXPECT_EQ(6U, length(m)); Eigen::Matrix<double,Eigen::Dynamic,1> rv(2); rv << 1, 2; EXPECT_EQ(2U, length(rv)); Eigen::Matrix<double,1,Eigen::Dynamic> v(2); v << 1, 2; EXPECT_EQ(2U, length(v)); }
TEST(ErrorHandlingScalar, checkConsistentSize_EigenVector) { using Eigen::Matrix; using Eigen::Dynamic; using stan::math::check_consistent_size; using stan::size_of; const char* function = "checkConsistentSize"; const char* name1 = "name1"; Matrix<double,Dynamic,1> x(4); EXPECT_EQ(4U, size_of(x)); EXPECT_TRUE(check_consistent_size(function, name1, x, 4U)); EXPECT_THROW_MSG(check_consistent_size(function, name1, x, 2U), std::invalid_argument, "name1 has dimension = 4, expecting dimension = 2"); x.resize(1); EXPECT_TRUE(check_consistent_size(function, name1, x, 1U)); EXPECT_THROW_MSG(check_consistent_size(function, name1, x, 2U), std::invalid_argument, "name1 has dimension = 1, expecting dimension = 2"); x.resize(0); EXPECT_TRUE(check_consistent_size(function, name1, x, 0U)); EXPECT_THROW_MSG(check_consistent_size(function, name1, x, 1U), std::invalid_argument, "name1 has dimension = 0, expecting dimension = 1"); }
TEST(MetaTraits, VectorBuilder_false_true) { using std::vector; using stan::VectorBuilder; using stan::math::var; using stan::length; var a_var(1); std::vector<var> a_std_vector(3); VectorBuilder<false,double,std::vector<var> > dvv1(length(a_var)); EXPECT_THROW(dvv1[0], std::logic_error); EXPECT_THROW(dvv1.data(), std::logic_error); VectorBuilder<false,double,std::vector<var> > dvv2(length(a_std_vector)); EXPECT_THROW(dvv2[0], std::logic_error); EXPECT_THROW(dvv2.data(), std::logic_error); }
TEST(MetaTraits, VectorBuilderHelper_false_false) { using stan::VectorBuilderHelper; using stan::length; using Eigen::Matrix; using Eigen::Dynamic; Matrix<double,Dynamic,1> a_vector(4); Matrix<double,1,Dynamic> a_row_vector(5); VectorBuilderHelper<double,false,false> dvv3(length(a_vector)); EXPECT_THROW(dvv3[0], std::logic_error); EXPECT_THROW(dvv3.data(), std::logic_error); VectorBuilderHelper<double,false,false> dvv4(length(a_row_vector)); EXPECT_THROW(dvv4[0], std::logic_error); EXPECT_THROW(dvv4.data(), std::logic_error); }
TEST(MetaTraits, VectorBuilder_false_true) { using stan::VectorBuilder; using Eigen::Matrix; using Eigen::Dynamic; using stan::math::var; using stan::length; Matrix<var,Dynamic,1> a_vector(4); Matrix<var,1,Dynamic> a_row_vector(5); VectorBuilder<false,double,Matrix<var,Dynamic,1> > dvv3(length(a_vector)); EXPECT_THROW(dvv3[0], std::logic_error); EXPECT_THROW(dvv3.data(), std::logic_error); VectorBuilder<false,double,Matrix<var,1,Dynamic> > dvv4(length(a_row_vector)); EXPECT_THROW(dvv4[0], std::logic_error); EXPECT_THROW(dvv4.data(), std::logic_error); }
TEST(MetaTraits, DoubleVectorView_true_true) { using std::vector; using stan::DoubleVectorView; using Eigen::Matrix; using Eigen::Dynamic; using stan::agrad::var; var a_var(1); std::vector<var> a_std_vector(3); Matrix<var,Dynamic,1> a_vector(4); Matrix<var,1,Dynamic> a_row_vector(5); DoubleVectorView<true,true> dvv1(length(a_var)); dvv1[0] = 0.0; dvv1[1] = 1.0; dvv1[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv1[0]); EXPECT_FLOAT_EQ(1.0, dvv1[1]); EXPECT_FLOAT_EQ(2.0, dvv1[2]); DoubleVectorView<true,true> dvv2(length(a_std_vector)); dvv2[0] = 0.0; dvv2[1] = 1.0; dvv2[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv2[0]); EXPECT_FLOAT_EQ(1.0, dvv2[1]); EXPECT_FLOAT_EQ(2.0, dvv2[2]); DoubleVectorView<true,true> dvv3(length(a_vector)); dvv3[0] = 0.0; dvv3[1] = 1.0; dvv3[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv3[0]); EXPECT_FLOAT_EQ(1.0, dvv3[1]); EXPECT_FLOAT_EQ(2.0, dvv3[2]); DoubleVectorView<true,true> dvv4(length(a_row_vector)); dvv4[0] = 0.0; dvv4[1] = 1.0; dvv4[2] = 2.0; EXPECT_FLOAT_EQ(0.0, dvv4[0]); EXPECT_FLOAT_EQ(1.0, dvv4[1]); EXPECT_FLOAT_EQ(2.0, dvv4[2]); }
TEST(MetaTraits, VectorBuilderHelper_false_false) { using std::vector; using stan::VectorBuilderHelper; using stan::length; std::vector<double> a_std_vector(3); VectorBuilderHelper<double,false,false> dvv2(length(a_std_vector)); EXPECT_THROW(dvv2[0], std::logic_error); EXPECT_THROW(dvv2.data(), std::logic_error); }
static bool check(const char* function, const char* name, const T_y& y, const T_low& low, const T_high& high) { using stan::length; using stan::get; VectorView<const T_low> low_vec(low); VectorView<const T_high> high_vec(high); for (size_t n = 0; n < length(y); n++) { if (!(low_vec[n] <= get(y, n) && get(y, n) <= high_vec[n])) { std::stringstream msg; msg << ", but must be between "; msg << "(" << low_vec[n] << ", " << high_vec[n] << ")"; std::string msg_str(msg.str()); domain_error_vec(function, name, y, n, "is ", msg_str.c_str()); } } return true; }
TEST(MetaTraits, VectorBuilder_false_false) { using std::vector; using stan::VectorBuilder; using Eigen::Matrix; using Eigen::Dynamic; double a_double(1); std::vector<double> a_std_vector(3); Matrix<double,Dynamic,1> a_vector(4); Matrix<double,1,Dynamic> a_row_vector(5); VectorBuilder<false,double,double> dvv1(length(a_double)); EXPECT_THROW(dvv1[0], std::logic_error); VectorBuilder<false,double,double> dvv2(length(a_std_vector)); EXPECT_THROW(dvv2[0], std::logic_error); VectorBuilder<false,double,double> dvv3(length(a_vector)); EXPECT_THROW(dvv3[0], std::logic_error); VectorBuilder<false,double,double> dvv4(length(a_row_vector)); EXPECT_THROW(dvv4[0], std::logic_error); }
TEST(MetaTraits, DoubleVectorView_false_true) { using std::vector; using stan::DoubleVectorView; using Eigen::Matrix; using Eigen::Dynamic; using stan::agrad::var; var a_var(1); std::vector<var> a_std_vector(3); Matrix<var,Dynamic,1> a_vector(4); Matrix<var,1,Dynamic> a_row_vector(5); DoubleVectorView<false,true> dvv1(length(a_var)); EXPECT_THROW(dvv1[0], std::runtime_error); DoubleVectorView<false,true> dvv2(length(a_std_vector)); EXPECT_THROW(dvv2[0], std::runtime_error); DoubleVectorView<false,true> dvv3(length(a_vector)); EXPECT_THROW(dvv3[0], std::runtime_error); DoubleVectorView<false,true> dvv4(length(a_row_vector)); EXPECT_THROW(dvv4[0], std::runtime_error); }
TEST(MetaTraits, VectorBuilderHelper_true_false) { using std::vector; using stan::VectorBuilderHelper; using stan::length; std::vector<double> a_std_vector(3); VectorBuilderHelper<double,true,false> dvv2(length(a_std_vector)); EXPECT_FLOAT_EQ(0.0, dvv2[0]); EXPECT_FLOAT_EQ(0.0, dvv2[1]); EXPECT_FLOAT_EQ(0.0, dvv2[2]); double data2(10); EXPECT_NO_THROW(data2 = dvv2.data()); EXPECT_FLOAT_EQ(0.0, data2); }
TEST(ErrorHandlingScalar, checkConsistentSize_nan) { using Eigen::Matrix; using Eigen::Dynamic; using stan::math::check_consistent_size; using stan::size_of; const char* function = "checkConsistentSize"; const char* name1 = "name1"; double nan = std::numeric_limits<double>::quiet_NaN(); Matrix<double,Dynamic,1> v1(4); v1 << nan,nan,4,nan; EXPECT_EQ(4U, size_of(v1)); EXPECT_TRUE(check_consistent_size(function, name1, v1, 4U)); EXPECT_THROW(check_consistent_size(function, name1, v1, 2U), std::invalid_argument); }
TEST(AgradRevErrorHandlingScalar, checkConsistentSize) { using Eigen::Matrix; using Eigen::Dynamic; using stan::math::check_consistent_size; using stan::size_of; using stan::agrad::var; const char* function = "check_consistent_size"; const char* name1 = "name1"; Matrix<var,Dynamic,1> v1(4); v1 << 4.0,5.0,6.0,7.0; EXPECT_EQ(4U, size_of(v1)); EXPECT_TRUE(check_consistent_size(function, name1, v1, 4U)); EXPECT_THROW(check_consistent_size(function, name1, v1, 2U), std::invalid_argument); stan::agrad::recover_memory(); }
TEST(MetaTraits, length) { using stan::length; EXPECT_EQ(1U, length(27.0)); EXPECT_EQ(1U, length(3)); std::vector<double> x(10); EXPECT_EQ(10U, length(x)); Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> m(2,3); m << 1, 2, 3, 4, 5, 6; EXPECT_EQ(6U, length(m)); Eigen::Matrix<double,Eigen::Dynamic,1> rv(2); rv << 1, 2; EXPECT_EQ(2U, length(rv)); Eigen::Matrix<double,1,Eigen::Dynamic> v(2); v << 1, 2; EXPECT_EQ(2U, length(v)); }