Compare commits

...
666 Commits
Author SHA1 Message Date
conrad 5e4ce67bf4 patch bump 2025-12-16 13:25:46 +10:00
conrad 7dbe9fa6c3 add LLM prohibition section 2025-12-16 13:03:19 +10:00
conrad 7da30298dd add RSL section to head 2025-12-15 14:19:05 +10:00
conrad f347a5640e simplification 2025-12-11 19:07:05 +10:00
conrad c7433b6e60 allow memory reuse with size growth 2025-12-11 16:22:29 +10:00
conrad e712b832e8 simplification 2025-12-11 15:14:55 +10:00
conrad 8a736f85a3 reuse memory where possible 2025-12-11 15:09:16 +10:00
conrad 9f8bf056c2 simplification 2025-12-11 14:20:05 +10:00
conrad b79a7e005c use explicit initialisation 2025-12-10 18:57:17 +10:00
conrad cae3a6a4bf optimise .resize() for small vectors that fit within pre-allocated memory 2025-12-10 15:12:17 +10:00
conrad fb6278f692 return early if resized matrix is empty 2025-12-10 15:11:10 +10:00
conrad 8622e81b8a faster repcube() 2025-12-10 12:31:03 +10:00
conrad f788d4032f emit more info on linker config 2025-12-10 12:28:19 +10:00
conrad c2b1eea864 patch bump 2025-11-20 00:09:55 +10:00
conrad 6eb9394e13 prevent bad line breaks 2025-11-17 23:33:52 +10:00
conrad 391a1df2e8 simplification 2025-11-17 23:30:08 +10:00
conrad 7b718b1ae9 sanitise n_threads 2025-11-12 10:43:09 +10:00
conrad bc18db7a51 use ordered clause 2025-11-09 23:42:09 +10:00
conrad 505339b6e5 rename variable 2025-11-09 22:24:17 +10:00
conrad f015fac562 set rng seed for each thread 2025-11-08 19:51:07 +10:00
conrad 502cbca4ba add internal links 2025-10-30 21:44:19 +10:00
conrad 5e5331acd4 cleanup layout 2025-10-30 20:49:25 +10:00
conrad 2dddc1367e add internal link 2025-10-30 20:45:41 +10:00
conrad 5ca720b31f simpler wording 2025-10-30 13:32:01 +10:00
conradsnicta f72922fa68 fix documentation typo 2025-10-30 00:00:52 +00:00
Ryan Curtin c18e7f0aff Fix documentation typo 2025-10-30 00:00:52 +00:00
conrad 0c40604508 patch bump 2025-10-28 12:23:57 +10:00
conrad f16c95c5c5 add internal link 2025-10-26 23:15:57 +10:00
conrad 65c42d01cd faster handling of submatrix rows 2025-10-26 20:07:38 +10:00
conrad 485b705757 version bump 2025-10-20 13:48:12 +10:00
conrad 0b77330a4d cleanup 2025-10-20 13:38:00 +10:00
conrad 4b93b36b3b sync layout with Row 2025-10-20 12:26:39 +10:00
conrad 475b97464d faster handling of row subvectors 2025-10-20 12:21:33 +10:00
conrad 09e213b8ee rename for clarity 2025-10-20 00:51:15 +10:00
conrad 16d8d9184a restore previous handling 2025-10-19 23:31:10 +10:00
conrad db9a72e616 fix 2025-10-19 23:05:54 +10:00
conrad a091e28200 add explanatory notes 2025-10-19 23:01:46 +10:00
conrad f0b85ca5f6 remove redundant increment 2025-10-19 20:20:51 +10:00
conrad df0d597efe speedup 2025-10-19 11:43:13 +10:00
conrad 43175ea30a further simplification 2025-10-19 11:23:57 +10:00
conrad 5c89440ae6 simplifications 2025-10-19 10:45:33 +10:00
conrad 6c9939308c mark as RC2 2025-10-19 01:26:39 +10:00
conrad fd42b70761 use consistent style 2025-10-19 00:46:21 +10:00
conrad edfa27d837 skip alias check if element types differ 2025-10-18 14:29:18 +10:00
conrad 1549c14df7 fiix 2025-10-18 14:15:26 +10:00
conrad 5d312b07c1 add subview_row overload 2025-10-18 14:10:01 +10:00
conrad 91b672bd1a rename variable for clarity 2025-10-18 12:02:52 +10:00
conrad 59707c1ae4 mark as RC1 2025-10-16 19:24:25 +10:00
conrad b2668ee071 remove unused typedef 2025-10-16 15:24:06 +10:00
conrad f447f144fe avoid unnecessary alias checks 2025-10-16 15:20:54 +10:00
conrad ce914cdf47 cleanup 2025-10-16 10:19:30 +10:00
conrad dc613842b1 use plain inline 2025-10-16 10:18:30 +10:00
conrad f290389fbe change to silent deprecation for now 2025-10-16 10:08:12 +10:00
conrad 3a7185c261 better wording 2025-10-16 00:46:43 +10:00
conrad c7861f1fd0 better wording 2025-10-16 00:34:18 +10:00
conrad 63763b6b63 declare functions as constexpr 2025-10-15 18:29:29 +10:00
conrad 8ebb6ac0a2 avoid unnecessary alias checks 2025-10-15 00:59:38 +10:00
conrad 5245bfc6fe avoid unnecessary alias checks 2025-10-14 19:43:14 +10:00
conrad 4f9486699c remove unused typedefs 2025-10-14 16:09:35 +10:00
conrad 9a45f6cb87 avoid unnecessary alias checks 2025-10-14 15:57:15 +10:00
conrad f232dde0e4 fix 2025-10-14 13:58:42 +10:00
conrad db7395173f allow avoiding unnecessary alias checks in Row and Col constructors 2025-10-14 13:54:28 +10:00
conrad ba2af98edf move noop check 2025-10-14 13:51:01 +10:00
conrad 0998f46768 restore previous detection of row vectors 2025-10-14 00:51:30 +10:00
conrad 1816783f33 avoid unnecessary alias checks 2025-10-14 00:44:22 +10:00
conrad c1a8093c81 update list of changes 2025-10-12 20:38:58 +10:00
conrad a50f35ea01 avoid unnecessary alias checks 2025-10-12 18:30:20 +10:00
conrad 3ac6dae148 avoid unnecessary alias checks 2025-10-12 18:25:06 +10:00
conrad 289630982c improve internal detection of vector expressions 2025-10-11 22:23:53 +10:00
conrad d0c03a8854 simplifications 2025-10-11 21:47:23 +10:00
conrad a7d1061a91 simplifications 2025-10-11 18:43:34 +10:00
conrad 51e05c104c use quasi_unwrap instead of Proxy 2025-10-11 18:31:00 +10:00
conrad 6fea1054d4 avoid unnecessary alias checks 2025-10-10 23:48:48 +10:00
conrad 1d5981c084 use quasi_unwrap instead of Proxy 2025-10-10 23:34:19 +10:00
conrad 8d75ca051d remove unused typedef 2025-10-10 23:33:49 +10:00
conrad 3d30c3c98b avoid unnecessary alias checks 2025-10-10 21:35:28 +10:00
conrad 6b9b3ee8ca avoid unnecessary alias checks 2025-10-10 13:09:07 +10:00
conrad 0d53547bd7 avoid unnecessary alias checks 2025-10-10 12:45:46 +10:00
conrad 4dbc73b36d remove unused typedef 2025-10-10 00:29:19 +10:00
conrad 2784d6c912 avoid unnecessary alias checks 2025-10-10 00:23:22 +10:00
conrad 5ea56be3b7 use quasi_unwrap instead of unwrap_check 2025-10-09 20:02:37 +10:00
conrad c33258d10c avoid unnecessary alias checks 2025-10-09 19:54:41 +10:00
conrad db0f9bb7eb avoid unnecessary alias checks 2025-10-09 13:46:36 +10:00
conrad f44ddefe87 avoid unnecessary alias checks 2025-10-09 11:47:00 +10:00
conrad 27f50ccc77 experiment with avoiding unnecessary alias checks 2025-10-09 11:10:33 +10:00
conrad cf989effe6 remove unnecessary forced inline 2025-10-08 12:56:09 +10:00
conrad b18e38ed2b remove mex_interface 2025-10-08 12:18:24 +10:00
conrad 5b8b5813dc remove unnecessary changes 2025-10-02 16:57:59 +10:00
conrad 5bafc30a2a preserve row type information in quasi_unwrap 2025-10-02 16:52:38 +10:00
conrad 7a63aad350 detect more expressions that don't need to go via Proxy 2025-10-02 00:56:31 +10:00
conrad 56b74f982e detect more expressions that don't need to go via Proxy 2025-09-30 14:06:37 +10:00
conrad 05740be686 detect more expressions that don't need to go via Proxy 2025-09-30 14:02:43 +10:00
conrad 7e67ab4d9a improve layout 2025-09-29 21:55:55 +10:00
conrad 0ad1fa65f6 use consistent layout 2025-09-29 12:50:37 +10:00
conrad 7fd68b3333 simplifications 2025-09-29 12:44:14 +10:00
conrad 356be8fdf0 better wording 2025-09-29 12:21:31 +10:00
conrad 2f0b2aaf83 add brief explanation of fill_form for Col and Row 2025-09-29 00:59:43 +10:00
conrad 355cc6adad move docs for circshift() 2025-09-27 20:55:09 +10:00
conrad a189f683c4 update shift() to circshift() 2025-09-27 13:57:14 +10:00
conrad 5b64691308 deprecate shift() 2025-09-25 13:33:51 +10:00
conrad f487d19327 detect more expressions that don't need to go via Proxy 2025-09-21 14:41:00 +10:00
conrad 544afa8b21 detect more expressions that don't need to go via Proxy 2025-09-21 14:30:38 +10:00
conrad ab6d553c18 faster handling of Row::subvec 2025-09-21 14:24:46 +10:00
conrad ec9abaf635 use quasi_unwrap for consistency with Base::print() 2025-09-19 00:34:05 +10:00
conrad d896f56e06 rearrange for consistency 2025-09-16 10:45:47 +10:00
conrad bae404906c rename variables for clarity 2025-09-16 10:40:53 +10:00
conrad 85b987e5c9 simplifications 2025-09-15 21:55:41 +10:00
conrad 0c54c27517 reduce delta 2025-09-15 15:38:34 +10:00
conrad e116139d6d update limits on integer representation of floating point values 2025-09-15 15:22:22 +10:00
conrad f441ee87b7 update limits on integer representation of floating point values 2025-09-15 15:05:15 +10:00
conrad 787654c911 use internal function 2025-09-15 10:14:57 +10:00
conrad 1bb4f5e350 add docs for rande() 2025-09-06 13:43:51 +10:00
conrad 24586267cf initial implementation of rande() 2025-09-05 23:11:30 +10:00
conrad 71142882e9 remove the now redundant stable_sort_index() 2025-09-05 16:00:33 +10:00
conrad c9f960afa9 reduce number of trials 2025-09-05 14:13:15 +10:00
conrad 50ff9c704e handle corner-case 2025-09-05 11:29:22 +10:00
conrad 86d6ae5b4c faster handling of subcubes 2025-09-05 11:27:16 +10:00
conrad 9ace567ad4 faster handling of tubes 2025-09-04 15:23:08 +10:00
conrad cdb7166177 reduce size of matrices 2025-08-30 21:33:41 +10:00
conrad 7e560dadd0 reduce number of trials 2025-08-30 21:14:57 +10:00
conrad 6ba4f99302 speedup via rudimentary openmp parallelisation 2025-08-30 21:10:49 +10:00
conrad 712596cd5e add TODO 2025-08-30 20:37:17 +10:00
conrad 7ee11c94ec add TODO 2025-08-30 20:36:21 +10:00
conrad 8d68fefa48 use threshold size of 30x30 for triggering openmp path 2025-08-30 20:33:38 +10:00
conrad cd1944d9ed simplifications 2025-08-29 16:13:05 +10:00
conrad 877568668d further rework of parallelised matrix mul 2025-08-29 15:48:58 +10:00
conrad 108adbdf97 partial rework on parallelised matrix mul 2025-08-29 14:09:27 +10:00
conrad f76cf14794 separate standard and openmp code paths 2025-08-29 12:30:56 +10:00
conradsnicta c4033d8838 rudimentary openmp based parallelisation 2025-08-29 01:10:48 +00:00
Ryan Curtin ced2325184 rudimentary openmp based parallelisation 2025-08-29 01:10:48 +00:00
conrad fe9a74bf75 mark as unstable 2025-08-26 10:58:20 +10:00
conrad 6ddb55c173 patch bump 2025-08-22 15:56:39 +10:00
conrad c029b2a22f use generic function as omp simd seems to have no effect 2025-08-22 11:59:03 +10:00
conrad 8a9f6482bd use pragma omp simd instead of gcc function attribute 2025-08-22 10:58:31 +10:00
conrad bae84c796b allow repcube() to use matrices 2025-08-21 23:49:45 +10:00
conrad 4b0636d0d8 version bummp 2025-08-21 15:14:18 +10:00
conrad cbbf66efc8 add TODO 2025-08-21 14:51:08 +10:00
conrad 3a23c33fad update list of additions 2025-08-21 14:19:28 +10:00
conrad 7de06ecddf add docs for repcube() 2025-08-21 14:15:33 +10:00
conrad d59269511f initial version of repcube() 2025-08-21 13:57:18 +10:00
conrad 38795499cc expand debugging to print element type 2025-08-21 12:01:35 +10:00
conrad f5ebe93f9f rearrange 2025-08-20 18:09:36 +10:00
conrad 8ffcf5383e add TODOs 2025-08-20 18:05:07 +10:00
conrad fdd94a2c81 update group name 2025-08-20 13:59:13 +10:00
conrad 2ca675d242 rename 2025-08-20 13:27:06 +10:00
conrad 9d5cfe2016 use Proxy for compound expressions 2025-08-20 13:17:57 +10:00
conrad 9e1a000e4b check for aliasing only if element types are the same 2025-08-20 12:34:09 +10:00
conrad e10f142788 expand eps() to handle cubes 2025-08-20 12:33:36 +10:00
conrad 4639edc493 return only real for cx inputs 2025-08-20 00:56:11 +10:00
conrad fcd771fda7 sort out the eps() mess 2025-08-20 00:44:22 +10:00
conrad e22c9e7cff update list of functions with optimisation for symmetric matrices 2025-08-19 15:16:06 +10:00
conrad 69bd3b3693 rearrange order 2025-08-19 13:52:33 +10:00
conrad 75c40c6549 cleanup 2025-08-18 16:56:07 +10:00
conrad d44d24fd97 update list of changes 2025-08-18 16:50:56 +10:00
conrad 534b3ab79c better wording 2025-08-18 16:44:11 +10:00
conrad b247c9618e handle corner cases 2025-08-18 16:26:53 +10:00
conrad 17f02679a9 reduce delta 2025-08-18 15:56:57 +10:00
conrad 88fdc045cd add TODOs 2025-08-18 10:43:28 +10:00
conrad 4d2e63c686 fix 2025-08-18 10:39:14 +10:00
conradsnicta e073e64481 add 'valid' convolution mode 2025-08-18 00:35:45 +00:00
Zachary Ng a7a92724d5 add 'valid' convolution mode 2025-08-18 00:35:45 +00:00
conrad 27a9de7f7d simplification 2025-08-16 16:28:14 +10:00
conrad 2eb4bcb4f3 better layout 2025-08-15 13:57:20 +10:00
conrad f95602aba2 add workaround from upstream catch2 repo 2025-08-15 11:32:37 +10:00
conrad 5b65d1ad2a update list of changes 2025-08-14 20:12:07 +10:00
conrad 6b45328103 layout fixes 2025-08-14 20:08:15 +10:00
conrad 2be7d8c60f expand docs for cond() 2025-08-14 20:03:24 +10:00
conrad e14cc6fac1 add secondary form of cond() 2025-08-14 19:48:24 +10:00
conrad 1ccc7dbd73 fallback to generic method if symmetric/hermitian optimisation failed 2025-08-14 19:43:08 +10:00
conrad f3cc6c475a bump to openmp 4.0 2025-08-14 16:52:23 +10:00
conrad db550a6579 use _OPENMP corresponding to OpenMP 4.0 2025-08-14 15:12:23 +10:00
conrad 5b88b2323a fallback to generic method if symmetric/hermitian optimisation failed 2025-08-14 00:20:59 +10:00
conrad 28ac91cb67 fallback to generic method if symmetric/hermitian optimisation failed 2025-08-14 00:08:33 +10:00
conrad 83452a0627 require OpenMP 4.0 for seq_cst memory order clause 2025-08-13 18:18:33 +10:00
conrad c5cc28a737 change to struct 2025-08-13 18:16:44 +10:00
conrad 9f785eff7e use seq_cst for openmp atomic read/write 2025-08-13 00:19:45 +10:00
conrad cc89707913 update description 2025-08-12 15:34:27 +10:00
conrad 1a46e0e83b update list of changes 2025-08-11 18:58:39 +10:00
conrad 39db5b5095 update docs for wall_clock 2025-08-11 18:52:20 +10:00
conrad efc2bcf316 rearrange 2025-08-11 18:35:11 +10:00
conrad e38cbaab8e handle corner case where tic() is reused 2025-08-11 18:33:09 +10:00
conrad a30ad16ebe rename warm() to unfreeze() 2025-08-11 18:25:11 +10:00
conrad d0da492c26 use type promotion for fp16 version of mat_norm_2() 2025-08-11 17:11:17 +10:00
conrad 3f5d4784fc add freeze() and warm() 2025-08-11 17:03:00 +10:00
conrad 7a15d37a99 simplifications 2025-08-11 14:32:48 +10:00
conrad 1e40f043ff use constexpr 2025-08-11 01:09:38 +10:00
conrad 21f2bf28d2 simplification 2025-08-11 00:51:52 +10:00
conrad 4a5c3d8f27 rearrange 2025-08-11 00:48:59 +10:00
conrad 2b49392e7c remove no longer needed macros 2025-08-09 23:32:25 +10:00
conrad 26dcdbbf0a add explanation 2025-08-09 23:28:59 +10:00
conrad 16b0912a6f use C++14 deprecation attributes directly 2025-08-09 23:22:55 +10:00
conrad 644cc2908a allow testing of cx_fp16 2025-08-08 20:34:29 +10:00
conrad bfdb9b4d1c update to https 2025-08-08 20:26:16 +10:00
conrad b3b260c00c update to https 2025-08-08 20:22:21 +10:00
conrad 6991c9aa25 update to https 2025-08-08 20:20:21 +10:00
conrad e8027c3e14 update to https 2025-08-08 20:17:18 +10:00
conrad 3a719ad581 update to https 2025-08-08 20:14:01 +10:00
conrad 012acbea12 update to https 2025-08-08 20:13:15 +10:00
conrad 8f89982b74 update to https 2025-08-08 20:10:25 +10:00
conrad 3f6aee0ccb update command line example 2025-08-08 20:08:33 +10:00
conrad b2489b2d87 rename variable for overall consistency 2025-08-08 20:05:37 +10:00
conrad 925d5c7318 update to openblas 0.3.30 2025-08-08 14:44:36 +10:00
conrad 3de20fe5cb fix 2025-08-07 22:53:15 +10:00
conrad dd1be88826 use forced optimisation for fp16 dot products 2025-08-07 16:35:02 +10:00
conrad 0c8e97e10e use type promotion only where necessary 2025-08-07 16:02:57 +10:00
conrad fa4b928937 remove no longer needed function 2025-08-07 14:57:44 +10:00
conrad 4001efe359 strip out type promotion 2025-08-07 14:56:29 +10:00
conrad c294a16d84 strip out type promotion 2025-08-07 14:52:13 +10:00
conrad 28670b8854 minor cleanup 2025-08-07 14:18:09 +10:00
conrad c5613778a8 strip out type promotion 2025-08-07 14:17:32 +10:00
conrad d7d3326003 add note on speed issues with the F16C instruction set 2025-08-07 13:19:22 +10:00
conrad 2c60189b8f use namespace prefix 2025-08-06 23:14:19 +10:00
conrad 3cfd3f90b4 rearrange 2025-08-06 23:02:41 +10:00
conrad db49fc5bb5 add handling of cx_fp16 2025-08-06 22:58:17 +10:00
conrad 2eb334e0ab increase accuracy for fp16 2025-08-06 14:29:11 +10:00
conrad 52cd25c365 increase accuracy for fp16 2025-08-06 14:12:15 +10:00
conrad 43786efafe better handling of fp16 via type promotion in vec_norm_1 2025-08-06 13:30:41 +10:00
conrad 624da4833a better handling of fp16 via type promotion in op_norm_dot 2025-08-06 13:01:02 +10:00
conrad 5bf5668272 better handling of fp16 via type promotion in vec_norm_2 2025-08-06 12:41:52 +10:00
conrad c94b17927c use type promotion for fp16 elements 2025-08-06 10:36:07 +10:00
conrad d5e8bae784 implement mat_norm_2() for fp16 via type promoted matrix 2025-08-05 11:30:13 +10:00
conrad 567d6ccd2c rearrange 2025-08-04 23:55:51 +10:00
conrad 7eca200236 add promote variant of direct_mean_robust() 2025-08-04 23:52:48 +10:00
conrad e7b39cf480 add type promotion variant for optimised handling of sum(square(X)) 2025-08-04 21:31:23 +10:00
conrad 51d4f2e898 more efficient row-wise summation with promotion 2025-08-04 20:54:54 +10:00
conrad 8047a5f342 use type promotion for fp16 2025-08-04 17:06:11 +10:00
conrad 600642f829 simplifications 2025-08-04 15:52:34 +10:00
conrad 9d68301372 use promoted type instead of specialising for fp16 2025-08-04 15:19:43 +10:00
conrad 20ca20b31b expand specialised handling of fp16 2025-08-01 13:01:09 +10:00
conrad 972f2f648f simplification 2025-07-30 12:16:24 +10:00
conrad 273b91efab rename op_accu_fp16mat to op_accu_mat_promote 2025-07-30 12:12:45 +10:00
conrad c3b3a42f46 add specialisations for Proxy 2025-07-30 12:09:45 +10:00
conrad 8bf1eb2af8 reduce compiler processing when fp16 is not available 2025-07-30 11:39:36 +10:00
conrad 9072a2f7c8 place-holder implementation of specialised accu() for fp16 2025-07-30 00:19:41 +10:00
conrad 8abea07d35 simplify handling of openmp 2025-07-29 23:28:51 +10:00
conrad 2fe2b5fa36 fix group names 2025-07-29 23:07:37 +10:00
conrad aba91e9610 refactor accu() into op_accu and spop_accu 2025-07-29 22:43:11 +10:00
conrad 72f7db891f simplification 2025-07-28 13:06:21 +10:00
conrad 89e7703875 specialisation for fp16 2025-07-28 12:56:45 +10:00
conrad 276c968a6b use type promotion for op_cdot 2025-07-28 12:12:29 +10:00
conrad 1e3001be06 type promote components instead of just the result 2025-07-28 12:04:22 +10:00
conrad 648710482d use more precise traits 2025-07-28 01:03:30 +10:00
conrad 839f895bbb use semantically more precise traits 2025-07-28 00:27:33 +10:00
conrad 866dcdbd2c use conditional promotion of accumulator type instead of specialised functions 2025-07-27 19:05:39 +10:00
conrad 723676eb7f use at least float for accumulator in dot products involving compound expressions 2025-07-27 18:31:46 +10:00
conrad 6b63c96af1 use dot products specialised for fp16 2025-07-27 17:51:49 +10:00
conrad 35f3394324 enable more tests 2025-07-26 00:58:58 +10:00
conrad 39be977b55 check aliasing only if element types are the same 2025-07-26 00:32:59 +10:00
conrad 95fda0d2e3 combine cond_rel function definitons and bodies into one file 2025-07-26 00:16:37 +10:00
conrad 3f577dc19c use constexpr instead of forced inline 2025-07-26 00:02:39 +10:00
conrad c9d547c862 use constexpr instead of forced inline 2025-07-25 23:39:48 +10:00
conrad 854d470c63 simplifications 2025-07-25 20:53:21 +10:00
conrad 4af55d5abb simplifications 2025-07-25 16:26:29 +10:00
conrad 13e400d50e simplifications 2025-07-25 13:56:47 +10:00
conrad e798206b1a use constexpr instead of forced inline 2025-07-24 00:36:00 +10:00
conrad 9302d2911b don't use divide-and-conquer when matrix size is too large for LAPACK with 32 bit ints 2025-07-23 23:44:43 +10:00
conrad e727967b39 use void_ptr instead of (void*) 2025-07-23 15:51:38 +10:00
conrad 92837026c3 add __has_include guards around headers that may not be present 2025-07-23 15:31:57 +10:00
conrad c28db14b6f note that fp16 is not the same as bfloat16 2025-07-23 13:17:33 +10:00
conrad e218004dbf specify that hardware support for fp16 via F16C is rudimentary 2025-07-23 13:07:13 +10:00
conrad 583efe0eb0 simplification 2025-07-23 12:58:00 +10:00
conrad 59fccc4457 also use __F16C__ to indicate hardware support for fp16 2025-07-23 12:55:25 +10:00
conrad 0bb7d88a3e more informative warnings 2025-07-23 12:00:50 +10:00
conrad 03ee00c429 simplifications 2025-07-22 18:22:46 +10:00
conrad 24dd81d2cc add -march=native to CXXFLAGS 2025-07-22 14:03:01 +10:00
conrad d37ef70517 change 'fp16_' prefix in matrix typedefs to 'h' 2025-07-22 14:00:27 +10:00
conrad 52b563703e fix typo 2025-07-22 00:50:17 +10:00
conrad 08817332b7 rename shift to circshift 2025-07-21 12:56:21 +10:00
conrad 34722ecab1 rename shift to circshift 2025-07-21 12:52:41 +10:00
conrad a3a1372972 add circshift() versions of shift() 2025-07-21 12:47:41 +10:00
conrad 87f74241f7 show sylvester() instead of deprecatated syl() 2025-07-21 11:44:08 +10:00
conrad 9237785486 remove long deprecated options 2025-07-19 21:38:48 +10:00
conrad 4fecf1e97f bump to C++14 2025-07-18 22:36:58 +10:00
conrad 0c9034e3b9 expanded list of changes 2025-07-18 22:25:37 +10:00
conrad b0b031e152 cleanups 2025-07-18 22:23:27 +10:00
conrad 9e084f7dab use forced optimisation when BLAS is not available 2025-07-18 14:20:21 +10:00
conrad cce74c0e49 use direct_dot() instead of direct_dot_generic() since the former can now detect integer types 2025-07-18 14:20:01 +10:00
conrad 0db44c0fa8 use forced optimisation only for fp16 2025-07-18 14:09:27 +10:00
conrad fb2fd4a049 split direct_dot_generic() into direct_dot_generic_short() and direct_dot_generic_long() 2025-07-18 11:44:59 +10:00
conrad 996bb45534 rename direct_dot_arma() to direct_dot_generic() 2025-07-18 11:13:51 +10:00
conrad 0601761cf2 add handling of cx_fp16 2025-07-18 00:11:38 +10:00
conrad 084a695129 add TODO 2025-07-17 18:37:42 +10:00
conrad 344f123ac4 add warning message 2025-07-17 18:33:37 +10:00
conrad deaf5c413a don't use divide-and-conquer when matrix size is too large for LAPACK with 32 bit ints 2025-07-17 18:31:14 +10:00
conrad 9fcd2f3449 add TODOs 2025-07-17 17:06:22 +10:00
conrad 71eeb56cee add TODOs 2025-07-17 17:00:20 +10:00
conrad a135bbcb94 remove no longer used variable 2025-07-17 16:58:19 +10:00
conrad 5f334da813 don't use divide-and-conquer when matrix size is too large for LAPACK with 32 bit ints 2025-07-17 16:54:41 +10:00
conrad ad478221e1 don't use divide-and-conquer when matrix size is too large for LAPACK with 32 bit ints 2025-07-17 14:38:58 +10:00
conrad 7dc07e12b2 partial revert 2025-07-16 17:05:18 +10:00
conrad 8c295b058e use constexpr for 0 2025-07-16 16:58:59 +10:00
conrad 0e117986aa simplification 2025-07-16 16:34:40 +10:00
conrad 9c9a25f7f6 force vectorisation of direct_dot_arma() under GCC 2025-07-16 15:17:48 +10:00
conrad 15e03f9bac remove forced inline 2025-07-16 14:21:52 +10:00
conrad 484acbecd6 simplification 2025-07-16 14:18:28 +10:00
conrad a8200a6bb5 minor spacing fix 2025-07-16 13:00:45 +10:00
conrad 511ce72db2 add docs for ARMA_DONT_OPTIMISE_POWEXPR 2025-07-16 12:59:45 +10:00
conrad 677bdb3bad swap order to ensure consistency with previous version 2025-07-14 14:55:45 +10:00
conrad 79f6b87781 fix 2025-07-14 14:28:15 +10:00
conrad 39b2a52bd0 allow to optionally disable optimised handling of pow() 2025-07-14 14:02:19 +10:00
conrad ac3fcabca8 simplifications 2025-07-14 13:29:53 +10:00
conrad 4aaf66547e compile time note that ARMA_CRIPPLED_LAPACK is not supported 2025-07-14 13:20:12 +10:00
conrad d676e4cfa2 remove handling of ARMA_CRIPPLED_LAPACK 2025-07-14 13:17:56 +10:00
conrad 3b1ac86a9f remove auxlib::crippled_lapack() 2025-07-14 13:07:00 +10:00
conrad 460e13a272 expand handling of fp16 and cx_fp16 2025-07-12 23:44:53 +10:00
conrad ef4c5a7844 ensure blas cx type only 2025-07-12 21:25:29 +10:00
conrad d8f31aa94f prevent shadow warnings 2025-07-12 19:38:34 +10:00
conrad 382b0f02d6 add docs for ARMA_FORCE_USE_FP16 and ARMA_DONT_USE_FP16 2025-07-12 19:27:32 +10:00
conrad 5155b0bb38 add ARMA_DONT_USE_FP16 option 2025-07-12 19:08:58 +10:00
conrad 69d6fc1319 better wording 2025-07-12 18:56:13 +10:00
conrad d9d5098203 rework fp16 related docs 2025-07-12 18:50:22 +10:00
conrad bfb650ea5d fix 2025-07-12 11:21:31 +10:00
conrad 7369ee1086 allow use of fp16 with fft functions 2025-07-12 00:04:15 +10:00
conrad f06c6ab8f8 rename arma_is_blas_type_only to arma_is_real_or_cx_only for consistency 2025-07-11 23:46:23 +10:00
conrad 206606d40d rename arma_fp16_only to arma_fp16_real_only 2025-07-11 23:24:37 +10:00
conrad 1e731455ec fix 2025-07-11 23:21:08 +10:00
conrad c87cf374c4 add support for cx_fp16 2025-07-11 23:14:44 +10:00
conrad bbe5dcf225 add is_blas_cx trait 2025-07-11 20:45:49 +10:00
conrad 6fd1531d80 enable saving/loading sparse fp16 2025-07-11 20:41:59 +10:00
conrad 30ee79ee37 enable fp16 support for SpMat 2025-07-11 16:06:01 +10:00
conrad 9264db2876 fix 2025-07-10 15:34:34 +10:00
conrad 35668ad125 limit to supported blas types only 2025-07-10 15:18:46 +10:00
conrad 4e6392f0c2 replace is_supported_blas_type with is_blas_type 2025-07-10 14:57:30 +10:00
conrad 5f833e68ce explicitly limit is_cx to std::complex<float> and std::complex<double> 2025-07-10 14:53:32 +10:00
conrad 28d1515afa rearrange order of links 2025-07-09 14:23:45 +10:00
conrad 0820f68e69 restrict to blas real types only 2025-07-09 14:05:48 +10:00
conrad c3db1ead03 ensure junk args are const and are explicitly ignored 2025-07-09 13:48:27 +10:00
conrad 7dadab9eb1 add stub mat_norm_2() for fp16 2025-07-09 13:42:00 +10:00
conrad 46de13b363 use std::uniform_real_distribution with promoted type 2025-07-08 23:32:03 +10:00
conrad 98df75f7d7 simplifications 2025-07-07 23:45:27 +10:00
conrad 91065683da minor layout fixes 2025-07-07 23:29:11 +10:00
conrad ee663d08f6 remove outdated comments 2025-07-07 21:37:13 +10:00
conrad d3c2a9ebd0 add option to test fp16 2025-07-07 21:34:58 +10:00
conrad 35610a4944 simplifications 2025-07-07 20:26:34 +10:00
conrad c2175c86ee C++23 required for fp16 support 2025-07-07 20:14:29 +10:00
conrad 8239b26f62 use only std::float16_t as fp16 2025-07-07 20:04:50 +10:00
conrad a32600ae17 fix 2025-07-07 17:06:31 +10:00
conrad 15ffdaf72a fix 2025-07-07 17:06:19 +10:00
conrad edbe0c1ed5 clarifications 2025-07-07 17:04:19 +10:00
conrad 168e9b9e36 extend debug info for fp16 2025-07-07 16:33:46 +10:00
conrad 4ce154033a simplifications 2025-07-07 16:24:07 +10:00
conrad 8155fe8b26 add fp16 extension of arma_isnonfinite() 2025-07-07 15:57:28 +10:00
conrad 2671a1c8d0 various fixes 2025-07-07 15:06:59 +10:00
conrad 7e2378d1a0 better wording 2025-07-07 14:47:05 +10:00
conrad 9dea1a92be fix layout 2025-07-07 14:11:21 +10:00
conradsnicta bfd7c162f3 Merge branch 'add-fp16-bf16' into 'experimental'
Initial FP16 support

See merge request conradsnicta/armadillo-code!141
2025-07-07 04:00:20 +00:00
Ryan Curtin f07af5a111 Initial FP16 support 2025-07-07 04:00:20 +00:00
conrad d53fcc7e9e speedup 2025-07-05 01:51:18 +10:00
conrad 252d43ae35 cleanup 2025-07-04 13:32:01 +10:00
conrad 8e154ddd13 better wording 2025-07-04 13:13:09 +10:00
conrad feb342fcc1 compile time note about no longer supported options 2025-07-04 13:00:42 +10:00
conrad a57df05fd0 use C++14 features by default 2025-07-03 15:55:34 +10:00
conrad 8039076f07 expand deprecation message with refactoring suggestion 2025-07-03 15:50:30 +10:00
conrad 00d75f3962 remove ARMA_IGNORE_DEPRECATED_MARKER option 2025-07-03 12:24:09 +10:00
conrad 9f8a5cba11 fix 2025-07-01 12:37:08 +10:00
conrad 78aeb5401b bump experimental version 2025-06-30 20:11:43 +10:00
conrad f06e5ce249 add changelog block for next version 2025-06-30 19:38:07 +10:00
conrad b1a9f62bc5 cleanup 2025-06-30 19:34:10 +10:00
conrad 25e0945a29 bump min required C++ standard to C++14 2025-06-30 19:28:06 +10:00
conrad 562ea70276 bump experimental version 2025-06-30 19:12:49 +10:00
conrad 5765ef2909 cleanup 2025-06-30 12:31:26 +10:00
conrad fd2b724040 rename accumulator variable for clarity 2025-06-29 23:06:46 +10:00
conrad e7bd7e4e18 return early if there are no non-zero elements 2025-06-29 22:52:33 +10:00
conrad a902935f11 avoid going through SpProxy unless necessary 2025-06-29 00:38:05 +10:00
conrad 1907b8799e fix debug messages 2025-06-29 00:28:42 +10:00
conrad 9782878612 minor optimisation 2025-06-29 00:22:24 +10:00
conrad b94080a168 specialised handling of spop_omit 2025-06-29 00:10:36 +10:00
conrad ada1e18e45 split out handling of spop_square into separate function 2025-06-28 19:16:24 +10:00
conrad bd26d90563 fix example 2025-06-28 15:40:57 +10:00
conrad 447d66758e simplification 2025-06-28 14:21:09 +10:00
conrad d242d1d3d7 add internal link 2025-06-28 14:13:26 +10:00
conrad e7e189c012 add internal links 2025-06-28 13:46:08 +10:00
conrad 256e1d6e88 use consistent wording for infinity 2025-06-28 13:15:49 +10:00
conrad 6952ca11d5 add caveat 2025-06-28 13:09:27 +10:00
conrad 4ec76d5211 simplifications 2025-06-28 13:03:54 +10:00
conrad 05670bfc64 better wording 2025-06-28 12:56:43 +10:00
conrad 29f4f10118 emit warnings when using fast math mode 2025-06-24 18:48:44 +10:00
conrad e5663df8fa specialised handling for op_omit_cube 2025-06-24 18:42:01 +10:00
conrad cefb070832 initial implementation of op_omit_cube 2025-06-24 18:24:26 +10:00
conrad 2f9829c777 better wording 2025-06-24 12:00:48 +10:00
conrad 78dbddf2e9 emit warnings when using fast math mode 2025-06-24 11:05:36 +10:00
conrad 9318a5df61 ensure consistent expression style 2025-06-24 10:55:54 +10:00
conrad 8e65bd7d21 fix wording 2025-06-24 01:02:35 +10:00
conrad 42022c75e3 initial docs for omit_nan() and omit_nonfinite() 2025-06-23 14:18:33 +10:00
conrad 869c46e39b remove elem_opts 2025-06-23 12:59:12 +10:00
conrad 3199376bbf simplify 'arma_isfinite(x) == false' to 'arma_isnonfinite(x)' 2025-06-20 13:03:29 +10:00
conrad a93c67cc34 update deprecation comments 2025-06-19 16:55:03 +10:00
conrad 753e1e23c7 initial implementation of spop_omit 2025-06-19 14:39:25 +10:00
conrad 021403a5c1 specialised handling of op_omit 2025-06-19 13:25:50 +10:00
conrad 402a453065 initial implementation of omit_nan() and omit_nonfinite() 2025-06-17 21:30:58 +10:00
conrad 5b05fb843d initial implementation of omit_nan() and omit_nonfinite() 2025-06-17 21:30:38 +10:00
conrad 772addf5c1 restore previous behaviour 2025-06-12 19:04:38 +10:00
conrad c08e594437 fix 2025-06-12 14:21:14 +10:00
conrad 9797ad1cad simplifications 2025-06-12 14:18:08 +10:00
conrad b260cdaa58 remove detection of NaN from plain versions of median() 2025-06-12 14:12:32 +10:00
conrad e83cb29013 add median() variant to handle elem_opts 2025-06-12 13:55:48 +10:00
conrad 48e19f8e50 fix 2025-06-11 21:45:30 +10:00
conrad 4e02904b18 add stddev() variant to handle elem_opts 2025-06-11 19:44:43 +10:00
conrad bd1bd14831 fix 2025-06-11 19:21:52 +10:00
conrad 74feb70896 simplifications 2025-06-11 19:08:07 +10:00
conrad 48a33a1fc3 use original option name for now 2025-06-11 15:35:14 +10:00
conrad 36a5188083 minor cleanup 2025-06-11 15:22:03 +10:00
conrad 0731de2367 simplifications 2025-06-11 15:04:22 +10:00
conrad 91b5f68bed fix 2025-06-11 13:45:41 +10:00
conrad a290735187 simplifications 2025-06-11 13:32:47 +10:00
conrad 4b4ab0ced8 add var() variant to handle elem_opts 2025-06-11 13:27:22 +10:00
conrad 7faec6fdce simplifications 2025-06-10 19:30:19 +10:00
conrad 696fd719e8 simplify use of podarray 2025-06-10 19:23:56 +10:00
conrad aa0c021737 simplifications 2025-06-10 19:00:27 +10:00
conrad 682790d0bc started on op_var_omit 2025-06-10 11:39:26 +10:00
conrad 47a0e466e7 add TODO 2025-06-10 11:29:23 +10:00
conrad 8842cdc739 directly handle corner cases 2025-06-09 22:14:08 +10:00
conrad 870414aa06 simplifications 2025-06-09 21:48:48 +10:00
conrad 7b03681ce7 simplifications 2025-06-09 20:10:50 +10:00
conrad a80f63501b expand cube versions of accu() and sum() to handle elem_opts 2025-06-08 21:50:29 +10:00
conrad 6556e4ae04 rearrange 2025-06-08 20:45:28 +10:00
conrad 648527eb1b rearrange 2025-06-08 19:27:36 +10:00
conrad 4a848124fa expand sparse versions of accu() and sum() to handle elem_opts 2025-06-08 15:24:39 +10:00
conrad 39d01b483e remove unused typedef 2025-06-08 15:21:03 +10:00
conrad 03e92c43ba expand op_mean_omit to general matrices 2025-06-08 01:23:11 +10:00
conrad bdf448e8f0 fix 2025-06-07 21:20:39 +10:00
conrad d0dfac1a32 simplification 2025-06-07 20:29:29 +10:00
conrad d057c221d8 simplifications + fix handling of inf corner case 2025-06-07 18:10:33 +10:00
conrad 83bb1e7937 add TODOs 2025-06-06 13:23:48 +10:00
conrad bdc82c2c76 initial work on op_mean_omit 2025-06-06 13:09:39 +10:00
conrad 3cfec929f6 use arma_isnonfinite() for semantic simplification 2025-06-06 13:04:45 +10:00
conrad 74720f366d expand sum() with omit_mode 2025-06-05 13:55:41 +10:00
conrad 65012ac724 use more flexible omit_mode 2025-06-05 12:26:31 +10:00
conrad 7b0ce7088e add accu() variant that can omit nan values 2025-06-04 13:18:03 +10:00
conrad d2930a2763 fix 2025-06-04 13:01:05 +10:00
conrad 9ef5f44c53 expand deprecation message with refactoring suggestion 2025-06-03 14:16:25 +10:00
conrad 6b79e17ec3 use batch random generation to avoid locking rng for each random number 2025-06-02 17:02:33 +10:00
conrad eaf7825044 add randu() and randn() 2025-06-02 16:55:59 +10:00
conrad 365eca0c16 use batch random generation to avoid locking rng for each random number 2025-06-02 16:24:06 +10:00
conrad 096591bafb add TODOs 2025-06-02 13:58:56 +10:00
conrad 68e9cf2a01 use batch random generation to avoid locking rng for each random number 2025-06-02 13:34:10 +10:00
conrad 36a2e4eed4 use batch random generation to avoid locking rng for each random number 2025-06-02 13:19:08 +10:00
conrad 7e7fff181b always use stable sort for sorting indices 2025-05-29 20:01:54 +10:00
conrad 91319547c4 use consistent layout 2025-05-29 19:44:12 +10:00
conrad 6288784171 resolve complex number ties 2025-05-29 19:40:55 +10:00
conrad 74eb504435 use stable sort for sort_index() 2025-05-29 18:17:43 +10:00
conrad 7e63c9f48c add docs for standalone replace() 2025-05-28 13:59:28 +10:00
conrad 5560281526 add standalone replace() 2025-05-24 16:23:03 +10:00
conrad 9d04feb8c3 add dual aux constructor 2025-05-24 16:21:17 +10:00
conrad 47d576fc76 add debug info 2025-05-24 15:40:07 +10:00
conrad c0bf9d5262 group docs for find_finite() + find_nonfinite() and find_nan() + find_nonnan() 2025-05-23 12:35:23 +10:00
conradsnicta 8f74c350ce Merge branch 'fn_find_nonnan' into 'experimental'
Add `fn_find_nonnan()`

See merge request conradsnicta/armadillo-code!140
2025-05-23 01:40:16 +00:00
Ryan Curtin c9425f3158 Add fn_find_nonnan() 2025-05-23 01:40:16 +00:00
conrad 4e7a567967 simplifications 2025-05-22 13:29:39 +10:00
conrad 84ec3ddf9f bump minimum gcc version to 8.1 2025-05-22 13:18:10 +10:00
conrad 0138a5b699 similar optimisation as spglue_schur 2025-05-21 10:11:43 +10:00
conrad 623eb2915d take into account possible inf and nan 2025-05-20 22:27:38 +10:00
conrad f845134e58 restore previous attributes due to false positives in gcc 14.2 2025-05-20 13:49:20 +10:00
conrad 014e11aa5b remove no longer needed typedef 2025-05-20 13:20:10 +10:00
conrad 9f9a93e5e8 fix comment 2025-05-20 13:02:04 +10:00
conrad 636b8f8cf0 optimisation for empty matrices 2025-05-20 12:45:16 +10:00
conrad d1f296eaca simplification 2025-05-20 12:26:18 +10:00
conrad fb5ee6fa0b take into account possible inf and nan 2025-05-20 11:13:31 +10:00
conrad 28c3cd7e54 take into account possible inf and nan 2025-05-20 01:26:58 +10:00
conrad 69e7c73b34 take into account inf and nan 2025-05-20 01:03:12 +10:00
conrad 6fd0ff0d0f minor layout fix 2025-05-19 12:49:13 +10:00
conrad 7e88739a41 simplification 2025-05-19 12:30:41 +10:00
conrad 0bc9d1b2d6 add explanatory comments 2025-05-19 12:22:25 +10:00
conrad e8b7efceba fix handling of corner-cases with nan and inf 2025-05-18 23:25:26 +10:00
conrad 7fda8d02b0 add details 2025-05-18 16:23:26 +10:00
conrad fe3c943543 add details on unsuppported option 2025-05-15 13:30:37 +10:00
conrad 72838eb1df better wording 2025-05-14 13:13:41 +10:00
conrad 2bf91c9159 use .is_finite() 2025-05-13 16:21:26 +10:00
conrad c8c64e614e conditionally undefine ARMA_IGNORE_DEPRECATED_MARKER 2025-05-13 00:29:45 +10:00
conrad 5ff113d8b1 add DOI 2025-05-12 23:30:48 +10:00
conrad bebbf30075 deprecated syl() in favour of sylvester() 2025-05-09 10:54:26 +10:00
conrad 5b05448d69 speedup for accu(square(sp_mat.col(i))) 2025-05-09 00:41:28 +10:00
conrad c0ef238433 deprecate stand-alone is_finite() 2025-05-07 12:45:44 +10:00
conrad e662f86944 add TODOs 2025-05-07 12:24:39 +10:00
conrad 57da508cf3 issue compile time warning for unused outputs 2025-05-02 13:46:08 +10:00
conrad 9ac38a895c mark as experimental 2025-04-26 21:46:56 +10:00
conrad ed840ebb2d use std:: prefix 2025-04-26 00:29:25 +10:00
conrad 1c41747d9c update pdf 2025-04-25 23:56:56 +10:00
conrad dd0aeff3f1 remove old papers 2025-04-25 23:51:16 +10:00
conrad 2186acc08f workaround for bugs in clang 20.1 2025-04-24 15:15:37 +10:00
conrad a2aa0f361a rearrange 2025-04-23 16:15:18 +10:00
conrad 756cebff72 embed icon image into html 2025-04-23 14:47:45 +10:00
conrad e767844a07 add compile time warning 2025-04-23 14:11:27 +10:00
conrad 57b7cec007 better wording 2025-04-23 13:28:54 +10:00
conrad f3bf7bc683 add debug statement 2025-04-23 12:34:15 +10:00
conrad a3bd59ddac cleanup 2025-04-23 11:22:38 +10:00
conrad 82e715f2cf clamp exponent 2025-04-23 01:27:10 +10:00
conrad eb8ea83e11 proposed fix 2025-04-23 01:17:26 +10:00
conrad bd912040a5 bump min version of cmake 2025-04-22 15:37:01 +10:00
conrad f696ac0e4b bump min version of cmake 2025-04-22 15:36:37 +10:00
conrad 616b01448f update list of publications 2025-04-22 15:10:11 +10:00
conrad c71edbf5e5 fixes 2025-04-22 12:51:38 +10:00
conrad 82b3972cae add docs for ARMA_SUPERLU_64BIT_INT 2025-04-22 12:47:42 +10:00
conrad 982aaf0993 update list of supported superlu versions 2025-04-22 12:27:00 +10:00
conrad 25ba9a0ca5 state ARMA_BLAS_64BIT_INT 2025-04-22 12:24:03 +10:00
conrad 740601a431 state ARMA_BLAS_64BIT_INT 2025-04-22 12:20:41 +10:00
conrad 45423128a9 more robust handling of trace reduction 2025-04-20 22:21:35 +10:00
conrad acd6552307 add trace reduction 2025-04-20 16:44:53 +10:00
conrad 085731e77c increase number of terms 2025-04-20 16:31:59 +10:00
conrad f3c1248095 allow detection of superlu 5 to 7 2025-04-19 13:33:36 +10:00
conrad 996b226da5 rename 2025-04-19 13:10:34 +10:00
conrad 3c0be74876 refactor to use superlu 7 2025-04-18 16:46:01 +10:00
conrad aec53c9445 simplifications 2025-04-18 14:36:02 +10:00
conrad 3105fb0bd2 change error to warning 2025-04-16 00:23:18 +10:00
conrad c2852a268d simplifications 2025-04-11 11:51:35 +10:00
conrad b0da624def update docs for balance() 2025-04-09 17:22:55 +10:00
conrad 03a3efe988 update docs for balance() 2025-04-09 17:20:07 +10:00
conrad 35ba4266cd rename variables 2025-04-09 17:15:49 +10:00
conrad 45da4eee4f initial docs for balance() 2025-04-09 16:57:20 +10:00
conrad 90a67c55f2 move docs for affmul() 2025-04-08 16:06:36 +10:00
conrad 6346373654 prevent compiler warnings 2025-04-07 15:03:11 +10:00
conrad 7178d9715b more debug statements 2025-04-07 14:52:47 +10:00
conrad 46fe21ae0d improve docs for element access via better ordering 2025-04-07 14:35:49 +10:00
conrad fc412ae23d initial implementation of balance() 2025-04-04 23:06:36 +10:00
conrad bc745128ef add interfaces to xGEBAL 2025-04-04 14:46:49 +10:00
conrad d2c7718e96 document ARMA_BLAS_64BIT_INT 2025-04-01 13:21:33 +10:00
conrad 3a0293e404 stop if both ARMA_BLAS_64BIT_INT and ARMA_USE_WRAPPER are active 2025-04-01 13:21:09 +10:00
conrad 66acb38834 expand history for new version 2025-04-01 12:55:59 +10:00
conrad 0ecd5a4c43 mark as unstable 2025-03-29 15:26:56 +10:00
conrad 0265363058 fix 2025-03-29 15:23:16 +10:00
conrad 0e091bc343 faster handling of inv(mat)*mat for tiny matrices 2025-03-29 13:03:20 +10:00
conrad 2456f676ec various spelling fixes 2025-03-25 23:17:48 +10:00
conrad 55560bbdf5 spelling fixes 2025-03-25 21:02:03 +10:00
conrad 6e880d8174 patch bump 2025-03-25 16:31:24 +10:00
conrad 0945718ee7 update pdf 2025-03-25 16:27:19 +10:00
conrad cc20c82f81 rename pdf 2025-03-25 16:26:39 +10:00
conrad 12259d14c4 add mutex around fftw plan teardown 2025-03-20 22:54:43 +08:00
conrad 993fe423df better wording 2025-03-19 23:52:25 +10:00
conrad 91970b89ff better wording 2025-03-19 14:14:06 +10:00
conrad 5bcbfc2494 improve docs for vecnorm() 2025-03-19 14:03:51 +10:00
conrad 64204ba71e minor simplifications 2025-03-18 19:58:20 +10:00
conrad efbb9ed899 update citation details 2025-03-17 15:31:46 +10:00
conrad 79d8be32a4 update citation details 2025-03-10 15:31:46 +10:00
conrad e5e59aad06 better wording 2025-03-10 12:49:05 +10:00
conrad 18836f6f54 minor fixes 2025-02-26 17:16:27 +10:00
conrad 12134220c6 add debug statements 2025-02-20 11:38:58 +10:00
conrad 54c8a6bce9 minor version bump 2025-02-17 14:23:00 +10:00
conrad 597779ad8e remove commented out code 2025-02-17 14:03:24 +10:00
conrad c7e0735820 mark as RC2 2025-02-15 15:20:49 +10:00
conrad 0a175fb070 comment out problematic workarounds 2025-02-15 11:56:07 +10:00
conrad 1ee1a6ea2d remove problematic workaround 2025-02-15 11:49:54 +10:00
conrad cb5686067d minor speedup 2025-02-14 14:47:06 +10:00
conrad 5d92b91916 faster handling of sum(square(X)) 2025-02-14 14:40:31 +10:00
conrad dca21aa5f1 optimisation for spglue_schur 2025-02-14 14:32:11 +10:00
conrad fce2e450b8 allow use of blas::dot() 2025-02-14 14:12:24 +10:00
conrad 28139a6da3 mark as RC1 2025-02-13 23:29:27 +10:00
conrad 5c45d78bba workaroudns for old user code 2025-02-13 22:45:47 +10:00
conrad 0446d2eed8 minor layout fix 2025-02-13 22:45:12 +10:00
conrad 3f0e62abfa workaround for old user code 2025-02-12 11:14:43 +10:00
conrad da80bc561f fix types 2025-02-12 10:04:02 +10:00
conrad 5a845df84b fix type 2025-02-12 09:46:43 +10:00
conrad c6219667df link to local PDF 2025-02-12 09:46:18 +10:00
conrad 90b529091f add arxiv pre-print 2025-02-11 13:08:36 +10:00
conrad dc1ede314e update citation 2025-02-10 15:34:37 +10:00
conrad fcd466d213 update copyright year 2025-02-10 15:29:46 +10:00
conrad 8ac6a694f0 update list of changes 2025-02-10 15:00:36 +10:00
conrad 9e6bda097d pre-calculate abs(cx) for faster sorting of complex matrices 2025-02-10 14:44:19 +10:00
conrad 0bea1b2f4d simplify comment 2025-02-10 12:03:26 +10:00
conrad 08a15ab6d2 simplifications 2025-02-07 15:44:24 +10:00
conrad 8f76c2f5a7 use temporary matrix to explicitly avoid aliasing 2025-02-07 15:32:51 +10:00
conrad eea1835183 specialised handling for pow(x,0.5) 2025-02-07 12:07:38 +10:00
conrad 8e02066f52 better wording 2025-02-07 11:51:28 +10:00
conrad cc5d113370 reinterpret pow(x,0.5) as sqrt(x) 2025-02-07 11:32:05 +10:00
conrad 8903fd84a5 restore selective use_mp for pow() 2025-02-07 11:15:52 +10:00
conrad 08d3312192 reinterpret pow(x,0.5) as sqrt(x) 2025-02-07 11:06:51 +10:00
conrad 9944415e12 minor fix 2025-02-06 14:44:15 +10:00
conrad beb4ee0e39 remove unused variable 2025-02-06 14:44:00 +10:00
conrad 4ab6a53ab5 minor layout fix 2025-02-06 14:40:31 +10:00
conrad 99b11428df use std:: prefix 2025-02-05 16:34:40 +10:00
conrad 955abfeeab refactor to avoid using union 2025-02-05 16:24:14 +10:00
conrad e5b1d0bd70 replace weird typedefs with C++11 type aliases 2025-02-05 13:01:33 +10:00
conrad b70e88d8ad minor fix 2025-02-04 13:40:24 +10:00
conrad e7ecee425f remove checking for matrix mul chains 2025-02-03 14:55:59 +10:00
conrad 7004caa4b4 handle more corner cases 2025-02-03 14:41:16 +10:00
conrad 22bbf2ad79 better debug message 2025-02-03 14:10:20 +10:00
conrad 73294812c3 rename unwrap variables 2025-02-03 13:22:42 +10:00
conrad 52b372f7f0 remove partial_unwrap_check 2025-02-03 13:15:07 +10:00
conrad 1f61355864 refactor to use partial_unwrap 2025-02-03 13:11:24 +10:00
conrad 95ac9ebde7 refactor to use partial_unwrap 2025-02-03 12:56:34 +10:00
conrad b244199997 print internal flags 2025-02-03 11:23:40 +10:00
conrad c689776db2 preserve more type information 2025-02-02 23:52:17 +10:00
conrad 37ca4fe05c update list of changes 2025-02-02 11:22:44 +10:00
conrad 4a299aa8ec update list of changes 2025-01-28 14:28:05 +10:00
conrad e0162f0a84 take into account use_mp flag 2025-01-28 14:24:53 +10:00
conrad cb9c78a9e3 faster handling of square() and pow(x,2) 2025-01-28 12:25:17 +10:00
conrad de479975af simplifications 2025-01-28 11:05:11 +10:00
conrad d57ad2a29a optimisation for spop_square 2025-01-27 22:47:34 +10:00
conrad 42a35f8cc3 optimisation for eop_square 2025-01-27 20:36:51 +10:00
conrad a75737fef7 use quasi_unwrap earlier 2025-01-27 00:10:13 +10:00
conrad 426ce1372a directly avoid Proxy if possible 2025-01-25 22:29:44 +10:00
conrad bce19ebcbd directly avoid Proxy if possible 2025-01-25 22:00:08 +10:00
conrad 59477c0dbc restore previous version 2025-01-24 13:08:05 +10:00
conrad bec851861b harmonise to use proxy_type 2025-01-24 11:43:39 +10:00
conrad 4e2f157604 reinterpret pow(x,2) as square(x) 2025-01-24 10:56:07 +10:00
conrad 2b513d3136 add TODO 2025-01-23 18:09:05 +10:00
conrad efac5b3148 reinterpret pow(x,2) as square(x) 2025-01-23 17:11:42 +10:00
conrad daa5deedf3 explicitly handle another corner case 2025-01-22 23:50:27 +10:00
conrad e658f0db17 restore old option for now 2025-01-22 23:23:02 +10:00
conrad bcee6924b7 update list of changes 2025-01-20 14:14:37 +10:00
conrad 089d2b965d unwrap if openmp can be used 2025-01-20 00:15:23 +10:00
conrad ee9f42faff simplifications 2025-01-19 23:41:41 +10:00
conrad 92f4bd5a24 simplifications 2025-01-19 23:01:35 +10:00
conrad 25383133c8 avoid using the proxy if we have direct memory access 2025-01-19 22:47:16 +10:00
conrad bde6942425 update list of changes 2025-01-19 00:17:26 +10:00
conrad b9461be144 faster handling of single submatirx columns 2025-01-18 23:58:31 +10:00
conrad c83caaa0da more efficient handling of expressions 2025-01-18 23:56:57 +10:00
conrad 0ec6b425e6 avoid using the proxy if we have direct memory access 2025-01-18 23:16:11 +10:00
conrad 785bfcb086 avoid using the proxy if we have direct memory access 2025-01-18 23:03:49 +10:00
conrad bb515b8a1f simplifications 2025-01-17 21:33:16 +10:00
conrad cb57dc3815 generate zeros quickly for non-complex inputs 2025-01-17 21:24:45 +10:00
conrad f474274d92 preserve type information 2025-01-17 21:19:04 +10:00
conrad 1629b41828 add warning 2025-01-17 14:08:13 +10:00
conrad 20afeff672 fix 2025-01-17 14:07:55 +10:00
conrad 78694113e3 cleanup 2025-01-17 13:41:00 +10:00
conrad acd2a5fcad optimisations for common cases 2025-01-17 13:37:58 +10:00
conrad 32fd3716fe optimisations for common cases 2025-01-17 13:33:13 +10:00
conrad 64de62450d exploit known dimensions 2025-01-17 13:13:12 +10:00
conrad 81e7d78488 don't fill with zeros as the memory will be immediately overwritten 2025-01-17 13:05:54 +10:00
conrad b8c402b663 avoid copying memory if possible 2025-01-17 13:01:07 +10:00
conrad 328f0fe573 exploit known dimensions 2025-01-17 12:51:38 +10:00
conrad 27db1972be fix for cornercase interaction with .slice() 2025-01-17 12:32:21 +10:00
conrad b0fe0d3cff simplifications 2025-01-17 12:23:08 +10:00
conrad 522cfdce58 fix 2025-01-16 16:34:06 +10:00
conrad dbf64f011c explicitly check for allowed transformations instead of implicit via n_elem 2025-01-16 16:29:13 +10:00
conrad f90249082c simplification 2025-01-16 16:14:14 +10:00
conrad 3b5fb76081 update list of changes 2025-01-16 16:04:47 +10:00
conrad af912a6177 fix 2025-01-16 15:59:42 +10:00
conrad 803c589b17 expand field class with initial implementations of .reshape() and .resize() 2025-01-16 15:50:59 +10:00
conrad 5eb6b5b5fc fix comments 2025-01-12 23:13:12 +10:00
conrad db71a4affb simplifications 2025-01-12 22:57:53 +10:00
conrad 0936110fbc update list of changes 2025-01-09 14:54:02 +10:00
conrad f905ee4b4a reinterpret pow(x,2) as square(x) 2025-01-09 14:39:11 +10:00
conrad 7ff62d22b0 simplifications 2025-01-09 14:30:55 +10:00
conrad c004318b0f fix 2025-01-09 14:25:20 +10:00
conrad 3632831126 reinterpret pow(x,2) as square(x) 2025-01-09 14:24:14 +10:00
conrad ebc6f94fcb simplification 2025-01-09 14:18:42 +10:00
conrad b4ede23c5c reinterpret pow(x,2) as square(x) 2025-01-09 14:17:15 +10:00
conrad feca3eae7f fix 2025-01-09 12:50:41 +10:00
conrad 0a76ab431b remove support for ARMA_IGNORE_DEPRECATED_MARKER 2025-01-02 15:09:00 +10:00
conrad 24b059344e new section for list of changes 2025-01-02 13:11:14 +10:00
conrad ceaa020a33 better layout for sinc() 2025-01-02 13:07:25 +10:00
conrad f9e308b2fd improve docs for toeplitz() 2025-01-02 00:02:21 +10:00
conrad 153c1363ea simplify docs for toeplitz() 2025-01-01 23:28:01 +10:00
conrad 316c7e4abf simplification; alias checks not required 2024-12-25 00:22:08 +10:00
conrad 469cb91a74 reduce stack usage by reducing unnecessary alignment markers 2024-12-18 14:08:42 +10:00
conrad 77cc3e9287 fix prototypes for xSYCON and xHECON 2024-12-17 12:17:02 +10:00
conrad e037bd9a5e reduce bloat 2024-12-16 13:58:00 +10:00
conrad 7138865c14 add note 2024-12-10 12:05:52 +10:00
conrad 8f94af0afb explicitly qualify inherited variables and functions 2024-12-04 12:24:44 +10:00
conrad dfdbae2570 explicitly qualify inherited variables and functions 2024-12-04 12:16:50 +10:00
conrad 11e69548f2 preserve vector type information 2024-12-03 16:25:38 +10:00
conrad 6f6cc83862 fix 2024-12-03 16:19:52 +10:00
conrad 0d2c5de574 preserve vector type information 2024-12-02 22:44:30 +10:00
conrad 07e5b6d1d6 avoid clashes with C++20 std::span 2024-12-02 16:23:54 +10:00
conrad df8741c86b explicitly qualify inherited variables and functions 2024-12-02 16:13:48 +10:00
conrad ffb9ef3c52 more selective detection of symmetric/hermitian matrices 2024-11-28 16:15:56 +11:00
conrad b87cc838a3 more selective detection of symmetric/hermitian matrices 2024-11-27 11:56:43 +11:00
conrad 9273614f58 fix 2024-11-24 17:12:41 +10:00
conrad cdedada64a revert 2024-11-23 16:40:29 +10:00
conrad b7cf2fd503 remove functions from Mat that are present in Base 2024-11-23 13:49:04 +10:00
conrad b3329329a7 expand deprecation warnings with messages 2024-11-23 00:42:36 +10:00
conrad 20bb9d8bcb ensure the first index of extremum value is found 2024-11-22 12:17:20 +10:00
conrad 6ecbed3813 remove unused code 2024-11-20 17:41:01 +10:00
conrad 123dd0108d use partial_unwrap instead of partial_unwrap_check 2024-11-20 17:26:49 +10:00
conrad 79793a7a97 mark as unstable 2024-11-20 12:27:28 +10:00
conrad a2c8b74a35 add TODOs 2024-11-20 11:45:56 +10:00
750 changed files with 17376 additions and 11635 deletions
+21 -18
View File
@@ -1,12 +1,12 @@
# SPDX-License-Identifier: Apache-2.0
#
# Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
# Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
# Copyright 2008-2016 National ICT Australia (NICTA)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,23 +16,24 @@
# ------------------------------------------------------------------------
## NOTE: This installation script by default generates a runtime wrapper library,
## NOTE: This installation script generates a runtime wrapper library by default,
## NOTE: which links with OpenBLAS, LAPACK, etc.
## NOTE:
## NOTE: If you prefer to link your programs directly with OpenBLAS, LAPACK, etc
## NOTE: there are two options:
## NOTE:
## NOTE: (1) use the HEADER_ONLY option when running this installation script,
## NOTE: or
## NOTE: (2) do not use this installation script, and instead compile your programs
## NOTE: using the include folder directly obtained from the armadillo archive.
## NOTE: (2) do not use this installation script; instead compile your programs
## NOTE: using the include folder directly obtained from the armadillo archive.
## NOTE:
## NOTE: To forcefully disable use of the runtime wrapper library,
## NOTE: compile your programs with ARMA_DONT_USE_WRAPPER enabled.
## NOTE: For example:
## NOTE: Example:
## NOTE: g++ prog.cpp -o prog -O2 -I /home/user/armadillo-14.0.0/include -DARMA_DONT_USE_WRAPPER -lopenblas -llapack
## NOTE:
## NOTE: The above command line assumes that you have unpacked the armadillo archive into /home/user/
## NOTE: This needs to be adjusted for newer versions of Armadillo (ie. change "14.0.0"),
## NOTE: The above assumes that the armadillo archive is unpacked into /home/user/
## NOTE: Adjust for newer versions of Armadillo (change "14.0.0"),
## NOTE: and/or if the armadillo archive has been unpacked into a different folder.
## NOTE:
## NOTE: Replace -lopenblas with -lblas if you don't have OpenBLAS.
@@ -40,7 +41,7 @@
## NOTE: More details: https://arma.sourceforge.net/faq.html
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
if(POLICY CMP0025)
# enable differentiation between vanilla Clang and AppleClang
@@ -73,7 +74,7 @@ set(ARMA_USE_LAPACK false)
set(ARMA_USE_BLAS false)
set(ARMA_USE_ATLAS false)
set(ARMA_USE_ARPACK false)
set(ARMA_USE_SUPERLU false) # Caveat: only SuperLU version 5.x can be used!
set(ARMA_USE_SUPERLU false)
# extract version from sources
@@ -101,13 +102,13 @@ endif()
if(DEFINED CMAKE_CXX_COMPILER_ID AND DEFINED CMAKE_CXX_COMPILER_VERSION)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(NOT (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 6.1.0))
if(NOT (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 8.1.0))
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
message(STATUS "Added '-std=c++14' to compiler flags")
endif()
else()
message(FATAL_ERROR "Compiler too old; need at least gcc 6.1")
message(FATAL_ERROR "Compiler too old; need at least gcc 8.1")
endif()
else()
if(NOT (${CMAKE_MAJOR_VERSION} LESS 3))
@@ -144,7 +145,7 @@ endif()
if(NOT APPLE)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
message(STATUS "")
message(STATUS "*** CMAKE_INSTALL_PREFIX was initalised by cmake to the default value of ${CMAKE_INSTALL_PREFIX}")
message(STATUS "*** CMAKE_INSTALL_PREFIX was initialised by cmake to the default value of ${CMAKE_INSTALL_PREFIX}")
message(STATUS "*** CMAKE_INSTALL_PREFIX changed to /usr")
set(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Standard install prefix" FORCE)
endif()
@@ -380,10 +381,11 @@ else()
set(ARMA_LIBS ${ARMA_LIBS} ${MKL_LIBRARIES})
message(STATUS "")
message(STATUS "*** If the MKL libraries are installed in non-standard locations such as")
message(STATUS "*** If the MKL libraries are installed in a non-standard location such as")
message(STATUS "*** /opt/intel/mkl, /opt/intel/composerxe/, /usr/local/intel/mkl")
message(STATUS "*** make sure the run-time linker can find them.")
message(STATUS "*** On Linux systems this can be done by editing /etc/ld.so.conf")
message(STATUS "*** or specifying the location through a file in /etc/ld.so.conf.d/")
message(STATUS "*** or modifying the LD_LIBRARY_PATH environment variable.")
message(STATUS "")
message(STATUS "*** On systems with SELinux enabled (eg. Fedora, RHEL),")
@@ -418,10 +420,11 @@ else()
endif()
message(STATUS "")
message(STATUS "*** If the OpenBLAS library is installed in")
message(STATUS "*** If the OpenBLAS library is installed in a location such as")
message(STATUS "*** /usr/local/lib or /usr/local/lib64")
message(STATUS "*** make sure the run-time linker can find it.")
message(STATUS "*** On Linux systems this can be done by editing /etc/ld.so.conf")
message(STATUS "*** or specifying the location through a file in /etc/ld.so.conf.d/")
message(STATUS "*** or modifying the LD_LIBRARY_PATH environment variable.")
message(STATUS "")
@@ -469,7 +472,7 @@ if(ARPACK_FOUND)
set(ARMA_LIBS ${ARMA_LIBS} ${ARPACK_LIBRARY})
endif()
include(ARMA_FindSuperLU5)
include(ARMA_FindSuperLU)
message(STATUS "SuperLU_FOUND = ${SuperLU_FOUND}")
if(SuperLU_FOUND)
@@ -618,7 +621,7 @@ install(TARGETS armadillo EXPORT ArmadilloLibraryDepends
if(BUILD_SMOKE_TEST)
if(HEADER_ONLY)
## TODO: update to link smoke_test with ARMA_LIBS when HEADER_ONLY option is enabled
message(STATUS "*** building smoke_test not suported when HEADER_ONLY enabled")
message(STATUS "*** building smoke_test not supported when HEADER_ONLY enabled")
else()
message(STATUS "*** configuring smoke_test")
enable_testing()
@@ -631,7 +634,7 @@ endif()
## TODO: update armadillo.pc.in to link with ARMA_LIBS when HEADER_ONLY option is enabled
if(HEADER_ONLY)
message(STATUS "*** generating pkgconfig files not suported when HEADER_ONLY enabled")
message(STATUS "*** generating pkgconfig files not supported when HEADER_ONLY enabled")
else()
message(STATUS "*** copying ${PROJECT_SOURCE_DIR}/misc/ to ${PROJECT_BINARY_DIR}/tmp/misc/")
file(COPY ${PROJECT_SOURCE_DIR}/misc/ DESTINATION ${PROJECT_BINARY_DIR}/tmp/misc/)
+2 -2
View File
@@ -1,7 +1,7 @@
Armadillo C++ Linear Algebra Library
Copyright 2008-2024 Conrad Sanderson (https://conradsanderson.id.au)
Copyright 2008-2025 Conrad Sanderson (https://conradsanderson.id.au)
Copyright 2008-2016 National ICT Australia (NICTA)
Copyright 2017-2024 Data61 / CSIRO
Copyright 2017-2025 Data61 / CSIRO
This product includes software developed by Conrad Sanderson (https://conradsanderson.id.au)
This product includes software developed at National ICT Australia (NICTA)
+28 -25
View File
@@ -1,9 +1,9 @@
### Armadillo: C++ Library for Linear Algebra & Scientific Computing
https://arma.sourceforge.net
Copyright 2008-2024 Conrad Sanderson (https://conradsanderson.id.au)
Copyright 2008-2025 Conrad Sanderson (https://conradsanderson.id.au)
Copyright 2008-2016 National ICT Australia (NICTA)
Copyright 2017-2024 Data61 / CSIRO
Copyright 2017-2025 Data61 / CSIRO
---
@@ -30,14 +30,15 @@ Copyright 2017-2024 Data61 / CSIRO
8. [Windows: Compiling and Linking](#8-windows-compiling-and-linking)
9. [Support for OpenBLAS and Intel MKL](#9-support-for-openblas-and-intel-mkl)
10. [Caveat on use of C++11 auto Keyword](#10-caveat-on-use-of-c11-auto-keyword)
11. [Support for OpenMP](#11-support-for-openmp)
10. [Support for OpenMP](#10-support-for-openmp)
11. [Documentation of Functions and Classes](#11-documentation-of-functions-and-classes)
12. [Caveat on use of C++11 auto Keyword](#12-caveat-on-use-of-c11-auto-keyword)
12. [Documentation of Functions and Classes](#12-documentation-of-functions-and-classes)
13. [API Stability and Version Policy](#13-api-stability-and-version-policy)
14. [Bug Reports and Frequently Asked Questions](#14-bug-reports-and-frequently-asked-questions)
15. [MEX Interface to Octave/Matlab](#15-mex-interface-to-octavematlab)
15. [Prohibition on Use of Large Language Models (LLMs)](#15-prohibition-on-use-of-large-language-models-llms)
16. [Related Software Using Armadillo](#16-related-software-using-armadillo)
---
@@ -78,8 +79,8 @@ Please cite the following papers if you use Armadillo in your research and/or so
Citations are useful for the continued development and maintenance of the library.
* Conrad Sanderson and Ryan Curtin.
Armadillo: a template-based C++ library for linear algebra.
Journal of Open Source Software, Vol. 1, No. 2, pp. 26, 2016.
Armadillo: An Efficient Framework for Numerical Linear Algebra.
International Conference on Computer and Automation Engineering, 2025.
* Conrad Sanderson and Ryan Curtin.
Practical Sparse Matrices in C++ with Hybrid Storage and Template-Based Expression Optimisation.
@@ -129,8 +130,8 @@ On Windows systems, the MinGW toolset or Visual Studio C++ 2019 (MSVC) can be us
Caveats on the use of SuperLU:
- SuperLU must be available as a shared library
- Only the following SuperLU versions are supported: 5.2.x, 5.3.x, 6.0.x
- SuperLU 6.0.x must be compiled with default integer size (32 bits)
- Only the following SuperLU versions are supported: 5.2.x, 5.3.x, 6.0.x, 7.0.x
- SuperLU 6.0.x and 7.0.x must be compiled with default integer size (32 bits)
---
@@ -365,27 +366,18 @@ Comment out the line containing:
---
### 10: Caveat on use of C++11 auto Keyword
Use of the C++11 `auto` keyword is not recommended with Armadillo objects and expressions.
Armadillo has a template meta-programming framework which creates lots of short lived temporaries
that are not properly handled by `auto`.
---
### 11: Support for OpenMP
### 10: Support for OpenMP
Armadillo can use OpenMP to automatically speed up computationally
expensive element-wise functions such as exp(), log(), cos(), etc.
This requires a C++ compiler with OpenMP 3.1+ support.
This requires a C++ compiler with OpenMP 4.0+ support.
For GCC and Clang compilers, use the following option to enable OpenMP:
`-fopenmp`
---
### 12: Documentation of Functions and Classes
### 11: Documentation of Functions and Classes
The documentation of Armadillo functions and classes is available at:
https://arma.sourceforge.net/docs.html
@@ -395,6 +387,15 @@ Use a web browser to view it.
---
### 12: Caveat on use of C++11 auto Keyword
Use of the C++11 `auto` keyword is not recommended with Armadillo objects and expressions.
Armadillo has a template meta-programming framework which creates short-lived
temporary objects that are not properly handled by `auto`.
---
### 13: API Stability and Version Policy
Each release of Armadillo has its public API (functions, classes, constants)
@@ -451,10 +452,12 @@ https://arma.sourceforge.net/faq.html
---
### 15: MEX Interface to Octave/Matlab
### 15: Prohibition on Use of Large Language Models (LLMs)
The `mex_interface` folder contains examples of how to interface
Octave/Matlab with C++ code that uses Armadillo matrices.
The Armadillo codebase has been developed entirely without the use of LLMs.
We do not accept any code which has been created (directly or indirectly)
with the aid of LLMs. This is due to issues with code provenance and low quality
of LLM generated code.
---
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 B

Binary file not shown.
Binary file not shown.
Binary file not shown.
+97
View File
@@ -0,0 +1,97 @@
# Try to find suitable version of SuperLU
# Once done, this will define
#
# SuperLU_FOUND - system has SuperLU
# SuperLU_LIBRARY - Link this to use SuperLU
# SuperLU_INCLUDE_DIR - directory of SuperLU headers
find_path(SuperLU_INCLUDE_DIR slu_ddefs.h
PATHS ${CMAKE_SYSTEM_INCLUDE_PATH} /usr/include /usr/local/include /opt/local/include
PATH_SUFFIXES superlu SuperLU ""
)
find_library(SuperLU_LIBRARY
NAMES superlu
PATHS ${CMAKE_SYSTEM_LIBRARY_PATH} /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib /opt/local/lib64 /opt/local/lib
)
set(SuperLU_FOUND NO)
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Looking for suitable version of SuperLU")
endif()
if(SuperLU_LIBRARY AND SuperLU_INCLUDE_DIR)
# determine if this is a suitable version of SuperLU
if(EXISTS "${SuperLU_INCLUDE_DIR}/slu_ddefs.h")
file(READ "${SuperLU_INCLUDE_DIR}/slu_ddefs.h" _slu_HEADER_CONTENTS)
string(REGEX REPLACE ".*version ([0-9]).*" "\\1" SLU_VERSION_MAJOR "${_slu_HEADER_CONTENTS}")
if("${SLU_VERSION_MAJOR}" EQUAL "7")
set(SuperLU_FOUND YES)
endif()
if("${SLU_VERSION_MAJOR}" EQUAL "6")
set(SuperLU_FOUND YES)
endif()
if("${SLU_VERSION_MAJOR}" EQUAL "5")
set(SuperLU_FOUND YES)
endif()
if("${SLU_VERSION_MAJOR}" EQUAL "4")
# NOTE: SLU_VERSION_MAJOR = 4 is not 100% reliable, as the version string in slu_ddefs.h wasn't updated in SuperLU 5.0, 5.1, 5.2
# NOTE: We need to explicitly check the prototype of dgssvx() to determine whether this is version 4 or 5.
string(FIND "${_slu_HEADER_CONTENTS}" "dgssvx" _slu_dgssvx_start)
if("${_slu_dgssvx_start}" GREATER 0)
string(SUBSTRING "${_slu_HEADER_CONTENTS}" ${_slu_dgssvx_start} -1 _slu_dgssvx_tmp)
string(FIND "${_slu_dgssvx_tmp}" ";" _slu_dgssvx_len)
string(SUBSTRING "${_slu_HEADER_CONTENTS}" ${_slu_dgssvx_start} ${_slu_dgssvx_len} _slu_dgssvx_proto)
string(FIND "${_slu_dgssvx_proto}" "GlobalLU_t" _slu_dgssvx_check)
if("${_slu_dgssvx_check}" EQUAL -1)
# in version 4, dgssvx() doesn't have a GlobalLU_t argument
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Found SuperLU 4, which is insufficient")
endif()
else()
set(SuperLU_FOUND YES)
endif()
endif()
endif()
else()
message(STATUS "Could not read ${SuperLU_INCLUDE_DIR}/slu_ddefs.h to verify suitable version")
endif()
endif()
if(SuperLU_LIBRARY AND NOT SuperLU_INCLUDE_DIR)
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Incomplete installation of SuperLU: no SuperLU headers found")
endif()
endif()
if(NOT SuperLU_FOUND)
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Could not find suitable version of SuperLU")
endif()
else()
message(STATUS "Found SuperLU library: ${SuperLU_LIBRARY}")
endif()
-90
View File
@@ -1,90 +0,0 @@
# Try to find SuperLU 5.x
# Once done, this will define
#
# SuperLU_FOUND - system has SuperLU
# SuperLU_LIBRARY - Link this to use SuperLU
# SuperLU_INCLUDE_DIR - directory of SuperLU headers
find_path(SuperLU_INCLUDE_DIR slu_ddefs.h
PATHS ${CMAKE_SYSTEM_INCLUDE_PATH} /usr/include /usr/local/include /opt/local/include
PATH_SUFFIXES superlu SuperLU ""
)
find_library(SuperLU_LIBRARY
NAMES superlu
PATHS ${CMAKE_SYSTEM_LIBRARY_PATH} /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib /opt/local/lib64 /opt/local/lib
)
set(SuperLU_FOUND NO)
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Looking for SuperLU version 5")
endif()
if(SuperLU_LIBRARY AND SuperLU_INCLUDE_DIR)
# Now determine if the version is version 5.
# This voodoo is required as SuperLU developers like to keep things messy.
if(EXISTS "${SuperLU_INCLUDE_DIR}/slu_ddefs.h")
file(READ "${SuperLU_INCLUDE_DIR}/slu_ddefs.h" _slu_HEADER_CONTENTS)
string(REGEX REPLACE ".*version ([0-9]).*" "\\1" SLU_VERSION_MAJOR "${_slu_HEADER_CONTENTS}")
if("${SLU_VERSION_MAJOR}" EQUAL "5")
set(SuperLU_FOUND YES)
else()
if("${SLU_VERSION_MAJOR}" EQUAL "4")
# NOTE: SLU_VERSION_MAJOR = 4 is not 100% reliable, as the version string in slu_ddefs.h wasn't updated in SuperLU 5.0, 5.1, 5.2
# NOTE: We need to explicitly check the prototype of dgssvx() to determine whether this is version 4 or 5.
string(FIND "${_slu_HEADER_CONTENTS}" "dgssvx" _slu_dgssvx_start)
if("${_slu_dgssvx_start}" GREATER 0)
string(SUBSTRING "${_slu_HEADER_CONTENTS}" ${_slu_dgssvx_start} -1 _slu_dgssvx_tmp)
string(FIND "${_slu_dgssvx_tmp}" ";" _slu_dgssvx_len)
string(SUBSTRING "${_slu_HEADER_CONTENTS}" ${_slu_dgssvx_start} ${_slu_dgssvx_len} _slu_dgssvx_proto)
string(FIND "${_slu_dgssvx_proto}" "GlobalLU_t" _slu_dgssvx_check)
if("${_slu_dgssvx_check}" EQUAL -1)
# in version 4, dgssvx() doesn't have a GlobalLU_t argument
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Found SuperLU, but it doesn't appear to be version 5")
endif()
else()
set(SuperLU_FOUND YES)
endif()
endif()
else()
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Found SuperLU version ${SLU_VERSION_MAJOR}, but version 5 is required")
endif()
endif()
endif()
else()
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Found SuperLU and headers, but could not verify version 5")
endif()
endif()
endif()
if(SuperLU_LIBRARY AND NOT SuperLU_INCLUDE_DIR)
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Incomplete installation of SuperLU: no SuperLU headers found")
endif()
endif()
if(NOT SuperLU_FOUND)
if(NOT SuperLU_FIND_QUIETLY)
message(STATUS "Could not find SuperLU")
endif()
else()
message(STATUS "Found SuperLU: ${SuperLU_LIBRARY}")
endif()
Vendored
+1 -1
View File
@@ -6,7 +6,7 @@ check_cmake()
{
(cmake --version) </dev/null >/dev/null 2>&1 ||
{
echo "error: cmake 3.5+ is required to configure and install Armadillo"
echo "error: cmake 3.10+ is required to configure and install Armadillo"
echo ""
echo "cmake can be installed via your system's package manager,"
echo "or downloaded from https://cmake.org"
+1275 -548
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -7,11 +7,11 @@ If you have installed Armadillo via the CMake installer:
g++ example1.cpp -o example1 -std=c++14 -O2 -larmadillo
Otherwise, if you want to use Armadillo without installation:
g++ example1.cpp -o example1 -std=c++14 -O2 -I /home/user/armadillo-14.0.0/include -DARMA_DONT_USE_WRAPPER -lopenblas
g++ example1.cpp -o example1 -std=c++14 -O2 -I /home/user/armadillo-15.0.0/include -DARMA_DONT_USE_WRAPPER -lopenblas
The above command assumes that the armadillo archive was unpacked into /home/user/
The command needs to be adjusted if the archive was unpacked into a different directory,
and/or for each specific version of Armadillo (ie. "14.0.0" needs to be changed).
and/or for each specific version of Armadillo (ie. "15.0.0" needs to be changed).
If you don't have OpenBLAS, on Linux change -lopenblas to -lblas -llapack
and on macOS change -lopenblas to -framework Accelerate
+3 -1
View File
@@ -1,7 +1,9 @@
#include <iostream>
#include <armadillo>
using namespace std;
using std::cout;
using std::endl;
using namespace arma;
// Armadillo documentation is available at:
+4 -4
View File
@@ -1,12 +1,12 @@
The lib and dll files in this folder are for MSVC running on Windows 10 (64 bit).
The files were obtained from a pre-compiled release of OpenBLAS 0.3.27:
https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.27/OpenBLAS-0.3.27-x64.zip
The files were obtained from a pre-compiled release of OpenBLAS 0.3.30:
https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.30/OpenBLAS-0.3.30-x64.zip
The compilation was done by a third party. USE AT YOUR OWN RISK.
libopenblas.dll is a copy of OpenBLAS-0.3.27-x64/bin/libopenblas.dll
libopenblas.lib is a copy of OpenBLAS-0.3.27-x64/lib/libopenblas.dll.a
libopenblas.dll is a copy of OpenBLAS-0.3.30-x64/bin/libopenblas.dll
libopenblas.lib is a copy of OpenBLAS-0.3.30-x64/lib/libopenblas.dll.a
OpenBLAS is a high-performance implementation of BLAS and LAPACK.
Binary file not shown.
Binary file not shown.
+41 -13
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -54,7 +54,16 @@
#include <atomic>
#if defined(ARMA_USE_STD_MUTEX)
#include <mutex>
#if defined(__has_include)
#if __has_include(<mutex>)
#include <mutex>
#else
#undef ARMA_USE_STD_MUTEX
#pragma message ("WARNING: use of std::mutex disabled; mutex header not found")
#endif
#else
#include <mutex>
#endif
#endif
// #if defined(ARMA_HAVE_CXX17)
@@ -62,6 +71,16 @@
// #include <system_error>
// #endif
#if defined(ARMA_HAVE_CXX23)
#if defined(__has_include)
#if __has_include(<stdfloat>)
#include <stdfloat>
#endif
#else
#include <stdfloat>
#endif
#endif
#if ( defined(__unix__) || defined(__unix) || defined(_POSIX_C_SOURCE) || (defined(__APPLE__) && defined(__MACH__)) ) && !defined(_WIN32)
#include <unistd.h>
#endif
@@ -139,6 +158,7 @@ namespace arma
#include "armadillo_bits/constants_old.hpp"
#include "armadillo_bits/mp_misc.hpp"
#include "armadillo_bits/arma_rel_comparators.hpp"
#include "armadillo_bits/cond_rel.hpp"
#include "armadillo_bits/fill.hpp"
#if defined(ARMA_RNG_ALT)
@@ -171,7 +191,6 @@ namespace arma
#include "armadillo_bits/translate_superlu.hpp"
#include "armadillo_bits/translate_fftw3.hpp"
#include "armadillo_bits/cond_rel_bones.hpp"
#include "armadillo_bits/arrayops_bones.hpp"
#include "armadillo_bits/podarray_bones.hpp"
#include "armadillo_bits/auxlib_bones.hpp"
@@ -275,7 +294,7 @@ namespace arma
#include "armadillo_bits/op_resize_bones.hpp"
#include "armadillo_bits/op_cov_bones.hpp"
#include "armadillo_bits/op_cor_bones.hpp"
#include "armadillo_bits/op_shift_bones.hpp"
#include "armadillo_bits/op_circshift_bones.hpp"
#include "armadillo_bits/op_shuffle_bones.hpp"
#include "armadillo_bits/op_prod_bones.hpp"
#include "armadillo_bits/op_pinv_bones.hpp"
@@ -283,7 +302,7 @@ namespace arma
#include "armadillo_bits/op_flip_bones.hpp"
#include "armadillo_bits/op_reverse_bones.hpp"
#include "armadillo_bits/op_princomp_bones.hpp"
#include "armadillo_bits/op_misc_bones.hpp"
#include "armadillo_bits/op_elem_bones.hpp"
#include "armadillo_bits/op_orth_null_bones.hpp"
#include "armadillo_bits/op_relational_bones.hpp"
#include "armadillo_bits/op_find_bones.hpp"
@@ -304,6 +323,7 @@ namespace arma
#include "armadillo_bits/op_clamp_bones.hpp"
#include "armadillo_bits/op_expmat_bones.hpp"
#include "armadillo_bits/op_nonzeros_bones.hpp"
#include "armadillo_bits/op_omit_bones.hpp"
#include "armadillo_bits/op_diff_bones.hpp"
#include "armadillo_bits/op_norm_bones.hpp"
#include "armadillo_bits/op_vecnorm_bones.hpp"
@@ -320,6 +340,7 @@ namespace arma
#include "armadillo_bits/op_rank_bones.hpp"
#include "armadillo_bits/op_row_as_mat_bones.hpp"
#include "armadillo_bits/op_col_as_mat_bones.hpp"
#include "armadillo_bits/op_accu_bones.hpp"
#include "armadillo_bits/op_sp_plus_bones.hpp"
#include "armadillo_bits/op_sp_minus_bones.hpp"
#include "armadillo_bits/op_sp_sum_bones.hpp"
@@ -375,8 +396,10 @@ namespace arma
#include "armadillo_bits/spop_repmat_bones.hpp"
#include "armadillo_bits/spop_vectorise_bones.hpp"
#include "armadillo_bits/spop_norm_bones.hpp"
#include "armadillo_bits/spop_shift_bones.hpp"
#include "armadillo_bits/spop_circshift_bones.hpp"
#include "armadillo_bits/spop_relational_bones.hpp"
#include "armadillo_bits/spop_omit_bones.hpp"
#include "armadillo_bits/spop_accu_bones.hpp"
#include "armadillo_bits/spglue_plus_bones.hpp"
#include "armadillo_bits/spglue_minus_bones.hpp"
@@ -523,10 +546,9 @@ namespace arma
#include "armadillo_bits/fn_resize.hpp"
#include "armadillo_bits/fn_cov.hpp"
#include "armadillo_bits/fn_cor.hpp"
#include "armadillo_bits/fn_shift.hpp"
#include "armadillo_bits/fn_circshift.hpp"
#include "armadillo_bits/fn_shuffle.hpp"
#include "armadillo_bits/fn_prod.hpp"
#include "armadillo_bits/fn_eps.hpp"
#include "armadillo_bits/fn_pinv.hpp"
#include "armadillo_bits/fn_rank.hpp"
#include "armadillo_bits/fn_kron.hpp"
@@ -559,11 +581,13 @@ namespace arma
#include "armadillo_bits/fn_inplace_trans.hpp"
#include "armadillo_bits/fn_randi.hpp"
#include "armadillo_bits/fn_randg.hpp"
#include "armadillo_bits/fn_rande.hpp"
#include "armadillo_bits/fn_cond_rcond.hpp"
#include "armadillo_bits/fn_normalise.hpp"
#include "armadillo_bits/fn_clamp.hpp"
#include "armadillo_bits/fn_expmat.hpp"
#include "armadillo_bits/fn_nonzeros.hpp"
#include "armadillo_bits/fn_omit.hpp"
#include "armadillo_bits/fn_interp1.hpp"
#include "armadillo_bits/fn_interp2.hpp"
#include "armadillo_bits/fn_qz.hpp"
@@ -590,6 +614,7 @@ namespace arma
#include "armadillo_bits/fn_powmat.hpp"
#include "armadillo_bits/fn_powext.hpp"
#include "armadillo_bits/fn_diags_spdiags.hpp"
#include "armadillo_bits/fn_balance.hpp"
#include "armadillo_bits/fn_speye.hpp"
#include "armadillo_bits/fn_spones.hpp"
@@ -658,7 +683,6 @@ namespace arma
#include "armadillo_bits/eop_core_meat.hpp"
#include "armadillo_bits/eglue_core_meat.hpp"
#include "armadillo_bits/cond_rel_meat.hpp"
#include "armadillo_bits/arrayops_meat.hpp"
#include "armadillo_bits/podarray_meat.hpp"
#include "armadillo_bits/auxlib_meat.hpp"
@@ -729,7 +753,7 @@ namespace arma
#include "armadillo_bits/op_resize_meat.hpp"
#include "armadillo_bits/op_cov_meat.hpp"
#include "armadillo_bits/op_cor_meat.hpp"
#include "armadillo_bits/op_shift_meat.hpp"
#include "armadillo_bits/op_circshift_meat.hpp"
#include "armadillo_bits/op_shuffle_meat.hpp"
#include "armadillo_bits/op_prod_meat.hpp"
#include "armadillo_bits/op_pinv_meat.hpp"
@@ -737,7 +761,7 @@ namespace arma
#include "armadillo_bits/op_flip_meat.hpp"
#include "armadillo_bits/op_reverse_meat.hpp"
#include "armadillo_bits/op_princomp_meat.hpp"
#include "armadillo_bits/op_misc_meat.hpp"
#include "armadillo_bits/op_elem_meat.hpp"
#include "armadillo_bits/op_orth_null_meat.hpp"
#include "armadillo_bits/op_relational_meat.hpp"
#include "armadillo_bits/op_find_meat.hpp"
@@ -758,6 +782,7 @@ namespace arma
#include "armadillo_bits/op_clamp_meat.hpp"
#include "armadillo_bits/op_expmat_meat.hpp"
#include "armadillo_bits/op_nonzeros_meat.hpp"
#include "armadillo_bits/op_omit_meat.hpp"
#include "armadillo_bits/op_diff_meat.hpp"
#include "armadillo_bits/op_norm_meat.hpp"
#include "armadillo_bits/op_vecnorm_meat.hpp"
@@ -774,6 +799,7 @@ namespace arma
#include "armadillo_bits/op_rank_meat.hpp"
#include "armadillo_bits/op_row_as_mat_meat.hpp"
#include "armadillo_bits/op_col_as_mat_meat.hpp"
#include "armadillo_bits/op_accu_meat.hpp"
#include "armadillo_bits/op_sp_plus_meat.hpp"
#include "armadillo_bits/op_sp_minus_meat.hpp"
#include "armadillo_bits/op_sp_sum_meat.hpp"
@@ -829,8 +855,10 @@ namespace arma
#include "armadillo_bits/spop_repmat_meat.hpp"
#include "armadillo_bits/spop_vectorise_meat.hpp"
#include "armadillo_bits/spop_norm_meat.hpp"
#include "armadillo_bits/spop_shift_meat.hpp"
#include "armadillo_bits/spop_circshift_meat.hpp"
#include "armadillo_bits/spop_relational_meat.hpp"
#include "armadillo_bits/spop_omit_meat.hpp"
#include "armadillo_bits/spop_accu_meat.hpp"
#include "armadillo_bits/spglue_plus_meat.hpp"
#include "armadillo_bits/spglue_minus_meat.hpp"
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+4 -4
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -328,7 +328,7 @@ BaseCube<elem_type,derived>::is_finite() const
for(uword c=0; c<n_c; ++c)
for(uword r=0; r<n_r; ++r)
{
if( arma_isfinite(P.at(r,c,s)) == false ) { return false; }
if( arma_isnonfinite(P.at(r,c,s)) ) { return false; }
}
}
@@ -436,7 +436,7 @@ BaseCube<elem_type,derived>::has_nonfinite() const
for(uword c=0; c<n_c; ++c)
for(uword r=0; r<n_r; ++r)
{
if(arma_isfinite(P.at(r,c,s)) == false) { return true; }
if(arma_isnonfinite(P.at(r,c,s))) { return true; }
}
}
+7 -7
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -109,7 +109,7 @@ struct Base_trans<derived, false> { typedef Base_trans_default<derived> result;
template<typename elem_type, typename derived>
struct Base
: public Base_extra<elem_type, derived, is_supported_blas_type<elem_type>::value>::result
: public Base_extra<elem_type, derived, is_blas_type<elem_type>::value>::result
, public Base_eval<elem_type, derived, is_Mat<derived>::value>::result
, public Base_trans<derived, is_cx<elem_type>::value>::result
{
@@ -127,11 +127,11 @@ struct Base
arma_warn_unused inline elem_type min() const;
arma_warn_unused inline elem_type max() const;
arma_frown("use .index_min() instead") inline elem_type min(uword& index_of_min_val) const;
arma_frown("use .index_max() instead") inline elem_type max(uword& index_of_max_val) const;
[[deprecated("use .index_min() instead")]] inline elem_type min(uword& index_of_min_val) const;
[[deprecated("use .index_max() instead")]] inline elem_type max(uword& index_of_max_val) const;
arma_deprecated inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const;
arma_deprecated inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const;
[[deprecated("use .index_min() with ind2sub() instead")]] inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const;
[[deprecated("use .index_max() with ind2sub() instead")]] inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const;
arma_warn_unused inline uword index_min() const;
arma_warn_unused inline uword index_max() const;
+10 -10
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -667,7 +667,7 @@ Base<elem_type,derived>::is_finite() const
if(arma_config::fast_math_warn) { arma_warn(1, "is_finite(): detection of non-finite values is not reliable in fast math mode"); }
if(is_Mat<typename Proxy<derived>::stored_type>::value)
if( (quasi_unwrap<derived>::has_orig_mem) || (is_Mat<typename Proxy<derived>::stored_type>::value) )
{
const quasi_unwrap<derived> U( (*this).get_ref() );
@@ -685,7 +685,7 @@ Base<elem_type,derived>::is_finite() const
for(uword i=0; i<n_elem; ++i)
{
if(arma_isfinite(Pea[i]) == false) { return false; }
if(arma_isnonfinite(Pea[i])) { return false; }
}
}
else
@@ -696,7 +696,7 @@ Base<elem_type,derived>::is_finite() const
for(uword col=0; col<n_cols; ++col)
for(uword row=0; row<n_rows; ++row)
{
if(arma_isfinite(P.at(row,col)) == false) { return false; }
if(arma_isnonfinite(P.at(row,col))) { return false; }
}
}
}
@@ -715,7 +715,7 @@ Base<elem_type,derived>::has_inf() const
if(arma_config::fast_math_warn) { arma_warn(1, "has_inf(): detection of non-finite values is not reliable in fast math mode"); }
if(is_Mat<typename Proxy<derived>::stored_type>::value)
if( (quasi_unwrap<derived>::has_orig_mem) || (is_Mat<typename Proxy<derived>::stored_type>::value) )
{
const quasi_unwrap<derived> U( (*this).get_ref() );
@@ -763,7 +763,7 @@ Base<elem_type,derived>::has_nan() const
if(arma_config::fast_math_warn) { arma_warn(1, "has_nan(): detection of non-finite values is not reliable in fast math mode"); }
if(is_Mat<typename Proxy<derived>::stored_type>::value)
if( (quasi_unwrap<derived>::has_orig_mem) || (is_Mat<typename Proxy<derived>::stored_type>::value) )
{
const quasi_unwrap<derived> U( (*this).get_ref() );
@@ -811,7 +811,7 @@ Base<elem_type,derived>::has_nonfinite() const
if(arma_config::fast_math_warn) { arma_warn(1, "has_nonfinite(): detection of non-finite values is not reliable in fast math mode"); }
if(is_Mat<typename Proxy<derived>::stored_type>::value)
if( (quasi_unwrap<derived>::has_orig_mem) || (is_Mat<typename Proxy<derived>::stored_type>::value) )
{
const quasi_unwrap<derived> U( (*this).get_ref() );
@@ -829,7 +829,7 @@ Base<elem_type,derived>::has_nonfinite() const
for(uword i=0; i<n_elem; ++i)
{
if(arma_isfinite(Pea[i]) == false) { return true; }
if(arma_isnonfinite(Pea[i])) { return true; }
}
}
else
@@ -840,7 +840,7 @@ Base<elem_type,derived>::has_nonfinite() const
for(uword col=0; col<n_cols; ++col)
for(uword row=0; row<n_rows; ++row)
{
if(arma_isfinite(P.at(row,col)) == false) { return true; }
if(arma_isnonfinite(P.at(row,col))) { return true; }
}
}
}
+12 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -91,7 +91,7 @@ class Col : public Mat<eT>
inline Col(const subview_cube<eT>& X);
inline Col& operator=(const subview_cube<eT>& X);
arma_frown("use braced initialiser list instead") inline mat_injector<Col> operator<<(const eT val);
[[deprecated("use braced initialiser list instead")]] inline mat_injector<Col> operator<<(const eT val);
arma_warn_unused arma_inline const Op<Col<eT>,op_htrans> t() const;
arma_warn_unused arma_inline const Op<Col<eT>,op_htrans> ht() const;
@@ -141,8 +141,8 @@ class Col : public Mat<eT>
template<typename T1> inline void shed_rows(const Base<uword, T1>& indices);
arma_deprecated inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero);
inline void insert_rows(const uword row_num, const uword N);
[[deprecated]] inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero);
inline void insert_rows(const uword row_num, const uword N);
template<typename T1> inline void insert_rows(const uword row_num, const Base<eT,T1>& X);
@@ -154,6 +154,11 @@ class Col : public Mat<eT>
arma_warn_unused arma_inline const eT& at(const uword in_row, const uword in_col) const;
inline constexpr bool is_vec() const { return true; }
inline constexpr bool is_rowvec() const { return false; }
inline constexpr bool is_colvec() const { return true; }
typedef eT* row_iterator;
typedef const eT* const_row_iterator;
@@ -187,6 +192,8 @@ class Col<eT>::fixed : public Col<eT>
{
private:
using Mat<eT>::mem_local;
static constexpr bool use_extra = (fixed_n_elem > arma_config::mat_prealloc);
arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ];
+28 -30
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -483,7 +483,7 @@ Col<eT>::operator=(Col<eT>&& X)
// if(X.n_cols != 1) { const Mat<eT>& XX = X; Mat<eT>::operator=(XX); return *this; }
//
// (*this).steal_mem(X, true);
//
//
// return *this;
// }
@@ -521,11 +521,9 @@ template<typename eT>
template<typename T1>
inline
Col<eT>::Col(const Base<eT,T1>& X)
: Mat<eT>(arma_vec_indicator(), 1)
: Mat<eT>(X.get_ref(), arma_vec_indicator(), 1)
{
arma_debug_sigprint();
Mat<eT>::operator=(X.get_ref());
arma_debug_sigprint_this(this);
}
@@ -549,11 +547,9 @@ template<typename eT>
template<typename T1>
inline
Col<eT>::Col(const SpBase<eT,T1>& X)
: Mat<eT>(arma_vec_indicator(), 1)
: Mat<eT>(X.get_ref(), arma_vec_indicator(), 1)
{
arma_debug_sigprint_this(this);
Mat<eT>::operator=(X.get_ref());
}
@@ -607,12 +603,9 @@ Col<eT>::Col
const Base<typename Col<eT>::pod_type, T1>& A,
const Base<typename Col<eT>::pod_type, T2>& B
)
: Mat<eT>(A.get_ref(), B.get_ref(), arma_vec_indicator(), 1)
{
arma_debug_sigprint();
access::rw(Mat<eT>::vec_state) = 1;
Mat<eT>::init(A,B);
arma_debug_sigprint_this(this);
}
@@ -621,12 +614,9 @@ template<typename eT>
template<typename T1>
inline
Col<eT>::Col(const BaseCube<eT,T1>& X)
: Mat<eT>(X.get_ref(), arma_vec_indicator(), 1)
{
arma_debug_sigprint();
access::rw(Mat<eT>::vec_state) = 1;
Mat<eT>::operator=(X);
arma_debug_sigprint_this(this);
}
@@ -649,12 +639,9 @@ Col<eT>::operator=(const BaseCube<eT,T1>& X)
template<typename eT>
inline
Col<eT>::Col(const subview_cube<eT>& X)
: Mat<eT>(X, arma_vec_indicator(), 1)
{
arma_debug_sigprint();
access::rw(Mat<eT>::vec_state) = 1;
Mat<eT>::operator=(X);
arma_debug_sigprint_this(this);
}
@@ -1277,6 +1264,13 @@ Col<eT>::end_row(const uword row_num) const
//
template<typename eT>
template<uword fixed_n_elem>
arma_inline
@@ -1345,11 +1339,11 @@ Col<eT>::fixed<fixed_n_elem>::fixed(const fill::fill_class<fill_type>&)
{
arma_debug_sigprint_this(this);
if(is_same_type<fill_type, fill::fill_zeros>::yes) { (*this).zeros(); }
if(is_same_type<fill_type, fill::fill_ones >::yes) { (*this).ones(); }
if(is_same_type<fill_type, fill::fill_eye >::yes) { (*this).eye(); }
if(is_same_type<fill_type, fill::fill_randu>::yes) { (*this).randu(); }
if(is_same_type<fill_type, fill::fill_randn>::yes) { (*this).randn(); }
if(is_same_type<fill_type, fill::fill_zeros>::yes) { (*this).zeros(); }
if(is_same_type<fill_type, fill::fill_ones >::yes) { (*this).ones(); }
if(is_same_type<fill_type, fill::fill_eye >::yes) { Mat<eT>::eye(); }
if(is_same_type<fill_type, fill::fill_randu>::yes) { Mat<eT>::randu(); }
if(is_same_type<fill_type, fill::fill_randn>::yes) { Mat<eT>::randn(); }
}
@@ -1872,6 +1866,10 @@ Col<eT>::fixed<fixed_n_elem>::ones()
//
template<typename eT>
inline
Col<eT>::Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem)
+5 -7
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,10 +22,8 @@
template<typename T1, typename op_type>
class CubeToMatOp : public Base< typename T1::elem_type, CubeToMatOp<T1, op_type> >
struct CubeToMatOp : public Base< typename T1::elem_type, CubeToMatOp<T1, op_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
@@ -33,8 +31,8 @@ class CubeToMatOp : public Base< typename T1::elem_type, CubeToMatOp<T1, op_type
inline CubeToMatOp(const T1& in_m, const uword in_aux_uword);
inline ~CubeToMatOp();
arma_aligned const T1& m; //!< the operand; must be derived from BaseCube
arma_aligned uword aux_uword; //!< auxiliary data, uword format
const T1& m; //!< the operand; must be derived from BaseCube
uword aux_uword; //!< auxiliary data, uword format
template<typename eT2>
constexpr bool is_alias(const Mat<eT2>&) const { return false; }
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+22 -18
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -218,9 +218,9 @@ class Cube : public BaseCube< eT, Cube<eT> >
template<typename T1> inline void shed_slices(const Base<uword, T1>& indices);
arma_deprecated inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero);
arma_deprecated inline void insert_cols(const uword row_num, const uword N, const bool set_to_zero);
arma_deprecated inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero);
[[deprecated]] inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero);
[[deprecated]] inline void insert_cols(const uword row_num, const uword N, const bool set_to_zero);
[[deprecated]] inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero);
inline void insert_rows(const uword row_num, const uword N);
inline void insert_cols(const uword row_num, const uword N);
@@ -387,11 +387,11 @@ class Cube : public BaseCube< eT, Cube<eT> >
arma_warn_unused inline eT min() const;
arma_warn_unused inline eT max() const;
arma_frown("use .index_min() instead") inline eT min(uword& index_of_min_val) const;
arma_frown("use .index_max() instead") inline eT max(uword& index_of_max_val) const;
[[deprecated("use .index_min() instead")]] inline eT min(uword& index_of_min_val) const;
[[deprecated("use .index_max() instead")]] inline eT max(uword& index_of_max_val) const;
arma_deprecated inline eT min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const;
arma_deprecated inline eT max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const;
[[deprecated("use .index_min() with ind2sub() instead")]] inline eT min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const;
[[deprecated("use .index_max() with ind2sub() instead")]] inline eT max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const;
arma_cold inline bool save(const std::string name, const file_type type = arma_binary) const;
arma_cold inline bool save(const hdf5_name& spec, const file_type type = hdf5_binary) const;
@@ -401,13 +401,13 @@ class Cube : public BaseCube< eT, Cube<eT> >
arma_cold inline bool load(const hdf5_name& spec, const file_type type = hdf5_binary);
arma_cold inline bool load( std::istream& is, const file_type type = auto_detect);
arma_deprecated inline bool quiet_save(const std::string name, const file_type type = arma_binary) const;
arma_deprecated inline bool quiet_save(const hdf5_name& spec, const file_type type = hdf5_binary) const;
arma_deprecated inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save(const std::string name, const file_type type = arma_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save(const hdf5_name& spec, const file_type type = hdf5_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
arma_deprecated inline bool quiet_load(const std::string name, const file_type type = auto_detect);
arma_deprecated inline bool quiet_load(const hdf5_name& spec, const file_type type = hdf5_binary);
arma_deprecated inline bool quiet_load( std::istream& is, const file_type type = auto_detect);
[[deprecated("use load() instead")]] inline bool quiet_load(const std::string name, const file_type type = auto_detect);
[[deprecated("use load() instead")]] inline bool quiet_load(const hdf5_name& spec, const file_type type = hdf5_binary);
[[deprecated("use load() instead")]] inline bool quiet_load( std::istream& is, const file_type type = auto_detect);
// iterators
@@ -464,11 +464,12 @@ class Cube : public BaseCube< eT, Cube<eT> >
inline Mat<eT>* create_mat_ptr(const uword in_slice) const;
inline Mat<eT>* get_mat_ptr(const uword in_slice) const;
friend class glue_join;
friend class op_reshape;
friend class op_resize;
friend class subview_cube<eT>;
friend struct glue_join;
friend struct op_reshape;
friend struct op_resize;
public:
@@ -485,6 +486,9 @@ class Cube<eT>::fixed : public Cube<eT>
{
private:
using Cube<eT>::mat_ptrs_local;
using Cube<eT>::mem_local;
static constexpr uword fixed_n_elem = fixed_n_rows * fixed_n_cols * fixed_n_slices;
static constexpr uword fixed_n_elem_slice = fixed_n_rows * fixed_n_cols;
+67 -15
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -615,7 +615,7 @@ Cube<eT>::get_mat_ptr(const uword in_slice) const
#if defined(ARMA_USE_OPENMP)
{
#pragma omp atomic read
#pragma omp atomic read seq_cst
mat_ptr = mat_ptrs[in_slice];
}
#elif defined(ARMA_USE_STD_MUTEX)
@@ -634,12 +634,12 @@ Cube<eT>::get_mat_ptr(const uword in_slice) const
{
#pragma omp critical (arma_Cube_mat_ptrs)
{
#pragma omp atomic read
#pragma omp atomic read seq_cst
mat_ptr = mat_ptrs[in_slice];
if(mat_ptr == nullptr) { mat_ptr = create_mat_ptr(in_slice); }
#pragma omp atomic write
#pragma omp atomic write seq_cst
mat_ptrs[in_slice] = mat_ptr;
}
}
@@ -784,6 +784,10 @@ Cube<eT>::operator=(const Cube<eT>& x)
arrayops::copy( memptr(), x.mem, n_elem );
}
else
{
arma_debug_print("Cube::operator=(): copy omitted");
}
return *this;
}
@@ -1019,7 +1023,7 @@ Cube<eT>::operator-=(const subview_cube<eT>& X)
//! in-place element-wise cube mutiplication (using a subcube on the right-hand-side)
//! in-place element-wise cube multiplication (using a subcube on the right-hand-side)
template<typename eT>
inline
Cube<eT>&
@@ -2868,6 +2872,14 @@ Cube<eT>::Cube(const eOpCube<T1, eop_type>& X)
init_cold();
if(arma_config::optimise_powexpr && is_same_type<eop_type, eop_pow>::value)
{
constexpr bool eT_ok = is_real_or_cx<eT>::value;
if( X.aux == eT(2) ) { eop_square::apply(*this, reinterpret_cast< const eOpCube<T1, eop_square>& >(X)); return; }
if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply(*this, reinterpret_cast< const eOpCube<T1, eop_sqrt >& >(X)); return; }
}
eop_type::apply(*this, X);
}
@@ -2890,6 +2902,14 @@ Cube<eT>::operator=(const eOpCube<T1, eop_type>& X)
init_warm(X.get_n_rows(), X.get_n_cols(), X.get_n_slices());
if(arma_config::optimise_powexpr && is_same_type<eop_type, eop_pow>::value)
{
constexpr bool eT_ok = is_real_or_cx<eT>::value;
if( X.aux == eT(2) ) { eop_square::apply(*this, reinterpret_cast< const eOpCube<T1, eop_square>& >(X)); return *this; }
if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply(*this, reinterpret_cast< const eOpCube<T1, eop_sqrt >& >(X)); return *this; }
}
eop_type::apply(*this, X);
return *this;
@@ -2912,6 +2932,14 @@ Cube<eT>::operator+=(const eOpCube<T1, eop_type>& X)
if(bad_alias) { const Cube<eT> tmp(X); return (*this).operator+=(tmp); }
if(arma_config::optimise_powexpr && is_same_type<eop_type, eop_pow>::value)
{
constexpr bool eT_ok = is_real_or_cx<eT>::value;
if( X.aux == eT(2) ) { eop_square::apply_inplace_plus(*this, reinterpret_cast< const eOpCube<T1, eop_square>& >(X)); return *this; }
if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply_inplace_plus(*this, reinterpret_cast< const eOpCube<T1, eop_sqrt >& >(X)); return *this; }
}
eop_type::apply_inplace_plus(*this, X);
return *this;
@@ -2934,6 +2962,14 @@ Cube<eT>::operator-=(const eOpCube<T1, eop_type>& X)
if(bad_alias) { const Cube<eT> tmp(X); return (*this).operator-=(tmp); }
if(arma_config::optimise_powexpr && is_same_type<eop_type, eop_pow>::value)
{
constexpr bool eT_ok = is_real_or_cx<eT>::value;
if( X.aux == eT(2) ) { eop_square::apply_inplace_minus(*this, reinterpret_cast< const eOpCube<T1, eop_square>& >(X)); return *this; }
if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply_inplace_minus(*this, reinterpret_cast< const eOpCube<T1, eop_sqrt >& >(X)); return *this; }
}
eop_type::apply_inplace_minus(*this, X);
return *this;
@@ -2956,6 +2992,14 @@ Cube<eT>::operator%=(const eOpCube<T1, eop_type>& X)
if(bad_alias) { const Cube<eT> tmp(X); return (*this).operator%=(tmp); }
if(arma_config::optimise_powexpr && is_same_type<eop_type, eop_pow>::value)
{
constexpr bool eT_ok = is_real_or_cx<eT>::value;
if( X.aux == eT(2) ) { eop_square::apply_inplace_schur(*this, reinterpret_cast< const eOpCube<T1, eop_square>& >(X)); return *this; }
if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply_inplace_schur(*this, reinterpret_cast< const eOpCube<T1, eop_sqrt >& >(X)); return *this; }
}
eop_type::apply_inplace_schur(*this, X);
return *this;
@@ -2978,6 +3022,14 @@ Cube<eT>::operator/=(const eOpCube<T1, eop_type>& X)
if(bad_alias) { const Cube<eT> tmp(X); return (*this).operator/=(tmp); }
if(arma_config::optimise_powexpr && is_same_type<eop_type, eop_pow>::value)
{
constexpr bool eT_ok = is_real_or_cx<eT>::value;
if( X.aux == eT(2) ) { eop_square::apply_inplace_div(*this, reinterpret_cast< const eOpCube<T1, eop_square>& >(X)); return *this; }
if(eT_ok && (X.aux == eT(0.5))) { eop_sqrt::apply_inplace_div(*this, reinterpret_cast< const eOpCube<T1, eop_sqrt >& >(X)); return *this; }
}
eop_type::apply_inplace_div(*this, X);
return *this;
@@ -3096,7 +3148,7 @@ Cube<eT>::Cube(const GlueCube<T1, T2, glue_type>& X)
{
arma_debug_sigprint_this(this);
this->operator=(X);
(*this).operator=(X);
}
@@ -3448,7 +3500,7 @@ Cube<eT>::at_alt(const uword i) const
//! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_NO_DEBUG is defined
//! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined
template<typename eT>
arma_inline
eT&
@@ -3461,7 +3513,7 @@ Cube<eT>::operator() (const uword i)
//! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_NO_DEBUG is defined
//! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined
template<typename eT>
arma_inline
const eT&
@@ -3517,7 +3569,7 @@ Cube<eT>::at(const uword i) const
//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined
//! element accessor; bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined
template<typename eT>
arma_inline
eT&
@@ -3537,7 +3589,7 @@ Cube<eT>::operator() (const uword in_row, const uword in_col, const uword in_sli
//! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined
//! element accessor; bounds checking not done when ARMA_DONT_CHECK_CONFORMANCE is defined
template<typename eT>
arma_inline
const eT&
@@ -5412,10 +5464,10 @@ Cube<eT>::fixed<fixed_n_rows, fixed_n_cols, fixed_n_slices>::fixed(const fill::f
mem_setup();
if(is_same_type<fill_type, fill::fill_zeros>::yes) { (*this).zeros(); }
if(is_same_type<fill_type, fill::fill_ones >::yes) { (*this).ones(); }
if(is_same_type<fill_type, fill::fill_randu>::yes) { (*this).randu(); }
if(is_same_type<fill_type, fill::fill_randn>::yes) { (*this).randn(); }
if(is_same_type<fill_type, fill::fill_zeros>::yes) { Cube<eT>::zeros(); }
if(is_same_type<fill_type, fill::fill_ones >::yes) { Cube<eT>::ones(); }
if(is_same_type<fill_type, fill::fill_randu>::yes) { Cube<eT>::randu(); }
if(is_same_type<fill_type, fill::fill_randn>::yes) { Cube<eT>::randn(); }
arma_static_check( (is_same_type<fill_type, fill::fill_eye>::yes), "Cube::fixed::fixed(): unsupported fill type" );
}
+6 -8
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,20 +22,18 @@
//! support class for generator functions (zeros, ones)
template<typename eT, typename gen_type>
class GenCube
struct GenCube
: public BaseCube< eT, GenCube<eT, gen_type> >
{
public:
typedef eT elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
static constexpr bool use_at = false;
static constexpr bool is_simple = (is_same_type<gen_type, gen_ones>::value) || (is_same_type<gen_type, gen_zeros>::value);
arma_aligned const uword n_rows;
arma_aligned const uword n_cols;
arma_aligned const uword n_slices;
const uword n_rows;
const uword n_cols;
const uword n_slices;
arma_inline GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices);
arma_inline ~GenCube();
+3 -3
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -89,7 +89,7 @@ GenCube<eT, gen_type>::apply(Cube<eT>& out) const
arma_debug_sigprint();
// NOTE: we're assuming that the cube has already been set to the correct size;
// this is done by either the Cube contructor or operator=()
// this is done by either the Cube constructor or operator=()
if(is_same_type<gen_type, gen_zeros>::yes) { out.zeros(); }
else if(is_same_type<gen_type, gen_ones >::yes) { out.ones(); }
+5 -7
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,11 +22,9 @@
//! support class for generator functions (zeros, ones, eye)
template<typename T1, typename gen_type>
class Gen
struct Gen
: public Base< typename T1::elem_type, Gen<T1, gen_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
@@ -37,8 +35,8 @@ class Gen
static constexpr bool is_col = T1::is_col;
static constexpr bool is_xvec = T1::is_xvec;
arma_aligned const uword n_rows;
arma_aligned const uword n_cols;
const uword n_rows;
const uword n_cols;
arma_inline Gen(const uword in_n_rows, const uword in_n_cols);
arma_inline ~Gen();
+3 -3
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -91,7 +91,7 @@ Gen<T1, gen_type>::apply(Mat<typename T1::elem_type>& out) const
arma_debug_sigprint();
// NOTE: we're assuming that the matrix has already been set to the correct size;
// this is done by either the Mat contructor or operator=()
// this is done by either the Mat constructor or operator=()
if(is_same_type<gen_type, gen_zeros>::yes) { out.zeros(); }
else if(is_same_type<gen_type, gen_ones >::yes) { out.ones(); }
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,10 +23,8 @@
//! analog of the Glue class, intended for Cube objects
template<typename T1, typename T2, typename glue_type>
class GlueCube : public BaseCube< typename T1::elem_type, GlueCube<T1, T2, glue_type> >
struct GlueCube : public BaseCube< typename T1::elem_type, GlueCube<T1, T2, glue_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -43,12 +43,10 @@ struct Glue_traits<T1, T2, glue_type, false>
template<typename T1, typename T2, typename glue_type>
class Glue
struct Glue
: public Base< typename T1::elem_type, Glue<T1, T2, glue_type> >
, public Glue_traits<T1, T2, glue_type, has_nested_glue_traits<glue_type>::value>
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+39 -52
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -106,7 +106,12 @@ MapMat<eT>::operator=(const MapMat<eT>& x)
{
arma_debug_sigprint();
if(this == &x) { return; }
if(this == &x)
{
arma_debug_print("MapMat::operator=(): copy omitted");
return;
}
access::rw(n_rows) = x.n_rows;
access::rw(n_cols) = x.n_cols;
@@ -970,18 +975,17 @@ MapMat_val<eT>::operator*=(const eT in_val)
if(it != it_end)
{
if(in_val != eT(0))
{
eT& val = (*it).second;
val *= in_val;
if(val == eT(0)) { map_ref.erase(it); }
}
else
{
map_ref.erase(it);
}
eT& val = (*it).second;
val *= in_val;
if(val == eT(0)) { map_ref.erase(it); }
}
else
{
const eT val = eT(0) * in_val; // in case in_val is inf or nan
if(val != eT(0)) { parent.set_val(index, val); }
}
}
@@ -1009,9 +1013,7 @@ MapMat_val<eT>::operator/=(const eT in_val)
}
else
{
// silly operation, but included for completness
const eT val = eT(0) / in_val;
const eT val = eT(0) / in_val; // in case in_val is zero or nan
if(val != eT(0)) { parent.set_val(index, val); }
}
@@ -1481,18 +1483,11 @@ SpMat_MapMat_val<eT>::mul(const eT in_val)
if(it != it_end)
{
if(in_val != eT(0))
{
eT& val = (*it).second;
val *= in_val;
if(val == eT(0)) { map_ref.erase(it); }
}
else
{
map_ref.erase(it);
}
eT& val = (*it).second;
val *= in_val;
if(val == eT(0)) { map_ref.erase(it); }
s_parent.sync_state = 1;
@@ -1500,19 +1495,15 @@ SpMat_MapMat_val<eT>::mul(const eT in_val)
}
else
{
// element not found, ie. it's zero; zero multiplied by anything is zero, except for nan and inf
if(arma_isfinite(in_val) == false)
const eT result = eT(0) * in_val; // in case in_val is inf or nan
if(result != eT(0))
{
const eT result = eT(0) * in_val;
m_parent.set_val(index, result);
if(result != eT(0)) // paranoia, in case compiling with -ffast-math
{
m_parent.set_val(index, result);
s_parent.sync_state = 1;
access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero();
}
s_parent.sync_state = 1;
access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero();
}
}
}
@@ -1554,19 +1545,15 @@ SpMat_MapMat_val<eT>::div(const eT in_val)
}
else
{
// element not found, ie. it's zero; zero divided by anything is zero, except for zero and nan
if( (in_val == eT(0)) || (arma_isnan(in_val)) )
const eT result = eT(0) / in_val; // in case in_val is zero or nan
if(result != eT(0))
{
const eT result = eT(0) / in_val;
m_parent.set_val(index, result);
if(result != eT(0)) // paranoia, in case compiling with -ffast-math
{
m_parent.set_val(index, result);
s_parent.sync_state = 1;
access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero();
}
s_parent.sync_state = 1;
access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero();
}
}
}
+57 -29
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -99,6 +99,7 @@ class Mat : public Base< eT, Mat<eT> >
inline Mat& operator*=(const eT val);
inline Mat& operator/=(const eT val);
inline Mat(const Mat& m, const arma_vec_indicator&, const uhword in_vec_state);
inline Mat(const Mat& m);
inline Mat& operator= (const Mat& m);
inline Mat& operator+=(const Mat& m);
@@ -107,6 +108,7 @@ class Mat : public Base< eT, Mat<eT> >
inline Mat& operator%=(const Mat& m);
inline Mat& operator/=(const Mat& m);
template<typename T1> inline Mat(const BaseCube<eT,T1>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1> inline Mat(const BaseCube<eT,T1>& X);
template<typename T1> inline Mat& operator= (const BaseCube<eT,T1>& X);
template<typename T1> inline Mat& operator+=(const BaseCube<eT,T1>& X);
@@ -115,11 +117,12 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1> inline Mat& operator%=(const BaseCube<eT,T1>& X);
template<typename T1> inline Mat& operator/=(const BaseCube<eT,T1>& X);
template<typename T1, typename T2>
inline explicit Mat(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);
template<typename T1, typename T2> inline explicit Mat(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename T2> inline explicit Mat(const Base<pod_type,T1>& A, const Base<pod_type,T2>& B);
inline explicit Mat(const subview<eT>& X, const bool use_colmem); // only to be used by the quasi_unwrap class
inline explicit Mat(const subview<eT>& X, const bool reuse_mem); // only to be used by quasi_unwrap and partial_unwrap
inline Mat(const subview<eT>& X, const arma_vec_indicator&, const uhword in_vec_state);
inline Mat(const subview<eT>& X);
inline Mat& operator= (const subview<eT>& X);
inline Mat& operator+=(const subview<eT>& X);
@@ -135,6 +138,7 @@ class Mat : public Base< eT, Mat<eT> >
template<bool do_conj>
inline Mat(const xtrans_mat<eT,do_conj>& X); // xtrans_mat can only be generated by the Proxy class
inline Mat(const subview_cube<eT>& X, const arma_vec_indicator&, const uhword in_vec_state);
inline Mat(const subview_cube<eT>& X);
inline Mat& operator= (const subview_cube<eT>& X);
inline Mat& operator+=(const subview_cube<eT>& X);
@@ -143,6 +147,7 @@ class Mat : public Base< eT, Mat<eT> >
inline Mat& operator%=(const subview_cube<eT>& X);
inline Mat& operator/=(const subview_cube<eT>& X);
inline Mat(const diagview<eT>& X, const arma_vec_indicator&, const uhword in_vec_state);
inline Mat(const diagview<eT>& X);
inline Mat& operator= (const diagview<eT>& X);
inline Mat& operator+=(const diagview<eT>& X);
@@ -151,6 +156,7 @@ class Mat : public Base< eT, Mat<eT> >
inline Mat& operator%=(const diagview<eT>& X);
inline Mat& operator/=(const diagview<eT>& X);
template<typename T1> inline Mat(const subview_elem1<eT,T1>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1> inline Mat(const subview_elem1<eT,T1>& X);
template<typename T1> inline Mat& operator= (const subview_elem1<eT,T1>& X);
template<typename T1> inline Mat& operator+=(const subview_elem1<eT,T1>& X);
@@ -159,6 +165,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1> inline Mat& operator%=(const subview_elem1<eT,T1>& X);
template<typename T1> inline Mat& operator/=(const subview_elem1<eT,T1>& X);
template<typename T1, typename T2> inline Mat(const subview_elem2<eT,T1,T2>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename T2> inline Mat(const subview_elem2<eT,T1,T2>& X);
template<typename T1, typename T2> inline Mat& operator= (const subview_elem2<eT,T1,T2>& X);
template<typename T1, typename T2> inline Mat& operator+=(const subview_elem2<eT,T1,T2>& X);
@@ -168,6 +175,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename T2> inline Mat& operator/=(const subview_elem2<eT,T1,T2>& X);
// Operators on sparse matrices (and subviews)
template<typename T1> inline explicit Mat(const SpBase<eT, T1>& m, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1> inline explicit Mat(const SpBase<eT, T1>& m);
template<typename T1> inline Mat& operator= (const SpBase<eT, T1>& m);
template<typename T1> inline Mat& operator+=(const SpBase<eT, T1>& m);
@@ -176,11 +184,13 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1> inline Mat& operator%=(const SpBase<eT, T1>& m);
template<typename T1> inline Mat& operator/=(const SpBase<eT, T1>& m);
inline explicit Mat(const SpSubview<eT>& X, const arma_vec_indicator&, const uhword in_vec_state);
inline explicit Mat(const SpSubview<eT>& X);
inline Mat& operator= (const SpSubview<eT>& X);
inline Mat& operator+=(const SpSubview<eT>& X);
inline Mat& operator-=(const SpSubview<eT>& X);
inline explicit Mat(const spdiagview<eT>& X, const arma_vec_indicator&, const uhword in_vec_state);
inline explicit Mat(const spdiagview<eT>& X);
inline Mat& operator= (const spdiagview<eT>& X);
inline Mat& operator+=(const spdiagview<eT>& X);
@@ -190,8 +200,8 @@ class Mat : public Base< eT, Mat<eT> >
inline Mat& operator/=(const spdiagview<eT>& X);
arma_frown("use braced initialiser list instead") inline mat_injector<Mat> operator<<(const eT val);
arma_frown("use braced initialiser list instead") inline mat_injector<Mat> operator<<(const injector_end_of_row<>& x);
[[deprecated("use braced initialiser list instead")]] inline mat_injector<Mat> operator<<(const eT val);
[[deprecated("use braced initialiser list instead")]] inline mat_injector<Mat> operator<<(const injector_end_of_row<>& x);
arma_inline subview_row<eT> row(const uword row_num);
@@ -310,8 +320,8 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1> inline void shed_rows(const Base<uword, T1>& indices);
template<typename T1> inline void shed_cols(const Base<uword, T1>& indices);
arma_frown("use insert_rows(row_num, N) instead") inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero);
arma_frown("use insert_cols(col_num, N) instead") inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero);
[[deprecated("use insert_rows(row_num, N) instead")]] inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero);
[[deprecated("use insert_cols(col_num, N) instead")]] inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero);
inline void insert_rows(const uword row_num, const uword N);
inline void insert_cols(const uword col_num, const uword N);
@@ -320,6 +330,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1> inline void insert_cols(const uword col_num, const Base<eT,T1>& X);
template<typename T1, typename gen_type> inline Mat(const Gen<T1, gen_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename gen_type> inline Mat(const Gen<T1, gen_type>& X);
template<typename T1, typename gen_type> inline Mat& operator= (const Gen<T1, gen_type>& X);
template<typename T1, typename gen_type> inline Mat& operator+=(const Gen<T1, gen_type>& X);
@@ -328,6 +339,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename gen_type> inline Mat& operator%=(const Gen<T1, gen_type>& X);
template<typename T1, typename gen_type> inline Mat& operator/=(const Gen<T1, gen_type>& X);
template<typename T1, typename op_type> inline Mat(const Op<T1, op_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename op_type> inline Mat(const Op<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator= (const Op<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator+=(const Op<T1, op_type>& X);
@@ -336,6 +348,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename op_type> inline Mat& operator%=(const Op<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator/=(const Op<T1, op_type>& X);
template<typename T1, typename eop_type> inline Mat(const eOp<T1, eop_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename eop_type> inline Mat(const eOp<T1, eop_type>& X);
template<typename T1, typename eop_type> inline Mat& operator= (const eOp<T1, eop_type>& X);
template<typename T1, typename eop_type> inline Mat& operator+=(const eOp<T1, eop_type>& X);
@@ -344,6 +357,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename eop_type> inline Mat& operator%=(const eOp<T1, eop_type>& X);
template<typename T1, typename eop_type> inline Mat& operator/=(const eOp<T1, eop_type>& X);
template<typename T1, typename op_type> inline Mat(const mtOp<eT, T1, op_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename op_type> inline Mat(const mtOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator= (const mtOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator+=(const mtOp<eT, T1, op_type>& X);
@@ -352,6 +366,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename op_type> inline Mat& operator%=(const mtOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator/=(const mtOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat(const CubeToMatOp<T1, op_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename op_type> inline Mat(const CubeToMatOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator= (const CubeToMatOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator+=(const CubeToMatOp<T1, op_type>& X);
@@ -360,6 +375,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename op_type> inline Mat& operator%=(const CubeToMatOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator/=(const CubeToMatOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat(const SpToDOp<T1, op_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename op_type> inline Mat(const SpToDOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator= (const SpToDOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator+=(const SpToDOp<T1, op_type>& X);
@@ -368,6 +384,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename op_type> inline Mat& operator%=(const SpToDOp<T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator/=(const SpToDOp<T1, op_type>& X);
template<typename T1, typename op_type> inline explicit Mat(const mtSpReduceOp<eT, T1, op_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename op_type> inline explicit Mat(const mtSpReduceOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator= (const mtSpReduceOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator+=(const mtSpReduceOp<eT, T1, op_type>& X);
@@ -376,6 +393,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename op_type> inline Mat& operator%=(const mtSpReduceOp<eT, T1, op_type>& X);
template<typename T1, typename op_type> inline Mat& operator/=(const mtSpReduceOp<eT, T1, op_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat(const Glue<T1, T2, glue_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename T2, typename glue_type> inline Mat(const Glue<T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator= (const Glue<T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator+=(const Glue<T1, T2, glue_type>& X);
@@ -387,6 +405,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename T2> inline Mat& operator+=(const Glue<T1, T2, glue_times>& X);
template<typename T1, typename T2> inline Mat& operator-=(const Glue<T1, T2, glue_times>& X);
template<typename T1, typename T2, typename eglue_type> inline Mat(const eGlue<T1, T2, eglue_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename T2, typename eglue_type> inline Mat(const eGlue<T1, T2, eglue_type>& X);
template<typename T1, typename T2, typename eglue_type> inline Mat& operator= (const eGlue<T1, T2, eglue_type>& X);
template<typename T1, typename T2, typename eglue_type> inline Mat& operator+=(const eGlue<T1, T2, eglue_type>& X);
@@ -395,6 +414,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename T2, typename eglue_type> inline Mat& operator%=(const eGlue<T1, T2, eglue_type>& X);
template<typename T1, typename T2, typename eglue_type> inline Mat& operator/=(const eGlue<T1, T2, eglue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat(const mtGlue<eT, T1, T2, glue_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename T2, typename glue_type> inline Mat(const mtGlue<eT, T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator= (const mtGlue<eT, T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator+=(const mtGlue<eT, T1, T2, glue_type>& X);
@@ -403,6 +423,7 @@ class Mat : public Base< eT, Mat<eT> >
template<typename T1, typename T2, typename glue_type> inline Mat& operator%=(const mtGlue<eT, T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator/=(const mtGlue<eT, T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat(const SpToDGlue<T1, T2, glue_type>& X, const arma_vec_indicator&, const uhword in_vec_state);
template<typename T1, typename T2, typename glue_type> inline Mat(const SpToDGlue<T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator= (const SpToDGlue<T1, T2, glue_type>& X);
template<typename T1, typename T2, typename glue_type> inline Mat& operator+=(const SpToDGlue<T1, T2, glue_type>& X);
@@ -485,7 +506,7 @@ class Mat : public Base< eT, Mat<eT> >
inline Mat& reshape(const uword new_n_rows, const uword new_n_cols);
inline Mat& reshape(const SizeMat& s);
arma_frown("use reshape(n_rows, n_cols) instead") inline void reshape(const uword new_n_rows, const uword new_n_cols, const uword dim); //!< NOTE: don't use this form: it will be removed
[[deprecated("use reshape(n_rows, n_cols) instead")]] inline void reshape(const uword new_n_rows, const uword new_n_cols, const uword dim); //!< NOTE: don't use this form: it will be removed
template<typename functor> inline Mat& for_each(functor F);
@@ -541,11 +562,11 @@ class Mat : public Base< eT, Mat<eT> >
arma_warn_unused inline eT min() const;
arma_warn_unused inline eT max() const;
arma_frown("use .index_min() instead") inline eT min(uword& index_of_min_val) const;
arma_frown("use .index_max() instead") inline eT max(uword& index_of_max_val) const;
[[deprecated("use .index_min() instead")]] inline eT min(uword& index_of_min_val) const;
[[deprecated("use .index_max() instead")]] inline eT max(uword& index_of_max_val) const;
arma_deprecated inline eT min(uword& row_of_min_val, uword& col_of_min_val) const;
arma_deprecated inline eT max(uword& row_of_max_val, uword& col_of_max_val) const;
[[deprecated("use .index_min() with ind2sub() instead")]] inline eT min(uword& row_of_min_val, uword& col_of_min_val) const;
[[deprecated("use .index_max() with ind2sub() instead")]] inline eT max(uword& row_of_max_val, uword& col_of_max_val) const;
arma_cold inline bool save(const std::string name, const file_type type = arma_binary) const;
@@ -558,15 +579,15 @@ class Mat : public Base< eT, Mat<eT> >
arma_cold inline bool load(const csv_name& spec, const file_type type = csv_ascii);
arma_cold inline bool load( std::istream& is, const file_type type = auto_detect);
arma_frown("use save() instead") inline bool quiet_save(const std::string name, const file_type type = arma_binary) const;
arma_frown("use save() instead") inline bool quiet_save(const hdf5_name& spec, const file_type type = hdf5_binary) const;
arma_frown("use save() instead") inline bool quiet_save(const csv_name& spec, const file_type type = csv_ascii) const;
arma_frown("use save() instead") inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save(const std::string name, const file_type type = arma_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save(const hdf5_name& spec, const file_type type = hdf5_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save(const csv_name& spec, const file_type type = csv_ascii) const;
[[deprecated("use save() instead")]] inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
arma_frown("use load() instead") inline bool quiet_load(const std::string name, const file_type type = auto_detect);
arma_frown("use load() instead") inline bool quiet_load(const hdf5_name& spec, const file_type type = hdf5_binary);
arma_frown("use load() instead") inline bool quiet_load(const csv_name& spec, const file_type type = csv_ascii);
arma_frown("use load() instead") inline bool quiet_load( std::istream& is, const file_type type = auto_detect);
[[deprecated("use load() instead")]] inline bool quiet_load(const std::string name, const file_type type = auto_detect);
[[deprecated("use load() instead")]] inline bool quiet_load(const hdf5_name& spec, const file_type type = hdf5_binary);
[[deprecated("use load() instead")]] inline bool quiet_load(const csv_name& spec, const file_type type = csv_ascii);
[[deprecated("use load() instead")]] inline bool quiet_load( std::istream& is, const file_type type = auto_detect);
// for container-like functionality
@@ -801,13 +822,14 @@ class Mat : public Base< eT, Mat<eT> >
friend class Cube<eT>;
friend class subview_cube<eT>;
friend class glue_join;
friend class op_strans;
friend class op_htrans;
friend class op_resize;
friend class op_mean;
friend class op_max;
friend class op_min;
friend struct glue_join;
friend struct op_strans;
friend struct op_htrans;
friend struct op_resize;
friend struct op_mean;
friend struct op_max;
friend struct op_min;
public:
@@ -825,6 +847,8 @@ class Mat<eT>::fixed : public Mat<eT>
{
private:
using Mat<eT>::mem_local;
static constexpr uword fixed_n_elem = fixed_n_rows * fixed_n_cols;
static constexpr bool use_extra = (fixed_n_elem > arma_config::mat_prealloc);
@@ -955,4 +979,8 @@ class Mat_aux
template<typename eT> class Mat_noalias : public Mat<eT> {};
//! @}
File diff suppressed because it is too large Load Diff
+8 -10
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,10 +21,8 @@
template<typename T1, typename op_type>
class OpCube : public BaseCube< typename T1::elem_type, OpCube<T1, op_type> >
struct OpCube : public BaseCube< typename T1::elem_type, OpCube<T1, op_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
@@ -35,11 +33,11 @@ class OpCube : public BaseCube< typename T1::elem_type, OpCube<T1, op_type> >
inline OpCube(const BaseCube<typename T1::elem_type, T1>& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c);
inline ~OpCube();
arma_aligned const T1& m; //!< the operand; must be derived from BaseCube
arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1
arma_aligned uword aux_uword_a; //!< auxiliary data, uword format
arma_aligned uword aux_uword_b; //!< auxiliary data, uword format
arma_aligned uword aux_uword_c; //!< auxiliary data, uword format
const T1& m; //!< the operand; must be derived from BaseCube
elem_type aux; //!< auxiliary data, using the element type as used by T1
uword aux_uword_a; //!< auxiliary data, uword format
uword aux_uword_b; //!< auxiliary data, uword format
uword aux_uword_c; //!< auxiliary data, uword format
};
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+7 -9
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -43,12 +43,10 @@ struct Op_traits<T1, op_type, false>
template<typename T1, typename op_type>
class Op
struct Op
: public Base< typename T1::elem_type, Op<T1, op_type> >
, public Op_traits<T1, op_type, has_nested_op_traits<op_type>::value>
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
@@ -61,10 +59,10 @@ class Op
template<typename eT2>
inline bool is_alias(const Mat<eT2>& X) const;
arma_aligned const T1& m; //!< the operand; must be derived from Base
arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1
arma_aligned uword aux_uword_a; //!< auxiliary data, uword format
arma_aligned uword aux_uword_b; //!< auxiliary data, uword format
const T1& m; //!< the operand; must be derived from Base
elem_type aux; //!< auxiliary data, using the element type as used by T1
uword aux_uword_a; //!< auxiliary data, uword format
uword aux_uword_b; //!< auxiliary data, uword format
};
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+56 -56
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -20,7 +20,7 @@
//! @{
// within each specialisation of the Proxy class:
// within each specialisation of the Proxy struct:
//
// elem_type = type of the elements obtained from object Q
// pod_type = underlying type of elements if elem_type is std::complex
@@ -168,7 +168,7 @@ struct Proxy< Mat<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const Mat<eT>& Q;
const Mat<eT>& Q;
inline explicit Proxy(const Mat<eT>& A)
: Q(A)
@@ -215,7 +215,7 @@ struct Proxy< Col<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const Col<eT>& Q;
const Col<eT>& Q;
inline explicit Proxy(const Col<eT>& A)
: Q(A)
@@ -262,7 +262,7 @@ struct Proxy< Row<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const Row<eT>& Q;
const Row<eT>& Q;
inline explicit Proxy(const Row<eT>& A)
: Q(A)
@@ -309,7 +309,7 @@ struct Proxy< Gen<T1, gen_type> >
static constexpr bool is_col = Gen<T1, gen_type>::is_col;
static constexpr bool is_xvec = Gen<T1, gen_type>::is_xvec;
arma_aligned const Gen<T1, gen_type>& Q;
const Gen<T1, gen_type>& Q;
inline explicit Proxy(const Gen<T1, gen_type>& A)
: Q(A)
@@ -356,7 +356,7 @@ struct Proxy< eOp<T1, eop_type> >
static constexpr bool is_col = eOp<T1, eop_type>::is_col;
static constexpr bool is_xvec = eOp<T1, eop_type>::is_xvec;
arma_aligned const eOp<T1, eop_type>& Q;
const eOp<T1, eop_type>& Q;
inline explicit Proxy(const eOp<T1, eop_type>& A)
: Q(A)
@@ -403,7 +403,7 @@ struct Proxy< eGlue<T1, T2, eglue_type> >
static constexpr bool is_col = eGlue<T1, T2, eglue_type>::is_col;
static constexpr bool is_xvec = eGlue<T1, T2, eglue_type>::is_xvec;
arma_aligned const eGlue<T1, T2, eglue_type>& Q;
const eGlue<T1, T2, eglue_type>& Q;
inline explicit Proxy(const eGlue<T1, T2, eglue_type>& A)
: Q(A)
@@ -450,7 +450,7 @@ struct Proxy< Op<T1, op_type> >
static constexpr bool is_col = Op<T1, op_type>::is_col;
static constexpr bool is_xvec = Op<T1, op_type>::is_xvec;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy(const Op<T1, op_type>& A)
: Q(A)
@@ -497,7 +497,7 @@ struct Proxy< Glue<T1, T2, glue_type> >
static constexpr bool is_col = Glue<T1, T2, glue_type>::is_col;
static constexpr bool is_xvec = Glue<T1, T2, glue_type>::is_xvec;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy(const Glue<T1, T2, glue_type>& A)
: Q(A)
@@ -547,9 +547,9 @@ struct Proxy< Glue<T1, T2, glue_min> >
static constexpr bool is_col = this_Glue_type::is_col;
static constexpr bool is_xvec = this_Glue_type::is_xvec;
arma_aligned const this_Glue_type& Q;
arma_aligned const Proxy<T1> P1;
arma_aligned const Proxy<T2> P2;
const this_Glue_type& Q;
const Proxy<T1> P1;
const Proxy<T2> P2;
arma_lt_comparator<elem_type> comparator;
@@ -605,9 +605,9 @@ struct Proxy< Glue<T1, T2, glue_max> >
static constexpr bool is_col = this_Glue_type::is_col;
static constexpr bool is_xvec = this_Glue_type::is_xvec;
arma_aligned const this_Glue_type& Q;
arma_aligned const Proxy<T1> P1;
arma_aligned const Proxy<T2> P2;
const this_Glue_type& Q;
const Proxy<T1> P1;
const Proxy<T2> P2;
arma_gt_comparator<elem_type> comparator;
@@ -660,7 +660,7 @@ struct Proxy< mtOp<out_eT, T1, op_type> >
static constexpr bool is_col = mtOp<out_eT, T1, op_type>::is_col;
static constexpr bool is_xvec = mtOp<out_eT, T1, op_type>::is_xvec;
arma_aligned const Mat<out_eT> Q;
const Mat<out_eT> Q;
inline explicit Proxy(const mtOp<out_eT, T1, op_type>& A)
: Q(A)
@@ -707,7 +707,7 @@ struct Proxy< mtGlue<out_eT, T1, T2, glue_type> >
static constexpr bool is_col = mtGlue<out_eT, T1, T2, glue_type>::is_col;
static constexpr bool is_xvec = mtGlue<out_eT, T1, T2, glue_type>::is_xvec;
arma_aligned const Mat<out_eT> Q;
const Mat<out_eT> Q;
inline explicit Proxy(const mtGlue<out_eT, T1, T2, glue_type>& A)
: Q(A)
@@ -754,7 +754,7 @@ struct Proxy< CubeToMatOp<T1, op_type> >
static constexpr bool is_col = CubeToMatOp<T1, op_type>::is_col;
static constexpr bool is_xvec = CubeToMatOp<T1, op_type>::is_xvec;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy(const CubeToMatOp<T1, op_type>& A)
: Q(A)
@@ -801,8 +801,8 @@ struct Proxy< CubeToMatOp<T1, op_vectorise_cube_col> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const unwrap_cube<T1> U;
arma_aligned const Mat<elem_type> Q;
const unwrap_cube<T1> U;
const Mat<elem_type> Q;
inline explicit Proxy(const CubeToMatOp<T1, op_vectorise_cube_col>& A)
: U(A.m)
@@ -850,7 +850,7 @@ struct Proxy< SpToDOp<T1, op_type> >
static constexpr bool is_col = SpToDOp<T1, op_type>::is_col;
static constexpr bool is_xvec = SpToDOp<T1, op_type>::is_xvec;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy(const SpToDOp<T1, op_type>& A)
: Q(A)
@@ -897,8 +897,8 @@ struct Proxy< SpToDOp<SpMat<eT>, op_sp_nonzeros> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const SpMat<elem_type>& R;
arma_aligned const Mat<elem_type> Q;
const SpMat<elem_type>& R;
const Mat<elem_type> Q;
inline explicit Proxy(const SpToDOp<SpMat<eT>, op_sp_nonzeros>& A)
: R(A.m)
@@ -946,7 +946,7 @@ struct Proxy< SpToDGlue<T1, T2, glue_type> >
static constexpr bool is_col = SpToDGlue<T1, T2, glue_type>::is_col;
static constexpr bool is_xvec = SpToDGlue<T1, T2, glue_type>::is_xvec;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy(const SpToDGlue<T1, T2, glue_type>& A)
: Q(A)
@@ -993,7 +993,7 @@ struct Proxy< subview<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const subview<eT>& Q;
const subview<eT>& Q;
inline explicit Proxy(const subview<eT>& A)
: Q(A)
@@ -1040,7 +1040,7 @@ struct Proxy< subview_col<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_col<eT>& Q;
const subview_col<eT>& Q;
inline explicit Proxy(const subview_col<eT>& A)
: Q(A)
@@ -1087,8 +1087,8 @@ struct Proxy< subview_cols<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const subview_cols<eT>& sv;
arma_aligned const Mat<eT> Q;
const subview_cols<eT>& sv;
const Mat<eT> Q;
inline explicit Proxy(const subview_cols<eT>& A)
: sv(A)
@@ -1136,7 +1136,7 @@ struct Proxy< subview_row<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const subview_row<eT>& Q;
const subview_row<eT>& Q;
inline explicit Proxy(const subview_row<eT>& A)
: Q(A)
@@ -1183,8 +1183,8 @@ struct Proxy< subview_elem1<eT,T1> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_elem1<eT,T1>& Q;
arma_aligned const Proxy<T1> R;
const subview_elem1<eT,T1>& Q;
const Proxy<T1> R;
inline explicit Proxy(const subview_elem1<eT,T1>& A)
: Q(A)
@@ -1237,7 +1237,7 @@ struct Proxy< subview_elem2<eT,T1,T2> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const Mat<eT> Q;
const Mat<eT> Q;
inline explicit Proxy(const subview_elem2<eT,T1,T2>& A)
: Q(A)
@@ -1284,7 +1284,7 @@ struct Proxy< diagview<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const diagview<eT>& Q;
const diagview<eT>& Q;
inline explicit Proxy(const diagview<eT>& A)
: Q(A)
@@ -1339,8 +1339,8 @@ struct Proxy_diagvec_mat< Op<T1, op_diagvec> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const Mat<elem_type>& R;
arma_aligned const diagview<elem_type> Q;
const Mat<elem_type>& R;
const diagview<elem_type> Q;
inline explicit Proxy_diagvec_mat(const Op<T1, op_diagvec>& A)
: R(A.m), Q( R.diag() )
@@ -1395,7 +1395,7 @@ struct Proxy_diagvec_expr< Op<T1, op_diagvec> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy_diagvec_expr(const Op<T1, op_diagvec>& A)
: Q(A)
@@ -1468,7 +1468,7 @@ struct Proxy< Op<T1, op_diagvec2> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const Mat<elem_type> Q;
const Mat<elem_type> Q;
inline explicit Proxy(const Op<T1, op_diagvec2>& A)
: Q(A)
@@ -1614,8 +1614,8 @@ struct Proxy_xtrans_vector< Op<T1, op_htrans> >
static constexpr bool is_col = Op<T1, op_htrans>::is_col;
static constexpr bool is_xvec = Op<T1, op_htrans>::is_xvec;
arma_aligned const quasi_unwrap<T1> U; // avoid copy if T1 is a Row, Col or subview_col
arma_aligned const Mat<elem_type> Q;
const quasi_unwrap<T1> U; // avoid copy if T1 is a Row, Col or subview_col
const Mat<elem_type> Q;
inline Proxy_xtrans_vector(const Op<T1, op_htrans>& A)
: U(A.m)
@@ -1656,8 +1656,8 @@ struct Proxy_xtrans_vector< Op<T1, op_strans> >
static constexpr bool is_col = Op<T1, op_strans>::is_col;
static constexpr bool is_xvec = Op<T1, op_strans>::is_xvec;
arma_aligned const quasi_unwrap<T1> U; // avoid copy if T1 is a Row, Col or subview_col
arma_aligned const Mat<elem_type> Q;
const quasi_unwrap<T1> U; // avoid copy if T1 is a Row, Col or subview_col
const Mat<elem_type> Q;
inline Proxy_xtrans_vector(const Op<T1, op_strans>& A)
: U(A.m)
@@ -1832,7 +1832,7 @@ struct Proxy_subview_row_htrans_cx
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_row_htrans<eT> Q;
const subview_row_htrans<eT> Q;
inline explicit Proxy_subview_row_htrans_cx(const Op<subview_row<eT>, op_htrans>& A)
: Q(A.m)
@@ -1866,7 +1866,7 @@ struct Proxy_subview_row_htrans_non_cx
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_row_strans<eT> Q;
const subview_row_strans<eT> Q;
inline explicit Proxy_subview_row_htrans_non_cx(const Op<subview_row<eT>, op_htrans>& A)
: Q(A.m)
@@ -1973,7 +1973,7 @@ struct Proxy< Op<subview_row<eT>, op_strans> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_row_strans<eT> Q;
const subview_row_strans<eT> Q;
inline explicit Proxy(const Op<subview_row<eT>, op_strans>& A)
: Q(A.m)
@@ -2174,8 +2174,8 @@ struct Proxy< Op<T1, op_htrans2> >
static constexpr bool is_col = eOp< Op<T1, op_htrans>, eop_scalar_times>::is_col;
static constexpr bool is_xvec = eOp< Op<T1, op_htrans>, eop_scalar_times>::is_xvec;
arma_aligned const Op<T1, op_htrans> R;
arma_aligned const eOp< Op<T1, op_htrans>, eop_scalar_times > Q;
const Op<T1, op_htrans> R;
const eOp< Op<T1, op_htrans>, eop_scalar_times > Q;
inline explicit Proxy(const Op<T1, op_htrans2>& A)
: R(A.m)
@@ -2223,7 +2223,7 @@ struct Proxy< subview_row_strans<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_row_strans<eT>& Q;
const subview_row_strans<eT>& Q;
inline explicit Proxy(const subview_row_strans<eT>& A)
: Q(A)
@@ -2270,7 +2270,7 @@ struct Proxy< subview_row_htrans<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const subview_row_htrans<eT>& Q;
const subview_row_htrans<eT>& Q;
inline explicit Proxy(const subview_row_htrans<eT>& A)
: Q(A)
@@ -2317,7 +2317,7 @@ struct Proxy< xtrans_mat<eT, do_conj> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const Mat<eT> Q;
const Mat<eT> Q;
inline explicit Proxy(const xtrans_mat<eT, do_conj>& A)
: Q(A)
@@ -2364,7 +2364,7 @@ struct Proxy< xvec_htrans<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = true;
arma_aligned const Mat<eT> Q;
const Mat<eT> Q;
inline explicit Proxy(const xvec_htrans<eT>& A)
: Q(A)
@@ -2419,8 +2419,8 @@ struct Proxy_vectorise_col_mat< Op<T1, op_vectorise_col> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const unwrap<T1> U;
arma_aligned const Mat<elem_type> Q;
const unwrap<T1> U;
const Mat<elem_type> Q;
inline explicit Proxy_vectorise_col_mat(const Op<T1, op_vectorise_col>& A)
: U(A.m)
@@ -2476,8 +2476,8 @@ struct Proxy_vectorise_col_expr< Op<T1, op_vectorise_col> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const Op<T1, op_vectorise_col>& Q;
arma_aligned const Proxy<T1> R;
const Op<T1, op_vectorise_col>& Q;
const Proxy<T1> R;
inline explicit Proxy_vectorise_col_expr(const Op<T1, op_vectorise_col>& A)
: Q(A)
+12 -12
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -48,7 +48,7 @@ struct ProxyCube< Cube<eT> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const Cube<eT>& Q;
const Cube<eT>& Q;
inline explicit ProxyCube(const Cube<eT>& A)
: Q(A)
@@ -93,7 +93,7 @@ struct ProxyCube< GenCube<eT, gen_type> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const GenCube<eT, gen_type>& Q;
const GenCube<eT, gen_type>& Q;
inline explicit ProxyCube(const GenCube<eT, gen_type>& A)
: Q(A)
@@ -138,7 +138,7 @@ struct ProxyCube< OpCube<T1, op_type> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const Cube<elem_type> Q;
const Cube<elem_type> Q;
inline explicit ProxyCube(const OpCube<T1, op_type>& A)
: Q(A)
@@ -183,7 +183,7 @@ struct ProxyCube< GlueCube<T1, T2, glue_type> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const Cube<elem_type> Q;
const Cube<elem_type> Q;
inline explicit ProxyCube(const GlueCube<T1, T2, glue_type>& A)
: Q(A)
@@ -228,7 +228,7 @@ struct ProxyCube< subview_cube<eT> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = true;
arma_aligned const subview_cube<eT>& Q;
const subview_cube<eT>& Q;
inline explicit ProxyCube(const subview_cube<eT>& A)
: Q(A)
@@ -273,7 +273,7 @@ struct ProxyCube< subview_cube_slices<eT,T1> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const Cube<eT> Q;
const Cube<eT> Q;
inline explicit ProxyCube(const subview_cube_slices<eT,T1>& A)
: Q(A)
@@ -318,7 +318,7 @@ struct ProxyCube< eOpCube<T1, eop_type > >
static constexpr bool use_mp = eOpCube<T1, eop_type>::use_mp;
static constexpr bool has_subview = eOpCube<T1, eop_type>::has_subview;
arma_aligned const eOpCube<T1, eop_type>& Q;
const eOpCube<T1, eop_type>& Q;
inline explicit ProxyCube(const eOpCube<T1, eop_type>& A)
: Q(A)
@@ -363,7 +363,7 @@ struct ProxyCube< eGlueCube<T1, T2, eglue_type > >
static constexpr bool use_mp = eGlueCube<T1, T2, eglue_type>::use_mp;
static constexpr bool has_subview = eGlueCube<T1, T2, eglue_type>::has_subview;
arma_aligned const eGlueCube<T1, T2, eglue_type>& Q;
const eGlueCube<T1, T2, eglue_type>& Q;
inline explicit ProxyCube(const eGlueCube<T1, T2, eglue_type>& A)
: Q(A)
@@ -408,7 +408,7 @@ struct ProxyCube< mtOpCube<out_eT, T1, op_type> >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const Cube<out_eT> Q;
const Cube<out_eT> Q;
inline explicit ProxyCube(const mtOpCube<out_eT, T1, op_type>& A)
: Q(A)
@@ -453,7 +453,7 @@ struct ProxyCube< mtGlueCube<out_eT, T1, T2, glue_type > >
static constexpr bool use_mp = false;
static constexpr bool has_subview = false;
arma_aligned const Cube<out_eT> Q;
const Cube<out_eT> Q;
inline explicit ProxyCube(const mtGlueCube<out_eT, T1, T2, glue_type>& A)
: Q(A)
+15 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -91,7 +91,7 @@ class Row : public Mat<eT>
inline Row(const subview_cube<eT>& X);
inline Row& operator=(const subview_cube<eT>& X);
arma_frown("use braced initialiser list instead") inline mat_injector<Row> operator<<(const eT val);
[[deprecated("use braced initialiser list instead")]] inline mat_injector<Row> operator<<(const eT val);
arma_warn_unused arma_inline const Op<Row<eT>,op_htrans> t() const;
arma_warn_unused arma_inline const Op<Row<eT>,op_htrans> ht() const;
@@ -141,8 +141,8 @@ class Row : public Mat<eT>
template<typename T1> inline void shed_cols(const Base<uword, T1>& indices);
arma_deprecated inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero);
inline void insert_cols(const uword col_num, const uword N);
[[deprecated]] inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero);
inline void insert_cols(const uword col_num, const uword N);
template<typename T1> inline void insert_cols(const uword col_num, const Base<eT,T1>& X);
@@ -154,6 +154,11 @@ class Row : public Mat<eT>
arma_warn_unused arma_inline const eT& at(const uword in_row, const uword in_col) const;
inline constexpr bool is_vec() const { return true; }
inline constexpr bool is_rowvec() const { return true; }
inline constexpr bool is_colvec() const { return false; }
typedef eT* row_iterator;
typedef const eT* const_row_iterator;
@@ -164,6 +169,9 @@ class Row : public Mat<eT>
inline const_row_iterator end_row (const uword row_num) const;
inline explicit Row(const subview<eT>& X, const bool reuse_mem); // only to be used by the partial_unwrap class
template<uword fixed_n_elem> class fixed;
@@ -187,6 +195,8 @@ class Row<eT>::fixed : public Row<eT>
{
private:
using Mat<eT>::mem_local;
static constexpr bool use_extra = (fixed_n_elem > arma_config::mat_prealloc);
arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ];
+35 -30
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -521,11 +521,9 @@ template<typename eT>
template<typename T1>
inline
Row<eT>::Row(const Base<eT,T1>& X)
: Mat<eT>(arma_vec_indicator(), 2)
: Mat<eT>(X.get_ref(), arma_vec_indicator(), 2)
{
arma_debug_sigprint();
Mat<eT>::operator=(X.get_ref());
arma_debug_sigprint_this(this);
}
@@ -549,11 +547,9 @@ template<typename eT>
template<typename T1>
inline
Row<eT>::Row(const SpBase<eT,T1>& X)
: Mat<eT>(arma_vec_indicator(), 2)
: Mat<eT>(X.get_ref(), arma_vec_indicator(), 2)
{
arma_debug_sigprint();
Mat<eT>::operator=(X.get_ref());
arma_debug_sigprint_this(this);
}
@@ -607,12 +603,9 @@ Row<eT>::Row
const Base<typename Row<eT>::pod_type, T1>& A,
const Base<typename Row<eT>::pod_type, T2>& B
)
: Mat<eT>(A.get_ref(), B.get_ref(), arma_vec_indicator(), 2)
{
arma_debug_sigprint();
access::rw(Mat<eT>::vec_state) = 2;
Mat<eT>::init(A,B);
arma_debug_sigprint_this(this);
}
@@ -621,12 +614,9 @@ template<typename eT>
template<typename T1>
inline
Row<eT>::Row(const BaseCube<eT,T1>& X)
: Mat<eT>(X.get_ref(), arma_vec_indicator(), 2)
{
arma_debug_sigprint();
access::rw(Mat<eT>::vec_state) = 2;
Mat<eT>::operator=(X);
arma_debug_sigprint_this(this);
}
@@ -649,12 +639,9 @@ Row<eT>::operator=(const BaseCube<eT,T1>& X)
template<typename eT>
inline
Row<eT>::Row(const subview_cube<eT>& X)
: Mat<eT>(X, arma_vec_indicator(), 2)
{
arma_debug_sigprint();
access::rw(Mat<eT>::vec_state) = 2;
Mat<eT>::operator=(X);
arma_debug_sigprint_this(this);
}
@@ -1277,6 +1264,20 @@ Row<eT>::end_row(const uword row_num) const
template<typename eT>
inline
Row<eT>::Row(const subview<eT>& X, const bool reuse_mem)
: Mat<eT>(X, reuse_mem)
{
arma_debug_sigprint_this(this);
}
//
template<typename eT>
template<uword fixed_n_elem>
arma_inline
@@ -1345,11 +1346,11 @@ Row<eT>::fixed<fixed_n_elem>::fixed(const fill::fill_class<fill_type>&)
{
arma_debug_sigprint_this(this);
if(is_same_type<fill_type, fill::fill_zeros>::yes) { (*this).zeros(); }
if(is_same_type<fill_type, fill::fill_ones >::yes) { (*this).ones(); }
if(is_same_type<fill_type, fill::fill_eye >::yes) { (*this).eye(); }
if(is_same_type<fill_type, fill::fill_randu>::yes) { (*this).randu(); }
if(is_same_type<fill_type, fill::fill_randn>::yes) { (*this).randn(); }
if(is_same_type<fill_type, fill::fill_zeros>::yes) { (*this).zeros(); }
if(is_same_type<fill_type, fill::fill_ones >::yes) { (*this).ones(); }
if(is_same_type<fill_type, fill::fill_eye >::yes) { Mat<eT>::eye(); }
if(is_same_type<fill_type, fill::fill_randu>::yes) { Mat<eT>::randu(); }
if(is_same_type<fill_type, fill::fill_randn>::yes) { Mat<eT>::randn(); }
}
@@ -1872,6 +1873,10 @@ Row<eT>::fixed<fixed_n_elem>::ones()
//
template<typename eT>
inline
Row<eT>::Row(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem)
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,10 +21,8 @@
class SizeCube
struct SizeCube
{
public:
const uword n_rows;
const uword n_cols;
const uword n_slices;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,10 +21,8 @@
class SizeMat
struct SizeMat
{
public:
const uword n_rows;
const uword n_cols;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+6 -6
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -76,11 +76,11 @@ struct SpBase
arma_warn_unused inline elem_type min() const;
arma_warn_unused inline elem_type max() const;
arma_frown("use .index_min() instead") inline elem_type min(uword& index_of_min_val) const;
arma_frown("use .index_max() instead") inline elem_type max(uword& index_of_max_val) const;
[[deprecated("use .index_min() instead")]] inline elem_type min(uword& index_of_min_val) const;
[[deprecated("use .index_max() instead")]] inline elem_type max(uword& index_of_max_val) const;
arma_deprecated inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const;
arma_deprecated inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const;
[[deprecated("use .index_min() with ind2sub() instead")]] inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const;
[[deprecated("use .index_max() with ind2sub() instead")]] inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const;
arma_warn_unused inline uword index_min() const;
arma_warn_unused inline uword index_max() const;
+4 -4
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -748,7 +748,7 @@ SpBase<elem_type,derived>::is_finite() const
while(it != it_end)
{
if(arma_isfinite(*it) == false) { return false; }
if(arma_isnonfinite(*it)) { return false; }
++it;
}
}
@@ -850,7 +850,7 @@ SpBase<elem_type,derived>::has_nonfinite() const
while(it != it_end)
{
if(arma_isfinite(*it) == false) { return true; }
if(arma_isnonfinite(*it)) { return true; }
++it;
}
}
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,10 +22,8 @@
template<typename T1, typename T2, typename spglue_type>
class SpGlue : public SpBase< typename T1::elem_type, SpGlue<T1, T2, spglue_type> >
struct SpGlue : public SpBase< typename T1::elem_type, SpGlue<T1, T2, spglue_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+10 -6
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -399,11 +399,11 @@ class SpMat : public SpBase< eT, SpMat<eT> >
arma_cold inline bool load(const csv_name& spec, const file_type type = csv_ascii);
arma_cold inline bool load( std::istream& is, const file_type type = arma_binary);
arma_frown("use save() instead") inline bool quiet_save(const std::string name, const file_type type = arma_binary) const;
arma_frown("use save() instead") inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save(const std::string name, const file_type type = arma_binary) const;
[[deprecated("use save() instead")]] inline bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
arma_frown("use load() instead") inline bool quiet_load(const std::string name, const file_type type = arma_binary);
arma_frown("use load() instead") inline bool quiet_load( std::istream& is, const file_type type = arma_binary);
[[deprecated("use load() instead")]] inline bool quiet_load(const std::string name, const file_type type = arma_binary);
[[deprecated("use load() instead")]] inline bool quiet_load( std::istream& is, const file_type type = arma_binary);
@@ -741,6 +741,10 @@ class SpMat_aux
template<typename eT> class SpMat_noalias : public SpMat<eT> {};
#define ARMA_HAS_SPMAT
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+33 -35
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -612,33 +612,26 @@ SpMat<eT>::operator*=(const eT val)
{
arma_debug_sigprint();
if(val != eT(0))
sync_csc();
invalidate_cache();
const uword n_nz = n_nonzero;
eT* vals = access::rwp(values);
bool has_zero = false;
for(uword i=0; i<n_nz; ++i)
{
sync_csc();
invalidate_cache();
eT& vals_i = vals[i];
const uword n_nz = n_nonzero;
vals_i *= val;
eT* vals = access::rwp(values);
bool has_zero = false;
for(uword i=0; i<n_nz; ++i)
{
eT& vals_i = vals[i];
vals_i *= val;
if(vals_i == eT(0)) { has_zero = true; }
}
if(has_zero) { remove_zeros(); }
}
else
{
(*this).zeros();
if(vals_i == eT(0)) { has_zero = true; }
}
if(has_zero) { remove_zeros(); }
return *this;
}
@@ -1673,7 +1666,7 @@ SpMat<eT>::SpMat(const SpOp<T1, spop_type>& X)
arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));
spop_type::apply(*this, X);
spop_type::apply(static_cast< SpMat_noalias<eT>& >(*this), X);
sync_csc(); // in case apply() used element accessors
invalidate_cache(); // in case apply() modified the CSC representation
@@ -1813,7 +1806,7 @@ SpMat<eT>::SpMat(const SpGlue<T1, T2, spglue_type>& X)
arma_type_check(( is_same_type< eT, typename T1::elem_type >::no ));
spglue_type::apply(*this, X);
spglue_type::apply(static_cast< SpMat_noalias<eT>& >(*this), X);
sync_csc(); // in case apply() used element accessors
invalidate_cache(); // in case apply() modified the CSC representation
@@ -3126,7 +3119,7 @@ SpMat<eT>::shed_rows(const uword in_row1, const uword in_row2)
arma_conform_check_bounds
(
(in_row1 > in_row2) || (in_row2 >= n_rows),
"SpMat::shed_rows(): indices out of bounds or incorectly used"
"SpMat::shed_rows(): indices out of bounds or incorrectly used"
);
sync_csc();
@@ -3288,7 +3281,7 @@ SpMat<eT>::shed_cols(const uword in_col1, const uword in_col2)
/**
* Element access; acces the i'th element (works identically to the Mat accessors).
* Element access; access the i'th element (works identically to the Mat accessors).
* If there is nothing at element i, 0 is returned.
*/
@@ -3484,7 +3477,7 @@ SpMat<eT>::is_colvec() const
//! returns true if the object has the same number of non-zero rows and columnns
//! returns true if the object has the same number of non-zero rows and columns
template<typename eT>
arma_inline
bool
@@ -5131,7 +5124,12 @@ SpMat<eT>::init(const SpMat<eT>& x)
{
arma_debug_sigprint();
if(this == &x) { return; }
if(this == &x)
{
arma_debug_print("SpMat::init(): copy omitted");
return;
}
bool init_done = false;
@@ -5202,7 +5200,7 @@ SpMat<eT>::init(const MapMat<eT>& x)
const uword x_index = x_entry.first;
const eT x_val = x_entry.second;
// have we gone past the curent column?
// have we gone past the current column?
if(x_index >= x_col_index_endp1)
{
x_col = x_index / x_n_rows;
@@ -5481,7 +5479,7 @@ SpMat<eT>::init_batch_add(const Mat<uword>& locs, const Mat<eT>& vals, const boo
uvec sorted_indices = sort_index(abslocs); // Ascending sort.
// work out the number of unique elments
// work out the number of unique elements
uword n_unique = 1; // first element is unique
for(uword i=1; i < sorted_indices.n_elem; ++i)
@@ -5536,7 +5534,7 @@ SpMat<eT>::init_batch_add(const Mat<uword>& locs, const Mat<eT>& vals, const boo
if( (sort_locations == false) || (actually_sorted == true) )
{
// work out the number of unique elments
// work out the number of unique elements
uword n_unique = 1; // first element is unique
for(uword i=1; i < locs.n_cols; ++i)
@@ -5918,7 +5916,7 @@ SpMat<eT>::init_xform_mt(const SpBase<eT2,T1>& A, const Functor& func)
{
eT& t_values_i = t_values[i];
t_values_i = func(x_values[i]); // NOTE: func() must produce a value of type eT (ie. act as a convertor between eT2 and eT)
t_values_i = func(x_values[i]); // NOTE: func() must produce a value of type eT (ie. act as a converter between eT2 and eT)
if(t_values_i == eT(0)) { has_zero = true; }
}
@@ -5936,7 +5934,7 @@ SpMat<eT>::init_xform_mt(const SpBase<eT2,T1>& A, const Functor& func)
while(it != it_end)
{
const eT val = func(*it); // NOTE: func() must produce a value of type eT (ie. act as a convertor between eT2 and eT)
const eT val = func(*it); // NOTE: func() must produce a value of type eT (ie. act as a converter between eT2 and eT)
if(val == eT(0)) { has_zero = true; }
+7 -9
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,10 +22,8 @@
template<typename T1, typename op_type>
class SpOp : public SpBase< typename T1::elem_type, SpOp<T1, op_type> >
struct SpOp : public SpBase< typename T1::elem_type, SpOp<T1, op_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
@@ -40,10 +38,10 @@ class SpOp : public SpBase< typename T1::elem_type, SpOp<T1, op_type> >
arma_inline bool is_alias(const SpMat<elem_type>& X) const;
arma_aligned const T1& m; //!< the operand; must be derived from SpBase
arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1
arma_aligned uword aux_uword_a; //!< auxiliary data, uword format
arma_aligned uword aux_uword_b; //!< auxiliary data, uword format
const T1& m; //!< the operand; must be derived from SpBase
elem_type aux; //!< auxiliary data, using the element type as used by T1
uword aux_uword_a; //!< auxiliary data, uword format
uword aux_uword_b; //!< auxiliary data, uword format
};
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+37 -37
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,7 +23,7 @@
// TODO: clarify and check which variables and functions are valid when 'use_iterator' is either true or false
// within each specialisation of the Proxy class:
// within each specialisation of the SpProxy struct:
//
// elem_type = type of the elements obtained from object Q
// pod_type = underlying type of elements if elem_type is std::complex
@@ -71,42 +71,42 @@ struct SpProxy< SpMat<eT> >
typedef eT elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
typedef SpMat<eT> stored_type;
typedef typename SpMat<eT>::const_iterator const_iterator_type;
typedef typename SpMat<eT>::const_row_iterator const_row_iterator_type;
static constexpr bool use_iterator = false;
static constexpr bool Q_is_generated = false;
static constexpr bool is_row = false;
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const SpMat<eT>& Q;
const SpMat<eT>& Q;
inline explicit SpProxy(const SpMat<eT>& A)
: Q(A)
{
arma_debug_sigprint();
Q.sync();
}
arma_inline uword get_n_rows() const { return Q.n_rows; }
arma_inline uword get_n_cols() const { return Q.n_cols; }
arma_inline uword get_n_elem() const { return Q.n_elem; }
arma_inline uword get_n_nonzero() const { return Q.n_nonzero; }
arma_inline elem_type operator[](const uword i) const { return Q[i]; }
arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
arma_inline const eT* get_values() const { return Q.values; }
arma_inline const uword* get_row_indices() const { return Q.row_indices; }
arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; }
arma_inline const_iterator_type begin() const { return Q.begin(); }
arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); }
arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }
arma_inline const_iterator_type end() const { return Q.end(); }
arma_inline const_row_iterator_type end_row() const { return Q.end_row(); }
arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }
@@ -134,7 +134,7 @@ struct SpProxy< SpCol<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const SpCol<eT>& Q;
const SpCol<eT>& Q;
inline explicit SpProxy(const SpCol<eT>& A)
: Q(A)
@@ -186,7 +186,7 @@ struct SpProxy< SpRow<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const SpRow<eT>& Q;
const SpRow<eT>& Q;
inline explicit SpProxy(const SpRow<eT>& A)
: Q(A)
@@ -227,42 +227,42 @@ struct SpProxy< SpSubview<eT> >
typedef eT elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
typedef SpSubview<eT> stored_type;
typedef typename SpSubview<eT>::const_iterator const_iterator_type;
typedef typename SpSubview<eT>::const_row_iterator const_row_iterator_type;
static constexpr bool use_iterator = true;
static constexpr bool Q_is_generated = false;
static constexpr bool is_row = false;
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const SpSubview<eT>& Q;
const SpSubview<eT>& Q;
inline explicit SpProxy(const SpSubview<eT>& A)
: Q(A)
{
arma_debug_sigprint();
Q.m.sync();
}
arma_inline uword get_n_rows() const { return Q.n_rows; }
arma_inline uword get_n_cols() const { return Q.n_cols; }
arma_inline uword get_n_elem() const { return Q.n_elem; }
arma_inline uword get_n_nonzero() const { return Q.n_nonzero; }
arma_inline elem_type operator[](const uword i) const { return Q[i]; }
arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
arma_inline const eT* get_values() const { return Q.m.values; }
arma_inline const uword* get_row_indices() const { return Q.m.row_indices; }
arma_inline const uword* get_col_ptrs() const { return Q.m.col_ptrs; }
arma_inline const_iterator_type begin() const { return Q.begin(); }
arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); }
arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); }
arma_inline const_iterator_type end() const { return Q.end(); }
arma_inline const_row_iterator_type end_row() const { return Q.end_row(); }
arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); }
@@ -290,7 +290,7 @@ struct SpProxy< SpSubview_col<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const SpSubview_col<eT>& Q;
const SpSubview_col<eT>& Q;
inline explicit SpProxy(const SpSubview_col<eT>& A)
: Q(A)
@@ -342,7 +342,7 @@ struct SpProxy< SpSubview_col_list<eT,T1> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const SpMat<eT> Q;
const SpMat<eT> Q;
inline explicit SpProxy(const SpSubview_col_list<eT,T1>& A)
: Q(A)
@@ -385,7 +385,7 @@ struct SpProxy< SpSubview_row<eT> >
typedef typename SpSubview<eT>::const_iterator const_iterator_type;
typedef typename SpSubview<eT>::const_row_iterator const_row_iterator_type;
static constexpr bool use_iterator = true;
static constexpr bool Q_is_generated = false;
@@ -393,7 +393,7 @@ struct SpProxy< SpSubview_row<eT> >
static constexpr bool is_col = false;
static constexpr bool is_xvec = false;
arma_aligned const SpSubview_row<eT>& Q;
const SpSubview_row<eT>& Q;
inline explicit SpProxy(const SpSubview_row<eT>& A)
: Q(A)
@@ -445,7 +445,7 @@ struct SpProxy< spdiagview<eT> >
static constexpr bool is_col = true;
static constexpr bool is_xvec = false;
arma_aligned const SpMat<eT> Q;
const SpMat<eT> Q;
inline explicit SpProxy(const spdiagview<eT>& A)
: Q(A)
@@ -497,7 +497,7 @@ struct SpProxy< SpOp<T1, spop_type> >
static constexpr bool is_col = SpOp<T1, spop_type>::is_col;
static constexpr bool is_xvec = SpOp<T1, spop_type>::is_xvec;
arma_aligned const SpMat<eT> Q;
const SpMat<eT> Q;
inline explicit SpProxy(const SpOp<T1, spop_type>& A)
: Q(A)
@@ -549,7 +549,7 @@ struct SpProxy< SpGlue<T1, T2, spglue_type> >
static constexpr bool is_col = SpGlue<T1, T2, spglue_type>::is_col;
static constexpr bool is_xvec = SpGlue<T1, T2, spglue_type>::is_xvec;
arma_aligned const SpMat<eT> Q;
const SpMat<eT> Q;
inline explicit SpProxy(const SpGlue<T1, T2, spglue_type>& A)
: Q(A)
@@ -600,7 +600,7 @@ struct SpProxy< mtSpOp<out_eT, T1, spop_type> >
static constexpr bool is_col = mtSpOp<out_eT, T1, spop_type>::is_col;
static constexpr bool is_xvec = mtSpOp<out_eT, T1, spop_type>::is_xvec;
arma_aligned const SpMat<out_eT> Q;
const SpMat<out_eT> Q;
inline explicit SpProxy(const mtSpOp<out_eT, T1, spop_type>& A)
: Q(A)
@@ -651,7 +651,7 @@ struct SpProxy< mtSpGlue<out_eT, T1, T2, spglue_type> >
static constexpr bool is_col = mtSpGlue<out_eT, T1, T2, spglue_type>::is_col;
static constexpr bool is_xvec = mtSpGlue<out_eT, T1, T2, spglue_type>::is_xvec;
arma_aligned const SpMat<out_eT> Q;
const SpMat<out_eT> Q;
inline explicit SpProxy(const mtSpGlue<out_eT, T1, T2, spglue_type>& A)
: Q(A)
@@ -702,7 +702,7 @@ struct SpProxy< mtSpReduceOp<out_eT, T1, op_type> >
static constexpr bool is_col = mtSpReduceOp<out_eT, T1, op_type>::is_col;
static constexpr bool is_xvec = mtSpReduceOp<out_eT, T1, op_type>::is_xvec;
arma_aligned const SpMat<out_eT> Q;
const SpMat<out_eT> Q;
inline explicit SpProxy(const mtSpReduceOp<out_eT, T1, op_type>& A)
: Q(A)
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -253,8 +253,6 @@ SpSubview_col_list<eT,T1>::operator*= (const eT val)
{
arma_debug_sigprint();
if(val == eT(0)) { (*this).zeros(); return; }
SpMat<eT>& m_local = const_cast< SpMat<eT>& >(m);
const umat& ci = U_ci.M;
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -816,7 +816,7 @@ SpSubview<eT>::const_row_iterator::operator++()
else if((*pos_ptr) == next_min_row + aux_row && col < next_min_col && (*pos_ptr) < aux_row + iterator_base::M->n_rows)
{
// The first element in this column is in a subsequent row that we
// already have another elemnt for, but the column index is less so
// already have another element for, but the column index is less so
// this element will come first.
next_min_col = col;
next_actual_pos = col_offset + (pos_ptr - start_ptr);
+2 -4
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -157,8 +157,6 @@ SpSubview<eT>::operator*=(const eT val)
{
arma_debug_sigprint();
if(val == eT(0)) { (*this).zeros(); return *this; }
if((n_elem == 0) || (n_nonzero == 0)) { return *this; }
m.sync_csc();
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,10 +22,8 @@
template<typename T1, typename T2, typename glue_type>
class SpToDGlue : public Base< typename T1::elem_type, SpToDGlue<T1, T2, glue_type> >
struct SpToDGlue : public Base< typename T1::elem_type, SpToDGlue<T1, T2, glue_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+7 -9
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,10 +23,8 @@
// NOTE: SpToDOp is dedicated for unary operations on sparse matrices that result in dense matrices.
template<typename T1, typename op_type>
class SpToDOp : public Base< typename T1::elem_type, SpToDOp<T1, op_type> >
struct SpToDOp : public Base< typename T1::elem_type, SpToDOp<T1, op_type> >
{
public:
typedef typename T1::elem_type elem_type;
typedef typename get_pod_type<elem_type>::result pod_type;
@@ -42,10 +40,10 @@ class SpToDOp : public Base< typename T1::elem_type, SpToDOp<T1, op_type> >
template<typename eT2>
constexpr bool is_alias(const Mat<eT2>&) const { return false; }
arma_aligned const T1& m; //!< the operand; must be derived from SpBase
arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1
arma_aligned uword aux_uword_a; //!< auxiliary data, uword format
arma_aligned uword aux_uword_b; //!< auxiliary data, uword format
const T1& m; //!< the operand; must be derived from SpBase
elem_type aux; //!< auxiliary data, using the element type as used by T1
uword aux_uword_a; //!< auxiliary data, uword format
uword aux_uword_b; //!< auxiliary data, uword format
};
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+4 -4
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -73,8 +73,8 @@ class SpValProxy
// Deletes the element if it is zero; NOTE: does not check if val_ptr == nullptr
arma_inline void check_zero();
arma_aligned const uword row;
arma_aligned const uword col;
const uword row;
const uword col;
arma_aligned eT* val_ptr;
+16 -43
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -148,24 +148,17 @@ inline
SpValProxy<T1>&
SpValProxy<T1>::operator*=(const eT rhs)
{
if(rhs != eT(0))
if(val_ptr)
{
if(val_ptr)
{
// The value already exists and merely needs to be updated.
*val_ptr *= rhs;
parent.invalidate_cache();
check_zero();
}
*val_ptr *= rhs;
parent.invalidate_cache();
check_zero();
}
else
{
if(val_ptr)
{
// Since we are multiplying by zero, the value can be deleted.
parent.delete_element(row, col);
val_ptr = nullptr;
}
const eT val = eT(0) * rhs; // in case rhs is inf or nan
if(val != eT(0)) { val_ptr = &parent.insert_element(row, col, val); }
}
return *this;
@@ -178,37 +171,17 @@ inline
SpValProxy<T1>&
SpValProxy<T1>::operator/=(const eT rhs)
{
if(rhs != eT(0)) // I hope this is true!
if(val_ptr)
{
if(val_ptr)
{
*val_ptr /= rhs;
parent.invalidate_cache();
check_zero();
}
*val_ptr /= rhs;
parent.invalidate_cache();
check_zero();
}
else
{
if(val_ptr)
{
*val_ptr /= rhs; // That is where it gets ugly.
// Now check if it's 0.
if(*val_ptr == eT(0))
{
parent.delete_element(row, col);
val_ptr = nullptr;
}
}
else
{
eT val = eT(0) / rhs; // This may vary depending on type and implementation.
if(val != eT(0))
{
// Ok, now we have to insert it.
val_ptr = &parent.insert_element(row, col, val);
}
}
const eT val = eT(0) / rhs; // in case rhs is zero or nan
if(val != eT(0)) { val_ptr = &parent.insert_element(row, col, val); }
}
return *this;
+10 -12
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -20,24 +20,22 @@
//! @{
class access
struct access
{
public:
//! internal function to allow modification of data declared as read-only (use with caution)
template<typename T1> constexpr static T1& rw (const T1& x) { return const_cast<T1& >(x); }
template<typename T1> constexpr static T1*& rwp(const T1* const& x) { return const_cast<T1*&>(x); }
template<typename T1> static constexpr T1& rw (const T1& x) { return const_cast<T1& >(x); }
template<typename T1> static constexpr T1*& rwp(const T1* const& x) { return const_cast<T1*&>(x); }
//! internal function to obtain the real part of either a plain number or a complex number
template<typename eT> constexpr static const eT& tmp_real(const eT& X) { return X; }
template<typename T> constexpr static const T tmp_real(const std::complex<T>& X) { return X.real(); }
template<typename eT> static constexpr const eT& tmp_real(const eT& X) { return X; }
template<typename T> static constexpr const T tmp_real(const std::complex<T>& X) { return X.real(); }
//! internal function to obtain the imag part of either a plain number or a complex number
template<typename eT> constexpr static const eT tmp_imag(const eT ) { return eT(0); }
template<typename T> constexpr static const T tmp_imag(const std::complex<T>& X) { return X.imag(); }
template<typename eT> static constexpr const eT tmp_imag(const eT ) { return eT(0); }
template<typename T> static constexpr const T tmp_imag(const std::complex<T>& X) { return X.imag(); }
//! internal function to work around braindead compilers
template<typename eT> constexpr static const typename enable_if2<is_cx<eT>::no, const eT&>::result alt_conj(const eT& X) { return X; }
template<typename eT> static constexpr const typename enable_if2<is_cx<eT>::no, const eT&>::result alt_conj(const eT& X) { return X; }
template<typename eT> arma_inline static const typename enable_if2<is_cx<eT>::yes, const eT >::result alt_conj(const eT& X) { return std::conj(X); }
};
+159 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -65,6 +65,48 @@ arma_isfinite(const std::complex<T>& x)
}
//
template<typename eT>
inline
bool
arma_isnonfinite(eT)
{
return false;
}
template<>
inline
bool
arma_isnonfinite(float x)
{
return (std::isfinite(x) == false);
}
template<>
inline
bool
arma_isnonfinite(double x)
{
return (std::isfinite(x) == false);
}
template<typename T>
inline
bool
arma_isnonfinite(const std::complex<T>& x)
{
return ( (std::isfinite(x.real()) == false) || (std::isfinite(x.imag()) == false) );
}
//
// wrappers for isinf
@@ -156,6 +198,21 @@ arma_isnan(const std::complex<T>& x)
//
// wrapper for pow; see also the associated FP16 specialisation
template<typename eT, typename exponent_eT>
inline
eT
arma_pow(eT base, exponent_eT pow)
{
return std::pow(base, pow);
}
//
// implementation of arma_sign()
@@ -165,7 +222,9 @@ constexpr
typename arma_unsigned_integral_only<eT>::result
arma_sign(const eT x)
{
return (x > eT(0)) ? eT(+1) : eT(0);
constexpr eT eT_zero = eT(0);
return (x > eT_zero) ? eT(+1) : eT_zero;
}
@@ -175,7 +234,9 @@ constexpr
typename arma_signed_integral_only<eT>::result
arma_sign(const eT x)
{
return (x > eT(0)) ? eT(+1) : ( (x < eT(0)) ? eT(-1) : eT(0) );
constexpr eT eT_zero = eT(0);
return (x > eT_zero) ? eT(+1) : ( (x < eT_zero) ? eT(-1) : eT_zero );
}
@@ -185,7 +246,9 @@ constexpr
typename arma_real_only<eT>::result
arma_sign(const eT x)
{
return (x > eT(0)) ? eT(+1) : ( (x < eT(0)) ? eT(-1) : ((x == eT(0)) ? eT(0) : x) );
constexpr eT eT_zero = eT(0);
return (x > eT_zero) ? eT(+1) : ( (x < eT_zero) ? eT(-1) : ((x == eT_zero) ? eT_zero : x) );
}
@@ -375,4 +438,95 @@ struct arma_arg< std::complex<double> >
//
// extensions for half-precision fp16
#if defined(ARMA_HAVE_FP16)
template<>
inline
bool
arma_isfinite(fp16 x)
{
return std::isfinite(x);
}
template<>
inline
bool
arma_isnonfinite(fp16 x)
{
return (std::isfinite(x) == false);
}
template<>
inline
bool
arma_isinf(fp16 x)
{
return std::isinf(x);
}
template<>
inline
bool
arma_isnan(fp16 x)
{
return std::isnan(x);
}
template<typename exponent_eT>
inline
fp16
arma_pow(fp16 base, exponent_eT pow)
{
return std::pow(base, fp16(pow));
}
template<>
inline
fp16
arma_hypot(const fp16 x, const fp16 y)
{
return std::hypot(x, y);
}
template<>
inline
fp16
arma_sinc(const fp16 x)
{
return arma_sinc_generic(x);
}
template<>
struct arma_arg<fp16>
{
static
inline
fp16
eval(const fp16 x)
{
return std::arg(x);
}
};
#endif
//! @}
+23 -9
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -65,6 +65,13 @@ struct arma_config
#endif
#if defined(ARMA_OPTIMISE_POWEXPR)
static constexpr bool optimise_powexpr = true;
#else
static constexpr bool optimise_powexpr = false;
#endif
#if defined(ARMA_CHECK_CONFORMANCE)
static constexpr bool check_conform = true;
#else
@@ -153,13 +160,6 @@ struct arma_config
#endif
#if defined(ARMA_HAVE_CXX14)
static constexpr bool cxx14 = true;
#else
static constexpr bool cxx14 = false;
#endif
#if defined(ARMA_HAVE_CXX17)
static constexpr bool cxx17 = true;
#else
@@ -237,6 +237,20 @@ struct arma_config
#endif
#if defined(ARMA_HAVE_FP16)
static constexpr bool have_fp16 = true;
#else
static constexpr bool have_fp16 = false;
#endif
#if defined(ARMA_GOOD_FP16)
static constexpr bool good_fp16 = true;
#else
static constexpr bool good_fp16 = false;
#endif
static constexpr uword warn_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : 0;
};
+108 -102
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -29,11 +29,10 @@ template<typename eT> class Mat;
template<typename eT> class Col;
template<typename eT> class Row;
template<typename eT> class Cube;
template<typename eT> class xvec_htrans;
template<typename oT> class field;
template<typename eT, bool do_conj> class xtrans_mat;
template<typename eT> struct xvec_htrans;
template<typename eT, bool do_conj> struct xtrans_mat;
template<typename eT> class subview;
template<typename eT> class subview_col;
@@ -73,91 +72,97 @@ template<typename eT, typename T1> class subview_cube_slices;
template<typename eT, typename T1> class SpSubview_col_list;
class SizeMat;
class SizeCube;
template<typename eT> class Mat_noalias;
template<typename eT> class SpMat_noalias;
class arma_empty_class {};
class diskio;
struct SizeMat;
struct SizeCube;
class op_strans;
class op_htrans;
class op_htrans2;
class op_inv_gen_default;
class op_inv_spd_default;
class op_inv_gen_full;
class op_inv_spd_full;
class op_diagmat;
class op_trimat;
class op_vectorise_row;
class op_vectorise_col;
class op_symmatu;
class op_symmatl;
struct arma_empty_class {};
class op_row_as_mat;
class op_col_as_mat;
struct diskio;
class glue_times;
class glue_times_diag;
struct op_strans;
struct op_htrans;
struct op_htrans2;
struct op_inv_gen_default;
struct op_inv_spd_default;
struct op_inv_gen_full;
struct op_inv_spd_full;
struct op_diagmat;
struct op_trimat;
struct op_vectorise_row;
struct op_vectorise_col;
struct op_symmatu;
struct op_symmatl;
struct op_omit;
class glue_rel_lt;
class glue_rel_gt;
class glue_rel_lteq;
class glue_rel_gteq;
class glue_rel_eq;
class glue_rel_noteq;
class glue_rel_and;
class glue_rel_or;
struct op_row_as_mat;
struct op_col_as_mat;
class op_rel_lt_pre;
class op_rel_lt_post;
class op_rel_gt_pre;
class op_rel_gt_post;
class op_rel_lteq_pre;
class op_rel_lteq_post;
class op_rel_gteq_pre;
class op_rel_gteq_post;
class op_rel_eq;
class op_rel_noteq;
struct glue_times;
struct glue_times_diag;
class gen_eye;
class gen_ones;
class gen_zeros;
struct glue_rel_lt;
struct glue_rel_gt;
struct glue_rel_lteq;
struct glue_rel_gteq;
struct glue_rel_eq;
struct glue_rel_noteq;
struct glue_rel_and;
struct glue_rel_or;
struct op_rel_lt_pre;
struct op_rel_lt_post;
struct op_rel_gt_pre;
struct op_rel_gt_post;
struct op_rel_lteq_pre;
struct op_rel_lteq_post;
struct op_rel_gteq_pre;
struct op_rel_gteq_post;
struct op_rel_eq;
struct op_rel_noteq;
struct gen_eye;
struct gen_ones;
struct gen_zeros;
class spop_strans;
class spop_htrans;
class spop_vectorise_row;
class spop_vectorise_col;
struct spop_strans;
struct spop_htrans;
struct spop_vectorise_row;
struct spop_vectorise_col;
struct spop_square;
class spop_rel_lt_pre;
class spop_rel_lt_post;
class spop_rel_gt_pre;
class spop_rel_gt_post;
class spop_rel_lteq_pre;
class spop_rel_lteq_post;
class spop_rel_gteq_pre;
class spop_rel_gteq_post;
class spop_rel_eq;
class spop_rel_noteq;
struct spop_rel_lt_pre;
struct spop_rel_lt_post;
struct spop_rel_gt_pre;
struct spop_rel_gt_post;
struct spop_rel_lteq_pre;
struct spop_rel_lteq_post;
struct spop_rel_gteq_pre;
struct spop_rel_gteq_post;
struct spop_rel_eq;
struct spop_rel_noteq;
class spglue_plus;
class spglue_minus;
class spglue_schur;
class spglue_times;
class spglue_max;
class spglue_min;
class spglue_rel_lt;
class spglue_rel_gt;
struct spglue_plus;
struct spglue_minus;
struct spglue_schur;
struct spglue_times;
struct spglue_max;
struct spglue_min;
struct spglue_rel_lt;
struct spglue_rel_gt;
class op_sp_as_dense;
struct op_sp_as_dense;
class op_internal_equ;
class op_internal_plus;
class op_internal_minus;
class op_internal_schur;
class op_internal_div;
struct op_internal_equ;
struct op_internal_plus;
struct op_internal_minus;
struct op_internal_schur;
struct op_internal_div;
@@ -246,40 +251,40 @@ struct traits_glue_or
template<const bool, const bool, const bool, const bool> class gemm;
template<const bool, const bool, const bool> class gemv;
template<const bool, const bool, const bool, const bool> struct gemm;
template<const bool, const bool, const bool> struct gemv;
template< typename eT, typename gen_type> class Gen;
template< typename eT, typename gen_type> struct Gen;
template< typename T1, typename op_type> class Op;
template< typename T1, typename eop_type> class eOp;
template< typename T1, typename op_type> class SpToDOp;
template< typename T1, typename op_type> class CubeToMatOp;
template<typename out_eT, typename T1, typename op_type> class mtOp;
template< typename T1, typename op_type> struct Op;
template< typename T1, typename eop_type> struct eOp;
template< typename T1, typename op_type> struct SpToDOp;
template< typename T1, typename op_type> struct CubeToMatOp;
template<typename out_eT, typename T1, typename op_type> struct mtOp;
template< typename T1, typename T2, typename glue_type> class Glue;
template< typename T1, typename T2, typename eglue_type> class eGlue;
template< typename T1, typename T2, typename glue_type> class SpToDGlue;
template<typename out_eT, typename T1, typename T2, typename glue_type> class mtGlue;
template< typename T1, typename T2, typename glue_type> struct Glue;
template< typename T1, typename T2, typename eglue_type> struct eGlue;
template< typename T1, typename T2, typename glue_type> struct SpToDGlue;
template<typename out_eT, typename T1, typename T2, typename glue_type> struct mtGlue;
template< typename eT, typename gen_type> class GenCube;
template< typename eT, typename gen_type> struct GenCube;
template< typename T1, typename op_type> class OpCube;
template< typename T1, typename eop_type> class eOpCube;
template<typename out_eT, typename T1, typename op_type> class mtOpCube;
template< typename T1, typename op_type> struct OpCube;
template< typename T1, typename eop_type> struct eOpCube;
template<typename out_eT, typename T1, typename op_type> struct mtOpCube;
template< typename T1, typename T2, typename glue_type> class GlueCube;
template< typename T1, typename T2, typename eglue_type> class eGlueCube;
template<typename out_eT, typename T1, typename T2, typename glue_type> class mtGlueCube;
template< typename T1, typename T2, typename glue_type> struct GlueCube;
template< typename T1, typename T2, typename eglue_type> struct eGlueCube;
template<typename out_eT, typename T1, typename T2, typename glue_type> struct mtGlueCube;
template<typename T1> struct Proxy;
template<typename T1> struct ProxyCube;
template<typename T1> class diagmat_proxy;
template<typename T1> struct diagmat_proxy;
template<typename T1> struct unwrap;
template<typename T1> struct quasi_unwrap;
@@ -310,7 +315,7 @@ struct state_type
int out;
#if defined(ARMA_USE_OPENMP)
#pragma omp atomic read
#pragma omp atomic read seq_cst
out = state;
#elif defined(ARMA_USE_STD_MUTEX)
out = state.load();
@@ -326,7 +331,7 @@ struct state_type
operator= (const int in_state)
{
#if defined(ARMA_USE_OPENMP)
#pragma omp atomic write
#pragma omp atomic write seq_cst
state = in_state;
#elif defined(ARMA_USE_STD_MUTEX)
state.store(in_state);
@@ -337,12 +342,12 @@ struct state_type
};
template< typename T1, typename spop_type> class SpOp;
template<typename out_eT, typename T1, typename spop_type> class mtSpOp;
template<typename out_eT, typename T1, typename op_type> class mtSpReduceOp;
template< typename T1, typename spop_type> struct SpOp;
template<typename out_eT, typename T1, typename spop_type> struct mtSpOp;
template<typename out_eT, typename T1, typename op_type> struct mtSpReduceOp;
template< typename T1, typename T2, typename spglue_type> class SpGlue;
template<typename out_eT, typename T1, typename T2, typename spglue_type> class mtSpGlue;
template< typename T1, typename T2, typename spglue_type> struct SpGlue;
template<typename out_eT, typename T1, typename T2, typename spglue_type> struct mtSpGlue;
template<typename T1> struct SpProxy;
@@ -360,6 +365,7 @@ struct arma_zeros_indicator : public arma_initmode_indicator<true > {};
struct arma_nozeros_indicator : public arma_initmode_indicator<false> {};
//! \addtogroup injector
//! @{
+4 -11
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,18 +21,13 @@
class arma_ostream_state
struct arma_ostream_state
{
private:
const ios::fmtflags orig_flags;
const std::streamsize orig_precision;
const std::streamsize orig_width;
const char orig_fill;
public:
inline arma_ostream_state(const std::ostream& o);
inline void restore(std::ostream& o) const;
@@ -40,10 +35,8 @@ class arma_ostream_state
class arma_ostream
struct arma_ostream
{
public:
template<typename eT> inline static std::streamsize modify_stream(std::ostream& o, const eT* data, const uword n_elem);
template<typename T> inline static std::streamsize modify_stream(std::ostream& o, const std::complex<T>* data, const uword n_elem);
template<typename eT> inline static std::streamsize modify_stream(std::ostream& o, typename SpMat<eT>::const_iterator begin, const uword n_elem, const typename arma_not_cx<eT>::result* junk = nullptr);
+15 -13
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -70,7 +70,7 @@ arma_ostream::modify_stream(std::ostream& o, const eT* data, const uword n_elem)
{
const eT val = data[i];
if(arma_isfinite(val) == false) { continue; }
if(arma_isnonfinite(val)) { continue; }
if(
( cond_rel< (sizeof(eT) > 4) && (is_same_type<uword,eT>::yes || is_same_type<sword,eT>::yes) >::geq(val, eT(+10000000000)) )
@@ -86,22 +86,22 @@ arma_ostream::modify_stream(std::ostream& o, const eT* data, const uword n_elem)
( val >= eT(+100) )
||
//( (is_signed<eT>::value) && (val <= eT(-100)) ) ||
//( (is_non_integral<eT>::value) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||
//( (is_non_integral<eT>::value) && (is_signed<eT>::value) && (val < eT(0)) && (val >= eT(-1e-4)) )
//( (is_real<eT>::value) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||
//( (is_real<eT>::value) && (is_signed<eT>::value) && (val < eT(0)) && (val >= eT(-1e-4)) )
(
cond_rel< is_signed<eT>::value >::leq(val, eT(-100))
)
||
(
cond_rel< is_non_integral<eT>::value >::gt(val, eT(0))
cond_rel< is_real<eT>::value >::gt(val, eT(0))
&&
cond_rel< is_non_integral<eT>::value >::leq(val, eT(+1e-4))
cond_rel< is_real<eT>::value >::leq(val, eT(+1e-4))
)
||
(
cond_rel< is_non_integral<eT>::value && is_signed<eT>::value >::lt(val, eT(0))
cond_rel< is_real<eT>::value && is_signed<eT>::value >::lt(val, eT(0))
&&
cond_rel< is_non_integral<eT>::value && is_signed<eT>::value >::geq(val, eT(-1e-4))
cond_rel< is_real<eT>::value && is_signed<eT>::value >::geq(val, eT(-1e-4))
)
)
{
@@ -208,13 +208,13 @@ arma_ostream::modify_stream(std::ostream& o, typename SpMat<eT>::const_iterator
{
const eT val = (*it);
if(arma_isfinite(val) == false) { continue; }
if(arma_isnonfinite(val)) { continue; }
if(
val >= eT(+100) ||
( (is_signed<eT>::value) && (val <= eT(-100)) ) ||
( (is_non_integral<eT>::value) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||
( (is_non_integral<eT>::value) && (is_signed<eT>::value) && (val < eT(0)) && (val >= eT(-1e-4)) )
( ( is_real<eT>::value) && (val > eT(0)) && (val <= eT(+1e-4)) ) ||
( ( is_real<eT>::value) && (is_signed<eT>::value) && (val < eT(0)) && (val >= eT(-1e-4)) )
)
{
use_layout_C = true;
@@ -368,7 +368,9 @@ inline
void
arma_ostream::print_elem(std::ostream& o, const std::complex<T>& x, const bool modify)
{
if( (x.real() == T(0)) && (x.imag() == T(0)) && (modify) )
constexpr T T_zero = T(0);
if( (x.real() == T_zero) && (x.imag() == T_zero) && (modify) )
{
o << "(0,0)";
}
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -24,7 +24,7 @@
template<typename eT>
struct arma_lt_comparator
{
arma_inline bool operator() (const eT a, const eT b) const { return (a < b); }
constexpr bool operator() (const eT a, const eT b) const { return (a < b); }
};
@@ -32,7 +32,7 @@ struct arma_lt_comparator
template<typename eT>
struct arma_gt_comparator
{
arma_inline bool operator() (const eT a, const eT b) const { return (a > b); }
constexpr bool operator() (const eT a, const eT b) const { return (a > b); }
};
@@ -40,7 +40,7 @@ struct arma_gt_comparator
template<typename eT>
struct arma_leq_comparator
{
arma_inline bool operator() (const eT a, const eT b) const { return (a <= b); }
constexpr bool operator() (const eT a, const eT b) const { return (a <= b); }
};
@@ -48,7 +48,7 @@ struct arma_leq_comparator
template<typename eT>
struct arma_geq_comparator
{
arma_inline bool operator() (const eT a, const eT b) const { return (a >= b); }
constexpr bool operator() (const eT a, const eT b) const { return (a >= b); }
};
+129 -36
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -26,6 +26,9 @@
#undef ARMA_USE_THREAD_LOCAL
#define ARMA_USE_THREAD_LOCAL
#undef ARMA_USE_THREAD_UNIQUE_RNG_SEED
#define ARMA_USE_THREAD_UNIQUE_RNG_SEED
#if (defined(ARMA_RNG_ALT) || defined(ARMA_DONT_USE_CXX11_RNG))
#undef ARMA_USE_CXX11_RNG
#endif
@@ -34,6 +37,10 @@
#undef ARMA_USE_THREAD_LOCAL
#endif
#if defined(ARMA_DONT_USE_THREAD_UNIQUE_RNG_SEED)
#undef ARMA_USE_THREAD_UNIQUE_RNG_SEED
#endif
// NOTE: ARMA_WARMUP_PRODUCER enables a workaround
// NOTE: for thread_local issue on macOS 11 and/or AppleClang 12.0
@@ -79,10 +86,8 @@
#endif
class arma_rng
struct arma_rng
{
public:
#if defined(ARMA_RNG_ALT)
typedef arma_rng_alt::seed_type seed_type;
#elif defined(ARMA_USE_CXX11_RNG)
@@ -118,6 +123,7 @@ class arma_rng
template<typename eT> struct randu;
template<typename eT> struct randn;
template<typename eT> struct randg;
template<typename eT> struct rande;
};
@@ -130,24 +136,42 @@ arma_rng::get_producer()
{
#if defined(ARMA_USE_THREAD_LOCAL)
// use a thread-safe RNG, with each thread having its own unique starting seed
// thread-safe RNG
static std::atomic<std::size_t> mt19937_64_producer_counter(0);
static thread_local std::mt19937_64 mt19937_64_producer( std::mt19937_64::default_seed + mt19937_64_producer_counter++ );
arma_rng::warmup_producer(mt19937_64_producer);
#if defined(ARMA_USE_THREAD_UNIQUE_RNG_SEED)
// each thread has unique starting seed
#if defined(ARMA_USE_OPENMP)
static thread_local std::mt19937_64 mt19937_64_producer( std::mt19937_64::default_seed + arma_rng::seed_type(omp_get_thread_num()) );
#else
static std::atomic<std::size_t> mt19937_64_producer_counter(0);
static thread_local std::mt19937_64 mt19937_64_producer( std::mt19937_64::default_seed + mt19937_64_producer_counter++ );
#endif
#else
// each thread has the same starting seed
static thread_local std::mt19937_64 mt19937_64_producer( std::mt19937_64::default_seed );
#endif
#else
// use a plain RNG in case we don't have thread_local
// plain RNG in case we don't have thread_local
static std::mt19937_64 mt19937_64_producer( std::mt19937_64::default_seed );
arma_rng::warmup_producer(mt19937_64_producer);
#endif
arma_rng::warmup_producer(mt19937_64_producer);
return mt19937_64_producer;
}
@@ -227,9 +251,45 @@ arma_rng::set_seed(const arma_rng::seed_type val)
}
#elif defined(ARMA_USE_CXX11_RNG)
{
arma_rng::lock_producer();
arma_rng::get_producer().seed(val);
arma_rng::unlock_producer();
#if defined(ARMA_USE_OPENMP) && defined(ARMA_USE_THREAD_LOCAL)
{
arma_rng::lock_producer();
#if defined(ARMA_USE_THREAD_UNIQUE_RNG_SEED)
constexpr bool thread_unique_rng_seed = true;
#else
constexpr bool thread_unique_rng_seed = false;
#endif
// if we're already in a parallel region, assume the user is setting the seed for each thread
if( (thread_unique_rng_seed == false) || bool(omp_in_parallel()) )
{
arma_rng::get_producer().seed(val);
}
else
{
const int n_threads = int( (std::max)( int(1), int(omp_get_max_threads()) ) );
#pragma omp parallel for ordered schedule(static) num_threads(n_threads)
for(int t=0; t < n_threads; ++t)
{
#pragma omp ordered
{
arma_rng::get_producer().seed(val + arma_rng::seed_type(omp_get_thread_num()));
}
}
}
arma_rng::unlock_producer();
}
#else
{
arma_rng::lock_producer();
arma_rng::get_producer().seed(val);
arma_rng::unlock_producer();
}
#endif
}
#else
{
@@ -267,20 +327,14 @@ arma_rng::set_seed_random()
{
try
{
union
{
seed_type a;
unsigned char b[sizeof(seed_type)];
} tmp;
tmp.a = seed_type(0);
char tmp[sizeof(seed_type)] = {};
std::ifstream f("/dev/urandom", std::ifstream::binary);
if(f.good()) { f.read((char*)(&(tmp.b[0])), sizeof(seed_type)); }
if(f.good()) { f.read(&(tmp[0]), sizeof(seed_type)); }
if(f.good()) { std::memcpy(&seed2, &(tmp[0]), sizeof(seed_type)); }
if(f.good()) { seed2 = tmp.a; }
have_seed = (seed2 != seed_type(0));
}
catch(...) {}
@@ -297,19 +351,17 @@ arma_rng::set_seed_random()
seed3 = static_cast<seed_type>( since_epoch_usec & 0xFFFF );
union
{
uword* a;
unsigned char b[sizeof(uword*)];
} tmp;
unsigned char* a = (unsigned char*)std::malloc(std::size_t(4096));
tmp.a = (uword*)malloc(sizeof(uword));
unsigned char b[sizeof(unsigned char*)] = {};
if(tmp.a != nullptr)
if(a != nullptr)
{
for(size_t i=0; i<sizeof(uword*); ++i) { seed4 += seed_type(tmp.b[i]); }
std::memcpy(&(b[0]), &a, sizeof(unsigned char*));
free(tmp.a);
for(size_t i=0; i<sizeof(unsigned char*); ++i) { seed4 += seed_type(b[i]); }
std::free(a);
}
}
@@ -1039,4 +1091,45 @@ struct arma_rng::randg
//
template<typename eT>
struct arma_rng::rande
{
inline
static
void
fill(eT* mem, const uword N, const double lambda)
{
#if defined(ARMA_USE_CXX11_RNG)
{
std::exponential_distribution<double> local_e_distr(lambda);
std::mt19937_64& producer = arma_rng::get_producer();
arma_rng::lock_producer();
for(uword i=0; i<N; ++i) { mem[i] = eT(local_e_distr(producer)); }
arma_rng::unlock_producer();
}
#else
{
typedef typename std::mt19937_64::result_type local_seed_type;
std::mt19937_64 local_engine;
std::exponential_distribution<double> local_e_distr(lambda);
local_engine.seed( local_seed_type(arma_rng::randi<local_seed_type>()) );
for(uword i=0; i<N; ++i) { mem[i] = eT(local_e_distr(local_engine)); }
}
#endif
}
};
//! @}
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,10 +21,8 @@
class arma_rng_cxx03
struct arma_rng_cxx03
{
public:
typedef unsigned int seed_type;
inline static void set_seed(const seed_type val);
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
+5 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,10 +21,10 @@
#define ARMA_VERSION_MAJOR 14
#define ARMA_VERSION_MAJOR 15
#define ARMA_VERSION_MINOR 2
#define ARMA_VERSION_PATCH 0
#define ARMA_VERSION_NAME "Smooth Caffeine"
#define ARMA_VERSION_PATCH 3
#define ARMA_VERSION_NAME "Medium Roast Deluxe"
+3 -5
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -20,10 +20,8 @@
//! @{
class arrayops
struct arrayops
{
public:
template<typename eT>
arma_inline static void
copy(eT* dest, const eT* src, const uword n_elem);
+15 -6
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -239,7 +239,7 @@ arrayops::convert(out_eT* dest, const in_eT* src, const uword n_elem)
{
const out_eT* src2 = (const out_eT*)src;
if(dest != src2) { arrayops::copy(dest, src2, n_elem); }
arrayops::copy(dest, src2, n_elem);
return;
}
@@ -304,6 +304,15 @@ inline
void
arrayops::convert_cx(out_eT* dest, const in_eT* src, const uword n_elem)
{
if(is_same_type<out_eT,in_eT>::value)
{
const out_eT* src2 = (const out_eT*)src;
arrayops::copy(dest, src2, n_elem);
return;
}
uword j;
for(j=1; j<n_elem; j+=2)
@@ -1041,13 +1050,13 @@ arrayops::is_finite(const eT* src, const uword n_elem)
const eT val_i = (*src); src++;
const eT val_j = (*src); src++;
if(arma_isfinite(val_i) == false) { return false; }
if(arma_isfinite(val_j) == false) { return false; }
if(arma_isnonfinite(val_i)) { return false; }
if(arma_isnonfinite(val_j)) { return false; }
}
if((j-1) < n_elem)
{
if(arma_isfinite(*src) == false) { return false; }
if(arma_isnonfinite(*src)) { return false; }
}
return true;
+14 -39
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,10 +21,8 @@
//! low-level interface functions for accessing LAPACK
class auxlib
struct auxlib
{
public:
//
// inv
@@ -188,12 +186,6 @@ class auxlib
template<typename eT>
inline static bool chol_band(Mat<eT>& X, const uword KD, const uword layout);
template<typename T>
inline static bool chol_band(Mat< std::complex<T> >& X, const uword KD, const uword layout);
template<typename eT>
inline static bool chol_band_common(Mat<eT>& X, const uword KD, const uword layout);
template<typename eT>
inline static bool chol_pivot(Mat<eT>& X, Mat<uword>& P, const uword layout);
@@ -298,9 +290,6 @@ class auxlib
template<typename T1>
inline static bool solve_sympd_fast(Mat<typename T1::elem_type>& out, Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr);
template<typename T1>
inline static bool solve_sympd_fast_common(Mat<typename T1::elem_type>& out, Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr);
template<typename T1>
inline static bool solve_sympd_rcond(Mat<typename T1::pod_type>& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat<typename T1::pod_type>& A, const Base<typename T1::pod_type,T1>& B_expr);
@@ -340,22 +329,10 @@ class auxlib
//
template<typename T1>
inline static bool solve_band_fast(Mat<typename T1::pod_type>& out, Mat<typename T1::pod_type>& A, const uword KL, const uword KU, const Base<typename T1::pod_type,T1>& B_expr);
inline static bool solve_band_fast(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr);
template<typename T1>
inline static bool solve_band_fast(Mat< std::complex<typename T1::pod_type> >& out, Mat< std::complex<typename T1::pod_type> >& A, const uword KL, const uword KU, const Base< std::complex<typename T1::pod_type>,T1>& B_expr);
template<typename T1>
inline static bool solve_band_fast_common(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr);
template<typename T1>
inline static bool solve_band_rcond(Mat<typename T1::pod_type>& out, typename T1::pod_type& out_rcond, Mat<typename T1::pod_type>& A, const uword KL, const uword KU, const Base<typename T1::pod_type,T1>& B_expr);
template<typename T1>
inline static bool solve_band_rcond(Mat< std::complex<typename T1::pod_type> >& out, typename T1::pod_type& out_rcond, Mat< std::complex<typename T1::pod_type> >& A, const uword KL, const uword KU, const Base< std::complex<typename T1::pod_type>,T1>& B_expr);
template<typename T1>
inline static bool solve_band_rcond_common(Mat<typename T1::elem_type>& out, typename T1::pod_type& out_rcond, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr);
inline static bool solve_band_rcond(Mat<typename T1::elem_type>& out, typename T1::pod_type& out_rcond, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr);
template<typename T1>
inline static bool solve_band_refine(Mat<typename T1::pod_type>& out, typename T1::pod_type& out_rcond, Mat<typename T1::pod_type>& A, const uword KL, const uword KU, const Base<typename T1::pod_type,T1>& B_expr, const bool equilibrate);
@@ -366,13 +343,7 @@ class auxlib
//
template<typename T1>
inline static bool solve_tridiag_fast(Mat<typename T1::pod_type>& out, Mat<typename T1::pod_type>& A, const Base<typename T1::pod_type,T1>& B_expr);
template<typename T1>
inline static bool solve_tridiag_fast(Mat< std::complex<typename T1::pod_type> >& out, Mat< std::complex<typename T1::pod_type> >& A, const Base< std::complex<typename T1::pod_type>,T1>& B_expr);
template<typename T1>
inline static bool solve_tridiag_fast_common(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr);
inline static bool solve_tridiag_fast(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr);
//
@@ -391,7 +362,7 @@ class auxlib
// solve the Sylvester equation AX + XB = C
template<typename eT>
inline static bool syl(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C);
inline static bool sylvester(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C);
//
@@ -404,6 +375,13 @@ class auxlib
inline static bool qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr, const char mode);
//
// matrix balance
template<typename eT>
inline static bool balance(Col<typename get_pod_type<eT>::result>& S, Col<uword>& P, Mat<eT>& A, const bool calc_SP, const bool do_scal, const bool do_perm);
//
// rcond
@@ -451,9 +429,6 @@ class auxlib
//
// misc
template<typename T1>
inline static bool crippled_lapack(const Base<typename T1::elem_type, T1>&);
template<typename eT>
inline static bool rudimentary_sym_check(const Mat<eT>& X);
+102 -311
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -320,13 +320,7 @@ auxlib::inv_sym(Mat< std::complex<T> >& A)
if(A.is_empty()) { return true; }
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::inv_sym(): redirecting to auxlib::inv() due to crippled LAPACK");
return auxlib::inv(A);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename std::complex<T> eT;
@@ -477,13 +471,7 @@ auxlib::inv_sym_rcond(Mat< std::complex<T> >& A, T& out_rcond)
if(A.is_empty()) { return true; }
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::inv_sym_rcond(): redirecting to auxlib::inv_rcond() due to crippled LAPACK");
return auxlib::inv_rcond(A, out_rcond);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename std::complex<T> eT;
@@ -686,13 +674,7 @@ auxlib::inv_sympd_rcond(Mat< std::complex<T> >& A, T& out_rcond)
if(A.is_empty()) { return true; }
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_ignore(A);
arma_ignore(out_rcond);
return false;
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
arma_conform_assert_blas_size(A);
@@ -1393,13 +1375,7 @@ auxlib::eig_gen_balance
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::eig_gen_balance(): redirecting to auxlib::eig_gen() due to crippled LAPACK");
return auxlib::eig_gen(vals, vecs, vecs_on, expr);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type T;
typedef typename std::complex<T> eT;
@@ -1751,13 +1727,7 @@ auxlib::eig_gen_twosided_balance
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::eig_gen_twosided_balance(): redirecting to auxlib::eig_gen() due to crippled LAPACK");
return auxlib::eig_gen(vals, lvecs, rvecs, expr);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type T;
typedef typename std::complex<T> eT;
@@ -2716,42 +2686,6 @@ auxlib::chol_band(Mat<eT>& X, const uword KD, const uword layout)
{
arma_debug_sigprint();
return auxlib::chol_band_common(X, KD, layout);
}
template<typename T>
inline
bool
auxlib::chol_band(Mat< std::complex<T> >& X, const uword KD, const uword layout)
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::chol_band(): redirecting to auxlib::chol() due to crippled LAPACK");
arma_ignore(KD);
return auxlib::chol(X, layout);
}
#else
{
return auxlib::chol_band_common(X, KD, layout);
}
#endif
}
template<typename eT>
inline
bool
auxlib::chol_band_common(Mat<eT>& X, const uword KD, const uword layout)
{
arma_debug_sigprint();
#if defined(ARMA_USE_LAPACK)
{
const uword N = X.n_rows;
@@ -3954,9 +3888,7 @@ auxlib::svd_dc(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, Mat<eT>& A)
blas_int lda = blas_int(A.n_rows);
blas_int ldu = blas_int(U.n_rows);
blas_int ldvt = blas_int(V.n_rows);
blas_int lwork1 = 3*min_mn*min_mn + (std::max)(max_mn, 4*min_mn*min_mn + 4*min_mn); // as per LAPACK 3.2 docs
blas_int lwork2 = 4*min_mn*min_mn + 6*min_mn + max_mn; // as per LAPACK 3.8 docs; consistent with LAPACK 3.4 docs
blas_int lwork_min = (std::max)(lwork1, lwork2); // due to differences between LAPACK 3.2 and 3.8
blas_int lwork_min = 4*min_mn*min_mn + 6*min_mn + max_mn; // as per LAPACK 3.8 and 3.12 docs; consistent with LAPACK 3.4 docs
blas_int info = 0;
S.set_size( static_cast<uword>(min_mn) );
@@ -4034,8 +3966,8 @@ auxlib::svd_dc(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >& V,
blas_int lda = blas_int(A.n_rows);
blas_int ldu = blas_int(U.n_rows);
blas_int ldvt = blas_int(V.n_rows);
blas_int lwork_min = min_mn*min_mn + 2*min_mn + max_mn; // as per LAPACK 3.2, 3.4, 3.8 docs
blas_int lrwork = min_mn * ((std::max)(5*min_mn+7, 2*max_mn + 2*min_mn+1)); // as per LAPACK 3.4 docs; LAPACK 3.8 uses 5*min_mn+5 instead of 5*min_mn+7
blas_int lwork_min = min_mn*min_mn + 2*min_mn + max_mn; // as per LAPACK 3.2, 3.4, 3.8, 3.12 docs
blas_int lrwork = min_mn * ((std::max)(5*min_mn+5, 2*max_mn + 2*min_mn+1)); // as per LAPACK 3.8 and 3.12 docs
blas_int info = 0;
S.set_size( static_cast<uword>(min_mn) );
@@ -4103,13 +4035,10 @@ auxlib::svd_dc_econ(Mat<eT>& U, Col<eT>& S, Mat<eT>& V, Mat<eT>& A)
blas_int m = blas_int(A.n_rows);
blas_int n = blas_int(A.n_cols);
blas_int min_mn = (std::min)(m,n);
blas_int max_mn = (std::max)(m,n);
blas_int lda = blas_int(A.n_rows);
blas_int ldu = m;
blas_int ldvt = min_mn;
blas_int lwork1 = 3*min_mn*min_mn + (std::max)( max_mn, 4*min_mn*min_mn + 4*min_mn ); // as per LAPACK 3.2 docs
blas_int lwork2 = 4*min_mn*min_mn + 6*min_mn + max_mn; // as per LAPACK 3.4 docs; LAPACK 3.8 requires 4*min_mn*min_mn + 7*min_mn
blas_int lwork_min = (std::max)(lwork1, lwork2); // due to differences between LAPACK 3.2 and 3.4
blas_int lwork_min = 4*min_mn*min_mn + 7*min_mn; // as per LAPACK 3.8 and 3.12 docs
blas_int info = 0;
if(A.is_empty())
@@ -4194,8 +4123,8 @@ auxlib::svd_dc_econ(Mat< std::complex<T> >& U, Col<T>& S, Mat< std::complex<T> >
blas_int lda = blas_int(A.n_rows);
blas_int ldu = m;
blas_int ldvt = min_mn;
blas_int lwork_min = min_mn*min_mn + 2*min_mn + max_mn; // as per LAPACK 3.2 docs
blas_int lrwork = min_mn * ((std::max)(5*min_mn+7, 2*max_mn + 2*min_mn+1)); // LAPACK 3.8 uses 5*min_mn+5 instead of 5*min_mn+7
blas_int lwork_min = min_mn*min_mn + 3*min_mn; // as per LAPACK 3.12 docs
blas_int lrwork = min_mn * ((std::max)(5*min_mn+5, 2*max_mn + 2*min_mn+1)); // as per LAPACK 3.8 and 3.12 docs
blas_int info = 0;
if(A.is_empty())
@@ -4650,13 +4579,7 @@ auxlib::solve_sym_fast(Mat< std::complex<typename T1::pod_type> >& out, Mat< std
if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; }
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_sym_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK");
return auxlib::solve_square_fast(out, A, B_expr);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type T;
typedef std::complex<T> eT;
@@ -4726,13 +4649,7 @@ auxlib::solve_sym_rcond(Mat<typename T1::pod_type>& out, typename T1::pod_type&
if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; }
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_sym_rcond(): redirecting to auxlib::solve_square_rcond() due to crippled LAPACK");
return auxlib::solve_square_rcond(out, out_rcond, A, B_expr);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type eT;
@@ -4894,28 +4811,6 @@ auxlib::solve_sympd_fast(Mat<typename T1::elem_type>& out, Mat<typename T1::elem
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_sympd_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK");
return auxlib::solve_square_fast(out, A, B_expr);
}
#else
{
return auxlib::solve_sympd_fast_common(out, A, B_expr);
}
#endif
}
template<typename T1>
inline
bool
auxlib::solve_sympd_fast_common(Mat<typename T1::elem_type>& out, Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr)
{
arma_debug_sigprint();
out = B_expr.get_ref();
const uword B_n_rows = out.n_rows;
@@ -5034,15 +4929,7 @@ auxlib::solve_sympd_rcond(Mat< std::complex<typename T1::pod_type> >& out, bool&
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_sympd_rcond(): redirecting to auxlib::solve_square_rcond() due to crippled LAPACK");
out_sympd_state = false;
return auxlib::solve_square_rcond(out, out_rcond, A, B_expr);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type T;
typedef typename std::complex<T> eT;
@@ -5190,13 +5077,7 @@ auxlib::solve_sympd_refine(Mat< std::complex<typename T1::pod_type> >& out, type
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_sympd_refine(): redirecting to auxlib::solve_square_refine() due to crippled LAPACK");
return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type T;
typedef typename std::complex<T> eT;
@@ -5849,50 +5730,11 @@ auxlib::solve_trimat_rcond(Mat<typename T1::elem_type>& out, typename T1::pod_ty
//! solve a system of linear equations via LU decomposition (real band matrix)
template<typename T1>
inline
bool
auxlib::solve_band_fast(Mat<typename T1::pod_type>& out, Mat<typename T1::pod_type>& A, const uword KL, const uword KU, const Base<typename T1::pod_type,T1>& B_expr)
{
arma_debug_sigprint();
return auxlib::solve_band_fast_common(out, A, KL, KU, B_expr);
}
//! solve a system of linear equations via LU decomposition (complex band matrix)
template<typename T1>
inline
bool
auxlib::solve_band_fast(Mat< std::complex<typename T1::pod_type> >& out, Mat< std::complex<typename T1::pod_type> >& A, const uword KL, const uword KU, const Base< std::complex<typename T1::pod_type>,T1>& B_expr)
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_band_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK");
arma_ignore(KL);
arma_ignore(KU);
return auxlib::solve_square_fast(out, A, B_expr);
}
#else
{
return auxlib::solve_band_fast_common(out, A, KL, KU, B_expr);
}
#endif
}
//! solve a system of linear equations via LU decomposition (band matrix)
template<typename T1>
inline
bool
auxlib::solve_band_fast_common(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr)
auxlib::solve_band_fast(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr)
{
arma_debug_sigprint();
@@ -5950,50 +5792,11 @@ auxlib::solve_band_fast_common(Mat<typename T1::elem_type>& out, const Mat<typen
//! solve a system of linear equations via LU decomposition (real band matrix)
template<typename T1>
inline
bool
auxlib::solve_band_rcond(Mat<typename T1::pod_type>& out, typename T1::pod_type& out_rcond, Mat<typename T1::pod_type>& A, const uword KL, const uword KU, const Base<typename T1::pod_type,T1>& B_expr)
{
arma_debug_sigprint();
return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr);
}
//! solve a system of linear equations via LU decomposition (complex band matrix)
template<typename T1>
inline
bool
auxlib::solve_band_rcond(Mat< std::complex<typename T1::pod_type> >& out, typename T1::pod_type& out_rcond, Mat< std::complex<typename T1::pod_type> >& A, const uword KL, const uword KU, const Base< std::complex<typename T1::pod_type>,T1>& B_expr)
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_band_rcond(): redirecting to auxlib::solve_square_rcond() due to crippled LAPACK");
arma_ignore(KL);
arma_ignore(KU);
return auxlib::solve_square_rcond(out, out_rcond, A, B_expr);
}
#else
{
return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr);
}
#endif
}
//! solve a system of linear equations via LU decomposition (band matrix)
template<typename T1>
inline
bool
auxlib::solve_band_rcond_common(Mat<typename T1::elem_type>& out, typename T1::pod_type& out_rcond, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr)
auxlib::solve_band_rcond(Mat<typename T1::elem_type>& out, typename T1::pod_type& out_rcond, const Mat<typename T1::elem_type>& A, const uword KL, const uword KU, const Base<typename T1::elem_type,T1>& B_expr)
{
arma_debug_sigprint();
@@ -6174,16 +5977,7 @@ auxlib::solve_band_refine(Mat< std::complex<typename T1::pod_type> >& out, typen
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_band_refine(): redirecting to auxlib::solve_square_refine() due to crippled LAPACK");
arma_ignore(KL);
arma_ignore(KU);
return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename T1::pod_type T;
typedef typename std::complex<T> eT;
@@ -6270,47 +6064,11 @@ auxlib::solve_band_refine(Mat< std::complex<typename T1::pod_type> >& out, typen
//! solve a system of linear equations via Gaussian elimination with partial pivoting (real tridiagonal band matrix)
template<typename T1>
inline
bool
auxlib::solve_tridiag_fast(Mat<typename T1::pod_type>& out, Mat<typename T1::pod_type>& A, const Base<typename T1::pod_type,T1>& B_expr)
{
arma_debug_sigprint();
return auxlib::solve_tridiag_fast_common(out, A, B_expr);
}
//! solve a system of linear equations via Gaussian elimination with partial pivoting (complex tridiagonal band matrix)
template<typename T1>
inline
bool
auxlib::solve_tridiag_fast(Mat< std::complex<typename T1::pod_type> >& out, Mat< std::complex<typename T1::pod_type> >& A, const Base< std::complex<typename T1::pod_type>,T1>& B_expr)
{
arma_debug_sigprint();
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::solve_tridiag_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK");
return auxlib::solve_square_fast(out, A, B_expr);
}
#else
{
return auxlib::solve_tridiag_fast_common(out, A, B_expr);
}
#endif
}
//! solve a system of linear equations via Gaussian elimination with partial pivoting (tridiagonal band matrix)
template<typename T1>
inline
bool
auxlib::solve_tridiag_fast_common(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr)
auxlib::solve_tridiag_fast(Mat<typename T1::elem_type>& out, const Mat<typename T1::elem_type>& A, const Base<typename T1::elem_type,T1>& B_expr)
{
arma_debug_sigprint();
@@ -6486,15 +6244,15 @@ auxlib::schur(Mat< std::complex<T> >& U, Mat< std::complex<T> >& S, const bool c
template<typename eT>
inline
bool
auxlib::syl(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C)
auxlib::sylvester(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C)
{
arma_debug_sigprint();
#if defined(ARMA_USE_LAPACK)
{
arma_conform_check( (A.is_square() == false) || (B.is_square() == false), "syl(): given matrices must be square sized" );
arma_conform_check( (A.is_square() == false) || (B.is_square() == false), "sylvester(): given matrices must be square sized" );
arma_conform_check( (C.n_rows != A.n_rows) || (C.n_cols != B.n_cols), "syl(): matrices are not conformant" );
arma_conform_check( (C.n_rows != A.n_rows) || (C.n_cols != B.n_cols), "sylvester(): matrices are not conformant" );
if(A.is_empty() || B.is_empty() || C.is_empty()) { X.reset(); return true; }
@@ -6534,7 +6292,7 @@ auxlib::syl(Mat<eT>& X, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C)
arma_ignore(A);
arma_ignore(B);
arma_ignore(C);
arma_stop_logic_error("syl(): use of LAPACK must be enabled");
arma_stop_logic_error("sylvester(): use of LAPACK must be enabled");
return false;
}
#endif
@@ -6714,6 +6472,76 @@ auxlib::qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::compl
template<typename eT>
inline
bool
auxlib::balance(Col<typename get_pod_type<eT>::result>& S, Col<uword>& P, Mat<eT>& A, const bool calc_SP, const bool do_scal, const bool do_perm)
{
arma_debug_sigprint();
#if defined(ARMA_USE_LAPACK)
{
typedef typename get_pod_type<eT>::result T;
// assuming given matrix is square-sized
if(A.n_elem == 0) { S.reset(); P.reset(); return true; }
const char job = (do_scal && do_perm) ? 'B' : ((do_scal) ? 'S' : ((do_perm) ? 'P' : 'N'));
blas_int n = blas_int(A.n_rows);
blas_int lda = blas_int(A.n_rows);
blas_int ilo = blas_int(0);
blas_int ihi = blas_int(0);
blas_int info = blas_int(0);
podarray<T> scale(A.n_rows); scale.zeros();
arma_debug_print("lapack::gebal()");
lapack::gebal(&job, &n, A.memptr(), &lda, &ilo, &ihi, scale.memptr(), &info);
if(info != blas_int(0)) { return false; }
if(calc_SP == false) { return true; }
const uword N = A.n_rows;
// sanity check
if( (ilo < 1) || (uword(ihi) > N) ) { arma_debug_print("ilo and/or ihi out of bounds"); return false; }
S.zeros(N);
P.zeros(N);
T* S_mem = S.memptr();
uword* P_mem = P.memptr();
const T* scale_mem = scale.memptr();
for(uword i = 0; i < uword(ilo)-1; ++i) { S_mem[i] = T(1); }
for(uword i = uword(ilo)-1; i < uword(ihi); ++i) { S_mem[i] = scale_mem[i]; }
for(uword i = uword(ihi); i < N; ++i) { S_mem[i] = T(1); }
for(uword i=0; i < N; ++i) { P_mem[i] = i; }
for(uword i=N-1; i >= uword(ihi) ; --i) { const uword j = uword(scale_mem[i]) - 1; std::swap(P_mem[i], P_mem[j]); }
for(uword i=0; i < uword(ilo)-1; ++i) { const uword j = uword(scale_mem[i]) - 1; std::swap(P_mem[i], P_mem[j]); }
return true;
}
#else
{
arma_ignore(S);
arma_ignore(P);
arma_ignore(A);
arma_ignore(do_scal);
arma_ignore(do_perm);
return false;
}
#endif
}
template<typename eT>
inline
eT
@@ -6882,13 +6710,7 @@ auxlib::rcond_sym(Mat< std::complex<T> >& A)
{
// NOTE: the function name is required for overloading, but is a misnomer: it processes complex hermitian matrices
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::rcond_sym(): redirecting to auxlib::rcond() due to crippled LAPACK");
return auxlib::rcond(A);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename std::complex<T> eT;
@@ -7135,13 +6957,7 @@ inline
T
auxlib::lu_rcond_sympd(const Mat< std::complex<T> >& A, const T norm_val)
{
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_ignore(A);
arma_ignore(norm_val);
return T(0);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename std::complex<T> eT;
@@ -7217,16 +7033,7 @@ inline
T
auxlib::lu_rcond_band(const Mat< std::complex<T> >& AB, const uword KL, const uword KU, const podarray<blas_int>& ipiv, const T norm_val)
{
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_ignore(AB);
arma_ignore(KL);
arma_ignore(KU);
arma_ignore(ipiv);
arma_ignore(norm_val);
return T(0);
}
#elif defined(ARMA_USE_LAPACK)
#if defined(ARMA_USE_LAPACK)
{
typedef typename std::complex<T> eT;
@@ -7264,26 +7071,6 @@ auxlib::lu_rcond_band(const Mat< std::complex<T> >& AB, const uword KL, const uw
template<typename T1>
inline
bool
auxlib::crippled_lapack(const Base<typename T1::elem_type, T1>&)
{
#if defined(ARMA_CRIPPLED_LAPACK)
{
arma_debug_print("auxlib::crippled_lapack(): true");
return (is_cx<typename T1::elem_type>::yes);
}
#else
{
return false;
}
#endif
}
template<typename eT>
inline
bool
@@ -7668,6 +7455,8 @@ inline
void_ptr
ptr_cast(blas_int (*function)(const T*, const T*, const T*))
{
// TODO: investigate replacement of union-based conversion
union converter
{
blas_int (*fn)(const T*, const T*, const T*);
@@ -7689,6 +7478,8 @@ inline
void_ptr
ptr_cast(blas_int (*function)(const std::complex<T>*, const std::complex<T>*))
{
// TODO: investigate replacement of union-based conversion
union converter
{
blas_int (*fn)(const std::complex<T>*, const std::complex<T>*);
+3 -3
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -242,7 +242,7 @@ compress(Mat<eT>& AB, const Mat<eT>& A, const uword KL, const uword KU, const bo
// http://www.netlib.org/lapack/lug/node124.html
// for ?gbsv, matrix AB size: 2*KL+KU+1 x N; band representation of A stored in rows KL+1 to 2*KL+KU+1 (note: fortran counts from 1)
// for ?gbsvx, matrix AB size: KL+KU+1 x N; band representaiton of A stored in rows 1 to KL+KU+1 (note: fortran counts from 1)
// for ?gbsvx, matrix AB size: KL+KU+1 x N; band representation of A stored in rows 1 to KL+KU+1 (note: fortran counts from 1)
//
// the +1 in the above formulas is to take into account the main diagonal
+4 -9
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -78,13 +78,8 @@
#endif
#if !defined(ARMA_HAVE_CXX11)
#error "*** C++11 compiler required; enable C++11 mode in your compiler, or use an earlier version of Armadillo"
#endif
#if (!defined(ARMA_HAVE_CXX14)) && (!defined(ARMA_IGNORE_DEPRECATED_MARKER))
#pragma message ("INFO: support for C++11 is deprecated; minimum recommended standard is C++14")
#if !defined(ARMA_HAVE_CXX14)
#error "*** C++14 compiler required; enable C++14 mode in your compiler, or use an earlier version of Armadillo"
#endif
+12 -64
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,8 +22,6 @@
#undef arma_aligned
#undef arma_align_mem
#undef arma_warn_unused
#undef arma_deprecated
#undef arma_frown
#undef arma_malloc
#undef arma_inline
#undef arma_noinline
@@ -34,8 +32,6 @@
#define arma_aligned
#define arma_align_mem
#define arma_warn_unused
#define arma_deprecated
#define arma_frown(msg)
#define arma_malloc
#define arma_inline inline
#define arma_noinline
@@ -102,6 +98,7 @@
#define ARMA_SIMPLE_LOOPS
#undef ARMA_GOOD_COMPILER
#undef ARMA_REAL_GCC
// posix_memalign() is part of IEEE standard 1003.1
// http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_memalign.html
@@ -158,29 +155,18 @@
// #pragma message ("using GCC extensions")
#undef ARMA_GCC_VERSION
#define ARMA_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#if (ARMA_GCC_VERSION < 60100)
#error "*** newer compiler required; need gcc 6.1 or newer ***"
#endif
// gcc 6.1 has proper C++14 support and fixes an OpenMP related bug:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57580
#if (ARMA_GCC_VERSION < 80100)
#pragma message("INFO: support for GCC versions older than 8.1 is deprecated"
#if (__GNUC__ < 8)
#error "*** newer compiler required; need at least gcc 8.1 ***"
#endif
#define ARMA_GOOD_COMPILER
#define ARMA_REAL_GCC
#undef arma_hot
#undef arma_cold
#undef arma_aligned
#undef arma_align_mem
#undef arma_warn_unused
#undef arma_deprecated
#undef arma_frown
#undef arma_malloc
#undef arma_inline
#undef arma_noinline
@@ -190,8 +176,6 @@
#define arma_aligned __attribute__((__aligned__))
#define arma_align_mem __attribute__((__aligned__(16)))
#define arma_warn_unused __attribute__((__warn_unused_result__))
#define arma_deprecated __attribute__((__deprecated__))
#define arma_frown(msg) __attribute__((__deprecated__(msg)))
#define arma_malloc __attribute__((__malloc__))
#define arma_inline __attribute__((__always_inline__)) inline
#define arma_noinline __attribute__((__noinline__))
@@ -251,16 +235,6 @@
#define arma_warn_unused __attribute__((__warn_unused_result__))
#endif
#if __has_attribute(__deprecated__)
#undef arma_deprecated
#define arma_deprecated __attribute__((__deprecated__))
#endif
#if __has_attribute(__deprecated__)
#undef arma_frown
#define arma_frown(msg) __attribute__((__deprecated__(msg)))
#endif
#if __has_attribute(__malloc__)
#undef arma_malloc
#define arma_malloc __attribute__((__malloc__))
@@ -318,9 +292,6 @@
#error "*** newer compiler required ***"
#endif
#undef arma_deprecated
#define arma_deprecated __declspec(deprecated)
#undef arma_noinline
#define arma_noinline __declspec(noinline)
@@ -378,15 +349,6 @@
#endif
#if defined(ARMA_HAVE_CXX14)
#undef arma_deprecated
#define arma_deprecated [[deprecated]]
#undef arma_frown
#define arma_frown(msg) [[deprecated(msg)]]
#endif
#if defined(ARMA_HAVE_CXX17)
#undef arma_warn_unused
#define arma_warn_unused [[nodiscard]]
@@ -394,16 +356,17 @@
#if !defined(ARMA_DONT_USE_OPENMP)
#if (defined(_OPENMP) && (_OPENMP >= 201107))
#if (defined(_OPENMP) && (_OPENMP >= 201307))
#undef ARMA_USE_OPENMP
#define ARMA_USE_OPENMP
#endif
#endif
#if ( defined(ARMA_USE_OPENMP) && (!defined(_OPENMP) || (defined(_OPENMP) && (_OPENMP < 201107))) )
#if ( defined(ARMA_USE_OPENMP) && (!defined(_OPENMP) || (defined(_OPENMP) && (_OPENMP < 201307))) )
// OpenMP 3.0 required for parallelisation of loops with unsigned integers
// OpenMP 3.1 required for atomic read and atomic write
// OpenMP 3.1 required for atomic read/write
// OpenMP 4.0 required for seq_cst memory order clause in atomic read/write
#undef ARMA_USE_OPENMP
#undef ARMA_PRINT_OPENMP_WARNING
#define ARMA_PRINT_OPENMP_WARNING
@@ -411,11 +374,10 @@
#if defined(ARMA_PRINT_OPENMP_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
#pragma message ("WARNING: use of OpenMP disabled; compiler support for OpenMP 3.1+ not detected")
#pragma message ("WARNING: use of OpenMP disabled; compiler support for OpenMP 4.0+ not detected")
#if (defined(_OPENMP) && (_OPENMP < 201107))
#if (defined(_OPENMP) && (_OPENMP < 201307))
#pragma message ("NOTE: your compiler has an outdated version of OpenMP")
#pragma message ("NOTE: consider upgrading to a better compiler")
#endif
#endif
@@ -449,7 +411,6 @@
#undef ARMA_DETECTED_FAKE_GCC
#undef ARMA_DETECTED_FAKE_CLANG
#undef ARMA_GCC_VERSION
#undef ARMA_PRINT_OPENMP_WARNING
@@ -475,16 +436,3 @@
// https://sourceware.org/bugzilla/show_bug.cgi?id=19239
#undef minor
#undef major
// optionally allow disabling of compile-time deprecation messages (not recommended)
// NOTE: option 'ARMA_IGNORE_DEPRECATED_MARKER' will be removed
// NOTE: disabling deprecation messages is counter-productive
#if defined(ARMA_IGNORE_DEPRECATED_MARKER)
#undef arma_deprecated
#define arma_deprecated
#undef arma_frown
#define arma_frown(msg)
#endif
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -20,10 +20,26 @@
//! @{
//
// for preventing pedantic compiler warnings
template<bool do_eval>
struct cond_rel
{
template<typename eT> static constexpr bool lt(const eT A, const eT B);
template<typename eT> static constexpr bool gt(const eT A, const eT B);
template<typename eT> static constexpr bool leq(const eT A, const eT B);
template<typename eT> static constexpr bool geq(const eT A, const eT B);
template<typename eT> static constexpr eT make_neg(const eT val);
};
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<true>::lt(const eT A, const eT B)
{
@@ -34,7 +50,7 @@ cond_rel<true>::lt(const eT A, const eT B)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<false>::lt(const eT, const eT)
{
@@ -45,7 +61,7 @@ cond_rel<false>::lt(const eT, const eT)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<true>::gt(const eT A, const eT B)
{
@@ -56,7 +72,7 @@ cond_rel<true>::gt(const eT A, const eT B)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<false>::gt(const eT, const eT)
{
@@ -67,7 +83,7 @@ cond_rel<false>::gt(const eT, const eT)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<true>::leq(const eT A, const eT B)
{
@@ -78,7 +94,7 @@ cond_rel<true>::leq(const eT A, const eT B)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<false>::leq(const eT, const eT)
{
@@ -89,7 +105,7 @@ cond_rel<false>::leq(const eT, const eT)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<true>::geq(const eT A, const eT B)
{
@@ -100,7 +116,7 @@ cond_rel<true>::geq(const eT A, const eT B)
template<>
template<typename eT>
arma_inline
constexpr
bool
cond_rel<false>::geq(const eT, const eT)
{
@@ -111,7 +127,7 @@ cond_rel<false>::geq(const eT, const eT)
template<>
template<typename eT>
arma_inline
constexpr
eT
cond_rel<true>::make_neg(const eT val)
{
@@ -122,7 +138,7 @@ cond_rel<true>::make_neg(const eT val)
template<>
template<typename eT>
arma_inline
constexpr
eT
cond_rel<false>::make_neg(const eT)
{
+42 -41
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -147,6 +147,12 @@
//// Note that ARMA_64BIT_WORD is automatically enabled when std::size_t has 64 bits and ARMA_32BIT_WORD is not defined.
#endif
#if !defined(ARMA_FORCE_USE_FP16)
// #define ARMA_FORCE_USE_FP16
//// Uncomment the above line to force the use of fp16 and cx_fp16 element types even if hardware support is not detected.
//// NOTE: C++23 is also required for fp16 and cx_fp16.
#endif
#if !defined(ARMA_OPTIMISE_BAND)
#define ARMA_OPTIMISE_BAND
//// Comment out the above line to disable optimised handling
@@ -157,7 +163,7 @@
#define ARMA_OPTIMISE_SYM
//// Comment out the above line to disable optimised handling
//// of symmetric/hermitian matrices by various functions:
//// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), rcond(), rank()
//// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), powmat(), rank(), cond(), rcond()
#endif
#if !defined(ARMA_OPTIMISE_INVEXPR)
@@ -166,6 +172,11 @@
//// of inv() and inv_sympd() within compound expressions
#endif
#if !defined(ARMA_OPTIMISE_POWEXPR)
#define ARMA_OPTIMISE_POWEXPR
//// Comment out the above line to disable optimised handling of pow()
#endif
#if !defined(ARMA_CHECK_CONFORMANCE)
#define ARMA_CHECK_CONFORMANCE
//// Comment out the above line to disable conformance checks for bounds and size.
@@ -209,32 +220,14 @@
#define ARMA_DEBUG
#endif
#if defined(ARMA_DEFAULT_OSTREAM)
#pragma message ("WARNING: support for ARMA_DEFAULT_OSTREAM is deprecated and will be removed;")
#pragma message ("WARNING: use ARMA_COUT_STREAM and ARMA_CERR_STREAM instead")
#endif
#if !defined(ARMA_COUT_STREAM)
#if defined(ARMA_DEFAULT_OSTREAM)
// for compatibility with earlier versions of Armadillo
#define ARMA_COUT_STREAM ARMA_DEFAULT_OSTREAM
#else
#define ARMA_COUT_STREAM std::cout
#endif
#define ARMA_COUT_STREAM std::cout
#endif
#if !defined(ARMA_CERR_STREAM)
#if defined(ARMA_DEFAULT_OSTREAM)
// for compatibility with earlier versions of Armadillo
#define ARMA_CERR_STREAM ARMA_DEFAULT_OSTREAM
#else
#define ARMA_CERR_STREAM std::cerr
#endif
#define ARMA_CERR_STREAM std::cerr
#endif
#if !defined(ARMA_PRINT_EXCEPTIONS)
// #define ARMA_PRINT_EXCEPTIONS
#if defined(ARMA_PRINT_EXCEPTIONS_INTERNAL)
@@ -288,13 +281,6 @@
#undef ARMA_USE_STD_MUTEX
#endif
// for compatibility with earlier versions of Armadillo
#if defined(ARMA_DONT_USE_CXX11_MUTEX)
#pragma message ("WARNING: support for ARMA_DONT_USE_CXX11_MUTEX is deprecated and will be removed;")
#pragma message ("WARNING: use ARMA_DONT_USE_STD_MUTEX instead")
#undef ARMA_USE_STD_MUTEX
#endif
#if defined(ARMA_DONT_USE_OPENMP)
#undef ARMA_USE_OPENMP
#endif
@@ -303,10 +289,29 @@
#undef ARMA_64BIT_WORD
#endif
#if defined(ARMA_DONT_USE_FP16)
#undef ARMA_FORCE_USE_FP16
#endif
#if (defined(ARMA_BLAS_LONG_LONG) && defined(ARMA_USE_WRAPPER))
#pragma message ("WARNING: use of ARMA_BLAS_LONG_LONG in conjunction with ARMA_USE_WRAPPER is not supported")
#endif
#if (defined(ARMA_BLAS_64BIT_INT) && defined(ARMA_USE_WRAPPER))
#pragma message ("WARNING: use of ARMA_BLAS_64BIT_INT in conjunction with ARMA_USE_WRAPPER is not supported")
#endif
#if (defined(ARMA_SUPERLU_64BIT_INT) && defined(ARMA_USE_WRAPPER))
#pragma message ("WARNING: use of ARMA_SUPERLU_64BIT_INT in conjunction with ARMA_USE_WRAPPER is not supported")
#endif
// for compatibility with earlier versions of Armadillo
#if defined(ARMA_BLAS_LONG) || defined(ARMA_BLAS_LONG_LONG)
#undef ARMA_BLAS_64BIT_INT
#define ARMA_BLAS_64BIT_INT
// #pragma message ("options ARMA_BLAS_LONG and ARMA_BLAS_LONG_LONG are deprecated;")
// #pragma message ("use ARMA_BLAS_64BIT_INT instead")
#endif
#if defined(ARMA_DONT_OPTIMISE_BAND) || defined(ARMA_DONT_OPTIMISE_SOLVE_BAND)
@@ -321,6 +326,10 @@
#undef ARMA_OPTIMISE_INVEXPR
#endif
#if defined(ARMA_DONT_OPTIMISE_POWEXPR)
#undef ARMA_OPTIMISE_POWEXPR
#endif
#if defined(ARMA_DONT_CHECK_CONFORMANCE)
#if defined(ARMA_CHECK_CONFORMANCE) && (ARMA_WARN_LEVEL >= 2)
#pragma message ("WARNING: conformance checks disabled")
@@ -333,10 +342,6 @@
#undef ARMA_CHECK_NONFINITE
#endif
#if defined(ARMA_DONT_IGNORE_DEPRECATED_MARKER)
#undef ARMA_IGNORE_DEPRECATED_MARKER
#endif
#if defined(ARMA_NO_DEBUG)
#undef ARMA_DEBUG
#undef ARMA_EXTRA_DEBUG
@@ -354,22 +359,18 @@
#undef ARMA_WARN_LEVEL
#define ARMA_WARN_LEVEL 3
#undef ARMA_IGNORE_DEPRECATED_MARKER
#endif
#if defined(ARMA_DONT_PRINT_EXCEPTIONS)
#undef ARMA_PRINT_EXCEPTIONS
#endif
#if defined(ARMA_NO_CRIPPLED_LAPACK)
#undef ARMA_CRIPPLED_LAPACK
#if defined(ARMA_IGNORE_DEPRECATED_MARKER)
#pragma message ("NOTE: option ARMA_IGNORE_DEPRECATED_MARKER is not supported")
#endif
#if defined(ARMA_CRIPPLED_LAPACK)
#if (!defined(ARMA_IGNORE_DEPRECATED_MARKER))
#pragma message ("option ARMA_CRIPPLED_LAPACK is deprecated and will be removed")
#endif
#pragma message ("NOTE: option ARMA_CRIPPLED_LAPACK is not supported")
#endif
+42 -41
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
//
// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
// Copyright 2008-2016 Conrad Sanderson (https://conradsanderson.id.au)
// Copyright 2008-2016 National ICT Australia (NICTA)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -147,6 +147,12 @@
//// Note that ARMA_64BIT_WORD is automatically enabled when std::size_t has 64 bits and ARMA_32BIT_WORD is not defined.
#endif
#if !defined(ARMA_FORCE_USE_FP16)
// #define ARMA_FORCE_USE_FP16
//// Uncomment the above line to force the use of fp16 and cx_fp16 element types even if hardware support is not detected.
//// NOTE: C++23 is also required for fp16 and cx_fp16.
#endif
#if !defined(ARMA_OPTIMISE_BAND)
#define ARMA_OPTIMISE_BAND
//// Comment out the above line to disable optimised handling
@@ -157,7 +163,7 @@
#define ARMA_OPTIMISE_SYM
//// Comment out the above line to disable optimised handling
//// of symmetric/hermitian matrices by various functions:
//// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), rcond(), rank()
//// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), powmat(), rank(), cond(), rcond()
#endif
#if !defined(ARMA_OPTIMISE_INVEXPR)
@@ -166,6 +172,11 @@
//// of inv() and inv_sympd() within compound expressions
#endif
#if !defined(ARMA_OPTIMISE_POWEXPR)
#define ARMA_OPTIMISE_POWEXPR
//// Comment out the above line to disable optimised handling of pow()
#endif
#if !defined(ARMA_CHECK_CONFORMANCE)
#define ARMA_CHECK_CONFORMANCE
//// Comment out the above line to disable conformance checks for bounds and size.
@@ -209,32 +220,14 @@
#define ARMA_DEBUG
#endif
#if defined(ARMA_DEFAULT_OSTREAM)
#pragma message ("WARNING: support for ARMA_DEFAULT_OSTREAM is deprecated and will be removed;")
#pragma message ("WARNING: use ARMA_COUT_STREAM and ARMA_CERR_STREAM instead")
#endif
#if !defined(ARMA_COUT_STREAM)
#if defined(ARMA_DEFAULT_OSTREAM)
// for compatibility with earlier versions of Armadillo
#define ARMA_COUT_STREAM ARMA_DEFAULT_OSTREAM
#else
#define ARMA_COUT_STREAM std::cout
#endif
#define ARMA_COUT_STREAM std::cout
#endif
#if !defined(ARMA_CERR_STREAM)
#if defined(ARMA_DEFAULT_OSTREAM)
// for compatibility with earlier versions of Armadillo
#define ARMA_CERR_STREAM ARMA_DEFAULT_OSTREAM
#else
#define ARMA_CERR_STREAM std::cerr
#endif
#define ARMA_CERR_STREAM std::cerr
#endif
#if !defined(ARMA_PRINT_EXCEPTIONS)
// #define ARMA_PRINT_EXCEPTIONS
#if defined(ARMA_PRINT_EXCEPTIONS_INTERNAL)
@@ -288,13 +281,6 @@
#undef ARMA_USE_STD_MUTEX
#endif
// for compatibility with earlier versions of Armadillo
#if defined(ARMA_DONT_USE_CXX11_MUTEX)
#pragma message ("WARNING: support for ARMA_DONT_USE_CXX11_MUTEX is deprecated and will be removed;")
#pragma message ("WARNING: use ARMA_DONT_USE_STD_MUTEX instead")
#undef ARMA_USE_STD_MUTEX
#endif
#if defined(ARMA_DONT_USE_OPENMP)
#undef ARMA_USE_OPENMP
#endif
@@ -303,10 +289,29 @@
#undef ARMA_64BIT_WORD
#endif
#if defined(ARMA_DONT_USE_FP16)
#undef ARMA_FORCE_USE_FP16
#endif
#if (defined(ARMA_BLAS_LONG_LONG) && defined(ARMA_USE_WRAPPER))
#pragma message ("WARNING: use of ARMA_BLAS_LONG_LONG in conjunction with ARMA_USE_WRAPPER is not supported")
#endif
#if (defined(ARMA_BLAS_64BIT_INT) && defined(ARMA_USE_WRAPPER))
#pragma message ("WARNING: use of ARMA_BLAS_64BIT_INT in conjunction with ARMA_USE_WRAPPER is not supported")
#endif
#if (defined(ARMA_SUPERLU_64BIT_INT) && defined(ARMA_USE_WRAPPER))
#pragma message ("WARNING: use of ARMA_SUPERLU_64BIT_INT in conjunction with ARMA_USE_WRAPPER is not supported")
#endif
// for compatibility with earlier versions of Armadillo
#if defined(ARMA_BLAS_LONG) || defined(ARMA_BLAS_LONG_LONG)
#undef ARMA_BLAS_64BIT_INT
#define ARMA_BLAS_64BIT_INT
// #pragma message ("options ARMA_BLAS_LONG and ARMA_BLAS_LONG_LONG are deprecated;")
// #pragma message ("use ARMA_BLAS_64BIT_INT instead")
#endif
#if defined(ARMA_DONT_OPTIMISE_BAND) || defined(ARMA_DONT_OPTIMISE_SOLVE_BAND)
@@ -321,6 +326,10 @@
#undef ARMA_OPTIMISE_INVEXPR
#endif
#if defined(ARMA_DONT_OPTIMISE_POWEXPR)
#undef ARMA_OPTIMISE_POWEXPR
#endif
#if defined(ARMA_DONT_CHECK_CONFORMANCE)
#if defined(ARMA_CHECK_CONFORMANCE) && (ARMA_WARN_LEVEL >= 2)
#pragma message ("WARNING: conformance checks disabled")
@@ -333,10 +342,6 @@
#undef ARMA_CHECK_NONFINITE
#endif
#if defined(ARMA_DONT_IGNORE_DEPRECATED_MARKER)
#undef ARMA_IGNORE_DEPRECATED_MARKER
#endif
#if defined(ARMA_NO_DEBUG)
#undef ARMA_DEBUG
#undef ARMA_EXTRA_DEBUG
@@ -354,22 +359,18 @@
#undef ARMA_WARN_LEVEL
#define ARMA_WARN_LEVEL 3
#undef ARMA_IGNORE_DEPRECATED_MARKER
#endif
#if defined(ARMA_DONT_PRINT_EXCEPTIONS)
#undef ARMA_PRINT_EXCEPTIONS
#endif
#if defined(ARMA_NO_CRIPPLED_LAPACK)
#undef ARMA_CRIPPLED_LAPACK
#if defined(ARMA_IGNORE_DEPRECATED_MARKER)
#pragma message ("NOTE: option ARMA_IGNORE_DEPRECATED_MARKER is not supported")
#endif
#if defined(ARMA_CRIPPLED_LAPACK)
#if (!defined(ARMA_IGNORE_DEPRECATED_MARKER))
#pragma message ("option ARMA_CRIPPLED_LAPACK is deprecated and will be removed")
#endif
#pragma message ("NOTE: option ARMA_CRIPPLED_LAPACK is not supported")
#endif

Some files were not shown because too many files have changed in this diff Show More