Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/stan_math_backend/Locations.ml
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,11 @@ let pp_globals ppf location_list =
:: ( List.filter ~f:(fun x -> x <> Location_span.empty) location_list
|> List.map ~f:(fun x -> " (in " ^ Location_span.to_string x ^ ")") )
in
let location_count = List.length location_list in
Fmt.pf ppf
"@ stan::math::profile_map profiles__;@ static int current_statement__= \
0;@ static const std::vector<std::string> locations_array__ = @ \
{@[<hov>%a@]};@ "
"@ stan::math::profile_map profiles__;@ static constexpr std::array<const \
char*, @[<hov>%d@]> locations_array__ = @ {@[<hov>%a@]};@ "
location_count
Fmt.(list ~sep:comma (fmt "%S"))
location_list

Expand Down
32 changes: 19 additions & 13 deletions src/stan_math_backend/Stan_math_code_gen.ml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ let pp_unused = fmt "(void) %s; // suppress unused var warning"
@param fname Name of the function.
*)
let pp_function__ ppf (prog_name, fname) =
pf ppf {|@[<v>static const char* function__ = "%s_namespace::%s";@,%a@]|}
pf ppf {|@[<v>static constexpr char* function__ = "%s_namespace::%s";@,%a@]|}
prog_name fname pp_unused "function__"

(** Print the body of exception handling for functions *)
Expand Down Expand Up @@ -217,10 +217,11 @@ let pp_fun_def ppf Program.({fdrt; fdname; fdargs; fdbody; _})
in
let pp_body ppf (Stmt.Fixed.({pattern; _}) as fdbody) =
pf ppf "@[<hv 8>using local_scalar_t__ = %a;@]@," pp_promoted_scalar fdargs ;
pf ppf "int current_statement__ = 0; @ " ;
if List.exists ~f:(fun (_, _, t) -> UnsizedType.is_eigen_type t) fdargs
then pp_eigen_arg_to_ref ppf fdargs ;
if not (is_dist || is_lp) then (
pf ppf "%s@ " "const static bool propto__ = true;" ;
pf ppf "%s@ " "static constexpr bool propto__ = true;" ;
pf ppf "%s@ " "(void) propto__;" ) ;
pf ppf "%s@ "
"local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" ;
Expand Down Expand Up @@ -397,6 +398,7 @@ let pp_ctor ppf p =
in
pp_block ppf
( (fun ppf {Program.prog_name; prepare_data; output_vars; _} ->
pf ppf "int current_statement__ = 0;@ " ;
pf ppf "using local_scalar_t__ = double ;@ " ;
pf ppf "boost::ecuyer1988 base_rng__ = @ " ;
pf ppf " stan::services::util::create_rng(random_seed__, 0);@ " ;
Expand Down Expand Up @@ -493,10 +495,11 @@ let pp_method_b ppf rt name params intro ?(outro = nop) ?(cv_attr = ["const"])
(** Print the write_array method of the model class *)
let pp_write_array ppf {Program.prog_name; generate_quantities; _} =
pf ppf
"template <typename RNG, typename VecR, typename VecI, typename VecVar, \
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr, \
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr, \
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>" ;
"template <typename RNG, typename VecR, typename VecI, typename VecVar, @ \
\x20 stan::require_vector_like_vt<std::is_floating_point, VecR>* = \
nullptr, @ \x20 stan::require_vector_like_vt<std::is_integral, VecI>* = \
nullptr, @ \x20 stan::require_std_vector_vt<std::is_floating_point, \
VecVar>* = nullptr> @ " ;
Copy link
Copy Markdown
Member

@rok-cesnovar rok-cesnovar Mar 8, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not completely sold on this @ \x20 thing. What you are trying to do is just limit the number of characters in a line right? If so, we can do this with less manual intervention.

Also dont really like the space before the comma in (see jacobian)

template <bool propto__, bool jacobian__ , typename VecR, typename V

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just thought it was nice looking to have an indentation there but I removed them

Copy link
Copy Markdown
Member

@rok-cesnovar rok-cesnovar Mar 8, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh indentation, I get it. Not an expert on this printing/formatter stuff, but I think there is a way to do that without the use of hex. Will give it a shot, else just merge if that is ok with you?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah it's fine as is

let params =
[ "RNG& base_rng__"; "VecR& params_r__"; "VecI& params_i__"
; "VecVar& vars__"; "const bool emit_transformed_parameters__ = true"
Expand All @@ -509,6 +512,7 @@ let pp_write_array ppf {Program.prog_name; generate_quantities; _} =
; "stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);"
; "double lp__ = 0.0;"
; "(void) lp__; // dummy to suppress unused var warning"
; "int current_statement__ = 0; "
; "stan::math::accumulator<double> lp_accum__;"
; "local_scalar_t__ \
DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" ]
Expand Down Expand Up @@ -637,17 +641,18 @@ let pp_unconstrained_param_names ppf {Program.output_vars; _} =
(** Print the `transform_inits` method of the model class *)
let pp_transform_inits ppf {Program.transform_inits; _} =
pf ppf
"template <typename VecVar, typename VecI, \
stan::require_std_vector_t<VecVar>* = nullptr, \
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>" ;
"template <typename VecVar, typename VecI, @ \x20 \
stan::require_std_vector_t<VecVar>* = nullptr, @ \x20 \
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr> @ " ;
let params =
[ "const stan::io::var_context& context__"; "VecI& params_i__"
; "VecVar& vars__"; "std::ostream* pstream__ = nullptr" ]
in
let intro ppf () =
pf ppf
"using local_scalar_t__ = \
double;@,vars__.clear();@,vars__.reserve(num_params_r__);"
double;@,vars__.clear();@,vars__.reserve(num_params_r__);@ int \
current_statement__ = 0; "
in
let cv_attr = ["const"] in
pp_method_b ppf "void" "transform_inits_impl" params intro transform_inits
Expand All @@ -656,9 +661,9 @@ let pp_transform_inits ppf {Program.transform_inits; _} =
(** Print the `log_prob` method of the model class *)
let pp_log_prob ppf Program.({prog_name; log_prob; _}) =
pf ppf
"template <bool propto__, bool jacobian__, typename VecR, typename VecI, \
stan::require_vector_like_t<VecR>* = nullptr, \
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>" ;
"template <bool propto__, bool jacobian__ , typename VecR, typename VecI, \
@ \x20 stan::require_vector_like_t<VecR>* = nullptr, @ \x20 \
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr> @ " ;
let params =
[ "VecR& params_r__"; "VecI& params_i__"
; "std::ostream* pstream__ = nullptr" ]
Expand All @@ -669,6 +674,7 @@ let pp_log_prob ppf Program.({prog_name; log_prob; _}) =
; "using local_scalar_t__ = T__;"; "T__ lp__(0.0);"
; "stan::math::accumulator<T__> lp_accum__;"
; "stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);"
; "int current_statement__ = 0;"
; "local_scalar_t__ \
DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" ]
pp_unused "DUMMY_VAR__" pp_function__ (prog_name, "log_prob")
Expand Down
26 changes: 18 additions & 8 deletions test/integration/cli-args/filename_good.expected
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ using namespace stan::math;


stan::math::profile_map profiles__;
static int current_statement__= 0;
static const std::vector<std::string> locations_array__ =
static constexpr std::array<const char*, 3> locations_array__ =
{" (found before start of program)",
" (in 'filename_good.stan', line 2, column 4 to column 11)",
" (in 'filename_good.stan', line 3, column 4 to column 19)"};
Expand All @@ -46,11 +45,12 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
filename_good_model(stan::io::var_context& context__,
unsigned int random_seed__ = 0,
std::ostream* pstream__ = nullptr) : model_base_crtp(0) {
int current_statement__ = 0;
using local_scalar_t__ = double ;
boost::ecuyer1988 base_rng__ =
stan::services::util::create_rng(random_seed__, 0);
(void) base_rng__; // suppress unused var warning
static const char* function__ = "filename_good_model_namespace::filename_good_model";
static constexpr char* function__ = "filename_good_model_namespace::filename_good_model";
(void) function__; // suppress unused var warning
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
(void) DUMMY_VAR__; // suppress unused var warning
Expand Down Expand Up @@ -82,7 +82,9 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
throw std::runtime_error("*** IF YOU SEE THIS, PLEASE REPORT A BUG ***");
}
}
template <bool propto__, bool jacobian__, typename VecR, typename VecI, stan::require_vector_like_t<VecR>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
template <bool propto__, bool jacobian__ , typename VecR, typename VecI,
stan::require_vector_like_t<VecR>* = nullptr,
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
inline stan::scalar_type_t<VecR> log_prob_impl(VecR& params_r__,
VecI& params_i__,
std::ostream* pstream__ = nullptr) const {
Expand All @@ -91,9 +93,10 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
T__ lp__(0.0);
stan::math::accumulator<T__> lp_accum__;
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
int current_statement__ = 0;
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
(void) DUMMY_VAR__; // suppress unused var warning
static const char* function__ = "filename_good_model_namespace::log_prob";
static constexpr char* function__ = "filename_good_model_namespace::log_prob";
(void) function__; // suppress unused var warning

try {
Expand All @@ -107,7 +110,10 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
return lp_accum__.sum();
} // log_prob_impl()

template <typename RNG, typename VecR, typename VecI, typename VecVar, stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr, stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>
template <typename RNG, typename VecR, typename VecI, typename VecVar,
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr,
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr,
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>
inline void write_array_impl(RNG& base_rng__, VecR& params_r__,
VecI& params_i__, VecVar& vars__,
const bool emit_transformed_parameters__ = true,
Expand All @@ -118,10 +124,11 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
double lp__ = 0.0;
(void) lp__; // dummy to suppress unused var warning
int current_statement__ = 0;
stan::math::accumulator<double> lp_accum__;
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
(void) DUMMY_VAR__; // suppress unused var warning
static const char* function__ = "filename_good_model_namespace::write_array";
static constexpr char* function__ = "filename_good_model_namespace::write_array";
(void) function__; // suppress unused var warning

try {
Expand All @@ -139,13 +146,16 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
}
} // write_array_impl()

template <typename VecVar, typename VecI, stan::require_std_vector_t<VecVar>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
template <typename VecVar, typename VecI,
stan::require_std_vector_t<VecVar>* = nullptr,
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
inline void transform_inits_impl(const stan::io::var_context& context__,
VecI& params_i__, VecVar& vars__,
std::ostream* pstream__ = nullptr) const {
using local_scalar_t__ = double;
vars__.clear();
vars__.reserve(num_params_r__);
int current_statement__ = 0;

try {
int pos__;
Expand Down
26 changes: 18 additions & 8 deletions test/integration/good/code-gen/cl.expected
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ using namespace stan::math;


stan::math::profile_map profiles__;
static int current_statement__= 0;
static const std::vector<std::string> locations_array__ =
static constexpr std::array<const char*, 217> locations_array__ =
{" (found before start of program)",
" (in 'optimize_glm.stan', line 27, column 2 to column 20)",
" (in 'optimize_glm.stan', line 28, column 2 to column 17)",
Expand Down Expand Up @@ -283,11 +282,12 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
optimize_glm_model(stan::io::var_context& context__,
unsigned int random_seed__ = 0,
std::ostream* pstream__ = nullptr) : model_base_crtp(0) {
int current_statement__ = 0;
using local_scalar_t__ = double ;
boost::ecuyer1988 base_rng__ =
stan::services::util::create_rng(random_seed__, 0);
(void) base_rng__; // suppress unused var warning
static const char* function__ = "optimize_glm_model_namespace::optimize_glm_model";
static constexpr char* function__ = "optimize_glm_model_namespace::optimize_glm_model";
(void) function__; // suppress unused var warning
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
(void) DUMMY_VAR__; // suppress unused var warning
Expand Down Expand Up @@ -556,7 +556,9 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
throw std::runtime_error("*** IF YOU SEE THIS, PLEASE REPORT A BUG ***");
}
}
template <bool propto__, bool jacobian__, typename VecR, typename VecI, stan::require_vector_like_t<VecR>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
template <bool propto__, bool jacobian__ , typename VecR, typename VecI,
stan::require_vector_like_t<VecR>* = nullptr,
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
inline stan::scalar_type_t<VecR> log_prob_impl(VecR& params_r__,
VecI& params_i__,
std::ostream* pstream__ = nullptr) const {
Expand All @@ -565,9 +567,10 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
T__ lp__(0.0);
stan::math::accumulator<T__> lp_accum__;
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
int current_statement__ = 0;
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
(void) DUMMY_VAR__; // suppress unused var warning
static const char* function__ = "optimize_glm_model_namespace::log_prob";
static constexpr char* function__ = "optimize_glm_model_namespace::log_prob";
(void) function__; // suppress unused var warning

try {
Expand Down Expand Up @@ -1270,7 +1273,10 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
return lp_accum__.sum();
} // log_prob_impl()

template <typename RNG, typename VecR, typename VecI, typename VecVar, stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr, stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>
template <typename RNG, typename VecR, typename VecI, typename VecVar,
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr,
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr,
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>
inline void write_array_impl(RNG& base_rng__, VecR& params_r__,
VecI& params_i__, VecVar& vars__,
const bool emit_transformed_parameters__ = true,
Expand All @@ -1281,10 +1287,11 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
double lp__ = 0.0;
(void) lp__; // dummy to suppress unused var warning
int current_statement__ = 0;
stan::math::accumulator<double> lp_accum__;
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
(void) DUMMY_VAR__; // suppress unused var warning
static const char* function__ = "optimize_glm_model_namespace::write_array";
static constexpr char* function__ = "optimize_glm_model_namespace::write_array";
(void) function__; // suppress unused var warning

try {
Expand Down Expand Up @@ -1379,13 +1386,16 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
}
} // write_array_impl()

template <typename VecVar, typename VecI, stan::require_std_vector_t<VecVar>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
template <typename VecVar, typename VecI,
stan::require_std_vector_t<VecVar>* = nullptr,
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
inline void transform_inits_impl(const stan::io::var_context& context__,
VecI& params_i__, VecVar& vars__,
std::ostream* pstream__ = nullptr) const {
using local_scalar_t__ = double;
vars__.clear();
vars__.reserve(num_params_r__);
int current_statement__ = 0;

try {
int pos__;
Expand Down
Loading