Skip to content

Commit

Permalink
updated generator to include real param version with Eigen vec and no…
Browse files Browse the repository at this point in the history
… discrete, with tests
  • Loading branch information
Bob Carpenter committed Dec 10, 2013
1 parent 41df65b commit a4b979e
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 1 deletion.
8 changes: 8 additions & 0 deletions make/tests
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,9 @@ ifeq ($(findstring test-,$(MAKECMDGOALS))$(findstring runtest/,$(MAKECMDGOALS)),
$@ --gtest_output="xml:$(basename $@).xml"
endif

src/test/gm/model_specs/no_main/%.cpp : src/test/gm/model_specs/no_main/%.stan bin/stanc$(EXE)
bin$(PATH_SEPARATOR)stanc$(EXE) --name=$(basename $(@F)) --o=$@ --no_main $<

src/test/mcmc/hmc/hamiltonians/models/%.cpp : src/test/mcmc/hmc/hamiltonians/models/%.stan bin/stanc$(EXE)
bin$(PATH_SEPARATOR)stanc$(EXE) --name=$(basename $(@F)) --o=$@ --no_main $<

Expand All @@ -172,6 +175,11 @@ test/mcmc/hmc/integrators/expl_leapfrog.o: test/%.o : src/test/%_test.cpp $(LIBG
@mkdir -p $(dir $@)
$(COMPILE.c) -O$O $(CFLAGS_GTEST) $< $(OUTPUT_OPTION)

.PRECIOUS: src/test/gm/model_specs/no_main/test_lp.cpp
test/gm/generator.o: test/%.o : src/test/%_test.cpp $(LIBGTEST) src/test/gm/model_specs/no_main/test_lp.cpp
@mkdir -p $(dir $@)
$(COMPILE.c) -O$O $(CFLAGS_GTEST) $< $(OUTPUT_OPTION)

test/gm/arguments/argument_configuration$(EXE) : test/gm/arguments/argument_configuration.o bin/libstan.a bin/libstanc.a src/test/gm/arguments/test_model$(EXE)
@mkdir -p $(dir $@)
$(LINK.c) -O$O $(GTEST_MAIN) $< $(CFLAGS_GTEST) $(OUTPUT_OPTION) $(LIBGTEST) $(LDLIBS) $(LDLIBS_STANC)
Expand Down
11 changes: 11 additions & 0 deletions src/stan/gm/generator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1649,6 +1649,17 @@ namespace stan {
o << INDENT2 << "lp_accum__.add(lp__);" << EOL;
o << INDENT2 << "return lp_accum__.sum();" << EOL2;
o << INDENT << "} // log_prob()" << EOL2;

o << INDENT << "template <bool propto, bool jacobian, typename T>" << EOL;
o << INDENT << "T log_prob(Eigen::Matrix<T,Eigen::Dynamic,1>& params_r," << EOL;
o << INDENT << " std::ostream* pstream = 0) const {" << EOL;
o << INDENT << " std::vector<T> vec_params_r;" << EOL;
o << INDENT << " vec_params_r.reserve(params_r.size());" << EOL;
o << INDENT << " for (int i = 0; i < params_r.size(); ++i)" << EOL;
o << INDENT << " vec_params_r.push_back(params_r(i));" << EOL;
o << INDENT << " std::vector<int> vec_params_i;" << EOL;
o << INDENT << " return log_prob<propto,jacobian,T>(vec_params_r, vec_params_i, pstream);" << EOL;
o << INDENT << "}" << EOL2;
}

struct dump_member_var_visgen : public visgen {
Expand Down
81 changes: 80 additions & 1 deletion src/test/gm/generator_test.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#include <gtest/gtest.h>
#include <stan/agrad/var.hpp>
#include <stan/gm/ast.hpp>
#include <stan/gm/generator.hpp>

#include <test/gm/model_specs/no_main/test_lp.cpp>
#include <stan/io/dump.hpp>


void test_print_string_literal(const std::string& s,
Expand Down Expand Up @@ -43,3 +45,80 @@ TEST(gm,printQuotedExpression) {
test_print_quoted_expression(index_op(expr,dimss),
s_exp);
}


TEST(gm, logProbPolymorphismDouble) {
using std::vector;
using Eigen::Matrix;
using Eigen::Dynamic;

std::string txt = "foo <- 3\nbar <- 4";
std::stringstream in(txt);
stan::io::dump dump(in);

test_lp_namespace::test_lp model(dump);

std::vector<double> params_r(2);
params_r[0] = 1.0;
params_r[1] = -3.2;

std::vector<int> params_i;

Matrix<double, Dynamic, 1> params_r_vec(2);
for (int i = 0; i < 2; ++i)
params_r_vec(i) = params_r[i];

double lp1 = model.log_prob<true,true>(params_r, params_i, 0);
double lp2 = model.log_prob<true,true>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1, lp2);

lp1 = model.log_prob<true,false>(params_r, params_i, 0);
lp2 = model.log_prob<true,false>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1, lp2);

lp1 = model.log_prob<false,true>(params_r, params_i, 0);
lp2 = model.log_prob<false,true>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1, lp2);

lp1 = model.log_prob<false,false>(params_r, params_i, 0);
lp2 = model.log_prob<false,false>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1, lp2);
}
TEST(gm, logProbPolymorphismVar) {
using std::vector;
using Eigen::Matrix;
using Eigen::Dynamic;
using stan::agrad::var;

std::string txt = "foo <- 3\nbar <- 4";
std::stringstream in(txt);
stan::io::dump dump(in);

test_lp_namespace::test_lp model(dump);

std::vector<var> params_r(2);
params_r[0] = 1.0;
params_r[1] = -3.2;

std::vector<int> params_i;

Matrix<var, Dynamic, 1> params_r_vec(2);
for (int i = 0; i < 2; ++i)
params_r_vec(i) = params_r[i];

var lp1 = model.log_prob<true,true>(params_r, params_i, 0);
var lp2 = model.log_prob<true,true>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1.val(), lp2.val());

lp1 = model.log_prob<true,false>(params_r, params_i, 0);
lp2 = model.log_prob<true,false>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1.val(), lp2.val());

lp1 = model.log_prob<false,true>(params_r, params_i, 0);
lp2 = model.log_prob<false,true>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1.val(), lp2.val());

lp1 = model.log_prob<false,false>(params_r, params_i, 0);
lp2 = model.log_prob<false,false>(params_r_vec, 0);
EXPECT_FLOAT_EQ(lp1.val(), lp2.val());
}
6 changes: 6 additions & 0 deletions src/test/gm/model_specs/no_main/test_lp.stan
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
parameters {
real y[2];
}
model {
y ~ normal(0,1);
}

0 comments on commit a4b979e

Please sign in to comment.