TEST(McmcNuts, instantiaton_test) { rng_t base_rng(4839294); std::stringstream output; stan::callbacks::stream_writer writer(output); std::stringstream error_stream; stan::callbacks::stream_writer error_writer(error_stream); std::fstream empty_stream("", std::fstream::in); stan::io::dump data_var_context(empty_stream); gauss3D_model_namespace::gauss3D_model model(data_var_context); stan::mcmc::unit_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> unit_e_sampler(model, base_rng); stan::mcmc::diag_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> diag_e_sampler(model, base_rng); stan::mcmc::dense_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> dense_e_sampler(model, base_rng); stan::mcmc::adapt_unit_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> adapt_unit_e_sampler(model, base_rng); stan::mcmc::adapt_diag_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> adapt_diag_e_sampler(model, base_rng); stan::mcmc::adapt_dense_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> adapt_dense_e_sampler(model, base_rng); }
TEST(McmcUnitENuts, transition_test) { rng_t base_rng(4839294); stan::mcmc::unit_e_point z_init(3); z_init.q(0) = 1; z_init.q(1) = -1; z_init.q(2) = 1; z_init.p(0) = -1; z_init.p(1) = 1; z_init.p(2) = -1; std::stringstream output_stream; stan::interface_callbacks::writer::stream_writer writer(output_stream); std::stringstream error_stream; stan::interface_callbacks::writer::stream_writer error_writer(error_stream); std::fstream empty_stream("", std::fstream::in); stan::io::dump data_var_context(empty_stream); gauss3D_model_namespace::gauss3D_model model(data_var_context); stan::mcmc::unit_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> sampler(model, base_rng); sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.set_nominal_stepsize(0.1); sampler.set_stepsize_jitter(0); sampler.sample_stepsize(); stan::mcmc::sample init_sample(z_init.q, 0, 0); stan::mcmc::sample s = sampler.transition(init_sample, writer, error_writer); EXPECT_EQ(4, sampler.depth_); EXPECT_EQ((2 << 3) - 1, sampler.n_leapfrog_); EXPECT_FALSE(sampler.divergent_); EXPECT_FLOAT_EQ(1.8718261, s.cont_params()(0)); EXPECT_FLOAT_EQ(-0.74208695, s.cont_params()(1)); EXPECT_FLOAT_EQ( 1.5202962, s.cont_params()(2)); EXPECT_FLOAT_EQ(-3.1828632, s.log_prob()); EXPECT_FLOAT_EQ(0.99629009, s.accept_stat()); EXPECT_EQ("", output_stream.str()); EXPECT_EQ("", error_stream.str()); }
/// Find the path to the gene info files, first checking the environment /// variable GENE_INFO_PATH, then the section BLAST, label /// GENE_INFO_PATH in the NCBI configuration file. If not found in either /// location, try the $BLASTDB/gene_info directory. If all fails return the /// current working directory /// @sa s_FindPathToWM static string s_FindPathToGeneInfoFiles(void) { string retval = kEmptyStr; const string kSection("BLAST"); CNcbiIstrstream empty_stream(kEmptyCStr); CRef<CNcbiRegistry> reg(new CNcbiRegistry(empty_stream, IRegistry::fWithNcbirc)); CRef<CSimpleEnvRegMapper> mapper(new CSimpleEnvRegMapper(kSection, kEmptyStr)); CRef<CEnvironmentRegistry> env_reg(new CEnvironmentRegistry); env_reg->AddMapper(*mapper, CEnvironmentRegistry::ePriority_Max); reg->Add(*env_reg, CNcbiRegistry::ePriority_MaxUser); retval = reg->Get(kSection, GENE_INFO_PATH_ENV_VARIABLE); // Try the features subdirectory in the BLAST database storage location if (retval == kEmptyStr) { if ( (retval = reg->Get(kSection, "BLASTDB")) != kEmptyStr) { retval = CDirEntry::ConcatPath(retval, "gene_info"); if ( !CDir(retval).Exists() ) { retval = kEmptyStr; } } } if (retval == kEmptyStr) { retval = CDir::GetCwd(); } #if defined(NCBI_OS_MSWIN) // We address this here otherwise CDirEntry::IsAbsolutePath() fails if (NStr::StartsWith(retval, "//")) { NStr::ReplaceInPlace(retval, "//", "\\\\"); } #endif return retval; }
TEST(McmcUnitENuts, tree_boundary_test) { rng_t base_rng(4839294); stan::mcmc::unit_e_point z_init(3); z_init.q(0) = 1; z_init.q(1) = -1; z_init.q(2) = 1; z_init.p(0) = -1; z_init.p(1) = 1; z_init.p(2) = -1; std::stringstream output; stan::interface_callbacks::writer::stream_writer writer(output); std::stringstream error_stream; stan::interface_callbacks::writer::stream_writer error_writer(error_stream); std::fstream empty_stream("", std::fstream::in); stan::io::dump data_var_context(empty_stream); typedef gauss3D_model_namespace::gauss3D_model model_t; model_t model(data_var_context); // Compute expected tree boundaries typedef stan::mcmc::unit_e_metric<model_t, rng_t> metric_t; metric_t metric(model); stan::mcmc::expl_leapfrog<metric_t> unit_e_integrator; double epsilon = 0.1; stan::mcmc::unit_e_point z_test = z_init; metric.init(z_test, writer, error_writer); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); Eigen::VectorXd p_sharp_forward_1 = metric.dtau_dp(z_test); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); Eigen::VectorXd p_sharp_forward_2 = metric.dtau_dp(z_test); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); Eigen::VectorXd p_sharp_forward_3 = metric.dtau_dp(z_test); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, epsilon, writer, error_writer); Eigen::VectorXd p_sharp_forward_4 = metric.dtau_dp(z_test); z_test = z_init; metric.init(z_test, writer, error_writer); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); Eigen::VectorXd p_sharp_backward_1 = metric.dtau_dp(z_test); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); Eigen::VectorXd p_sharp_backward_2 = metric.dtau_dp(z_test); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); Eigen::VectorXd p_sharp_backward_3 = metric.dtau_dp(z_test); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); unit_e_integrator.evolve(z_test, metric, -epsilon, writer, error_writer); Eigen::VectorXd p_sharp_backward_4 = metric.dtau_dp(z_test); // Check expected tree boundaries to those dynamically geneated by NUTS stan::mcmc::unit_e_nuts<model_t, rng_t> sampler(model, base_rng); sampler.set_nominal_stepsize(epsilon); sampler.set_stepsize_jitter(0); sampler.sample_stepsize(); stan::mcmc::ps_point z_propose = z_init; Eigen::VectorXd p_sharp_left = Eigen::VectorXd::Zero(z_init.p.size()); Eigen::VectorXd p_sharp_right = Eigen::VectorXd::Zero(z_init.p.size()); Eigen::VectorXd rho = z_init.p; double log_sum_weight = -std::numeric_limits<double>::infinity(); double H0 = -0.1; int n_leapfrog = 0; double sum_metro_prob = 0; // Depth 0 forward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(0, z_propose, p_sharp_left, p_sharp_right, rho, H0, 1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_1(n), p_sharp_right(n)); // Depth 1 forward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(1, z_propose, p_sharp_left, p_sharp_right, rho, H0, 1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_2(n), p_sharp_right(n)); // Depth 2 forward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(2, z_propose, p_sharp_left, p_sharp_right, rho, H0, 1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_3(n), p_sharp_right(n)); // Depth 3 forward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(3, z_propose, p_sharp_left, p_sharp_right, rho, H0, 1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_forward_4(n), p_sharp_right(n)); // Depth 0 backward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(0, z_propose, p_sharp_left, p_sharp_right, rho, H0, -1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_1(n), p_sharp_right(n)); // Depth 1 backward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(1, z_propose, p_sharp_left, p_sharp_right, rho, H0, -1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_2(n), p_sharp_right(n)); // Depth 2 backward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(2, z_propose, p_sharp_left, p_sharp_right, rho, H0, -1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_3(n), p_sharp_right(n)); // Depth 3 backward sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.build_tree(3, z_propose, p_sharp_left, p_sharp_right, rho, H0, -1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_1(n), p_sharp_left(n)); for (int n = 0; n < rho.size(); ++n) EXPECT_FLOAT_EQ(p_sharp_backward_4(n), p_sharp_right(n)); }
TEST(McmcUnitENuts, build_tree_test) { rng_t base_rng(4839294); stan::mcmc::unit_e_point z_init(3); z_init.q(0) = 1; z_init.q(1) = -1; z_init.q(2) = 1; z_init.p(0) = -1; z_init.p(1) = 1; z_init.p(2) = -1; std::stringstream output; stan::interface_callbacks::writer::stream_writer writer(output); std::stringstream error_stream; stan::interface_callbacks::writer::stream_writer error_writer(error_stream); std::fstream empty_stream("", std::fstream::in); stan::io::dump data_var_context(empty_stream); gauss3D_model_namespace::gauss3D_model model(data_var_context); stan::mcmc::unit_e_nuts<gauss3D_model_namespace::gauss3D_model, rng_t> sampler(model, base_rng); sampler.z() = z_init; sampler.init_hamiltonian(writer, error_writer); sampler.set_nominal_stepsize(0.1); sampler.set_stepsize_jitter(0); sampler.sample_stepsize(); stan::mcmc::ps_point z_propose = z_init; Eigen::VectorXd p_sharp_left = Eigen::VectorXd::Zero(z_init.p.size()); Eigen::VectorXd p_sharp_right = Eigen::VectorXd::Zero(z_init.p.size()); Eigen::VectorXd rho = z_init.p; double log_sum_weight = -std::numeric_limits<double>::infinity(); double H0 = -0.1; int n_leapfrog = 0; double sum_metro_prob = 0; bool valid_subtree = sampler.build_tree(3, z_propose, p_sharp_left, p_sharp_right, rho, H0, 1, n_leapfrog, log_sum_weight, sum_metro_prob, writer, error_writer); EXPECT_EQ(0.1, sampler.get_nominal_stepsize()); EXPECT_TRUE(valid_subtree); EXPECT_FLOAT_EQ(-11.401228, rho(0)); EXPECT_FLOAT_EQ(11.401228, rho(1)); EXPECT_FLOAT_EQ(-11.401228, rho(2)); EXPECT_FLOAT_EQ(-0.022019938, sampler.z().q(0)); EXPECT_FLOAT_EQ(0.022019938, sampler.z().q(1)); EXPECT_FLOAT_EQ(-0.022019938, sampler.z().q(2)); EXPECT_FLOAT_EQ(-1.4131583, sampler.z().p(0)); EXPECT_FLOAT_EQ(1.4131583, sampler.z().p(1)); EXPECT_FLOAT_EQ(-1.4131583, sampler.z().p(2)); EXPECT_EQ(8, n_leapfrog); EXPECT_FLOAT_EQ(std::log(0.36134657), log_sum_weight); EXPECT_FLOAT_EQ(0.36134657, sum_metro_prob); EXPECT_EQ("", output.str()); EXPECT_EQ("", error_stream.str()); }