1 #ifndef STAN__COMMON__INITIALIZE_STATE_HPP
2 #define STAN__COMMON__INITIALIZE_STATE_HPP
10 #include <boost/lexical_cast.hpp>
11 #include <boost/random/additive_combine.hpp>
12 #include <boost/random/uniform_real_distribution.hpp>
13 #include <boost/random/variate_generator.hpp>
32 template <
class Model>
35 std::ostream* output) {
36 cont_params.setZero();
39 Eigen::VectorXd init_grad = Eigen::VectorXd::Zero(model.num_params_r());
43 }
catch (
const std::exception&
e) {
45 *output <<
"Rejecting initialization at zero because of gradient failure."
46 << std::endl << e.what() << std::endl;
52 *output <<
"Rejecting initialization at zero because of vanishing density."
57 for (
int i = 0; i < init_grad.size(); ++i) {
60 *output <<
"Rejecting initialization at zero because of divergent gradient."
81 template <
class Model,
class RNG>
83 Eigen::VectorXd& cont_params,
86 std::ostream* output) {
87 int num_init_tries = -1;
89 boost::random::uniform_real_distribution<double>
90 init_range_distribution(-R, R);
92 boost::variate_generator<RNG&, boost::random::uniform_real_distribution<double> >
93 init_rng(base_rng, init_range_distribution);
95 cont_params.setZero();
98 Eigen::VectorXd init_grad = Eigen::VectorXd::Zero(model.num_params_r());
99 static int MAX_INIT_TRIES = 100;
101 for (num_init_tries = 1; num_init_tries <= MAX_INIT_TRIES; ++num_init_tries) {
102 for (
int i = 0; i < cont_params.size(); ++i)
103 cont_params(i) = init_rng();
105 double init_log_prob;
108 }
catch (
const std::exception&
e) {
111 *output <<
"Rejecting proposed initial value with zero density." << std::endl;
112 init_log_prob = -std::numeric_limits<double>::infinity();
116 for (
int i = 0; i < init_grad.size(); ++i)
123 if (num_init_tries > MAX_INIT_TRIES) {
125 *output << std::endl << std::endl
126 <<
"Initialization between (" << -R <<
", " << R <<
") failed after "
127 << MAX_INIT_TRIES <<
" attempts. " << std::endl
128 <<
" Try specifying initial values,"
129 <<
" reducing ranges of constrained values,"
130 <<
" or reparameterizing the model."
153 template <
class ContextFactory,
class Model,
class RNG>
155 Eigen::VectorXd& cont_params,
158 std::ostream* output,
159 ContextFactory& context_factory) {
161 typename ContextFactory::var_context_t context = context_factory(source);
162 model.transform_inits(context, cont_params);
163 }
catch(
const std::exception&
e) {
165 *output <<
"Initialization from source failed."
166 << std::endl << e.what() << std::endl;
170 double init_log_prob;
171 Eigen::VectorXd init_grad = Eigen::VectorXd::Zero(model.num_params_r());
175 }
catch (
const std::exception& e) {
177 *output <<
"Rejecting user-specified initialization because of gradient failure."
178 << std::endl << e.what() << std::endl;
184 *output <<
"Rejecting user-specified initialization because of vanishing density."
189 for (
int i = 0; i < init_grad.size(); ++i) {
192 *output <<
"Rejecting user-specified initialization because of divergent gradient."
210 val = boost::lexical_cast<
double>(s);
211 }
catch (
const boost::bad_lexical_cast&
e) {
212 val = std::numeric_limits<double>::quiet_NaN();
233 template <
class ContextFactory,
class Model,
class RNG>
235 Eigen::VectorXd& cont_params,
238 std::ostream* output,
239 ContextFactory& context_factory) {
bool get_double_from_string(const std::string &s, double &val)
Converts string to double.
bool initialize_state_source(const std::string source, Eigen::VectorXd &cont_params, Model &model, RNG &base_rng, std::ostream *output, ContextFactory &context_factory)
Creates the initial state using the source parameter.
bool isfinite(const stan::agrad::var &v)
Checks if the given number has finite value.
bool initialize_state_random(const double R, Eigen::VectorXd &cont_params, Model &model, RNG &base_rng, std::ostream *output)
Initializes state to random uniform values within range.
void gradient(const M &model, const Eigen::Matrix< double, Eigen::Dynamic, 1 > &x, double &f, Eigen::Matrix< double, Eigen::Dynamic, 1 > &grad_f, std::ostream *msgs=0)
void write_error_msg(std::ostream *error_stream, const std::exception &e)
bool initialize_state_zero(Eigen::VectorXd &cont_params, Model &model, std::ostream *output)
Sets initial state to zero.
bool initialize_state(const std::string init, Eigen::VectorXd &cont_params, Model &model, RNG &base_rng, std::ostream *output, ContextFactory &context_factory)
Creates the initial state.
double e()
Return the base of the natural logarithm.