1 #ifndef __STAN__MODEL__PROB_GRAD_HPP__
2 #define __STAN__MODEL__PROB_GRAD_HPP__
37 std::vector<std::pair<int,int> >& param_ranges_i)
80 virtual void init(std::vector<double>& params_r,
81 std::vector<int>& params_i) {
89 std::vector<int>& params_i,
90 std::vector<double>& gradient,
91 std::ostream* output_stream = 0) = 0;
93 virtual double log_prob(std::vector<double>& params_r,
94 std::vector<int>& params_i,
95 std::ostream* output_stream = 0) = 0;
99 std::vector<double>& params_r,
100 std::vector<int>& params_i,
101 std::ostream* output_stream = 0) {
103 throw std::runtime_error (
"idx >= num_params_i()");
105 throw std::runtime_error (
"val <= param_range_i(idx) lower");
107 throw std::runtime_error (
"val >= param_range_i(idx) upper");
109 int original_val = params_i[idx];
111 double result =
log_prob(params_r,params_i,output_stream);
112 params_i[idx] = original_val;
131 std::vector<int>& params_i,
133 std::ostream* output_stream = 0) {
135 for (
size_t i = 0; i < params_i.size(); ++i)
136 writer.
write(params_i[i]);
137 for (
size_t i = 0; i < params_r.size(); ++i)
138 writer.
write(params_r[i]);
155 std::vector<int>& params_i,
156 std::vector<double>&
grad,
158 std::ostream* output_stream = 0) {
159 std::vector<double> perturbed(params_r);
161 grad.resize(params_r.size());
162 for (
size_t k = 0; k < params_r.size(); k++) {
164 double logp_plus =
log_prob(perturbed,params_i,output_stream);
165 perturbed[k] = params_r[k] -
epsilon;
166 double logp_minus =
log_prob(perturbed,params_i,output_stream);
167 double gradest = (logp_plus - logp_minus) / (2*epsilon);
169 perturbed[k] = params_r[k];
190 std::vector<int>& params_i,
193 std::ostream& o = std::cout,
194 std::ostream* output_stream = 0) {
195 std::vector<double>
grad;
196 double lp =
grad_log_prob(params_r,params_i,grad,output_stream);
198 std::vector<double> grad_fd;
204 <<
" Log probability=" << lp
208 << std::setw(10) <<
"param idx"
209 << std::setw(16) <<
"value"
210 << std::setw(16) <<
"model"
211 << std::setw(16) <<
"finite diff"
212 << std::setw(16) <<
"error"
214 for (
size_t k = 0; k < params_r.size(); k++) {
215 o << std::setw(10) << k
216 << std::setw(16) << params_r[k]
217 << std::setw(16) << grad[k]
218 << std::setw(16) << grad_fd[k]
219 << std::setw(16) << (grad[k] - grad_fd[k])
221 if (
std::fabs(grad[k] - grad_fd[k]) > error)