From b449f93d19f1a3dd4d568eab0b09b489b3c6bcb6 Mon Sep 17 00:00:00 2001 From: Theodore Chang Date: Wed, 7 Aug 2024 10:20:48 +0200 Subject: [PATCH] Update `armadillo` version 14.0.2 --- Include/armadillo/armadillo | 3 +- .../armadillo/armadillo_bits/Cube_meat.hpp | 4 +- Include/armadillo/armadillo_bits/Mat_meat.hpp | 4 +- .../armadillo/armadillo_bits/SpMat_meat.hpp | 4 +- .../armadillo/armadillo_bits/arma_version.hpp | 2 +- .../armadillo_bits/compiler_setup.hpp | 2 - .../armadillo/armadillo_bits/diskio_meat.hpp | 16 +++--- .../armadillo/armadillo_bits/field_meat.hpp | 4 +- Include/armadillo/armadillo_bits/fn_accu.hpp | 53 ------------------- Include/armadillo/armadillo_bits/memory.hpp | 32 ++++------- Include/armadillo/armadillo_bits/mul_gemm.hpp | 4 +- Include/armadillo/armadillo_bits/mul_gemv.hpp | 2 +- Include/armadillo/armadillo_bits/mul_herk.hpp | 2 +- Include/armadillo/armadillo_bits/mul_syrk.hpp | 2 +- .../armadillo_bits/subview_field_meat.hpp | 3 +- 15 files changed, 34 insertions(+), 103 deletions(-) diff --git a/Include/armadillo/armadillo b/Include/armadillo/armadillo index 15ccfeb39..1d3f734a3 100644 --- a/Include/armadillo/armadillo +++ b/Include/armadillo/armadillo @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -52,7 +53,7 @@ #include #include -#if !defined(ARMA_DONT_USE_STD_MUTEX) +#if defined(ARMA_USE_STD_MUTEX) #include #endif diff --git a/Include/armadillo/armadillo_bits/Cube_meat.hpp b/Include/armadillo/armadillo_bits/Cube_meat.hpp index 591c62025..aa869bb43 100644 --- a/Include/armadillo/armadillo_bits/Cube_meat.hpp +++ b/Include/armadillo/armadillo_bits/Cube_meat.hpp @@ -3562,7 +3562,7 @@ Cube::operator() (const uword in_row, const uword in_col, const uword in_sli //! element accessor; no bounds check template arma_inline - eT& + eT& Cube::operator[] (const uword in_row, const uword in_col, const uword in_slice) { return access::rw( mem[in_slice*n_elem_slice + in_col*n_rows + in_row] ); @@ -3573,7 +3573,7 @@ Cube::operator() (const uword in_row, const uword in_col, const uword in_sli //! element accessor; no bounds check template arma_inline - const eT& + const eT& Cube::operator[] (const uword in_row, const uword in_col, const uword in_slice) const { return mem[in_slice*n_elem_slice + in_col*n_rows + in_row]; diff --git a/Include/armadillo/armadillo_bits/Mat_meat.hpp b/Include/armadillo/armadillo_bits/Mat_meat.hpp index b738fd27a..0f785d5c6 100644 --- a/Include/armadillo/armadillo_bits/Mat_meat.hpp +++ b/Include/armadillo/armadillo_bits/Mat_meat.hpp @@ -6500,7 +6500,7 @@ Mat::at(const uword in_row, const uword in_col) const //! element accessor; no bounds check template arma_inline - eT& + eT& Mat::operator[] (const uword in_row, const uword in_col) { return access::rw( mem[in_row + in_col*n_rows] ); @@ -6511,7 +6511,7 @@ Mat::at(const uword in_row, const uword in_col) const //! element accessor; no bounds check template arma_inline - const eT& + const eT& Mat::operator[] (const uword in_row, const uword in_col) const { return mem[in_row + in_col*n_rows]; diff --git a/Include/armadillo/armadillo_bits/SpMat_meat.hpp b/Include/armadillo/armadillo_bits/SpMat_meat.hpp index a09fa3f39..eb0bbce8d 100644 --- a/Include/armadillo/armadillo_bits/SpMat_meat.hpp +++ b/Include/armadillo/armadillo_bits/SpMat_meat.hpp @@ -3374,7 +3374,7 @@ SpMat::operator()(const uword i) const template arma_inline - SpMat_MapMat_val + SpMat_MapMat_val SpMat::operator[] (const uword in_row, const uword in_col) { return SpMat_MapMat_val((*this), cache, in_row, in_col); @@ -3384,7 +3384,7 @@ SpMat::operator()(const uword i) const template arma_inline - eT + eT SpMat::operator[] (const uword in_row, const uword in_col) const { return get_value(in_row, in_col); diff --git a/Include/armadillo/armadillo_bits/arma_version.hpp b/Include/armadillo/armadillo_bits/arma_version.hpp index ab18982e1..6665eef57 100644 --- a/Include/armadillo/armadillo_bits/arma_version.hpp +++ b/Include/armadillo/armadillo_bits/arma_version.hpp @@ -23,7 +23,7 @@ #define ARMA_VERSION_MAJOR 14 #define ARMA_VERSION_MINOR 0 -#define ARMA_VERSION_PATCH 1 +#define ARMA_VERSION_PATCH 2 #define ARMA_VERSION_NAME "Stochastic Parrot" diff --git a/Include/armadillo/armadillo_bits/compiler_setup.hpp b/Include/armadillo/armadillo_bits/compiler_setup.hpp index 931fd9674..3978911c1 100644 --- a/Include/armadillo/armadillo_bits/compiler_setup.hpp +++ b/Include/armadillo/armadillo_bits/compiler_setup.hpp @@ -304,8 +304,6 @@ #endif #undef ARMA_HAVE_GCC_ASSUME_ALIGNED - #undef ARMA_HAVE_ICC_ASSUME_ALIGNED - #define ARMA_HAVE_ICC_ASSUME_ALIGNED #endif diff --git a/Include/armadillo/armadillo_bits/diskio_meat.hpp b/Include/armadillo/armadillo_bits/diskio_meat.hpp index 570d7dbf1..2c6859fbc 100644 --- a/Include/armadillo/armadillo_bits/diskio_meat.hpp +++ b/Include/armadillo/armadillo_bits/diskio_meat.hpp @@ -1062,7 +1062,7 @@ diskio::save_coord_ascii(const Mat& x, std::ostream& f) f.put('\n'); } - // make sure it's possible to figure out the matrix size later + // make sure it's possible to determine the matrix size if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; @@ -1125,7 +1125,7 @@ diskio::save_coord_ascii(const Mat< std::complex >& x, std::ostream& f) f.put('\n'); } - // make sure it's possible to figure out the matrix size later + // make sure it's possible to determine the matrix size if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; @@ -1319,8 +1319,8 @@ diskio::save_hdf5_binary(const Mat& x, const hdf5_name& spec, std::string& e hid_t dataspace = H5Screate_simple(2, dims, NULL); // treat the matrix as a 2d array dataspace hid_t datatype = hdf5_misc::get_hdf5_type(); - // If this returned something invalid, well, it's time to crash. - arma_check(datatype == -1, "Mat::save(): unknown datatype for HDF5"); + // fail if we can't handle the datatype + if(datatype == -1) { err_msg = "unknown datatype for HDF5"; return false; } // MATLAB forces the users to specify a name at save time for HDF5; // Octave will use the default of 'dataset' unless otherwise specified. @@ -3065,7 +3065,7 @@ diskio::save_coord_ascii(const SpMat& x, std::ostream& f) } - // make sure it's possible to figure out the matrix size later + // make sure it's possible to determine the matrix size if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; @@ -3128,7 +3128,7 @@ diskio::save_coord_ascii(const SpMat< std::complex >& x, std::ostream& f) f.put('\n'); } - // make sure it's possible to figure out the matrix size later + // make sure it's possible to determine the matrix size if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; @@ -4016,8 +4016,8 @@ diskio::save_hdf5_binary(const Cube& x, const hdf5_name& spec, std::string& hid_t dataspace = H5Screate_simple(3, dims, NULL); // treat the cube as a 3d array dataspace hid_t datatype = hdf5_misc::get_hdf5_type(); - // If this returned something invalid, well, it's time to crash. - arma_check(datatype == -1, "Cube::save(): unknown datatype for HDF5"); + // fail if we can't handle the datatype + if(datatype == -1) { err_msg = "unknown datatype for HDF5"; return false; } // MATLAB forces the users to specify a name at save time for HDF5; // Octave will use the default of 'dataset' unless otherwise specified. diff --git a/Include/armadillo/armadillo_bits/field_meat.hpp b/Include/armadillo/armadillo_bits/field_meat.hpp index 5d7d380ec..1ae7cce14 100644 --- a/Include/armadillo/armadillo_bits/field_meat.hpp +++ b/Include/armadillo/armadillo_bits/field_meat.hpp @@ -614,7 +614,7 @@ field::operator() (const uword in_row, const uword in_col, const uword in_sl //! element accessor; no bounds check template arma_inline - oT& + oT& field::operator[] (const uword in_row, const uword in_col) { return (*mem[in_row + in_col*n_rows]); @@ -625,7 +625,7 @@ field::operator() (const uword in_row, const uword in_col, const uword in_sl //! element accessor; no bounds check template arma_inline - const oT& + const oT& field::operator[] (const uword in_row, const uword in_col) const { return (*mem[in_row + in_col*n_rows]); diff --git a/Include/armadillo/armadillo_bits/fn_accu.hpp b/Include/armadillo/armadillo_bits/fn_accu.hpp index 68442cbf0..9a3cec424 100644 --- a/Include/armadillo/armadillo_bits/fn_accu.hpp +++ b/Include/armadillo/armadillo_bits/fn_accu.hpp @@ -272,59 +272,6 @@ accu(const T1& X) -//! explicit handling of dot product expressed as matrix multiplication -template -arma_warn_unused -inline -typename T1::elem_type -accu(const Glue& expr) - { - arma_debug_sigprint(); - - typedef typename T1::elem_type eT; - - if( (is_cx::no) && (resolves_to_rowvector::value && resolves_to_colvector::value) ) - { - arma_debug_print("accu(): dot product optimisation"); - - constexpr bool proxy_is_mat = (is_Mat::stored_type>::value && is_Mat::stored_type>::value); - - constexpr bool use_at = (Proxy::use_at) || (Proxy::use_at); - - constexpr bool fast_unwrap = (partial_unwrap::is_fast && partial_unwrap::is_fast); - - if(proxy_is_mat || use_at || fast_unwrap) - { - const partial_unwrap UA(expr.A); - const partial_unwrap UB(expr.B); - - const typename partial_unwrap::stored_type& A = UA.M; - const typename partial_unwrap::stored_type& B = UB.M; - - arma_conform_assert_mul_size(A, B, UA.do_trans, UB.do_trans, "matrix multiplication"); - - const eT val = op_dot::direct_dot(A.n_elem, A.memptr(), B.memptr()); - - return (UA.do_times || UB.do_times) ? (val * UA.get_val() * UB.get_val()) : val; - } - else - { - const Proxy PA(expr.A); - const Proxy PB(expr.B); - - arma_conform_assert_mul_size(PA.get_n_rows(), PA.get_n_cols(), PB.get_n_rows(), PB.get_n_cols(), "matrix multiplication"); - - return op_dot::apply_proxy_linear(PA,PB); - } - } - - const Mat tmp(expr); - - return arrayops::accumulate( tmp.memptr(), tmp.n_elem ); - } - - - //! explicit handling of multiply-and-accumulate template arma_warn_unused diff --git a/Include/armadillo/armadillo_bits/memory.hpp b/Include/armadillo/armadillo_bits/memory.hpp index 70de279ee..34547e613 100644 --- a/Include/armadillo/armadillo_bits/memory.hpp +++ b/Include/armadillo/armadillo_bits/memory.hpp @@ -148,7 +148,7 @@ arma_inline bool memory::is_aligned(const eT* mem) { - #if (defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) || defined(ARMA_HAVE_GCC_ASSUME_ALIGNED)) && !defined(ARMA_DONT_CHECK_ALIGNMENT) + #if (defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) || defined(__cpp_lib_assume_aligned)) && !defined(ARMA_DONT_CHECK_ALIGNMENT) { return (sizeof(std::size_t) >= sizeof(eT*)) ? ((std::size_t(mem) & 0x0F) == 0) : false; } @@ -168,33 +168,19 @@ arma_inline void memory::mark_as_aligned(eT*& mem) { - #if defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) + #if defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) { - __assume_aligned(mem, 16); + mem = (eT*)__builtin_assume_aligned(mem, 16); } - #elif defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) + #elif defined(__cpp_lib_assume_aligned) { - mem = (eT*)__builtin_assume_aligned(mem, 16); + mem = (eT*)std::assume_aligned<16>(mem); } #else { arma_ignore(mem); } #endif - - // TODO: look into C++20 std::assume_aligned() - // TODO: https://en.cppreference.com/w/cpp/memory/assume_aligned - - // TODO: MSVC? __assume( (mem & 0x0F) == 0 ); - // - // http://comments.gmane.org/gmane.comp.gcc.patches/239430 - // GCC __builtin_assume_aligned is similar to ICC's __assume_aligned, - // so for lvalue first argument ICC's __assume_aligned can be emulated using - // #define __assume_aligned(lvalueptr, align) lvalueptr = __builtin_assume_aligned (lvalueptr, align) - // - // http://www.inf.ethz.ch/personal/markusp/teaching/263-2300-ETH-spring11/slides/class19.pdf - // http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/cpp/lin/index.htm - // http://d3f8ykwhia686p.cloudfront.net/1live/intel/CompilerAutovectorizationGuide.pdf } @@ -204,13 +190,13 @@ arma_inline void memory::mark_as_aligned(const eT*& mem) { - #if defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) + #if defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) { - __assume_aligned(mem, 16); + mem = (const eT*)__builtin_assume_aligned(mem, 16); } - #elif defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) + #elif defined(__cpp_lib_assume_aligned) { - mem = (const eT*)__builtin_assume_aligned(mem, 16); + mem = (const eT*)std::assume_aligned<16>(mem); } #else { diff --git a/Include/armadillo/armadillo_bits/mul_gemm.hpp b/Include/armadillo/armadillo_bits/mul_gemm.hpp index 71ac1687e..41cc833ff 100644 --- a/Include/armadillo/armadillo_bits/mul_gemm.hpp +++ b/Include/armadillo/armadillo_bits/mul_gemm.hpp @@ -316,8 +316,8 @@ class gemm const eT local_beta = (use_beta) ? beta : eT(0); - arma_debug_print( arma_str::format("blas::gemm(): trans_A = %c") % trans_A ); - arma_debug_print( arma_str::format("blas::gemm(): trans_B = %c") % trans_B ); + arma_debug_print( arma_str::format("blas::gemm(): trans_A: %c") % trans_A ); + arma_debug_print( arma_str::format("blas::gemm(): trans_B: %c") % trans_B ); blas::gemm ( diff --git a/Include/armadillo/armadillo_bits/mul_gemv.hpp b/Include/armadillo/armadillo_bits/mul_gemv.hpp index c4e19a6c4..8c4a0c87e 100644 --- a/Include/armadillo/armadillo_bits/mul_gemv.hpp +++ b/Include/armadillo/armadillo_bits/mul_gemv.hpp @@ -378,7 +378,7 @@ class gemv const blas_int inc = blas_int(1); const eT local_beta = (use_beta) ? beta : eT(0); - arma_debug_print( arma_str::format("blas::gemv(): trans_A = %c") % trans_A ); + arma_debug_print( arma_str::format("blas::gemv(): trans_A: %c") % trans_A ); blas::gemv ( diff --git a/Include/armadillo/armadillo_bits/mul_herk.hpp b/Include/armadillo/armadillo_bits/mul_herk.hpp index 09fdd02ad..442f734d7 100644 --- a/Include/armadillo/armadillo_bits/mul_herk.hpp +++ b/Include/armadillo/armadillo_bits/mul_herk.hpp @@ -405,7 +405,7 @@ class herk const blas_int lda = (do_trans_A) ? k : n; - arma_debug_print( arma_str::format("blas::herk(): trans_A = %c") % trans_A ); + arma_debug_print( arma_str::format("blas::herk(): trans_A: %c") % trans_A ); blas::herk ( diff --git a/Include/armadillo/armadillo_bits/mul_syrk.hpp b/Include/armadillo/armadillo_bits/mul_syrk.hpp index f1369393b..4c7de9373 100644 --- a/Include/armadillo/armadillo_bits/mul_syrk.hpp +++ b/Include/armadillo/armadillo_bits/mul_syrk.hpp @@ -362,7 +362,7 @@ class syrk const blas_int lda = (do_trans_A) ? k : n; - arma_debug_print( arma_str::format("blas::syrk(): trans_A = %c") % trans_A ); + arma_debug_print( arma_str::format("blas::syrk(): trans_A: %c") % trans_A ); blas::syrk ( diff --git a/Include/armadillo/armadillo_bits/subview_field_meat.hpp b/Include/armadillo/armadillo_bits/subview_field_meat.hpp index 7a402e191..9b5286ca6 100644 --- a/Include/armadillo/armadillo_bits/subview_field_meat.hpp +++ b/Include/armadillo/armadillo_bits/subview_field_meat.hpp @@ -525,7 +525,7 @@ subview_field::extract(field& actual_out, const subview_field& in) out.set_size(n_rows, n_cols, n_slices); - arma_debug_print(arma_str::format("out.n_rows: %u; out.n_cols: %u; out.n_slices: %u; n.m.n_rows: %u; in.m.n_cols: %u; in.m.n_slices: %u") % out.n_rows % out.n_cols % out.n_slices % in.f.n_rows % in.f.n_cols % in.f.n_slices); + arma_debug_print(arma_str::format("out.n_rows: %u; out.n_cols: %u; out.n_slices: %u; in.f.n_rows: %u; in.f.n_cols: %u; in.f.n_slices: %u") % out.n_rows % out.n_cols % out.n_slices % in.f.n_rows % in.f.n_cols % in.f.n_slices); if(n_slices == 1) { @@ -550,7 +550,6 @@ subview_field::extract(field& actual_out, const subview_field& in) actual_out = out; delete tmp; } - }