Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add simplex row and column matrix constraints #2992

Merged
merged 25 commits into from
Mar 23, 2024

Conversation

SteveBronder
Copy link
Collaborator

@SteveBronder SteveBronder commented Dec 22, 2023

Summary

This adds the functions simplex_row_constrain and simplex_column_constrain to be used by the stan language for matrices with simplexes along the rows or columns of the matrix. This is just the constrain version which is already a lot of code. I'm going to add the free functions in a separate PR

Tests

Tests were added in mix and prim and can be run with

python ./runTests.py -j3 ./test/unit/math/mix/fun/simplex_column_constrain_test.cpp \
 ./test/unit/math/mix/fun/simplex_row_constrain_test.cpp \
./test/unit/math/prim/fun/simplex_row_constrain_test.cpp  \
./test/unit/math/prim/fun/simplex_column_constrain_test.cpp 

A prim test for simplex_column_constrain was not written because under the hood simplex_column_constrain for doubles just calls simplex_constrain

Side Effects

There is one interesting thing to point out in the reverse mode versio nof simplex_column_constrain. I think this is one of the only places in the Stan math library we use Eigen::RowMajor to have row major underlying matrices.

For each of these algorithms we want to access memory in a contiguous manner. For rows of simplex matrices we start with a (N, M) and get back a (N, M + 1) where we operate on each column of the matrix from left to right. For columns of simplex matrices we start with an (N, M) and get back a (N + 1, M) where we need to operate on the row of the matrix from top to bottom. So for the row simplex everything is nice with column major order because that's how our access happens. But for columns of simplex vectors for reverse mode, we make a hard copy of the input changing it from column major to row major so that the rest of our memory access is contiguous. That means that for the rest of the reverse mode code we access things nicely, but then pay the cost of different storage orders when copy the input to the arena matrix in forward mode and then when we copy the adjoint from the reverse mode into the input's adjoint. But reading from different storage orders twice I think is better than reading from the noncontiguous memory for the entire algorithm.

Release notes

Adds constrain function for creating matrices holding row or column simplexes

Checklist

  • Copyright holder: Simons foundation

    The copyright holder is typically you or your assignee, such as a university or company. By submitting this pull request, the copyright holder is agreeing to the license the submitted work under the following licenses:
    - Code: BSD 3-clause (https://opensource.org/licenses/BSD-3-Clause)
    - Documentation: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

  • the basic tests are passing

    • unit tests pass (to run, use: ./runTests.py test/unit)
    • header checks pass, (make test-headers)
    • dependencies checks pass, (make test-math-dependencies)
    • docs build, (make doxygen)
    • code passes the built in C++ standards checks (make cpplint)
  • the code is written in idiomatic C++ and changes are documented in the doxygen

  • the new changes are tested

@SteveBronder
Copy link
Collaborator Author

@andrjohns could you take a look at this?

Copy link
Member

@syclik syclik left a comment

Choose a reason for hiding this comment

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

Functionality makes sense. Putting in comments to help make the code cleaner going into the code base.

*/
template <typename Mat, require_eigen_matrix_dynamic_t<Mat>* = nullptr,
require_not_st_var<Mat>* = nullptr>
inline auto simplex_column_constrain(const Mat& y) {
Copy link
Member

Choose a reason for hiding this comment

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

Can we make the return type more explicit? (Instead of auto)

Copy link
Member

Choose a reason for hiding this comment

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

Same below.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yeah we can make it plain_type_t<Mat> and that should be fine

*/
template <typename Mat, require_eigen_matrix_dynamic_t<Mat>* = nullptr,
require_not_st_var<Mat>* = nullptr>
inline auto simplex_row_constrain(const Mat& y) {
Copy link
Member

Choose a reason for hiding this comment

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

Same here for being more explicit with types instead of auto.

stan/math/prim/fun/simplex_row_constrain.hpp Outdated Show resolved Hide resolved
stan/math/rev/core/var.hpp Show resolved Hide resolved
stan/math/rev/fun/simplex_column_constrain.hpp Outdated Show resolved Hide resolved
@stan-buildbot
Copy link
Contributor


Name Old Result New Result Ratio Performance change( 1 - new / old )
arma/arma.stan 0.19 0.18 1.06 6.0% faster
low_dim_corr_gauss/low_dim_corr_gauss.stan 0.01 0.01 1.04 3.92% faster
gp_regr/gen_gp_data.stan 0.02 0.02 1.06 5.22% faster
gp_regr/gp_regr.stan 0.11 0.1 1.05 4.77% faster
sir/sir.stan 76.94 75.78 1.02 1.5% faster
irt_2pl/irt_2pl.stan 3.81 3.82 1.0 -0.44% slower
eight_schools/eight_schools.stan 0.05 0.05 1.02 1.78% faster
pkpd/sim_one_comp_mm_elim_abs.stan 0.24 0.24 0.98 -2.1% slower
pkpd/one_comp_mm_elim_abs.stan 17.54 17.68 0.99 -0.83% slower
garch/garch.stan 0.44 0.46 0.96 -4.21% slower
low_dim_gauss_mix/low_dim_gauss_mix.stan 2.75 2.78 0.99 -1.1% slower
arK/arK.stan 1.6 1.63 0.98 -2.01% slower
gp_pois_regr/gp_pois_regr.stan 2.49 2.49 1.0 0.14% faster
low_dim_gauss_mix_collapse/low_dim_gauss_mix_collapse.stan 9.02 9.06 1.0 -0.48% slower
performance.compilation 172.25 175.88 0.98 -2.11% slower
Mean result: 1.0076686160263006

Jenkins Console Log
Blue Ocean
Commit hash: e0626a595a3bddd83ac6d0ec401fba4e39c8c5ea


Machine information No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal

CPU:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 80
On-line CPU(s) list: 0-79
Thread(s) per core: 2
Core(s) per socket: 20
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
Stepping: 4
CPU MHz: 2400.000
CPU max MHz: 3700.0000
CPU min MHz: 1000.0000
BogoMIPS: 4800.00
Virtualization: VT-x
L1d cache: 1.3 MiB
L1i cache: 1.3 MiB
L2 cache: 40 MiB
L3 cache: 55 MiB
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79
Vulnerability Gather data sampling: Mitigation; Microcode
Vulnerability Itlb multihit: KVM: Mitigation: VMX disabled
Vulnerability L1tf: Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
Vulnerability Mds: Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Meltdown: Mitigation; PTI
Vulnerability Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Retbleed: Mitigation; IBRS
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2: Mitigation; IBRS, IBPB conditional, STIBP conditional, RSB filling, PBRSB-eIBRS Not affected
Vulnerability Srbds: Not affected
Vulnerability Tsx async abort: Mitigation; Clear CPU buffers; SMT vulnerable
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke md_clear flush_l1d arch_capabilities

G++:
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Clang:
clang version 10.0.0-4ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

@SteveBronder
Copy link
Collaborator Author

@syclik could you give this anotherl look?

@syclik
Copy link
Member

syclik commented Feb 24, 2024

@SteveBronder, sorry, I just saw a comment that I missed. Thought I'd put it here so you can track it. (It's more of a question about the PR than a single line of code.)

@syclik
Question: would it now be worth writing a function that accepts a pointer and length? And then using that function instead of reimplementing the same logic.

@SteveBronder
Sorry I'm not following, where would you want to use this?

The question I was asking was whether both simplex_row_constrain and simplex_column_constrain could call a function that consolidates the implementation. The chunk of code that looked like duplication was:

stan/math/prim/fun/simplex_row_constrain.hpp

  eigen_arr stick_len = eigen_arr::Constant(N, 1.0);
  for (Eigen::Index k = 0; k < Km1; ++k) {
    auto z_k = inv_logit(y_ref.array().col(k) - log(Km1 - k));
    x.array().col(k) = stick_len * z_k;
    stick_len -= x.array().col(k);
  }
  x.array().col(Km1) = stick_len;

stan/math/rev/fun/simplex_column_constrain.hpp

  arr_vec stick_len = arr_vec::Constant(M, 1.0);
  for (Eigen::Index k = 0; k < N; ++k) {
    const double log_N_minus_k = std::log(N - k);
    arena_z.row(k)
        = inv_logit(arena_y.array().row(k).val_op() - log_N_minus_k).matrix();
    x_val.row(k) = stick_len.array() * arena_z.array().row(k);
    stick_len -= x_val.array().row(k);
  }
  x_val.row(N) = stick_len;

The version with the jacobian also repeats. I guess I was wondering if it's better to have a C-like function that takes the pointer to data and length and consolidates the computation. We'd still have the same functions from the outside to handle types and everything.

It's a question, not even a suggestion. I was just reading the code and found the logic to be complicated enough and duplicated where it made me wonder. (Repeating code twice isn't that big of a deal in the long run.)

@syclik syclik self-requested a review February 24, 2024 03:41
syclik
syclik previously requested changes Feb 24, 2024
Copy link
Member

@syclik syclik left a comment

Choose a reason for hiding this comment

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

Thanks for updating the PR with the doc and return types.

I had a couple minor comments. I think one of the function docs had different indexes than everything else; it'd be nice to change that. Almost everything else is just using slightly more explicit return types. (It just makes it clear that the input type is the output type, which cuts out scanning the function for the return type.)

* dimensionality (K, M).
*/
template <bool Jacobian, typename T, require_std_vector_t<T>* = nullptr>
inline auto simplex_column_constrain(const T& y, return_type_t<T>& lp) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
inline auto simplex_column_constrain(const T& y, return_type_t<T>& lp) {
inline plain_type_t<T> simplex_column_constrain(const T& y, return_type_t<T>& lp) {

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This one we want to keep auto because it can return a vector with any amount of vectors of matrices within it.

@@ -24,7 +24,7 @@ namespace math {
* @param y Free vector input of dimensionality K - 1.
* @return Simplex of dimensionality K.
*/
template <typename Vec, require_eigen_col_vector_t<Vec>* = nullptr,
template <typename Vec, require_eigen_vector_t<Vec>* = nullptr,
require_not_st_var<Vec>* = nullptr>
inline auto simplex_constrain(const Vec& y) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
inline auto simplex_constrain(const Vec& y) {
inline plain_type_t<Vec> simplex_constrain(const Vec& y) {

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I changed all of these to plain_type_t

@@ -56,7 +56,7 @@ inline auto simplex_constrain(const Vec& y) {
* @param lp Log probability reference to increment.
* @return Simplex of dimensionality K.
*/
template <typename Vec, require_eigen_col_vector_t<Vec>* = nullptr,
template <typename Vec, require_eigen_vector_t<Vec>* = nullptr,
require_not_st_var<Vec>* = nullptr>
inline auto simplex_constrain(const Vec& y, value_type_t<Vec>& lp) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
inline auto simplex_constrain(const Vec& y, value_type_t<Vec>& lp) {
inline plain_type_t<Vec> simplex_constrain(const Vec& y, value_type_t<Vec>& lp) {

* @return vector of matrices with simplex rows of dimensionality (N, K)
*/
template <bool Jacobian, typename T, require_std_vector_t<T>* = nullptr>
inline auto simplex_row_constrain(const T& y, return_type_t<T>& lp) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
inline auto simplex_row_constrain(const T& y, return_type_t<T>& lp) {
inline plain_type_t<T> simplex_row_constrain(const T& y, return_type_t<T>& lp) {

Copy link
Collaborator Author

@SteveBronder SteveBronder Feb 27, 2024

Choose a reason for hiding this comment

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

Same as above for std vectors of std vectors of matrices. idt plain_type_t here gives any more information

namespace math {

namespace internal {
template <typename Mat, int NewOptions, typename = void>
Copy link
Member

Choose a reason for hiding this comment

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

Would this code be useful in stan/math/fun/Eigen.hpp? If we think we could use it again, I'd suggest moving it there now.

Copy link
Collaborator Author

@SteveBronder SteveBronder Feb 27, 2024

Choose a reason for hiding this comment

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

This requires some things in meta so I'm going to move it here

* @return Matrix of simplex columns of dimensionality (N + 1, M).
*/
template <typename T, require_rev_matrix_t<T>* = nullptr>
auto simplex_column_constrain(const T& y, scalar_type_t<T>& lp) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
auto simplex_column_constrain(const T& y, scalar_type_t<T>& lp) {
inline plain_type_t<T> simplex_column_constrain(const T& y, scalar_type_t<T>& lp) {

* @return Matrix with Simplexes along the rows of dimensionality (N, K)
*/
template <typename T, require_rev_matrix_t<T>* = nullptr>
inline auto simplex_row_constrain(const T& y) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
inline auto simplex_row_constrain(const T& y) {
inline plain_type_t<T> simplex_row_constrain(const T& y) {

* stick-breaking process.
*
* @tparam T type of the matrix to constrain
* @param y Free matrix input of dimensionality (N, M).
Copy link
Member

Choose a reason for hiding this comment

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

All the other doc says (N, K-1). Can we change this to be consistent?

* @tparam T type of the matrix to constrain
* @param y Free matrix input of dimensionality (N, M).
* @param lp Log probability reference to increment.
* @return Matrix with simplexes along the rows of dimensionality (N, M + 1).
Copy link
Member

Choose a reason for hiding this comment

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

And also change this to (N, K).

* @return Matrix with simplexes along the rows of dimensionality (N, M + 1).
*/
template <typename T, require_rev_matrix_t<T>* = nullptr>
inline auto simplex_row_constrain(const T& y, scalar_type_t<T>& lp) {
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
inline auto simplex_row_constrain(const T& y, scalar_type_t<T>& lp) {
inline plain_type_t<T> simplex_row_constrain(const T& y, scalar_type_t<T>& lp) {

@syclik
Copy link
Member

syclik commented Feb 24, 2024

@SteveBronder, minor changes requested. Once addressed, we can merge!

@SteveBronder
Copy link
Collaborator Author

Thanks @syclik! Just updated everything

@SteveBronder
Copy link
Collaborator Author

Actually @syclik do you mind if I just add the free functions to this PR? I think I'm just going to have them call the current simplex_free over the rows / columns so it shouldn't be that much extra code

@syclik
Copy link
Member

syclik commented Feb 27, 2024

@SteveBronder, go for it! I think it makes sense.

@stan-buildbot
Copy link
Contributor


Name Old Result New Result Ratio Performance change( 1 - new / old )
arma/arma.stan 0.21 0.18 1.18 15.31% faster
low_dim_corr_gauss/low_dim_corr_gauss.stan 0.01 0.01 1.06 5.96% faster
gp_regr/gen_gp_data.stan 0.02 0.02 1.07 6.63% faster
gp_regr/gp_regr.stan 0.11 0.1 1.03 3.24% faster
sir/sir.stan 77.62 74.35 1.04 4.21% faster
irt_2pl/irt_2pl.stan 3.89 3.81 1.02 2.13% faster
eight_schools/eight_schools.stan 0.06 0.05 1.06 5.27% faster
pkpd/sim_one_comp_mm_elim_abs.stan 0.26 0.24 1.06 5.25% faster
pkpd/one_comp_mm_elim_abs.stan 18.28 19.53 0.94 -6.82% slower
garch/garch.stan 0.45 0.44 1.03 2.66% faster
low_dim_gauss_mix/low_dim_gauss_mix.stan 2.77 2.82 0.98 -1.84% slower
arK/arK.stan 1.64 1.59 1.04 3.5% faster
gp_pois_regr/gp_pois_regr.stan 2.51 2.48 1.01 1.33% faster
low_dim_gauss_mix_collapse/low_dim_gauss_mix_collapse.stan 9.15 8.92 1.03 2.45% faster
performance.compilation 168.25 173.63 0.97 -3.2% slower
Mean result: 1.0343112712202833

Jenkins Console Log
Blue Ocean
Commit hash: f70fb84db501edcbf822691c02664c43b76287b2


Machine information No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal

CPU:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 80
On-line CPU(s) list: 0-79
Thread(s) per core: 2
Core(s) per socket: 20
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
Stepping: 4
CPU MHz: 2400.000
CPU max MHz: 3700.0000
CPU min MHz: 1000.0000
BogoMIPS: 4800.00
Virtualization: VT-x
L1d cache: 1.3 MiB
L1i cache: 1.3 MiB
L2 cache: 40 MiB
L3 cache: 55 MiB
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79
Vulnerability Gather data sampling: Mitigation; Microcode
Vulnerability Itlb multihit: KVM: Mitigation: VMX disabled
Vulnerability L1tf: Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
Vulnerability Mds: Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Meltdown: Mitigation; PTI
Vulnerability Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Retbleed: Mitigation; IBRS
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2: Mitigation; IBRS, IBPB conditional, STIBP conditional, RSB filling, PBRSB-eIBRS Not affected
Vulnerability Srbds: Not affected
Vulnerability Tsx async abort: Mitigation; Clear CPU buffers; SMT vulnerable
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke md_clear flush_l1d arch_capabilities

G++:
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Clang:
clang version 10.0.0-4ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

@stan-buildbot
Copy link
Contributor


Name Old Result New Result Ratio Performance change( 1 - new / old )
arma/arma.stan 0.2 0.19 1.03 3.08% faster
low_dim_corr_gauss/low_dim_corr_gauss.stan 0.01 0.01 0.95 -5.29% slower
gp_regr/gen_gp_data.stan 0.02 0.02 0.97 -2.88% slower
gp_regr/gp_regr.stan 0.13 0.12 1.12 10.89% faster
sir/sir.stan 80.29 78.65 1.02 2.04% faster
irt_2pl/irt_2pl.stan 4.56 3.62 1.26 20.63% faster
eight_schools/eight_schools.stan 0.06 0.05 1.11 10.07% faster
pkpd/sim_one_comp_mm_elim_abs.stan 0.25 0.24 1.07 6.74% faster
pkpd/one_comp_mm_elim_abs.stan 18.41 17.37 1.06 5.64% faster
garch/garch.stan 0.44 0.42 1.04 4.18% faster
low_dim_gauss_mix/low_dim_gauss_mix.stan 2.94 2.66 1.11 9.65% faster
arK/arK.stan 1.63 1.55 1.05 4.86% faster
gp_pois_regr/gp_pois_regr.stan 2.54 2.37 1.07 6.76% faster
low_dim_gauss_mix_collapse/low_dim_gauss_mix_collapse.stan 9.23 8.73 1.06 5.39% faster
performance.compilation 175.54 169.48 1.04 3.46% faster
Mean result: 1.0644859127821111

Jenkins Console Log
Blue Ocean
Commit hash: f70fb84db501edcbf822691c02664c43b76287b2


Machine information No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal

CPU:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 80
On-line CPU(s) list: 0-79
Thread(s) per core: 2
Core(s) per socket: 20
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
Stepping: 4
CPU MHz: 3399.999
CPU max MHz: 3700.0000
CPU min MHz: 1000.0000
BogoMIPS: 4800.00
Virtualization: VT-x
L1d cache: 1.3 MiB
L1i cache: 1.3 MiB
L2 cache: 40 MiB
L3 cache: 55 MiB
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79
Vulnerability Gather data sampling: Mitigation; Microcode
Vulnerability Itlb multihit: KVM: Mitigation: VMX disabled
Vulnerability L1tf: Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
Vulnerability Mds: Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Meltdown: Mitigation; PTI
Vulnerability Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Retbleed: Mitigation; IBRS
Vulnerability Spec rstack overflow: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2: Mitigation; IBRS, IBPB conditional, STIBP conditional, RSB filling, PBRSB-eIBRS Not affected
Vulnerability Srbds: Not affected
Vulnerability Tsx async abort: Mitigation; Clear CPU buffers; SMT vulnerable
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke md_clear flush_l1d arch_capabilities

G++:
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Clang:
clang version 10.0.0-4ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

@SteveBronder
Copy link
Collaborator Author

@syclik I think this is ready to merge!

Copy link
Collaborator

@andrjohns andrjohns left a comment

Choose a reason for hiding this comment

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

All requests addressed, approving and merging

@andrjohns andrjohns merged commit 8f0731a into develop Mar 23, 2024
8 checks passed
@WardBrian WardBrian deleted the feature/simplex_row_and_col branch April 12, 2024 18:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants