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,558 @@
1
+ //
2
+ // Copyright (c) 2018-2019, Cem Bassoy, cem.bassoy@gmail.com
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 IOSB, Ettlingen, Germany
10
+ //
11
+
12
+
13
+ #ifndef BOOST_UBLAS_TENSOR_FUNCTIONS_HPP
14
+ #define BOOST_UBLAS_TENSOR_FUNCTIONS_HPP
15
+
16
+
17
+ #include <stdexcept>
18
+ #include <vector>
19
+ #include <algorithm>
20
+ #include <numeric>
21
+
22
+
23
+ #include "multiplication.hpp"
24
+ #include "algorithms.hpp"
25
+ #include "expression.hpp"
26
+ #include "expression_evaluation.hpp"
27
+ #include "storage_traits.hpp"
28
+
29
+ namespace boost {
30
+ namespace numeric {
31
+ namespace ublas {
32
+
33
+ template<class Value, class Format, class Allocator>
34
+ class tensor;
35
+
36
+ template<class Value, class Format, class Allocator>
37
+ class matrix;
38
+
39
+ template<class Value, class Allocator>
40
+ class vector;
41
+
42
+
43
+
44
+
45
+ /** @brief Computes the m-mode tensor-times-vector product
46
+ *
47
+ * Implements C[i1,...,im-1,im+1,...,ip] = A[i1,i2,...,ip] * b[im]
48
+ *
49
+ * @note calls ublas::ttv
50
+ *
51
+ * @param[in] m contraction dimension with 1 <= m <= p
52
+ * @param[in] a tensor object A with order p
53
+ * @param[in] b vector object B
54
+ *
55
+ * @returns tensor object C with order p-1, the same storage format and allocator type as A
56
+ */
57
+ template<class V, class F, class A1, class A2>
58
+ auto prod(tensor<V,F,A1> const& a, vector<V,A2> const& b, const std::size_t m)
59
+ {
60
+
61
+ using tensor_type = tensor<V,F,A1>;
62
+ using extents_type = typename tensor_type::extents_type;
63
+ using ebase_type = typename extents_type::base_type;
64
+ using value_type = typename tensor_type::value_type;
65
+ using size_type = typename extents_type::value_type;
66
+
67
+ auto const p = std::size_t(a.rank());
68
+
69
+ if( m == 0)
70
+ throw std::length_error("error in boost::numeric::ublas::prod(ttv): contraction mode must be greater than zero.");
71
+
72
+ if( p < m )
73
+ throw std::length_error("error in boost::numeric::ublas::prod(ttv): rank of tensor must be greater than or equal to the modus.");
74
+
75
+ if( p == 0)
76
+ throw std::length_error("error in boost::numeric::ublas::prod(ttv): rank of tensor must be greater than zero.");
77
+
78
+ if( a.empty() )
79
+ throw std::length_error("error in boost::numeric::ublas::prod(ttv): first argument tensor should not be empty.");
80
+
81
+ if( b.size() == 0)
82
+ throw std::length_error("error in boost::numeric::ublas::prod(ttv): second argument vector should not be empty.");
83
+
84
+
85
+ auto nc = ebase_type(std::max(p-1, size_type(2)) , size_type(1));
86
+ auto nb = ebase_type{b.size(),1};
87
+
88
+
89
+ for(auto i = 0u, j = 0u; i < p; ++i)
90
+ if(i != m-1)
91
+ nc[j++] = a.extents().at(i);
92
+
93
+ auto c = tensor_type(extents_type(nc),value_type{});
94
+
95
+ auto bb = &(b(0));
96
+
97
+ ttv(m, p,
98
+ c.data(), c.extents().data(), c.strides().data(),
99
+ a.data(), a.extents().data(), a.strides().data(),
100
+ bb, nb.data(), nb.data());
101
+
102
+
103
+ return c;
104
+ }
105
+
106
+
107
+
108
+ /** @brief Computes the m-mode tensor-times-matrix product
109
+ *
110
+ * Implements C[i1,...,im-1,j,im+1,...,ip] = A[i1,i2,...,ip] * B[j,im]
111
+ *
112
+ * @note calls ublas::ttm
113
+ *
114
+ * @param[in] a tensor object A with order p
115
+ * @param[in] b vector object B
116
+ * @param[in] m contraction dimension with 1 <= m <= p
117
+ *
118
+ * @returns tensor object C with order p, the same storage format and allocator type as A
119
+ */
120
+ template<class V, class F, class A1, class A2>
121
+ auto prod(tensor<V,F,A1> const& a, matrix<V,F,A2> const& b, const std::size_t m)
122
+ {
123
+
124
+ using tensor_type = tensor<V,F,A1>;
125
+ using extents_type = typename tensor_type::extents_type;
126
+ using strides_type = typename tensor_type::strides_type;
127
+ using value_type = typename tensor_type::value_type;
128
+
129
+
130
+ auto const p = a.rank();
131
+
132
+ if( m == 0)
133
+ throw std::length_error("error in boost::numeric::ublas::prod(ttm): contraction mode must be greater than zero.");
134
+
135
+ if( p < m || m > a.extents().size())
136
+ throw std::length_error("error in boost::numeric::ublas::prod(ttm): rank of the tensor must be greater equal the modus.");
137
+
138
+ if( p == 0)
139
+ throw std::length_error("error in boost::numeric::ublas::prod(ttm): rank of the tensor must be greater than zero.");
140
+
141
+ if( a.empty() )
142
+ throw std::length_error("error in boost::numeric::ublas::prod(ttm): first argument tensor should not be empty.");
143
+
144
+ if( b.size1()*b.size2() == 0)
145
+ throw std::length_error("error in boost::numeric::ublas::prod(ttm): second argument matrix should not be empty.");
146
+
147
+
148
+ auto nc = a.extents().base();
149
+ auto nb = extents_type {b.size1(),b.size2()};
150
+ auto wb = strides_type (nb);
151
+
152
+ nc[m-1] = nb[0];
153
+
154
+ auto c = tensor_type(extents_type(nc),value_type{});
155
+
156
+ auto bb = &(b(0,0));
157
+
158
+ ttm(m, p,
159
+ c.data(), c.extents().data(), c.strides().data(),
160
+ a.data(), a.extents().data(), a.strides().data(),
161
+ bb, nb.data(), wb.data());
162
+
163
+
164
+ return c;
165
+ }
166
+
167
+
168
+
169
+
170
+ /** @brief Computes the q-mode tensor-times-tensor product
171
+ *
172
+ * Implements C[i1,...,ir,j1,...,js] = sum( A[i1,...,ir+q] * B[j1,...,js+q] )
173
+ *
174
+ * @note calls ublas::ttt
175
+ *
176
+ * na[phia[x]] = nb[phib[x]] for 1 <= x <= q
177
+ *
178
+ * @param[in] phia one-based permutation tuple of length q for the first input tensor a
179
+ * @param[in] phib one-based permutation tuple of length q for the second input tensor b
180
+ * @param[in] a left-hand side tensor with order r+q
181
+ * @param[in] b right-hand side tensor with order s+q
182
+ * @result tensor with order r+s
183
+ */
184
+ template<class V, class F, class A1, class A2>
185
+ auto prod(tensor<V,F,A1> const& a, tensor<V,F,A2> const& b,
186
+ std::vector<std::size_t> const& phia, std::vector<std::size_t> const& phib)
187
+ {
188
+
189
+ using tensor_type = tensor<V,F,A1>;
190
+ using extents_type = typename tensor_type::extents_type;
191
+ using value_type = typename tensor_type::value_type;
192
+ using size_type = typename extents_type::value_type;
193
+
194
+ auto const pa = a.rank();
195
+ auto const pb = b.rank();
196
+
197
+ auto const q = size_type(phia.size());
198
+
199
+ if(pa == 0ul)
200
+ throw std::runtime_error("error in ublas::prod: order of left-hand side tensor must be greater than 0.");
201
+ if(pb == 0ul)
202
+ throw std::runtime_error("error in ublas::prod: order of right-hand side tensor must be greater than 0.");
203
+ if(pa < q)
204
+ throw std::runtime_error("error in ublas::prod: number of contraction dimensions cannot be greater than the order of the left-hand side tensor.");
205
+ if(pb < q)
206
+ throw std::runtime_error("error in ublas::prod: number of contraction dimensions cannot be greater than the order of the right-hand side tensor.");
207
+
208
+ if(q != phib.size())
209
+ throw std::runtime_error("error in ublas::prod: permutation tuples must have the same length.");
210
+
211
+ if(pa < phia.size())
212
+ throw std::runtime_error("error in ublas::prod: permutation tuple for the left-hand side tensor cannot be greater than the corresponding order.");
213
+ if(pb < phib.size())
214
+ throw std::runtime_error("error in ublas::prod: permutation tuple for the right-hand side tensor cannot be greater than the corresponding order.");
215
+
216
+
217
+ auto const& na = a.extents();
218
+ auto const& nb = b.extents();
219
+
220
+ for(auto i = 0ul; i < q; ++i)
221
+ if( na.at(phia.at(i)-1) != nb.at(phib.at(i)-1))
222
+ throw std::runtime_error("error in ublas::prod: permutations of the extents are not correct.");
223
+
224
+ auto const r = pa - q;
225
+ auto const s = pb - q;
226
+
227
+
228
+ std::vector<std::size_t> phia1(pa), phib1(pb);
229
+ std::iota(phia1.begin(), phia1.end(), 1ul);
230
+ std::iota(phib1.begin(), phib1.end(), 1ul);
231
+
232
+ std::vector<std::size_t> nc( std::max ( r+s , size_type(2) ), size_type(1) );
233
+
234
+ for(auto i = 0ul; i < phia.size(); ++i)
235
+ * std::remove(phia1.begin(), phia1.end(), phia.at(i)) = phia.at(i);
236
+
237
+ //phia1.erase( std::remove(phia1.begin(), phia1.end(), phia.at(i)), phia1.end() ) ;
238
+
239
+ assert(phia1.size() == pa);
240
+
241
+ for(auto i = 0ul; i < r; ++i)
242
+ nc[ i ] = na[ phia1[ i ] - 1 ];
243
+
244
+ for(auto i = 0ul; i < phib.size(); ++i)
245
+ * std::remove(phib1.begin(), phib1.end(), phib.at(i)) = phib.at(i) ;
246
+ //phib1.erase( std::remove(phib1.begin(), phib1.end(), phia.at(i)), phib1.end() ) ;
247
+
248
+ assert(phib1.size() == pb);
249
+
250
+ for(auto i = 0ul; i < s; ++i)
251
+ nc[ r + i ] = nb[ phib1[ i ] - 1 ];
252
+
253
+ // std::copy( phib.begin(), phib.end(), phib1.end() );
254
+
255
+ assert( phia1.size() == pa );
256
+ assert( phib1.size() == pb );
257
+
258
+ auto c = tensor_type(extents_type(nc), value_type{});
259
+
260
+ ttt(pa, pb, q,
261
+ phia1.data(), phib1.data(),
262
+ c.data(), c.extents().data(), c.strides().data(),
263
+ a.data(), a.extents().data(), a.strides().data(),
264
+ b.data(), b.extents().data(), b.strides().data());
265
+
266
+ return c;
267
+ }
268
+
269
+ //template<class V, class F, class A1, class A2, std::size_t N, std::size_t M>
270
+ //auto operator*( tensor_index<V,F,A1,N> const& lhs, tensor_index<V,F,A2,M> const& rhs)
271
+
272
+
273
+
274
+
275
+ /** @brief Computes the q-mode tensor-times-tensor product
276
+ *
277
+ * Implements C[i1,...,ir,j1,...,js] = sum( A[i1,...,ir+q] * B[j1,...,js+q] )
278
+ *
279
+ * @note calls ublas::ttt
280
+ *
281
+ * na[phi[x]] = nb[phi[x]] for 1 <= x <= q
282
+ *
283
+ * @param[in] phi one-based permutation tuple of length q for bot input tensors
284
+ * @param[in] a left-hand side tensor with order r+q
285
+ * @param[in] b right-hand side tensor with order s+q
286
+ * @result tensor with order r+s
287
+ */
288
+ template<class V, class F, class A1, class A2>
289
+ auto prod(tensor<V,F,A1> const& a, tensor<V,F,A2> const& b,
290
+ std::vector<std::size_t> const& phi)
291
+ {
292
+ return prod(a, b, phi, phi);
293
+ }
294
+
295
+
296
+ /** @brief Computes the inner product of two tensors
297
+ *
298
+ * Implements c = sum(A[i1,i2,...,ip] * B[i1,i2,...,jp])
299
+ *
300
+ * @note calls inner function
301
+ *
302
+ * @param[in] a tensor object A
303
+ * @param[in] b tensor object B
304
+ *
305
+ * @returns a value type.
306
+ */
307
+ template<class V, class F, class A1, class A2>
308
+ auto inner_prod(tensor<V,F,A1> const& a, tensor<V,F,A2> const& b)
309
+ {
310
+ using value_type = typename tensor<V,F,A1>::value_type;
311
+
312
+ if( a.rank() != b.rank() )
313
+ throw std::length_error("error in boost::numeric::ublas::inner_prod: Rank of both tensors must be the same.");
314
+
315
+ if( a.empty() || b.empty())
316
+ throw std::length_error("error in boost::numeric::ublas::inner_prod: Tensors should not be empty.");
317
+
318
+ if( a.extents() != b.extents())
319
+ throw std::length_error("error in boost::numeric::ublas::inner_prod: Tensor extents should be the same.");
320
+
321
+ return inner(a.rank(), a.extents().data(),
322
+ a.data(), a.strides().data(),
323
+ b.data(), b.strides().data(), value_type{0});
324
+ }
325
+
326
+ /** @brief Computes the outer product of two tensors
327
+ *
328
+ * Implements C[i1,...,ip,j1,...,jq] = A[i1,i2,...,ip] * B[j1,j2,...,jq]
329
+ *
330
+ * @note calls outer function
331
+ *
332
+ * @param[in] a tensor object A
333
+ * @param[in] b tensor object B
334
+ *
335
+ * @returns tensor object C with the same storage format F and allocator type A1
336
+ */
337
+ template<class V, class F, class A1, class A2>
338
+ auto outer_prod(tensor<V,F,A1> const& a, tensor<V,F,A2> const& b)
339
+ {
340
+ using tensor_type = tensor<V,F,A1>;
341
+ using extents_type = typename tensor_type::extents_type;
342
+
343
+ if( a.empty() || b.empty() )
344
+ throw std::runtime_error("error in boost::numeric::ublas::outer_prod: tensors should not be empty.");
345
+
346
+ auto nc = typename extents_type::base_type(a.rank() + b.rank());
347
+ for(auto i = 0u; i < a.rank(); ++i)
348
+ nc.at(i) = a.extents().at(i);
349
+
350
+ for(auto i = 0u; i < b.rank(); ++i)
351
+ nc.at(a.rank()+i) = b.extents().at(i);
352
+
353
+ auto c = tensor_type(extents_type(nc));
354
+
355
+ outer(c.data(), c.rank(), c.extents().data(), c.strides().data(),
356
+ a.data(), a.rank(), a.extents().data(), a.strides().data(),
357
+ b.data(), b.rank(), b.extents().data(), b.strides().data());
358
+
359
+ return c;
360
+ }
361
+
362
+
363
+
364
+ /** @brief Transposes a tensor according to a permutation tuple
365
+ *
366
+ * Implements C[tau[i1],tau[i2]...,tau[ip]] = A[i1,i2,...,ip]
367
+ *
368
+ * @note calls trans function
369
+ *
370
+ * @param[in] a tensor object of rank p
371
+ * @param[in] tau one-based permutation tuple of length p
372
+ * @returns a transposed tensor object with the same storage format F and allocator type A
373
+ */
374
+ template<class V, class F, class A>
375
+ auto trans(tensor<V,F,A> const& a, std::vector<std::size_t> const& tau)
376
+ {
377
+ using tensor_type = tensor<V,F,A>;
378
+ using extents_type = typename tensor_type::extents_type;
379
+ // using strides_type = typename tensor_type::strides_type;
380
+
381
+ if( a.empty() )
382
+ return tensor<V,F,A>{};
383
+
384
+ auto const p = a.rank();
385
+ auto const& na = a.extents();
386
+
387
+ auto nc = typename extents_type::base_type (p);
388
+ for(auto i = 0u; i < p; ++i)
389
+ nc.at(tau.at(i)-1) = na.at(i);
390
+
391
+ // auto wc = strides_type(extents_type(nc));
392
+
393
+ auto c = tensor_type(extents_type(nc));
394
+
395
+
396
+ trans( a.rank(), a.extents().data(), tau.data(),
397
+ c.data(), c.strides().data(),
398
+ a.data(), a.strides().data());
399
+
400
+ // auto wc_pi = typename strides_type::base_type (p);
401
+ // for(auto i = 0u; i < p; ++i)
402
+ // wc_pi.at(tau.at(i)-1) = c.strides().at(i);
403
+
404
+
405
+ //copy(a.rank(),
406
+ // a.extents().data(),
407
+ // c.data(), wc_pi.data(),
408
+ // a.data(), a.strides().data() );
409
+
410
+ return c;
411
+ }
412
+
413
+ /** @brief Computes the frobenius norm of a tensor expression
414
+ *
415
+ * @note evaluates the tensor expression and calls the accumulate function
416
+ *
417
+ *
418
+ * Implements the two-norm with
419
+ * k = sqrt( sum_(i1,...,ip) A(i1,...,ip)^2 )
420
+ *
421
+ * @param[in] a tensor object of rank p
422
+ * @returns the frobenius norm of the tensor
423
+ */
424
+ //template<class V, class F, class A>
425
+ //auto norm(tensor<V,F,A> const& a)
426
+ template<class T, class D>
427
+ auto norm(detail::tensor_expression<T,D> const& expr)
428
+ {
429
+
430
+ using tensor_type = typename detail::tensor_expression<T,D>::tensor_type;
431
+ using value_type = typename tensor_type::value_type;
432
+
433
+ auto a = tensor_type( expr );
434
+
435
+ if( a.empty() )
436
+ throw std::runtime_error("error in boost::numeric::ublas::norm: tensors should not be empty.");
437
+
438
+ return std::sqrt( accumulate( a.order(), a.extents().data(), a.data(), a.strides().data(), value_type{},
439
+ [](auto const& l, auto const& r){ return l + r*r; } ) ) ;
440
+ }
441
+
442
+
443
+
444
+ /** @brief Extract the real component of tensor elements within a tensor expression
445
+ *
446
+ * @param[in] lhs tensor expression
447
+ * @returns unary tensor expression
448
+ */
449
+ template<class T, class D>
450
+ auto real(detail::tensor_expression<T,D> const& expr) {
451
+ return detail::make_unary_tensor_expression<T> (expr(), [] (auto const& l) { return std::real( l ); } );
452
+ }
453
+
454
+ /** @brief Extract the real component of tensor elements within a tensor expression
455
+ *
456
+ * @param[in] lhs tensor expression
457
+ * @returns unary tensor expression
458
+ */
459
+ template<class V, class F, class A, class D>
460
+ auto real(detail::tensor_expression<tensor<std::complex<V>,F,A>,D> const& expr)
461
+ {
462
+ using tensor_complex_type = tensor<std::complex<V>,F,A>;
463
+ using tensor_type = tensor<V,F,typename storage_traits<A>::template rebind<V>>;
464
+
465
+ if( detail::retrieve_extents( expr ).empty() )
466
+ throw std::runtime_error("error in boost::numeric::ublas::real: tensors should not be empty.");
467
+
468
+ auto a = tensor_complex_type( expr );
469
+ auto c = tensor_type( a.extents() );
470
+
471
+ std::transform( a.begin(), a.end(), c.begin(), [](auto const& l){ return std::real(l) ; } );
472
+
473
+ return c;
474
+ }
475
+
476
+
477
+ /** @brief Extract the imaginary component of tensor elements within a tensor expression
478
+ *
479
+ * @param[in] lhs tensor expression
480
+ * @returns unary tensor expression
481
+ */
482
+ template<class T, class D>
483
+ auto imag(detail::tensor_expression<T,D> const& lhs) {
484
+ return detail::make_unary_tensor_expression<T> (lhs(), [] (auto const& l) { return std::imag( l ); } );
485
+ }
486
+
487
+
488
+ /** @brief Extract the imag component of tensor elements within a tensor expression
489
+ *
490
+ * @param[in] lhs tensor expression
491
+ * @returns unary tensor expression
492
+ */
493
+ template<class V, class A, class F, class D>
494
+ auto imag(detail::tensor_expression<tensor<std::complex<V>,F,A>,D> const& expr)
495
+ {
496
+ using tensor_complex_type = tensor<std::complex<V>,F,A>;
497
+ using tensor_type = tensor<V,F,typename storage_traits<A>::template rebind<V>>;
498
+
499
+ if( detail::retrieve_extents( expr ).empty() )
500
+ throw std::runtime_error("error in boost::numeric::ublas::real: tensors should not be empty.");
501
+
502
+ auto a = tensor_complex_type( expr );
503
+ auto c = tensor_type( a.extents() );
504
+
505
+ std::transform( a.begin(), a.end(), c.begin(), [](auto const& l){ return std::imag(l) ; } );
506
+
507
+ return c;
508
+ }
509
+
510
+ /** @brief Computes the complex conjugate component of tensor elements within a tensor expression
511
+ *
512
+ * @param[in] expr tensor expression
513
+ * @returns complex tensor
514
+ */
515
+ template<class T, class D>
516
+ auto conj(detail::tensor_expression<T,D> const& expr)
517
+ {
518
+ using tensor_type = T;
519
+ using value_type = typename tensor_type::value_type;
520
+ using layout_type = typename tensor_type::layout_type;
521
+ using array_type = typename tensor_type::array_type;
522
+
523
+ using new_value_type = std::complex<value_type>;
524
+ using new_array_type = typename storage_traits<array_type>::template rebind<new_value_type>;
525
+
526
+ using tensor_complex_type = tensor<new_value_type,layout_type, new_array_type>;
527
+
528
+ if( detail::retrieve_extents( expr ).empty() )
529
+ throw std::runtime_error("error in boost::numeric::ublas::conj: tensors should not be empty.");
530
+
531
+ auto a = tensor_type( expr );
532
+ auto c = tensor_complex_type( a.extents() );
533
+
534
+ std::transform( a.begin(), a.end(), c.begin(), [](auto const& l){ return std::conj(l) ; } );
535
+
536
+ return c;
537
+ }
538
+
539
+
540
+ /** @brief Computes the complex conjugate component of tensor elements within a tensor expression
541
+ *
542
+ * @param[in] lhs tensor expression
543
+ * @returns unary tensor expression
544
+ */
545
+ template<class V, class A, class F, class D>
546
+ auto conj(detail::tensor_expression<tensor<std::complex<V>,F,A>,D> const& expr)
547
+ {
548
+ return detail::make_unary_tensor_expression<tensor<std::complex<V>,F,A>> (expr(), [] (auto const& l) { return std::conj( l ); } );
549
+ }
550
+
551
+
552
+
553
+ }
554
+ }
555
+ }
556
+
557
+
558
+ #endif
@@ -0,0 +1,89 @@
1
+ //
2
+ // Copyright (c) 2018-2019, Cem Bassoy, cem.bassoy@gmail.com
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 IOSB, Ettlingen, Germany
10
+ //
11
+
12
+ #ifndef BOOST_UBLAS_TENSOR_INDEX_HPP
13
+ #define BOOST_UBLAS_TENSOR_INDEX_HPP
14
+
15
+
16
+ #include <cstddef>
17
+ #include <array>
18
+ #include <vector>
19
+
20
+ namespace boost {
21
+ namespace numeric {
22
+ namespace ublas {
23
+ namespace index {
24
+
25
+ /** @brief Proxy template class for the einstein summation notation
26
+ *
27
+ * @note index::index_type<K> for 0<=K<=16 is used in tensor::operator()
28
+ *
29
+ * @tparam I wrapped integer
30
+ */
31
+ template<std::size_t I>
32
+ struct index_type
33
+ {
34
+ static constexpr std::size_t value = I;
35
+
36
+ constexpr bool operator == (std::size_t other) const { return value == other; }
37
+ constexpr bool operator != (std::size_t other) const { return value != other; }
38
+
39
+ template <std::size_t K>
40
+ constexpr bool operator == (index_type<K> /*other*/) const { return I==K; }
41
+ template <std::size_t K>
42
+ constexpr bool operator != (index_type<K> /*other*/) const { return I!=K; }
43
+
44
+ constexpr bool operator == (index_type /*other*/) const { return true; }
45
+ constexpr bool operator != (index_type /*other*/) const { return false; }
46
+
47
+ constexpr std::size_t operator()() const { return I; }
48
+ };
49
+
50
+ /** @brief Proxy classes for the einstein summation notation
51
+ *
52
+ * @note index::_a ... index::_z is used in tensor::operator()
53
+ */
54
+
55
+ static constexpr index_type< 0> _;
56
+ static constexpr index_type< 1> _a;
57
+ static constexpr index_type< 2> _b;
58
+ static constexpr index_type< 3> _c;
59
+ static constexpr index_type< 4> _d;
60
+ static constexpr index_type< 5> _e;
61
+ static constexpr index_type< 6> _f;
62
+ static constexpr index_type< 7> _g;
63
+ static constexpr index_type< 8> _h;
64
+ static constexpr index_type< 9> _i;
65
+ static constexpr index_type<10> _j;
66
+ static constexpr index_type<11> _k;
67
+ static constexpr index_type<12> _l;
68
+ static constexpr index_type<13> _m;
69
+ static constexpr index_type<14> _n;
70
+ static constexpr index_type<15> _o;
71
+ static constexpr index_type<16> _p;
72
+ static constexpr index_type<17> _q;
73
+ static constexpr index_type<18> _r;
74
+ static constexpr index_type<19> _s;
75
+ static constexpr index_type<20> _t;
76
+ static constexpr index_type<21> _u;
77
+ static constexpr index_type<22> _v;
78
+ static constexpr index_type<23> _w;
79
+ static constexpr index_type<24> _x;
80
+ static constexpr index_type<25> _y;
81
+ static constexpr index_type<26> _z;
82
+
83
+ } // namespace indices
84
+
85
+ }
86
+ }
87
+ }
88
+
89
+ #endif // _BOOST_UBLAS_TENSOR_INDEX_HPP_