Skip to content

Commit 2de78d7

Browse files
authored
Merge pull request #842 from SteveBronder/feature/local_curr_statement
Make locations_array constexpr and move curr_statement__ to function scope
2 parents 13726c2 + 6f7d5e8 commit 2de78d7

File tree

11 files changed

+1217
-555
lines changed

11 files changed

+1217
-555
lines changed

src/stan_math_backend/Locations.ml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ let pp_globals ppf location_list =
3838
:: ( List.filter ~f:(fun x -> x <> Location_span.empty) location_list
3939
|> List.map ~f:(fun x -> " (in " ^ Location_span.to_string x ^ ")") )
4040
in
41+
let location_count = List.length location_list in
4142
Fmt.pf ppf
42-
"@ stan::math::profile_map profiles__;@ static int current_statement__= \
43-
0;@ static const std::vector<std::string> locations_array__ = @ \
44-
{@[<hov>%a@]};@ "
43+
"@ stan::math::profile_map profiles__;@ static constexpr std::array<const \
44+
char*, @[<hov>%d@]> locations_array__ = @ {@[<hov>%a@]};@ "
45+
location_count
4546
Fmt.(list ~sep:comma (fmt "%S"))
4647
location_list
4748

src/stan_math_backend/Stan_math_code_gen.ml

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ let pp_unused = fmt "(void) %s; // suppress unused var warning"
4444
@param fname Name of the function.
4545
*)
4646
let pp_function__ ppf (prog_name, fname) =
47-
pf ppf {|@[<v>static const char* function__ = "%s_namespace::%s";@,%a@]|}
47+
pf ppf {|@[<v>static constexpr char* function__ = "%s_namespace::%s";@,%a@]|}
4848
prog_name fname pp_unused "function__"
4949

5050
(** Print the body of exception handling for functions *)
@@ -217,10 +217,11 @@ let pp_fun_def ppf Program.({fdrt; fdname; fdargs; fdbody; _})
217217
in
218218
let pp_body ppf (Stmt.Fixed.({pattern; _}) as fdbody) =
219219
pf ppf "@[<hv 8>using local_scalar_t__ = %a;@]@," pp_promoted_scalar fdargs ;
220+
pf ppf "int current_statement__ = 0; @ " ;
220221
if List.exists ~f:(fun (_, _, t) -> UnsizedType.is_eigen_type t) fdargs
221222
then pp_eigen_arg_to_ref ppf fdargs ;
222223
if not (is_dist || is_lp) then (
223-
pf ppf "%s@ " "const static bool propto__ = true;" ;
224+
pf ppf "%s@ " "static constexpr bool propto__ = true;" ;
224225
pf ppf "%s@ " "(void) propto__;" ) ;
225226
pf ppf "%s@ "
226227
"local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" ;
@@ -397,6 +398,7 @@ let pp_ctor ppf p =
397398
in
398399
pp_block ppf
399400
( (fun ppf {Program.prog_name; prepare_data; output_vars; _} ->
401+
pf ppf "int current_statement__ = 0;@ " ;
400402
pf ppf "using local_scalar_t__ = double ;@ " ;
401403
pf ppf "boost::ecuyer1988 base_rng__ = @ " ;
402404
pf ppf " stan::services::util::create_rng(random_seed__, 0);@ " ;
@@ -493,10 +495,11 @@ let pp_method_b ppf rt name params intro ?(outro = nop) ?(cv_attr = ["const"])
493495
(** Print the write_array method of the model class *)
494496
let pp_write_array ppf {Program.prog_name; generate_quantities; _} =
495497
pf ppf
496-
"template <typename RNG, typename VecR, typename VecI, typename VecVar, \
497-
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr, \
498-
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr, \
499-
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>" ;
498+
"template <typename RNG, typename VecR, typename VecI, typename VecVar, @ \
499+
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr, @ \
500+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr, @ \
501+
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr> \
502+
@ " ;
500503
let params =
501504
[ "RNG& base_rng__"; "VecR& params_r__"; "VecI& params_i__"
502505
; "VecVar& vars__"; "const bool emit_transformed_parameters__ = true"
@@ -509,6 +512,7 @@ let pp_write_array ppf {Program.prog_name; generate_quantities; _} =
509512
; "stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);"
510513
; "double lp__ = 0.0;"
511514
; "(void) lp__; // dummy to suppress unused var warning"
515+
; "int current_statement__ = 0; "
512516
; "stan::math::accumulator<double> lp_accum__;"
513517
; "local_scalar_t__ \
514518
DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" ]
@@ -637,17 +641,18 @@ let pp_unconstrained_param_names ppf {Program.output_vars; _} =
637641
(** Print the `transform_inits` method of the model class *)
638642
let pp_transform_inits ppf {Program.transform_inits; _} =
639643
pf ppf
640-
"template <typename VecVar, typename VecI, \
641-
stan::require_std_vector_t<VecVar>* = nullptr, \
642-
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>" ;
644+
"template <typename VecVar, typename VecI, @ \
645+
stan::require_std_vector_t<VecVar>* = nullptr, @ \
646+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr> @ " ;
643647
let params =
644648
[ "const stan::io::var_context& context__"; "VecI& params_i__"
645649
; "VecVar& vars__"; "std::ostream* pstream__ = nullptr" ]
646650
in
647651
let intro ppf () =
648652
pf ppf
649653
"using local_scalar_t__ = \
650-
double;@,vars__.clear();@,vars__.reserve(num_params_r__);"
654+
double;@,vars__.clear();@,vars__.reserve(num_params_r__);@ int \
655+
current_statement__ = 0; "
651656
in
652657
let cv_attr = ["const"] in
653658
pp_method_b ppf "void" "transform_inits_impl" params intro transform_inits
@@ -656,9 +661,9 @@ let pp_transform_inits ppf {Program.transform_inits; _} =
656661
(** Print the `log_prob` method of the model class *)
657662
let pp_log_prob ppf Program.({prog_name; log_prob; _}) =
658663
pf ppf
659-
"template <bool propto__, bool jacobian__, typename VecR, typename VecI, \
660-
stan::require_vector_like_t<VecR>* = nullptr, \
661-
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>" ;
664+
"template <bool propto__, bool jacobian__ , typename VecR, typename VecI, \
665+
@ stan::require_vector_like_t<VecR>* = nullptr, @ \
666+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr> @ " ;
662667
let params =
663668
[ "VecR& params_r__"; "VecI& params_i__"
664669
; "std::ostream* pstream__ = nullptr" ]
@@ -669,6 +674,7 @@ let pp_log_prob ppf Program.({prog_name; log_prob; _}) =
669674
; "using local_scalar_t__ = T__;"; "T__ lp__(0.0);"
670675
; "stan::math::accumulator<T__> lp_accum__;"
671676
; "stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);"
677+
; "int current_statement__ = 0;"
672678
; "local_scalar_t__ \
673679
DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());" ]
674680
pp_unused "DUMMY_VAR__" pp_function__ (prog_name, "log_prob")

test/integration/cli-args/filename_good.expected

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ using namespace stan::math;
1919

2020

2121
stan::math::profile_map profiles__;
22-
static int current_statement__= 0;
23-
static const std::vector<std::string> locations_array__ =
22+
static constexpr std::array<const char*, 3> locations_array__ =
2423
{" (found before start of program)",
2524
" (in 'filename_good.stan', line 2, column 4 to column 11)",
2625
" (in 'filename_good.stan', line 3, column 4 to column 19)"};
@@ -46,11 +45,12 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
4645
filename_good_model(stan::io::var_context& context__,
4746
unsigned int random_seed__ = 0,
4847
std::ostream* pstream__ = nullptr) : model_base_crtp(0) {
48+
int current_statement__ = 0;
4949
using local_scalar_t__ = double ;
5050
boost::ecuyer1988 base_rng__ =
5151
stan::services::util::create_rng(random_seed__, 0);
5252
(void) base_rng__; // suppress unused var warning
53-
static const char* function__ = "filename_good_model_namespace::filename_good_model";
53+
static constexpr char* function__ = "filename_good_model_namespace::filename_good_model";
5454
(void) function__; // suppress unused var warning
5555
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
5656
(void) DUMMY_VAR__; // suppress unused var warning
@@ -82,7 +82,9 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
8282
throw std::runtime_error("*** IF YOU SEE THIS, PLEASE REPORT A BUG ***");
8383
}
8484
}
85-
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>
85+
template <bool propto__, bool jacobian__ , typename VecR, typename VecI,
86+
stan::require_vector_like_t<VecR>* = nullptr,
87+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
8688
inline stan::scalar_type_t<VecR> log_prob_impl(VecR& params_r__,
8789
VecI& params_i__,
8890
std::ostream* pstream__ = nullptr) const {
@@ -91,9 +93,10 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
9193
T__ lp__(0.0);
9294
stan::math::accumulator<T__> lp_accum__;
9395
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
96+
int current_statement__ = 0;
9497
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
9598
(void) DUMMY_VAR__; // suppress unused var warning
96-
static const char* function__ = "filename_good_model_namespace::log_prob";
99+
static constexpr char* function__ = "filename_good_model_namespace::log_prob";
97100
(void) function__; // suppress unused var warning
98101

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

110-
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>
113+
template <typename RNG, typename VecR, typename VecI, typename VecVar,
114+
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr,
115+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr,
116+
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>
111117
inline void write_array_impl(RNG& base_rng__, VecR& params_r__,
112118
VecI& params_i__, VecVar& vars__,
113119
const bool emit_transformed_parameters__ = true,
@@ -118,10 +124,11 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
118124
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
119125
double lp__ = 0.0;
120126
(void) lp__; // dummy to suppress unused var warning
127+
int current_statement__ = 0;
121128
stan::math::accumulator<double> lp_accum__;
122129
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
123130
(void) DUMMY_VAR__; // suppress unused var warning
124-
static const char* function__ = "filename_good_model_namespace::write_array";
131+
static constexpr char* function__ = "filename_good_model_namespace::write_array";
125132
(void) function__; // suppress unused var warning
126133

127134
try {
@@ -139,13 +146,16 @@ class filename_good_model final : public model_base_crtp<filename_good_model> {
139146
}
140147
} // write_array_impl()
141148

142-
template <typename VecVar, typename VecI, stan::require_std_vector_t<VecVar>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
149+
template <typename VecVar, typename VecI,
150+
stan::require_std_vector_t<VecVar>* = nullptr,
151+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
143152
inline void transform_inits_impl(const stan::io::var_context& context__,
144153
VecI& params_i__, VecVar& vars__,
145154
std::ostream* pstream__ = nullptr) const {
146155
using local_scalar_t__ = double;
147156
vars__.clear();
148157
vars__.reserve(num_params_r__);
158+
int current_statement__ = 0;
149159

150160
try {
151161
int pos__;

test/integration/good/code-gen/cl.expected

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ using namespace stan::math;
1919

2020

2121
stan::math::profile_map profiles__;
22-
static int current_statement__= 0;
23-
static const std::vector<std::string> locations_array__ =
22+
static constexpr std::array<const char*, 217> locations_array__ =
2423
{" (found before start of program)",
2524
" (in 'optimize_glm.stan', line 27, column 2 to column 20)",
2625
" (in 'optimize_glm.stan', line 28, column 2 to column 17)",
@@ -283,11 +282,12 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
283282
optimize_glm_model(stan::io::var_context& context__,
284283
unsigned int random_seed__ = 0,
285284
std::ostream* pstream__ = nullptr) : model_base_crtp(0) {
285+
int current_statement__ = 0;
286286
using local_scalar_t__ = double ;
287287
boost::ecuyer1988 base_rng__ =
288288
stan::services::util::create_rng(random_seed__, 0);
289289
(void) base_rng__; // suppress unused var warning
290-
static const char* function__ = "optimize_glm_model_namespace::optimize_glm_model";
290+
static constexpr char* function__ = "optimize_glm_model_namespace::optimize_glm_model";
291291
(void) function__; // suppress unused var warning
292292
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
293293
(void) DUMMY_VAR__; // suppress unused var warning
@@ -556,7 +556,9 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
556556
throw std::runtime_error("*** IF YOU SEE THIS, PLEASE REPORT A BUG ***");
557557
}
558558
}
559-
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>
559+
template <bool propto__, bool jacobian__ , typename VecR, typename VecI,
560+
stan::require_vector_like_t<VecR>* = nullptr,
561+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
560562
inline stan::scalar_type_t<VecR> log_prob_impl(VecR& params_r__,
561563
VecI& params_i__,
562564
std::ostream* pstream__ = nullptr) const {
@@ -565,9 +567,10 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
565567
T__ lp__(0.0);
566568
stan::math::accumulator<T__> lp_accum__;
567569
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
570+
int current_statement__ = 0;
568571
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
569572
(void) DUMMY_VAR__; // suppress unused var warning
570-
static const char* function__ = "optimize_glm_model_namespace::log_prob";
573+
static constexpr char* function__ = "optimize_glm_model_namespace::log_prob";
571574
(void) function__; // suppress unused var warning
572575

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

1273-
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>
1276+
template <typename RNG, typename VecR, typename VecI, typename VecVar,
1277+
stan::require_vector_like_vt<std::is_floating_point, VecR>* = nullptr,
1278+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr,
1279+
stan::require_std_vector_vt<std::is_floating_point, VecVar>* = nullptr>
12741280
inline void write_array_impl(RNG& base_rng__, VecR& params_r__,
12751281
VecI& params_i__, VecVar& vars__,
12761282
const bool emit_transformed_parameters__ = true,
@@ -1281,10 +1287,11 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
12811287
stan::io::reader<local_scalar_t__> in__(params_r__, params_i__);
12821288
double lp__ = 0.0;
12831289
(void) lp__; // dummy to suppress unused var warning
1290+
int current_statement__ = 0;
12841291
stan::math::accumulator<double> lp_accum__;
12851292
local_scalar_t__ DUMMY_VAR__(std::numeric_limits<double>::quiet_NaN());
12861293
(void) DUMMY_VAR__; // suppress unused var warning
1287-
static const char* function__ = "optimize_glm_model_namespace::write_array";
1294+
static constexpr char* function__ = "optimize_glm_model_namespace::write_array";
12881295
(void) function__; // suppress unused var warning
12891296

12901297
try {
@@ -1379,13 +1386,16 @@ class optimize_glm_model final : public model_base_crtp<optimize_glm_model> {
13791386
}
13801387
} // write_array_impl()
13811388

1382-
template <typename VecVar, typename VecI, stan::require_std_vector_t<VecVar>* = nullptr, stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
1389+
template <typename VecVar, typename VecI,
1390+
stan::require_std_vector_t<VecVar>* = nullptr,
1391+
stan::require_vector_like_vt<std::is_integral, VecI>* = nullptr>
13831392
inline void transform_inits_impl(const stan::io::var_context& context__,
13841393
VecI& params_i__, VecVar& vars__,
13851394
std::ostream* pstream__ = nullptr) const {
13861395
using local_scalar_t__ = double;
13871396
vars__.clear();
13881397
vars__.reserve(num_params_r__);
1398+
int current_statement__ = 0;
13891399

13901400
try {
13911401
int pos__;

0 commit comments

Comments
 (0)