boost.cxx 0.0.2 → 1.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/README.md +29 -2
  2. package/boost/cast.hpp +20 -0
  3. package/boost/numeric/conversion/bounds.hpp +24 -0
  4. package/boost/numeric/conversion/cast.hpp +61 -0
  5. package/boost/numeric/conversion/conversion_traits.hpp +32 -0
  6. package/boost/numeric/conversion/converter.hpp +68 -0
  7. package/boost/numeric/conversion/converter_policies.hpp +194 -0
  8. package/boost/numeric/conversion/detail/bounds.hpp +58 -0
  9. package/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
  10. package/boost/numeric/conversion/detail/converter.hpp +593 -0
  11. package/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
  12. package/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
  13. package/boost/numeric/conversion/detail/meta.hpp +120 -0
  14. package/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
  15. package/boost/numeric/conversion/detail/old_numeric_cast.hpp +308 -0
  16. package/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
  17. package/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
  18. package/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
  19. package/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
  20. package/boost/numeric/conversion/int_float_mixture.hpp +30 -0
  21. package/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
  22. package/boost/numeric/conversion/is_subranged.hpp +27 -0
  23. package/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
  24. package/boost/numeric/conversion/sign_mixture.hpp +30 -0
  25. package/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
  26. package/boost/numeric/conversion/udt_builtin_mixture.hpp +28 -0
  27. package/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
  28. package/boost/numeric/interval/arith.hpp +305 -0
  29. package/boost/numeric/interval/arith2.hpp +304 -0
  30. package/boost/numeric/interval/arith3.hpp +69 -0
  31. package/boost/numeric/interval/checking.hpp +130 -0
  32. package/boost/numeric/interval/compare/certain.hpp +113 -0
  33. package/boost/numeric/interval/compare/explicit.hpp +248 -0
  34. package/boost/numeric/interval/compare/lexicographic.hpp +122 -0
  35. package/boost/numeric/interval/compare/possible.hpp +113 -0
  36. package/boost/numeric/interval/compare/set.hpp +101 -0
  37. package/boost/numeric/interval/compare/tribool.hpp +138 -0
  38. package/boost/numeric/interval/compare.hpp +19 -0
  39. package/boost/numeric/interval/constants.hpp +85 -0
  40. package/boost/numeric/interval/detail/alpha_rounding_control.hpp +113 -0
  41. package/boost/numeric/interval/detail/bcc_rounding_control.hpp +57 -0
  42. package/boost/numeric/interval/detail/bugs.hpp +48 -0
  43. package/boost/numeric/interval/detail/c99_rounding_control.hpp +50 -0
  44. package/boost/numeric/interval/detail/c99sub_rounding_control.hpp +43 -0
  45. package/boost/numeric/interval/detail/division.hpp +194 -0
  46. package/boost/numeric/interval/detail/ia64_rounding_control.hpp +83 -0
  47. package/boost/numeric/interval/detail/interval_prototype.hpp +41 -0
  48. package/boost/numeric/interval/detail/msvc_rounding_control.hpp +113 -0
  49. package/boost/numeric/interval/detail/ppc_rounding_control.hpp +99 -0
  50. package/boost/numeric/interval/detail/sparc_rounding_control.hpp +112 -0
  51. package/boost/numeric/interval/detail/test_input.hpp +76 -0
  52. package/boost/numeric/interval/detail/x86_rounding_control.hpp +108 -0
  53. package/boost/numeric/interval/detail/x86gcc_rounding_control.hpp +51 -0
  54. package/boost/numeric/interval/ext/integer.hpp +70 -0
  55. package/boost/numeric/interval/ext/x86_fast_rounding_control.hpp +70 -0
  56. package/boost/numeric/interval/hw_rounding.hpp +73 -0
  57. package/boost/numeric/interval/interval.hpp +450 -0
  58. package/boost/numeric/interval/io.hpp +41 -0
  59. package/boost/numeric/interval/limits.hpp +49 -0
  60. package/boost/numeric/interval/policies.hpp +75 -0
  61. package/boost/numeric/interval/rounded_arith.hpp +120 -0
  62. package/boost/numeric/interval/rounded_transc.hpp +140 -0
  63. package/boost/numeric/interval/rounding.hpp +101 -0
  64. package/boost/numeric/interval/transc.hpp +232 -0
  65. package/boost/numeric/interval/utility.hpp +335 -0
  66. package/boost/numeric/interval/utility_fwd.hpp +172 -0
  67. package/boost/numeric/interval.hpp +32 -0
  68. package/boost/numeric/odeint/algebra/algebra_dispatcher.hpp +86 -0
  69. package/boost/numeric/odeint/algebra/array_algebra.hpp +293 -0
  70. package/boost/numeric/odeint/algebra/default_operations.hpp +599 -0
  71. package/boost/numeric/odeint/algebra/detail/extract_value_type.hpp +51 -0
  72. package/boost/numeric/odeint/algebra/detail/for_each.hpp +165 -0
  73. package/boost/numeric/odeint/algebra/detail/macros.hpp +35 -0
  74. package/boost/numeric/odeint/algebra/detail/norm_inf.hpp +46 -0
  75. package/boost/numeric/odeint/algebra/fusion_algebra.hpp +216 -0
  76. package/boost/numeric/odeint/algebra/fusion_algebra_dispatcher.hpp +48 -0
  77. package/boost/numeric/odeint/algebra/multi_array_algebra.hpp +146 -0
  78. package/boost/numeric/odeint/algebra/norm_result_type.hpp +33 -0
  79. package/boost/numeric/odeint/algebra/operations_dispatcher.hpp +41 -0
  80. package/boost/numeric/odeint/algebra/range_algebra.hpp +142 -0
  81. package/boost/numeric/odeint/algebra/vector_space_algebra.hpp +175 -0
  82. package/boost/numeric/odeint/config.hpp +53 -0
  83. package/boost/numeric/odeint/external/blaze/blaze_algebra_dispatcher.hpp +55 -0
  84. package/boost/numeric/odeint/external/blaze/blaze_resize.hpp +64 -0
  85. package/boost/numeric/odeint/external/compute/compute.hpp +27 -0
  86. package/boost/numeric/odeint/external/compute/compute_algebra.hpp +65 -0
  87. package/boost/numeric/odeint/external/compute/compute_algebra_dispatcher.hpp +41 -0
  88. package/boost/numeric/odeint/external/compute/compute_operations.hpp +198 -0
  89. package/boost/numeric/odeint/external/compute/compute_operations_dispatcher.hpp +44 -0
  90. package/boost/numeric/odeint/external/compute/compute_resize.hpp +92 -0
  91. package/boost/numeric/odeint/external/eigen/eigen.hpp +27 -0
  92. package/boost/numeric/odeint/external/eigen/eigen_algebra.hpp +98 -0
  93. package/boost/numeric/odeint/external/eigen/eigen_algebra_dispatcher.hpp +49 -0
  94. package/boost/numeric/odeint/external/eigen/eigen_resize.hpp +103 -0
  95. package/boost/numeric/odeint/external/gsl/gsl_wrapper.hpp +228 -0
  96. package/boost/numeric/odeint/external/mkl/mkl_operations.hpp +181 -0
  97. package/boost/numeric/odeint/external/mpi/mpi.hpp +25 -0
  98. package/boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp +62 -0
  99. package/boost/numeric/odeint/external/mpi/mpi_state.hpp +113 -0
  100. package/boost/numeric/odeint/external/mpi/mpi_vector_state.hpp +95 -0
  101. package/boost/numeric/odeint/external/mtl4/implicit_euler_mtl4.hpp +161 -0
  102. package/boost/numeric/odeint/external/mtl4/mtl4.hpp +23 -0
  103. package/boost/numeric/odeint/external/mtl4/mtl4_algebra_dispatcher.hpp +99 -0
  104. package/boost/numeric/odeint/external/mtl4/mtl4_resize.hpp +134 -0
  105. package/boost/numeric/odeint/external/nt2/nt2_algebra_dispatcher.hpp +25 -0
  106. package/boost/numeric/odeint/external/nt2/nt2_copy.hpp +33 -0
  107. package/boost/numeric/odeint/external/nt2/nt2_norm_inf.hpp +31 -0
  108. package/boost/numeric/odeint/external/nt2/nt2_resize.hpp +54 -0
  109. package/boost/numeric/odeint/external/openmp/openmp.hpp +31 -0
  110. package/boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp +281 -0
  111. package/boost/numeric/odeint/external/openmp/openmp_range_algebra.hpp +276 -0
  112. package/boost/numeric/odeint/external/openmp/openmp_state.hpp +172 -0
  113. package/boost/numeric/odeint/external/thrust/thrust.hpp +27 -0
  114. package/boost/numeric/odeint/external/thrust/thrust_algebra.hpp +217 -0
  115. package/boost/numeric/odeint/external/thrust/thrust_algebra_dispatcher.hpp +118 -0
  116. package/boost/numeric/odeint/external/thrust/thrust_operations.hpp +233 -0
  117. package/boost/numeric/odeint/external/thrust/thrust_operations_dispatcher.hpp +118 -0
  118. package/boost/numeric/odeint/external/thrust/thrust_resize.hpp +197 -0
  119. package/boost/numeric/odeint/external/vexcl/vexcl.hpp +28 -0
  120. package/boost/numeric/odeint/external/vexcl/vexcl_abs.hpp +61 -0
  121. package/boost/numeric/odeint/external/vexcl/vexcl_algebra_dispatcher.hpp +51 -0
  122. package/boost/numeric/odeint/external/vexcl/vexcl_copy.hpp +55 -0
  123. package/boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp +68 -0
  124. package/boost/numeric/odeint/external/vexcl/vexcl_resize.hpp +96 -0
  125. package/boost/numeric/odeint/external/vexcl/vexcl_same_instance.hpp +58 -0
  126. package/boost/numeric/odeint/external/viennacl/viennacl_operations.hpp +226 -0
  127. package/boost/numeric/odeint/external/viennacl/viennacl_resize.hpp +68 -0
  128. package/boost/numeric/odeint/integrate/check_adapter.hpp +222 -0
  129. package/boost/numeric/odeint/integrate/detail/functors.hpp +70 -0
  130. package/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp +161 -0
  131. package/boost/numeric/odeint/integrate/detail/integrate_const.hpp +167 -0
  132. package/boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp +161 -0
  133. package/boost/numeric/odeint/integrate/detail/integrate_times.hpp +179 -0
  134. package/boost/numeric/odeint/integrate/integrate.hpp +133 -0
  135. package/boost/numeric/odeint/integrate/integrate_adaptive.hpp +127 -0
  136. package/boost/numeric/odeint/integrate/integrate_const.hpp +195 -0
  137. package/boost/numeric/odeint/integrate/integrate_n_steps.hpp +178 -0
  138. package/boost/numeric/odeint/integrate/integrate_times.hpp +220 -0
  139. package/boost/numeric/odeint/integrate/max_step_checker.hpp +114 -0
  140. package/boost/numeric/odeint/integrate/null_observer.hpp +38 -0
  141. package/boost/numeric/odeint/integrate/observer_collection.hpp +55 -0
  142. package/boost/numeric/odeint/iterator/adaptive_iterator.hpp +183 -0
  143. package/boost/numeric/odeint/iterator/adaptive_time_iterator.hpp +175 -0
  144. package/boost/numeric/odeint/iterator/const_step_iterator.hpp +180 -0
  145. package/boost/numeric/odeint/iterator/const_step_time_iterator.hpp +173 -0
  146. package/boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp +199 -0
  147. package/boost/numeric/odeint/iterator/impl/adaptive_iterator_impl.hpp +251 -0
  148. package/boost/numeric/odeint/iterator/impl/const_step_iterator_impl.hpp +228 -0
  149. package/boost/numeric/odeint/iterator/impl/n_step_iterator_impl.hpp +239 -0
  150. package/boost/numeric/odeint/iterator/impl/times_iterator_impl.hpp +369 -0
  151. package/boost/numeric/odeint/iterator/integrate/detail/functors.hpp +70 -0
  152. package/boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp +121 -0
  153. package/boost/numeric/odeint/iterator/integrate/detail/integrate_const.hpp +111 -0
  154. package/boost/numeric/odeint/iterator/integrate/detail/integrate_n_steps.hpp +107 -0
  155. package/boost/numeric/odeint/iterator/integrate/detail/integrate_times.hpp +67 -0
  156. package/boost/numeric/odeint/iterator/integrate/integrate.hpp +111 -0
  157. package/boost/numeric/odeint/iterator/integrate/integrate_adaptive.hpp +127 -0
  158. package/boost/numeric/odeint/iterator/integrate/integrate_const.hpp +158 -0
  159. package/boost/numeric/odeint/iterator/integrate/integrate_n_steps.hpp +123 -0
  160. package/boost/numeric/odeint/iterator/integrate/integrate_times.hpp +131 -0
  161. package/boost/numeric/odeint/iterator/integrate/null_observer.hpp +38 -0
  162. package/boost/numeric/odeint/iterator/integrate/observer_collection.hpp +55 -0
  163. package/boost/numeric/odeint/iterator/n_step_iterator.hpp +168 -0
  164. package/boost/numeric/odeint/iterator/n_step_time_iterator.hpp +169 -0
  165. package/boost/numeric/odeint/iterator/times_iterator.hpp +189 -0
  166. package/boost/numeric/odeint/iterator/times_time_iterator.hpp +193 -0
  167. package/boost/numeric/odeint/stepper/adams_bashforth.hpp +418 -0
  168. package/boost/numeric/odeint/stepper/adams_bashforth_moulton.hpp +313 -0
  169. package/boost/numeric/odeint/stepper/adams_moulton.hpp +201 -0
  170. package/boost/numeric/odeint/stepper/adaptive_adams_bashforth_moulton.hpp +237 -0
  171. package/boost/numeric/odeint/stepper/base/algebra_stepper_base.hpp +91 -0
  172. package/boost/numeric/odeint/stepper/base/explicit_error_stepper_base.hpp +588 -0
  173. package/boost/numeric/odeint/stepper/base/explicit_error_stepper_fsal_base.hpp +677 -0
  174. package/boost/numeric/odeint/stepper/base/explicit_stepper_base.hpp +415 -0
  175. package/boost/numeric/odeint/stepper/base/symplectic_rkn_stepper_base.hpp +431 -0
  176. package/boost/numeric/odeint/stepper/bulirsch_stoer.hpp +642 -0
  177. package/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp +838 -0
  178. package/boost/numeric/odeint/stepper/controlled_adams_bashforth_moulton.hpp +322 -0
  179. package/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp +1018 -0
  180. package/boost/numeric/odeint/stepper/controlled_step_result.hpp +42 -0
  181. package/boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp +476 -0
  182. package/boost/numeric/odeint/stepper/detail/adams_bashforth_call_algebra.hpp +148 -0
  183. package/boost/numeric/odeint/stepper/detail/adams_bashforth_coefficients.hpp +168 -0
  184. package/boost/numeric/odeint/stepper/detail/adams_moulton_call_algebra.hpp +148 -0
  185. package/boost/numeric/odeint/stepper/detail/adams_moulton_coefficients.hpp +168 -0
  186. package/boost/numeric/odeint/stepper/detail/adaptive_adams_coefficients.hpp +207 -0
  187. package/boost/numeric/odeint/stepper/detail/generic_rk_algorithm.hpp +247 -0
  188. package/boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp +263 -0
  189. package/boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp +252 -0
  190. package/boost/numeric/odeint/stepper/detail/pid_step_adjuster.hpp +199 -0
  191. package/boost/numeric/odeint/stepper/detail/pid_step_adjuster_coefficients.hpp +180 -0
  192. package/boost/numeric/odeint/stepper/detail/rotating_buffer.hpp +84 -0
  193. package/boost/numeric/odeint/stepper/euler.hpp +166 -0
  194. package/boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp +255 -0
  195. package/boost/numeric/odeint/stepper/explicit_generic_rk.hpp +246 -0
  196. package/boost/numeric/odeint/stepper/extrapolation_stepper.hpp +288 -0
  197. package/boost/numeric/odeint/stepper/generation/generation_controlled_adams_bashforth_moulton.hpp +59 -0
  198. package/boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp +61 -0
  199. package/boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp +65 -0
  200. package/boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp +79 -0
  201. package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_cash_karp54.hpp +47 -0
  202. package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_cash_karp54_classic.hpp +48 -0
  203. package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_dopri5.hpp +56 -0
  204. package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_fehlberg78.hpp +46 -0
  205. package/boost/numeric/odeint/stepper/generation/make_controlled.hpp +103 -0
  206. package/boost/numeric/odeint/stepper/generation/make_dense_output.hpp +100 -0
  207. package/boost/numeric/odeint/stepper/generation.hpp +37 -0
  208. package/boost/numeric/odeint/stepper/implicit_euler.hpp +170 -0
  209. package/boost/numeric/odeint/stepper/modified_midpoint.hpp +315 -0
  210. package/boost/numeric/odeint/stepper/rosenbrock4.hpp +346 -0
  211. package/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp +240 -0
  212. package/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp +204 -0
  213. package/boost/numeric/odeint/stepper/runge_kutta4.hpp +181 -0
  214. package/boost/numeric/odeint/stepper/runge_kutta4_classic.hpp +232 -0
  215. package/boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp +231 -0
  216. package/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp +289 -0
  217. package/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp +403 -0
  218. package/boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp +374 -0
  219. package/boost/numeric/odeint/stepper/stepper_categories.hpp +66 -0
  220. package/boost/numeric/odeint/stepper/symplectic_euler.hpp +136 -0
  221. package/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp +160 -0
  222. package/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp +162 -0
  223. package/boost/numeric/odeint/stepper/velocity_verlet.hpp +375 -0
  224. package/boost/numeric/odeint/tools/assert.hpp +30 -0
  225. package/boost/numeric/odeint/tools/is_standalone.hpp +21 -0
  226. package/boost/numeric/odeint/tools/traits.hpp +39 -0
  227. package/boost/numeric/odeint/util/bind.hpp +35 -0
  228. package/boost/numeric/odeint/util/copy.hpp +88 -0
  229. package/boost/numeric/odeint/util/detail/is_range.hpp +127 -0
  230. package/boost/numeric/odeint/util/detail/less_with_sign.hpp +78 -0
  231. package/boost/numeric/odeint/util/is_pair.hpp +42 -0
  232. package/boost/numeric/odeint/util/is_resizeable.hpp +84 -0
  233. package/boost/numeric/odeint/util/multi_array_adaption.hpp +131 -0
  234. package/boost/numeric/odeint/util/n_ary_helper.hpp +96 -0
  235. package/boost/numeric/odeint/util/odeint_error.hpp +77 -0
  236. package/boost/numeric/odeint/util/resize.hpp +120 -0
  237. package/boost/numeric/odeint/util/resizer.hpp +94 -0
  238. package/boost/numeric/odeint/util/same_instance.hpp +56 -0
  239. package/boost/numeric/odeint/util/same_size.hpp +117 -0
  240. package/boost/numeric/odeint/util/split.hpp +64 -0
  241. package/boost/numeric/odeint/util/split_adaptor.hpp +103 -0
  242. package/boost/numeric/odeint/util/state_wrapper.hpp +50 -0
  243. package/boost/numeric/odeint/util/stepper_traits.hpp +63 -0
  244. package/boost/numeric/odeint/util/ublas_matrix_expression.patch +6 -0
  245. package/boost/numeric/odeint/util/ublas_wrapper.hpp +297 -0
  246. package/boost/numeric/odeint/util/unit_helper.hpp +151 -0
  247. package/boost/numeric/odeint/util/unwrap_reference.hpp +141 -0
  248. package/boost/numeric/odeint/version.hpp +55 -0
  249. package/boost/numeric/odeint.hpp +87 -0
  250. package/boost/numeric/ublas/assignment.hpp +1288 -0
  251. package/boost/numeric/ublas/banded.hpp +2372 -0
  252. package/boost/numeric/ublas/blas.hpp +499 -0
  253. package/boost/numeric/ublas/detail/concepts.hpp +1465 -0
  254. package/boost/numeric/ublas/detail/config.hpp +304 -0
  255. package/boost/numeric/ublas/detail/definitions.hpp +212 -0
  256. package/boost/numeric/ublas/detail/documentation.hpp +33 -0
  257. package/boost/numeric/ublas/detail/duff.hpp +56 -0
  258. package/boost/numeric/ublas/detail/iterator.hpp +1448 -0
  259. package/boost/numeric/ublas/detail/matrix_assign.hpp +1785 -0
  260. package/boost/numeric/ublas/detail/raw.hpp +878 -0
  261. package/boost/numeric/ublas/detail/returntype_deduction.hpp +174 -0
  262. package/boost/numeric/ublas/detail/temporary.hpp +33 -0
  263. package/boost/numeric/ublas/detail/vector_assign.hpp +609 -0
  264. package/boost/numeric/ublas/doxydoc.hpp +58 -0
  265. package/boost/numeric/ublas/exception.hpp +297 -0
  266. package/boost/numeric/ublas/experimental/sparse_view.hpp +317 -0
  267. package/boost/numeric/ublas/expression_types.hpp +506 -0
  268. package/boost/numeric/ublas/functional.hpp +2112 -0
  269. package/boost/numeric/ublas/fwd.hpp +229 -0
  270. package/boost/numeric/ublas/hermitian.hpp +2633 -0
  271. package/boost/numeric/ublas/io.hpp +355 -0
  272. package/boost/numeric/ublas/lu.hpp +350 -0
  273. package/boost/numeric/ublas/matrix.hpp +6013 -0
  274. package/boost/numeric/ublas/matrix_expression.hpp +5693 -0
  275. package/boost/numeric/ublas/matrix_proxy.hpp +5457 -0
  276. package/boost/numeric/ublas/matrix_sparse.hpp +5773 -0
  277. package/boost/numeric/ublas/matrix_vector.hpp +406 -0
  278. package/boost/numeric/ublas/opencl/elementwise.hpp +508 -0
  279. package/boost/numeric/ublas/opencl/library.hpp +38 -0
  280. package/boost/numeric/ublas/opencl/matrix.hpp +123 -0
  281. package/boost/numeric/ublas/opencl/misc.hpp +182 -0
  282. package/boost/numeric/ublas/opencl/operations.hpp +18 -0
  283. package/boost/numeric/ublas/opencl/prod.hpp +364 -0
  284. package/boost/numeric/ublas/opencl/transpose.hpp +142 -0
  285. package/boost/numeric/ublas/opencl/vector.hpp +90 -0
  286. package/boost/numeric/ublas/opencl.hpp +16 -0
  287. package/boost/numeric/ublas/operation/begin.hpp +318 -0
  288. package/boost/numeric/ublas/operation/c_array.hpp +41 -0
  289. package/boost/numeric/ublas/operation/end.hpp +318 -0
  290. package/boost/numeric/ublas/operation/num_columns.hpp +45 -0
  291. package/boost/numeric/ublas/operation/num_rows.hpp +44 -0
  292. package/boost/numeric/ublas/operation/size.hpp +350 -0
  293. package/boost/numeric/ublas/operation.hpp +830 -0
  294. package/boost/numeric/ublas/operation_blocked.hpp +266 -0
  295. package/boost/numeric/ublas/operation_sparse.hpp +198 -0
  296. package/boost/numeric/ublas/operations.hpp +26 -0
  297. package/boost/numeric/ublas/storage.hpp +2131 -0
  298. package/boost/numeric/ublas/storage_sparse.hpp +578 -0
  299. package/boost/numeric/ublas/symmetric.hpp +2309 -0
  300. package/boost/numeric/ublas/tags.hpp +37 -0
  301. package/boost/numeric/ublas/tensor/algorithms.hpp +345 -0
  302. package/boost/numeric/ublas/tensor/expression.hpp +181 -0
  303. package/boost/numeric/ublas/tensor/expression_evaluation.hpp +288 -0
  304. package/boost/numeric/ublas/tensor/extents.hpp +335 -0
  305. package/boost/numeric/ublas/tensor/functions.hpp +558 -0
  306. package/boost/numeric/ublas/tensor/index.hpp +89 -0
  307. package/boost/numeric/ublas/tensor/multi_index.hpp +110 -0
  308. package/boost/numeric/ublas/tensor/multi_index_utility.hpp +364 -0
  309. package/boost/numeric/ublas/tensor/multiplication.hpp +945 -0
  310. package/boost/numeric/ublas/tensor/operators_arithmetic.hpp +244 -0
  311. package/boost/numeric/ublas/tensor/operators_comparison.hpp +175 -0
  312. package/boost/numeric/ublas/tensor/ostream.hpp +122 -0
  313. package/boost/numeric/ublas/tensor/storage_traits.hpp +84 -0
  314. package/boost/numeric/ublas/tensor/strides.hpp +251 -0
  315. package/boost/numeric/ublas/tensor/tensor.hpp +734 -0
  316. package/boost/numeric/ublas/tensor.hpp +26 -0
  317. package/boost/numeric/ublas/traits/c_array.hpp +110 -0
  318. package/boost/numeric/ublas/traits/const_iterator_type.hpp +127 -0
  319. package/boost/numeric/ublas/traits/iterator_type.hpp +126 -0
  320. package/boost/numeric/ublas/traits.hpp +753 -0
  321. package/boost/numeric/ublas/triangular.hpp +2775 -0
  322. package/boost/numeric/ublas/vector.hpp +2947 -0
  323. package/boost/numeric/ublas/vector_expression.hpp +1762 -0
  324. package/boost/numeric/ublas/vector_of_vector.hpp +1347 -0
  325. package/boost/numeric/ublas/vector_proxy.hpp +1697 -0
  326. package/boost/numeric/ublas/vector_sparse.hpp +2246 -0
  327. package/package.json +3 -7
@@ -0,0 +1,734 @@
1
+ // Copyright (c) 2018-2019
2
+ // Cem Bassoy
3
+ //
4
+ // Distributed under the Boost Software License, Version 1.0. (See
5
+ // accompanying file LICENSE_1_0.txt or copy at
6
+ // http://www.boost.org/LICENSE_1_0.txt)
7
+ //
8
+ // The authors gratefully acknowledge the support of
9
+ // Fraunhofer and Google in producing this work
10
+ // which started as a Google Summer of Code project.
11
+ //
12
+
13
+
14
+ /// \file tensor.hpp Definition for the tensor template class
15
+
16
+ #ifndef BOOST_UBLAS_TENSOR_IMPL_HPP
17
+ #define BOOST_UBLAS_TENSOR_IMPL_HPP
18
+
19
+ #include <boost/config.hpp>
20
+
21
+ #include <initializer_list>
22
+
23
+ #include "algorithms.hpp"
24
+ #include "expression.hpp"
25
+ #include "expression_evaluation.hpp"
26
+ #include "extents.hpp"
27
+ #include "strides.hpp"
28
+ #include "index.hpp"
29
+
30
+ namespace boost { namespace numeric { namespace ublas {
31
+
32
+ template<class T, class F, class A>
33
+ class tensor;
34
+
35
+ template<class T, class F, class A>
36
+ class matrix;
37
+
38
+ template<class T, class A>
39
+ class vector;
40
+
41
+ ///** \brief Base class for Tensor container models
42
+ // *
43
+ // * it does not model the Tensor concept but all derived types should.
44
+ // * The class defines a common base type and some common interface for all
45
+ // * statically derived Tensor classes
46
+ // * We implement the casts to the statically derived type.
47
+ // */
48
+ //template<class C>
49
+ //class tensor_container:
50
+ // public detail::tensor_expression<C>
51
+ //{
52
+ //public:
53
+ // static const unsigned complexity = 0;
54
+ // typedef C container_type;
55
+ // typedef tensor_tag type_category;
56
+
57
+ // BOOST_UBLAS_INLINE
58
+ // const container_type &operator () () const {
59
+ // return *static_cast<const container_type *> (this);
60
+ // }
61
+ // BOOST_UBLAS_INLINE
62
+ // container_type &operator () () {
63
+ // return *static_cast<container_type *> (this);
64
+ // }
65
+ //};
66
+
67
+
68
+
69
+ /** @brief A dense tensor of values of type \c T.
70
+ *
71
+ * For a \f$n\f$-dimensional tensor \f$v\f$ and \f$0\leq i < n\f$ every element \f$v_i\f$ is mapped
72
+ * to the \f$i\f$-th element of the container. A storage type \c A can be specified which defaults to \c unbounded_array.
73
+ * Elements are constructed by \c A, which need not initialise their value.
74
+ *
75
+ * @tparam T type of the objects stored in the tensor (like int, double, complex,...)
76
+ * @tparam A The type of the storage array of the tensor. Default is \c unbounded_array<T>. \c <bounded_array<T> and \c std::vector<T> can also be used
77
+ */
78
+ template<class T, class F = first_order, class A = std::vector<T,std::allocator<T>> >
79
+ class tensor:
80
+ public detail::tensor_expression<tensor<T, F, A>,tensor<T, F, A>>
81
+ {
82
+
83
+ static_assert( std::is_same<F,first_order>::value ||
84
+ std::is_same<F,last_order >::value, "boost::numeric::tensor template class only supports first- or last-order storage formats.");
85
+
86
+ using self_type = tensor<T, F, A>;
87
+ public:
88
+
89
+
90
+
91
+ template<class derived_type>
92
+ using tensor_expression_type = detail::tensor_expression<self_type,derived_type>;
93
+
94
+ template<class derived_type>
95
+ using matrix_expression_type = matrix_expression<derived_type>;
96
+
97
+ template<class derived_type>
98
+ using vector_expression_type = vector_expression<derived_type>;
99
+
100
+ using super_type = tensor_expression_type<self_type>;
101
+
102
+ // static_assert(std::is_same_v<tensor_expression_type<self_type>, detail::tensor_expression<tensor<T,F,A>,tensor<T,F,A>>>, "tensor_expression_type<self_type>");
103
+
104
+ using array_type = A;
105
+ using layout_type = F;
106
+
107
+
108
+ using size_type = typename array_type::size_type;
109
+ using difference_type = typename array_type::difference_type;
110
+ using value_type = typename array_type::value_type;
111
+
112
+ using reference = typename array_type::reference;
113
+ using const_reference = typename array_type::const_reference;
114
+
115
+ using pointer = typename array_type::pointer;
116
+ using const_pointer = typename array_type::const_pointer;
117
+
118
+ using iterator = typename array_type::iterator;
119
+ using const_iterator = typename array_type::const_iterator;
120
+
121
+ using reverse_iterator = typename array_type::reverse_iterator;
122
+ using const_reverse_iterator = typename array_type::const_reverse_iterator;
123
+
124
+ using tensor_temporary_type = self_type;
125
+ using storage_category = dense_tag;
126
+
127
+ using strides_type = basic_strides<std::size_t,layout_type>;
128
+ using extents_type = shape;
129
+
130
+ using matrix_type = matrix<value_type,layout_type,array_type>;
131
+ using vector_type = vector<value_type,array_type>;
132
+
133
+
134
+ /** @brief Constructs a tensor.
135
+ *
136
+ * @note the tensor is empty.
137
+ * @note the tensor needs to reshaped for further use.
138
+ *
139
+ */
140
+ BOOST_UBLAS_INLINE
141
+ constexpr tensor ()
142
+ : tensor_expression_type<self_type>() // container_type
143
+ , extents_()
144
+ , strides_()
145
+ , data_()
146
+ {
147
+ }
148
+
149
+
150
+ /** @brief Constructs a tensor with an initializer list
151
+ *
152
+ * By default, its elements are initialized to 0.
153
+ *
154
+ * @code tensor<float> A{4,2,3}; @endcode
155
+ *
156
+ * @param l initializer list for setting the dimension extents of the tensor
157
+ */
158
+ explicit BOOST_UBLAS_INLINE
159
+ tensor (std::initializer_list<size_type> l)
160
+ : tensor_expression_type<self_type>()
161
+ , extents_ (std::move(l))
162
+ , strides_ (extents_)
163
+ , data_ (extents_.product())
164
+ {
165
+ }
166
+
167
+
168
+ /** @brief Constructs a tensor with a \c shape
169
+ *
170
+ * By default, its elements are initialized to 0.
171
+ *
172
+ * @code tensor<float> A{extents{4,2,3}}; @endcode
173
+ *
174
+ * @param s initial tensor dimension extents
175
+ */
176
+ explicit BOOST_UBLAS_INLINE
177
+ tensor (extents_type const& s)
178
+ : tensor_expression_type<self_type>() //tensor_container<self_type>()
179
+ , extents_ (s)
180
+ , strides_ (extents_)
181
+ , data_ (extents_.product())
182
+ {}
183
+
184
+
185
+ /** @brief Constructs a tensor with a \c shape and initiates it with one-dimensional data
186
+ *
187
+ * @code tensor<float> A{extents{4,2,3}, array }; @endcode
188
+ *
189
+ *
190
+ * @param s initial tensor dimension extents
191
+ * @param a container of \c array_type that is copied according to the storage layout
192
+ */
193
+ BOOST_UBLAS_INLINE
194
+ tensor (extents_type const& s, const array_type &a)
195
+ : tensor_expression_type<self_type>() //tensor_container<self_type>()
196
+ , extents_ (s)
197
+ , strides_ (extents_)
198
+ , data_ (a)
199
+ {
200
+ if(this->extents_.product() != this->data_.size())
201
+ throw std::runtime_error("Error in boost::numeric::ublas::tensor: size of provided data and specified extents do not match.");
202
+ }
203
+
204
+
205
+
206
+ /** @brief Constructs a tensor using a shape tuple and initiates it with a value.
207
+ *
208
+ * @code tensor<float> A{extents{4,2,3}, 1 }; @endcode
209
+ *
210
+ * @param e initial tensor dimension extents
211
+ * @param i initial value of all elements of type \c value_type
212
+ */
213
+ BOOST_UBLAS_INLINE
214
+ tensor (extents_type const& e, const value_type &i)
215
+ : tensor_expression_type<self_type>() //tensor_container<self_type> ()
216
+ , extents_ (e)
217
+ , strides_ (extents_)
218
+ , data_ (extents_.product(), i)
219
+ {}
220
+
221
+
222
+
223
+ /** @brief Constructs a tensor from another tensor
224
+ *
225
+ * @param v tensor to be copied.
226
+ */
227
+ BOOST_UBLAS_INLINE
228
+ tensor (const tensor &v)
229
+ : tensor_expression_type<self_type>()
230
+ , extents_ (v.extents_)
231
+ , strides_ (v.strides_)
232
+ , data_ (v.data_ )
233
+ {}
234
+
235
+
236
+
237
+ /** @brief Constructs a tensor from another tensor
238
+ *
239
+ * @param v tensor to be moved.
240
+ */
241
+ BOOST_UBLAS_INLINE
242
+ tensor (tensor &&v)
243
+ : tensor_expression_type<self_type>() //tensor_container<self_type> ()
244
+ , extents_ (std::move(v.extents_))
245
+ , strides_ (std::move(v.strides_))
246
+ , data_ (std::move(v.data_ ))
247
+ {}
248
+
249
+
250
+ /** @brief Constructs a tensor with a matrix
251
+ *
252
+ * \note Initially the tensor will be two-dimensional.
253
+ *
254
+ * @param v matrix to be copied.
255
+ */
256
+ BOOST_UBLAS_INLINE
257
+ tensor (const matrix_type &v)
258
+ : tensor_expression_type<self_type>()
259
+ , extents_ ()
260
+ , strides_ ()
261
+ , data_ (v.data())
262
+ {
263
+ if(!data_.empty()){
264
+ extents_ = extents_type{v.size1(),v.size2()};
265
+ strides_ = strides_type(extents_);
266
+ }
267
+ }
268
+
269
+ /** @brief Constructs a tensor with a matrix
270
+ *
271
+ * \note Initially the tensor will be two-dimensional.
272
+ *
273
+ * @param v matrix to be moved.
274
+ */
275
+ BOOST_UBLAS_INLINE
276
+ tensor (matrix_type &&v)
277
+ : tensor_expression_type<self_type>()
278
+ , extents_ {}
279
+ , strides_ {}
280
+ , data_ {}
281
+ {
282
+ if(v.size1()*v.size2() != 0){
283
+ extents_ = extents_type{v.size1(),v.size2()};
284
+ strides_ = strides_type(extents_);
285
+ data_ = std::move(v.data());
286
+ }
287
+ }
288
+
289
+ /** @brief Constructs a tensor using a \c vector
290
+ *
291
+ * @note It is assumed that vector is column vector
292
+ * @note Initially the tensor will be one-dimensional.
293
+ *
294
+ * @param v vector to be copied.
295
+ */
296
+ BOOST_UBLAS_INLINE
297
+ tensor (const vector_type &v)
298
+ : tensor_expression_type<self_type>()
299
+ , extents_ ()
300
+ , strides_ ()
301
+ , data_ (v.data())
302
+ {
303
+ if(!data_.empty()){
304
+ extents_ = extents_type{data_.size(),1};
305
+ strides_ = strides_type(extents_);
306
+ }
307
+ }
308
+
309
+ /** @brief Constructs a tensor using a \c vector
310
+ *
311
+ * @param v vector to be moved.
312
+ */
313
+ BOOST_UBLAS_INLINE
314
+ tensor (vector_type &&v)
315
+ : tensor_expression_type<self_type>()
316
+ , extents_ {}
317
+ , strides_ {}
318
+ , data_ {}
319
+ {
320
+ if(v.size() != 0){
321
+ extents_ = extents_type{v.size(),1};
322
+ strides_ = strides_type(extents_);
323
+ data_ = std::move(v.data());
324
+ }
325
+ }
326
+
327
+
328
+ /** @brief Constructs a tensor with another tensor with a different layout
329
+ *
330
+ * @param other tensor with a different layout to be copied.
331
+ */
332
+ BOOST_UBLAS_INLINE
333
+ template<class other_layout>
334
+ tensor (const tensor<value_type, other_layout> &other)
335
+ : tensor_expression_type<self_type> ()
336
+ , extents_ (other.extents())
337
+ , strides_ (other.extents())
338
+ , data_ (other.extents().product())
339
+ {
340
+ copy(this->rank(), this->extents().data(),
341
+ this->data(), this->strides().data(),
342
+ other.data(), other.strides().data());
343
+ }
344
+
345
+ /** @brief Constructs a tensor with an tensor expression
346
+ *
347
+ * @code tensor<float> A = B + 3 * C; @endcode
348
+ *
349
+ * @note type must be specified of tensor must be specified.
350
+ * @note dimension extents are extracted from tensors within the expression.
351
+ *
352
+ * @param expr tensor expression
353
+ */
354
+ BOOST_UBLAS_INLINE
355
+ template<class derived_type>
356
+ tensor (const tensor_expression_type<derived_type> &expr)
357
+ : tensor_expression_type<self_type> ()
358
+ , extents_ ( detail::retrieve_extents(expr) )
359
+ , strides_ ( extents_ )
360
+ , data_ ( extents_.product() )
361
+ {
362
+ static_assert( detail::has_tensor_types<self_type, tensor_expression_type<derived_type>>::value,
363
+ "Error in boost::numeric::ublas::tensor: expression does not contain a tensor. cannot retrieve shape.");
364
+ detail::eval( *this, expr );
365
+ }
366
+
367
+ /** @brief Constructs a tensor with a matrix expression
368
+ *
369
+ * @code tensor<float> A = B + 3 * C; @endcode
370
+ *
371
+ * @note matrix expression is evaluated and pushed into a temporary matrix before assignment.
372
+ * @note extents are automatically extracted from the temporary matrix
373
+ *
374
+ * @param expr matrix expression
375
+ */
376
+ BOOST_UBLAS_INLINE
377
+ template<class derived_type>
378
+ tensor (const matrix_expression_type<derived_type> &expr)
379
+ : tensor( matrix_type ( expr ) )
380
+ {
381
+ }
382
+
383
+ /** @brief Constructs a tensor with a vector expression
384
+ *
385
+ * @code tensor<float> A = b + 3 * b; @endcode
386
+ *
387
+ * @note matrix expression is evaluated and pushed into a temporary matrix before assignment.
388
+ * @note extents are automatically extracted from the temporary matrix
389
+ *
390
+ * @param expr vector expression
391
+ */
392
+ BOOST_UBLAS_INLINE
393
+ template<class derived_type>
394
+ tensor (const vector_expression_type<derived_type> &expr)
395
+ : tensor( vector_type ( expr ) )
396
+ {
397
+ }
398
+
399
+ /** @brief Evaluates the tensor_expression and assigns the results to the tensor
400
+ *
401
+ * @code A = B + C * 2; @endcode
402
+ *
403
+ * @note rank and dimension extents of the tensors in the expressions must conform with this tensor.
404
+ *
405
+ * @param expr expression that is evaluated.
406
+ */
407
+ BOOST_UBLAS_INLINE
408
+ template<class derived_type>
409
+ tensor &operator = (const tensor_expression_type<derived_type> &expr)
410
+ {
411
+ detail::eval(*this, expr);
412
+ return *this;
413
+ }
414
+
415
+ tensor& operator=(tensor other)
416
+ {
417
+ swap (*this, other);
418
+ return *this;
419
+ }
420
+
421
+ tensor& operator=(const_reference v)
422
+ {
423
+ std::fill(this->begin(), this->end(), v);
424
+ return *this;
425
+ }
426
+
427
+ /** @brief Returns true if the tensor is empty (\c size==0) */
428
+ BOOST_UBLAS_INLINE
429
+ bool empty () const {
430
+ return this->data_.empty();
431
+ }
432
+
433
+
434
+ /** @brief Returns the size of the tensor */
435
+ BOOST_UBLAS_INLINE
436
+ size_type size () const {
437
+ return this->data_.size ();
438
+ }
439
+
440
+ /** @brief Returns the size of the tensor */
441
+ BOOST_UBLAS_INLINE
442
+ size_type size (size_type r) const {
443
+ return this->extents_.at(r);
444
+ }
445
+
446
+ /** @brief Returns the number of dimensions/modes of the tensor */
447
+ BOOST_UBLAS_INLINE
448
+ size_type rank () const {
449
+ return this->extents_.size();
450
+ }
451
+
452
+ /** @brief Returns the number of dimensions/modes of the tensor */
453
+ BOOST_UBLAS_INLINE
454
+ size_type order () const {
455
+ return this->extents_.size();
456
+ }
457
+
458
+ /** @brief Returns the strides of the tensor */
459
+ BOOST_UBLAS_INLINE
460
+ strides_type const& strides () const {
461
+ return this->strides_;
462
+ }
463
+
464
+ /** @brief Returns the extents of the tensor */
465
+ BOOST_UBLAS_INLINE
466
+ extents_type const& extents () const {
467
+ return this->extents_;
468
+ }
469
+
470
+
471
+ /** @brief Returns a \c const reference to the container. */
472
+ BOOST_UBLAS_INLINE
473
+ const_pointer data () const {
474
+ return this->data_.data();
475
+ }
476
+
477
+ /** @brief Returns a \c const reference to the container. */
478
+ BOOST_UBLAS_INLINE
479
+ pointer data () {
480
+ return this->data_.data();
481
+ }
482
+
483
+ /** @brief Element access using a single index.
484
+ *
485
+ * @code auto a = A[i]; @endcode
486
+ *
487
+ * @param i zero-based index where 0 <= i < this->size()
488
+ */
489
+ BOOST_UBLAS_INLINE
490
+ const_reference operator [] (size_type i) const {
491
+ return this->data_[i];
492
+ }
493
+
494
+ /** @brief Element access using a single index.
495
+ *
496
+ *
497
+ * @code A[i] = a; @endcode
498
+ *
499
+ * @param i zero-based index where 0 <= i < this->size()
500
+ */
501
+ BOOST_UBLAS_INLINE
502
+ reference operator [] (size_type i)
503
+ {
504
+ return this->data_[i];
505
+ }
506
+
507
+
508
+ /** @brief Element access using a multi-index or single-index.
509
+ *
510
+ *
511
+ * @code auto a = A.at(i,j,k); @endcode or
512
+ * @code auto a = A.at(i); @endcode
513
+ *
514
+ * @param i zero-based index where 0 <= i < this->size() if sizeof...(is) == 0, else 0<= i < this->size(0)
515
+ * @param is zero-based indices where 0 <= is[r] < this->size(r) where 0 < r < this->rank()
516
+ */
517
+ template<class ... size_types>
518
+ BOOST_UBLAS_INLINE
519
+ const_reference at (size_type i, size_types ... is) const {
520
+ if constexpr (sizeof...(is) == 0)
521
+ return this->data_[i];
522
+ else
523
+ return this->data_[detail::access<0ul>(size_type(0),this->strides_,i,std::forward<size_types>(is)...)];
524
+ }
525
+
526
+ /** @brief Element access using a multi-index or single-index.
527
+ *
528
+ *
529
+ * @code A.at(i,j,k) = a; @endcode or
530
+ * @code A.at(i) = a; @endcode
531
+ *
532
+ * @param i zero-based index where 0 <= i < this->size() if sizeof...(is) == 0, else 0<= i < this->size(0)
533
+ * @param is zero-based indices where 0 <= is[r] < this->size(r) where 0 < r < this->rank()
534
+ */
535
+ BOOST_UBLAS_INLINE
536
+ template<class ... size_types>
537
+ reference at (size_type i, size_types ... is) {
538
+ if constexpr (sizeof...(is) == 0)
539
+ return this->data_[i];
540
+ else
541
+ return this->data_[detail::access<0ul>(size_type(0),this->strides_,i,std::forward<size_types>(is)...)];
542
+ }
543
+
544
+
545
+
546
+
547
+ /** @brief Element access using a single index.
548
+ *
549
+ *
550
+ * @code A(i) = a; @endcode
551
+ *
552
+ * @param i zero-based index where 0 <= i < this->size()
553
+ */
554
+ BOOST_UBLAS_INLINE
555
+ const_reference operator()(size_type i) const {
556
+ return this->data_[i];
557
+ }
558
+
559
+
560
+ /** @brief Element access using a single index.
561
+ *
562
+ * @code A(i) = a; @endcode
563
+ *
564
+ * @param i zero-based index where 0 <= i < this->size()
565
+ */
566
+ BOOST_UBLAS_INLINE
567
+ reference operator()(size_type i){
568
+ return this->data_[i];
569
+ }
570
+
571
+
572
+
573
+
574
+ /** @brief Generates a tensor index for tensor contraction
575
+ *
576
+ *
577
+ * @code auto Ai = A(_i,_j,k); @endcode
578
+ *
579
+ * @param i placeholder
580
+ * @param is zero-based indices where 0 <= is[r] < this->size(r) where 0 < r < this->rank()
581
+ */
582
+ BOOST_UBLAS_INLINE
583
+ template<std::size_t I, class ... index_types>
584
+ decltype(auto) operator() (index::index_type<I> p, index_types ... ps) const
585
+ {
586
+ constexpr auto N = sizeof...(ps)+1;
587
+ if( N != this->rank() )
588
+ throw std::runtime_error("Error in boost::numeric::ublas::operator(): size of provided index_types does not match with the rank.");
589
+
590
+ return std::make_pair( std::cref(*this), std::make_tuple( p, std::forward<index_types>(ps)... ) );
591
+ }
592
+
593
+
594
+
595
+
596
+
597
+ /** @brief Reshapes the tensor
598
+ *
599
+ *
600
+ * (1) @code A.reshape(extents{m,n,o}); @endcode or
601
+ * (2) @code A.reshape(extents{m,n,o},4); @endcode
602
+ *
603
+ * If the size of this smaller than the specified extents than
604
+ * default constructed (1) or specified (2) value is appended.
605
+ *
606
+ * @note rank of the tensor might also change.
607
+ *
608
+ * @param e extents with which the tensor is reshaped.
609
+ * @param v value which is appended if the tensor is enlarged.
610
+ */
611
+ BOOST_UBLAS_INLINE
612
+ void reshape (extents_type const& e, value_type v = value_type{})
613
+ {
614
+ this->extents_ = e;
615
+ this->strides_ = strides_type(this->extents_);
616
+
617
+ if(e.product() != this->size())
618
+ this->data_.resize (this->extents_.product(), v);
619
+ }
620
+
621
+
622
+
623
+
624
+
625
+ friend void swap(tensor& lhs, tensor& rhs) {
626
+ std::swap(lhs.data_ , rhs.data_ );
627
+ std::swap(lhs.extents_, rhs.extents_);
628
+ std::swap(lhs.strides_, rhs.strides_);
629
+ }
630
+
631
+
632
+ /// \brief return an iterator on the first element of the tensor
633
+ BOOST_UBLAS_INLINE
634
+ const_iterator begin () const {
635
+ return data_.begin ();
636
+ }
637
+
638
+ /// \brief return an iterator on the first element of the tensor
639
+ BOOST_UBLAS_INLINE
640
+ const_iterator cbegin () const {
641
+ return data_.cbegin ();
642
+ }
643
+
644
+ /// \brief return an iterator after the last element of the tensor
645
+ BOOST_UBLAS_INLINE
646
+ const_iterator end () const {
647
+ return data_.end();
648
+ }
649
+
650
+ /// \brief return an iterator after the last element of the tensor
651
+ BOOST_UBLAS_INLINE
652
+ const_iterator cend () const {
653
+ return data_.cend ();
654
+ }
655
+
656
+ /// \brief Return an iterator on the first element of the tensor
657
+ BOOST_UBLAS_INLINE
658
+ iterator begin () {
659
+ return data_.begin();
660
+ }
661
+
662
+ /// \brief Return an iterator at the end of the tensor
663
+ BOOST_UBLAS_INLINE
664
+ iterator end () {
665
+ return data_.end();
666
+ }
667
+
668
+ /// \brief Return a const reverse iterator before the first element of the reversed tensor (i.e. end() of normal tensor)
669
+ BOOST_UBLAS_INLINE
670
+ const_reverse_iterator rbegin () const {
671
+ return data_.rbegin();
672
+ }
673
+
674
+ /// \brief Return a const reverse iterator before the first element of the reversed tensor (i.e. end() of normal tensor)
675
+ BOOST_UBLAS_INLINE
676
+ const_reverse_iterator crbegin () const {
677
+ return data_.crbegin();
678
+ }
679
+
680
+ /// \brief Return a const reverse iterator on the end of the reverse tensor (i.e. first element of the normal tensor)
681
+ BOOST_UBLAS_INLINE
682
+ const_reverse_iterator rend () const {
683
+ return data_.rend();
684
+ }
685
+
686
+ /// \brief Return a const reverse iterator on the end of the reverse tensor (i.e. first element of the normal tensor)
687
+ BOOST_UBLAS_INLINE
688
+ const_reverse_iterator crend () const {
689
+ return data_.crend();
690
+ }
691
+
692
+ /// \brief Return a const reverse iterator before the first element of the reversed tensor (i.e. end() of normal tensor)
693
+ BOOST_UBLAS_INLINE
694
+ reverse_iterator rbegin () {
695
+ return data_.rbegin();
696
+ }
697
+
698
+ /// \brief Return a const reverse iterator on the end of the reverse tensor (i.e. first element of the normal tensor)
699
+ BOOST_UBLAS_INLINE
700
+ reverse_iterator rend () {
701
+ return data_.rend();
702
+ }
703
+
704
+
705
+ #if 0
706
+ // -------------
707
+ // Serialization
708
+ // -------------
709
+
710
+ /// Serialize a tensor into and archive as defined in Boost
711
+ /// \param ar Archive object. Can be a flat file, an XML file or any other stream
712
+ /// \param file_version Optional file version (not yet used)
713
+ template<class Archive>
714
+ void serialize(Archive & ar, const unsigned int /* file_version */){
715
+ ar & serialization::make_nvp("data",data_);
716
+ }
717
+ #endif
718
+
719
+
720
+
721
+ private:
722
+
723
+ extents_type extents_;
724
+ strides_type strides_;
725
+ array_type data_;
726
+ };
727
+
728
+ }}} // namespaces
729
+
730
+
731
+
732
+
733
+
734
+ #endif