1 #ifndef STAN_SERVICES_OPTIMIZE_LBFGS_HPP 2 #define STAN_SERVICES_OPTIMIZE_LBFGS_HPP 54 template <
class Model>
56 unsigned int random_seed,
unsigned int chain,
67 std::vector<int> disc_vector;
68 std::vector<double> cont_vector
69 = util::initialize<false>(
model, init, rng, init_radius,
false,
72 std::stringstream lbfgs_ss;
75 Optimizer
lbfgs(model, cont_vector, disc_vector, &lbfgs_ss);
85 double lp = lbfgs.logp();
87 std::stringstream initial_msg;
88 initial_msg <<
"Initial log joint probability = " << lp;
89 logger.info(initial_msg);
91 std::vector<std::string>
names;
92 names.push_back(
"lp__");
93 model.constrained_param_names(names,
true,
true);
94 parameter_writer(names);
96 if (save_iterations) {
97 std::vector<double>
values;
98 std::stringstream
msg;
99 model.write_array(rng, cont_vector, disc_vector, values,
101 if (msg.str().length() > 0)
104 values.insert(values.begin(), lp);
105 parameter_writer(values);
113 || ((lbfgs.
iter_num() + 1) % refresh == 0)))
125 lbfgs.params_r(cont_vector);
129 || !lbfgs.
note().empty()
131 || ((lbfgs.
iter_num() + 1) % refresh == 0))) {
132 std::stringstream
msg;
133 msg <<
" " << std::setw(7) << lbfgs.
iter_num() <<
" ";
134 msg <<
" " << std::setw(12) << std::setprecision(6)
136 msg <<
" " << std::setw(12) << std::setprecision(6)
138 msg <<
" " << std::setw(12) << std::setprecision(6)
139 << lbfgs.
curr_g().norm() <<
" ";
140 msg <<
" " << std::setw(10) << std::setprecision(4)
141 << lbfgs.
alpha() <<
" ";
142 msg <<
" " << std::setw(10) << std::setprecision(4)
144 msg <<
" " << std::setw(7)
145 << lbfgs.grad_evals() <<
" ";
146 msg <<
" " << lbfgs.
note() <<
" ";
150 if (lbfgs_ss.str().length() > 0) {
151 logger.info(lbfgs_ss);
155 if (save_iterations) {
156 std::vector<double>
values;
157 std::stringstream
msg;
158 model.write_array(rng, cont_vector, disc_vector, values,
160 if (msg.str().length() > 0)
163 values.insert(values.begin(), lp);
164 parameter_writer(values);
168 if (!save_iterations) {
169 std::vector<double>
values;
170 std::stringstream
msg;
171 model.write_array(rng, cont_vector, disc_vector, values,
173 if (msg.str().length() > 0)
176 values.insert(values.begin(), lp);
177 parameter_writer(values);
182 logger.info(
"Optimization terminated normally: ");
185 logger.info(
"Optimization terminated with error: ");
QNUpdateType & get_qnupdate()
Scalar prev_step_size() const
const VectorT & curr_g() const
stan::optimization::BFGSMinimizer< stan::optimization::ModelAdaptor< Model >, stan::optimization::BFGSUpdate_HInv<> > Optimizer
const Scalar & alpha() const
const Scalar & alpha0() const
rosenbrock_model_namespace::rosenbrock_model Model
std::string get_code_string(int retCode)
chain
Check that an output directory exists.
LSOptions< Scalar > _ls_opts
ConvergenceOptions< Scalar > _conv_opts
const std::string & note() const
const size_t iter_num() const
const XML_Char XML_Content * model
int lbfgs(Model &model, stan::io::var_context &init, unsigned int random_seed, unsigned int chain, double init_radius, int history_size, double init_alpha, double tol_obj, double tol_rel_obj, double tol_grad, double tol_rel_grad, double tol_param, int num_iterations, bool save_iterations, int refresh, callbacks::interrupt &interrupt, callbacks::logger &logger, callbacks::writer &init_writer, callbacks::writer ¶meter_writer)
boost::ecuyer1988 create_rng(unsigned int seed, unsigned int chain)