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,182 @@
1
+ // Boost.uBLAS
2
+ //
3
+ // Copyright (c) 2018 Fady Essam
4
+ // Copyright (c) 2018 Stefan Seefeld
5
+ //
6
+ // Distributed under the Boost Software License, Version 1.0.
7
+ // (See accompanying file LICENSE_1_0.txt or
8
+ // copy at http://www.boost.org/LICENSE_1_0.txt)
9
+
10
+ #ifndef boost_numeric_ublas_opencl_misc_hpp_
11
+ #define boost_numeric_ublas_opencl_misc_hpp_
12
+
13
+ #include <boost/numeric/ublas/opencl/library.hpp>
14
+ #include <boost/numeric/ublas/opencl/vector.hpp>
15
+ #include <boost/numeric/ublas/opencl/matrix.hpp>
16
+
17
+ namespace boost { namespace numeric { namespace ublas { namespace opencl {
18
+
19
+ template <typename T>
20
+ typename std::enable_if<is_numeric<T>::value, T>::type
21
+ a_sum(ublas::vector<T, opencl::storage> const &v, compute::command_queue& queue)
22
+ {
23
+ compute::vector<T> scratch_buffer(v.size(), queue.get_context());
24
+ compute::vector<T> result_buffer(1, queue.get_context());
25
+ cl_event event;
26
+ if (std::is_same<T, float>::value)
27
+ clblasSasum(v.size(),
28
+ result_buffer.begin().get_buffer().get(), //result buffer
29
+ 0, //offset in result buffer
30
+ v.begin().get_buffer().get(), //input buffer
31
+ 0, //offset in input buffer
32
+ 1, //increment in input buffer
33
+ scratch_buffer.begin().get_buffer().get(),
34
+ 1, //number of command queues
35
+ &(queue.get()), //queue
36
+ 0, // number of events waiting list
37
+ NULL, //event waiting list
38
+ &event); //event
39
+ else if (std::is_same<T, double>::value)
40
+ clblasDasum(v.size(),
41
+ result_buffer.begin().get_buffer().get(), //result buffer
42
+ 0, //offset in result buffer
43
+ v.begin().get_buffer().get(), //input buffer
44
+ 0, //offset in input buffer
45
+ 1, //increment in input buffer
46
+ scratch_buffer.begin().get_buffer().get(),
47
+ 1, //number of command queues
48
+ &(queue.get()), //queue
49
+ 0, // number of events waiting list
50
+ NULL, //event waiting list
51
+ &event); //event
52
+ else if (std::is_same<T, std::complex<float>>::value)
53
+ clblasScasum(v.size(),
54
+ result_buffer.begin().get_buffer().get(), //result buffer
55
+ 0, //offset in result buffer
56
+ v.begin().get_buffer().get(), //input buffer
57
+ 0, //offset in input buffer
58
+ 1, //increment in input buffer
59
+ scratch_buffer.begin().get_buffer().get(),
60
+ 1, //number of command queues
61
+ &(queue.get()), //queue
62
+ 0, // number of events waiting list
63
+ NULL, //event waiting list
64
+ &event); //event
65
+ else if (std::is_same<T, std::complex<double>>::value)
66
+ clblasDzasum(v.size(),
67
+ result_buffer.begin().get_buffer().get(), //result buffer
68
+ 0, //offset in result buffer
69
+ v.begin().get_buffer().get(), //input buffer
70
+ 0, //offset in input buffer
71
+ 1, //increment in input buffer
72
+ scratch_buffer.begin().get_buffer().get(),
73
+ 1, //number of command queues
74
+ &(queue.get()), //queue
75
+ 0, // number of events waiting list
76
+ NULL, //event waiting list
77
+ &event); //event
78
+ clWaitForEvents(1, &event);
79
+ return result_buffer[0];
80
+ }
81
+
82
+ template <typename T, typename A>
83
+ typename std::enable_if<is_numeric<T>::value, T>::type
84
+ a_sum(ublas::vector<T, A> const &v, compute::command_queue& queue)
85
+ {
86
+ ublas::vector<T, opencl::storage> vdev(v, queue);
87
+ return a_sum(vdev, queue);
88
+ }
89
+
90
+ template <typename T>
91
+ typename std::enable_if<std::is_same<T, float>::value |
92
+ std::is_same<T, double>::value,
93
+ T>::type
94
+ norm_1(ublas::vector<T, opencl::storage> const &v, compute::command_queue& queue)
95
+ {
96
+ return a_sum(v, queue);
97
+ }
98
+
99
+ template <typename T, typename A>
100
+ typename std::enable_if<std::is_same<T, float>::value |
101
+ std::is_same<T, double>::value,
102
+ T>::type
103
+ norm_1(ublas::vector<T, A> const &v, compute::command_queue& queue)
104
+ {
105
+ ublas::vector<T, opencl::storage> vdev(v, queue);
106
+ return norm_1(vdev, queue);
107
+ }
108
+
109
+ template <typename T>
110
+ typename std::enable_if<is_numeric<T>::value, T>::type
111
+ norm_2(ublas::vector<T, opencl::storage> const &v, compute::command_queue& queue)
112
+ {
113
+ compute::vector<T> scratch_buffer(2*v.size(), queue.get_context());
114
+ compute::vector<T> result_buffer(1, queue.get_context());
115
+ cl_event event;
116
+ if (std::is_same<T, float>::value)
117
+ clblasSnrm2(v.size(),
118
+ result_buffer.begin().get_buffer().get(), //result buffer
119
+ 0, //offset in result buffer
120
+ v.begin().get_buffer().get(), //input buffer
121
+ 0, //offset in input buffer
122
+ 1, //increment in input buffer
123
+ scratch_buffer.begin().get_buffer().get(),
124
+ 1, //number of command queues
125
+ &(queue.get()), //queue
126
+ 0, // number of events waiting list
127
+ NULL, //event waiting list
128
+ &event); //event
129
+ else if (std::is_same<T, double>::value)
130
+ clblasDnrm2(v.size(),
131
+ result_buffer.begin().get_buffer().get(), //result buffer
132
+ 0, //offset in result buffer
133
+ v.begin().get_buffer().get(), //input buffer
134
+ 0, //offset in input buffer
135
+ 1, //increment in input buffer
136
+ scratch_buffer.begin().get_buffer().get(),
137
+ 1, //number of command queues
138
+ &(queue.get()), //queue
139
+ 0, // number of events waiting list
140
+ NULL, //event waiting list
141
+ &event); //event
142
+ else if (std::is_same<T, std::complex<float>>::value)
143
+ clblasScnrm2(v.size(),
144
+ result_buffer.begin().get_buffer().get(), //result buffer
145
+ 0, //offset in result buffer
146
+ v.begin().get_buffer().get(), //input buffer
147
+ 0, //offset in input buffer
148
+ 1, //increment in input buffer
149
+ scratch_buffer.begin().get_buffer().get(),
150
+ 1, //number of command queues
151
+ &(queue.get()), //queue
152
+ 0, // number of events waiting list
153
+ NULL, //event waiting list
154
+ &event); //event
155
+ else if (std::is_same<T, std::complex<double>>::value)
156
+ clblasDznrm2(v.size(),
157
+ result_buffer.begin().get_buffer().get(), //result buffer
158
+ 0, //offset in result buffer
159
+ v.begin().get_buffer().get(), //input buffer
160
+ 0, //offset in input buffer
161
+ 1, //increment in input buffer
162
+ scratch_buffer.begin().get_buffer().get(),
163
+ 1, //number of command queues
164
+ &(queue.get()), //queue
165
+ 0, // number of events waiting list
166
+ NULL, //event waiting list
167
+ &event); //event
168
+ clWaitForEvents(1, &event);
169
+ return result_buffer[0];
170
+ }
171
+
172
+ template <typename T, typename A>
173
+ typename std::enable_if<is_numeric<T>::value, T>::type
174
+ norm_2(ublas::vector<T, A> const &v, compute::command_queue& queue)
175
+ {
176
+ ublas::vector<T, opencl::storage> vdev(v, queue);
177
+ return norm_2(vdev, queue);
178
+ }
179
+
180
+ }}}}
181
+
182
+ #endif
@@ -0,0 +1,18 @@
1
+ // Boost.uBLAS
2
+ //
3
+ // Copyright (c) 2018 Fady Essam
4
+ // Copyright (c) 2018 Stefan Seefeld
5
+ //
6
+ // Distributed under the Boost Software License, Version 1.0.
7
+ // (See accompanying file LICENSE_1_0.txt or
8
+ // copy at http://www.boost.org/LICENSE_1_0.txt)
9
+
10
+ #ifndef boost_numeric_ublas_opencl_operations_hpp_
11
+ #define boost_numeric_ublas_opencl_operations_hpp_
12
+
13
+ #include <boost/numeric/ublas/opencl/transpose.hpp>
14
+ #include <boost/numeric/ublas/opencl/prod.hpp>
15
+ #include <boost/numeric/ublas/opencl/elementwise.hpp>
16
+ #include <boost/numeric/ublas/opencl/misc.hpp>
17
+
18
+ #endif
@@ -0,0 +1,364 @@
1
+ // Boost.uBLAS
2
+ //
3
+ // Copyright (c) 2018 Fady Essam
4
+ // Copyright (c) 2018 Stefan Seefeld
5
+ //
6
+ // Distributed under the Boost Software License, Version 1.0.
7
+ // (See accompanying file LICENSE_1_0.txt or
8
+ // copy at http://www.boost.org/LICENSE_1_0.txt)
9
+
10
+ #ifndef boost_numeric_ublas_opencl_prod_hpp_
11
+ #define boost_numeric_ublas_opencl_prod_hpp_
12
+
13
+ #include <boost/numeric/ublas/opencl/library.hpp>
14
+ #include <boost/numeric/ublas/opencl/vector.hpp>
15
+ #include <boost/numeric/ublas/opencl/matrix.hpp>
16
+ #include <boost/numeric/ublas/opencl/transpose.hpp>
17
+ #include <boost/compute/buffer.hpp>
18
+
19
+ namespace boost { namespace numeric { namespace ublas { namespace opencl {
20
+
21
+ #define ONE_DOUBLE_COMPLEX {{1.0, 00.0}}
22
+ #define ONE_FLOAT_COMPLEX {{1.0f, 00.0f}}
23
+
24
+ template <typename T, typename L1, typename L2>
25
+ typename std::enable_if<is_numeric<T>::value>::type
26
+ prod(ublas::matrix<T, L1, opencl::storage> const &a,
27
+ ublas::matrix<T, L2, opencl::storage> const &b,
28
+ ublas::matrix<T, L1, opencl::storage> &result,
29
+ compute::command_queue &queue)
30
+ {
31
+ assert(a.device() == b.device() &&
32
+ a.device() == result.device() &&
33
+ a.device() == queue.get_device());
34
+ assert(a.size2() == b.size1());
35
+
36
+ result.fill(0, queue);
37
+
38
+ //to hold matrix b with layout 1 if the b has different layout
39
+ std::unique_ptr<ublas::matrix<T, L1, opencl::storage>> bl1;
40
+
41
+ cl_event event = NULL;
42
+
43
+ cl_mem buffer_a = a.begin().get_buffer().get();
44
+ cl_mem buffer_b = b.begin().get_buffer().get();
45
+ cl_mem buffer_result = result.begin().get_buffer().get();
46
+
47
+ if (!(std::is_same<L1, L2>::value))
48
+ {
49
+ bl1.reset(new ublas::matrix<T, L1, opencl::storage>(b.size1(), b.size2(), queue.get_context()));
50
+ change_layout(b, *bl1, queue);
51
+ buffer_b = bl1->begin().get_buffer().get();
52
+ }
53
+
54
+ clblasOrder Order = std::is_same<L1, ublas::basic_row_major<> >::value ? clblasRowMajor : clblasColumnMajor;
55
+ size_t lda = Order == clblasRowMajor ? a.size2() : a.size1();
56
+ size_t ldb = Order == clblasRowMajor ? b.size2() : a.size2();
57
+ size_t ldc = Order == clblasRowMajor ? b.size2() : a.size1();
58
+
59
+ if (std::is_same<T, float>::value)
60
+ clblasSgemm(Order, clblasNoTrans, clblasNoTrans,
61
+ a.size1(), b.size2(), a.size2(),
62
+ 1, buffer_a, 0, lda,
63
+ buffer_b, 0, ldb, 1,
64
+ buffer_result, 0, ldc,
65
+ 1, &(queue.get()), 0, NULL, &event);
66
+ else if (std::is_same<T, double>::value)
67
+ clblasDgemm(Order, clblasNoTrans, clblasNoTrans,
68
+ a.size1(), b.size2(), a.size2(),
69
+ 1, buffer_a, 0, lda,
70
+ buffer_b, 0, ldb, 1,
71
+ buffer_result, 0, ldc,
72
+ 1, &(queue.get()), 0, NULL, &event);
73
+ else if (std::is_same<T, std::complex<float>>::value)
74
+ clblasCgemm(Order, clblasNoTrans, clblasNoTrans,
75
+ a.size1(), b.size2(), a.size2(),
76
+ ONE_FLOAT_COMPLEX, buffer_a, 0, lda,
77
+ buffer_b, 0, ldb, ONE_FLOAT_COMPLEX,
78
+ buffer_result, 0, ldc,
79
+ 1, &(queue.get()), 0, NULL, &event);
80
+ else if (std::is_same<T, std::complex<double>>::value)
81
+ clblasZgemm(Order, clblasNoTrans, clblasNoTrans,
82
+ a.size1(), b.size2(), a.size2(),
83
+ ONE_DOUBLE_COMPLEX, buffer_a, 0, lda,
84
+ buffer_b, 0, ldb, ONE_DOUBLE_COMPLEX,
85
+ buffer_result, 0, ldc,
86
+ 1, &(queue.get()), 0, NULL, &event);
87
+ clWaitForEvents(1, &event);
88
+ }
89
+
90
+ template <typename T, typename L1, typename L2, typename A>
91
+ typename std::enable_if<is_numeric<T>::value>::type
92
+ prod(ublas::matrix<T, L1, A> const &a,
93
+ ublas::matrix<T, L2, A> const &b,
94
+ ublas::matrix<T, L1, A> &result,
95
+ compute::command_queue &queue)
96
+ {
97
+ ublas::matrix<T, L1, opencl::storage> adev(a, queue);
98
+ ublas::matrix<T, L2, opencl::storage> bdev(b, queue);
99
+ ublas::matrix<T, L1, opencl::storage> rdev(a.size1(), b.size2(), queue.get_context());
100
+ prod(adev, bdev, rdev, queue);
101
+ rdev.to_host(result,queue);
102
+ }
103
+
104
+ template <typename T, typename L1, typename L2, typename A>
105
+ typename std::enable_if<is_numeric<T>::value, ublas::matrix<T, L1, A>>::type
106
+ prod(ublas::matrix<T, L1, A> const &a,
107
+ ublas::matrix<T, L2, A> const &b,
108
+ compute::command_queue &queue)
109
+ {
110
+ ublas::matrix<T, L1, A> result(a.size1(), b.size2());
111
+ prod(a, b, result, queue);
112
+ return result;
113
+ }
114
+
115
+ template <typename T, typename L>
116
+ typename std::enable_if<is_numeric<T>::value>::type
117
+ prod(ublas::matrix<T, L, opencl::storage> const &a,
118
+ ublas::vector<T, opencl::storage> const &b,
119
+ ublas::vector<T, opencl::storage> &result,
120
+ compute::command_queue &queue)
121
+ {
122
+ assert(a.device() == b.device() &&
123
+ a.device() == result.device() &&
124
+ a.device() == queue.get_device());
125
+ assert(a.size2() == b.size());
126
+ result.fill(0, queue);
127
+
128
+ cl_event event = NULL;
129
+ clblasOrder Order = std::is_same<L, ublas::basic_row_major<> >::value ? clblasRowMajor : clblasColumnMajor;
130
+ int lda = Order == clblasRowMajor ? a.size2() : a.size1();
131
+ int ldb = Order == clblasRowMajor ? 1 : a.size2();
132
+ int ldc = Order == clblasRowMajor ? 1 : a.size1();
133
+
134
+ if (std::is_same<T, float>::value)
135
+ clblasSgemm(Order, clblasNoTrans, clblasNoTrans,
136
+ a.size1(), 1, a.size2(),
137
+ 1, a.begin().get_buffer().get(), 0, lda,
138
+ b.begin().get_buffer().get(), 0, ldb, 1,
139
+ result.begin().get_buffer().get(), 0, ldc,
140
+ 1, &(queue.get()), 0, NULL, &event);
141
+ else if (std::is_same<T, double>::value)
142
+ clblasDgemm(Order, clblasNoTrans, clblasNoTrans,
143
+ a.size1(), 1, a.size2(),
144
+ 1, a.begin().get_buffer().get(), 0, lda,
145
+ b.begin().get_buffer().get(), 0, ldb, 1,
146
+ result.begin().get_buffer().get(), 0, ldc,
147
+ 1, &(queue.get()), 0, NULL, &event);
148
+ else if (std::is_same<T, std::complex<float>>::value)
149
+ clblasCgemm(Order, clblasNoTrans, clblasNoTrans,
150
+ a.size1(), 1, a.size2(),
151
+ ONE_FLOAT_COMPLEX, a.begin().get_buffer().get(), 0, lda,
152
+ b.begin().get_buffer().get(), 0, ldb, ONE_FLOAT_COMPLEX,
153
+ result.begin().get_buffer().get(), 0, ldc,
154
+ 1, &(queue.get()), 0, NULL, &event);
155
+ else if (std::is_same<T, std::complex<double>>::value)
156
+ clblasZgemm(Order, clblasNoTrans, clblasNoTrans,
157
+ a.size1(), 1, a.size2(),
158
+ ONE_DOUBLE_COMPLEX, a.begin().get_buffer().get(), 0, lda,
159
+ b.begin().get_buffer().get(), 0, ldb, ONE_DOUBLE_COMPLEX,
160
+ result.begin().get_buffer().get(), 0, ldc,
161
+ 1, &(queue.get()), 0, NULL, &event);
162
+ clWaitForEvents(1, &event);
163
+ }
164
+
165
+ template <typename T, typename L, typename A>
166
+ typename std::enable_if<is_numeric<T>::value>::type
167
+ prod(ublas::matrix<T, L, A> const &a,
168
+ ublas::vector<T, A> const &b,
169
+ ublas::vector<T, A> &result,
170
+ compute::command_queue &queue)
171
+ {
172
+ ublas::matrix<T, L, opencl::storage> adev(a, queue);
173
+ ublas::vector<T, opencl::storage> bdev(b, queue);
174
+ ublas::vector<T, opencl::storage> rdev(a.size1(), queue.get_context());
175
+ prod(adev, bdev, rdev, queue);
176
+ rdev.to_host(result, queue);
177
+ }
178
+
179
+ template <typename T, typename L, typename A>
180
+ typename std::enable_if<is_numeric<T>::value, ublas::vector<T, A>>::type
181
+ prod(ublas::matrix<T, L, A> const &a,
182
+ ublas::vector<T, A> const &b,
183
+ compute::command_queue &queue)
184
+ {
185
+ ublas::vector<T, A> result(a.size1());
186
+ prod(a, b, result, queue);
187
+ return result;
188
+ }
189
+
190
+ template <typename T, typename L>
191
+ typename std::enable_if<is_numeric<T>::value>::type
192
+ prod(ublas::vector<T, opencl::storage> const &a,
193
+ ublas::matrix<T, L, opencl::storage> const &b,
194
+ ublas::vector<T, opencl::storage> &result,
195
+ compute::command_queue &queue)
196
+ {
197
+ assert(a.device() == b.device() &&
198
+ a.device() == result.device() &&
199
+ a.device() == queue.get_device());
200
+ assert(a.size() == b.size1());
201
+ result.fill(0, queue);
202
+ cl_event event = NULL;
203
+ clblasOrder Order = std::is_same<L, ublas::basic_row_major<> >::value ? clblasRowMajor : clblasColumnMajor;
204
+ size_t lda = Order == clblasRowMajor ? a.size() : 1;
205
+ size_t ldb = Order == clblasRowMajor ? b.size2() : a.size();
206
+ size_t ldc = Order == clblasRowMajor ? b.size2() : 1;
207
+
208
+ if (std::is_same<T, float>::value)
209
+ clblasSgemm(Order, clblasNoTrans, clblasNoTrans,
210
+ 1, b.size2(), a.size(),
211
+ 1, a.begin().get_buffer().get(), 0, lda,
212
+ b.begin().get_buffer().get(), 0, ldb, 1,
213
+ result.begin().get_buffer().get(), 0, ldc,
214
+ 1, &(queue.get()), 0, NULL, &event);
215
+ else if (std::is_same<T, double>::value)
216
+ clblasDgemm(Order, clblasNoTrans, clblasNoTrans,
217
+ 1, b.size2(), a.size(),
218
+ 1, a.begin().get_buffer().get(), 0, lda,
219
+ b.begin().get_buffer().get(), 0, ldb, 1,
220
+ result.begin().get_buffer().get(), 0, ldc,
221
+ 1, &(queue.get()), 0, NULL, &event);
222
+ else if (std::is_same<T, std::complex<float>>::value)
223
+ clblasCgemm(Order, clblasNoTrans, clblasNoTrans,
224
+ 1, b.size2(), a.size(),
225
+ ONE_FLOAT_COMPLEX, a.begin().get_buffer().get(), 0, lda,
226
+ b.begin().get_buffer().get(), 0, ldb, ONE_FLOAT_COMPLEX,
227
+ result.begin().get_buffer().get(), 0, ldc,
228
+ 1, &(queue.get()), 0, NULL, &event);
229
+ else if (std::is_same<T, std::complex<double>>::value)
230
+ clblasZgemm(Order, clblasNoTrans, clblasNoTrans,
231
+ 1, b.size2(), a.size(),
232
+ ONE_DOUBLE_COMPLEX, a.begin().get_buffer().get(), 0, lda,
233
+ b.begin().get_buffer().get(), 0, ldb, ONE_DOUBLE_COMPLEX,
234
+ result.begin().get_buffer().get(), 0, ldc,
235
+ 1, &(queue.get()), 0, NULL, &event);
236
+ clWaitForEvents(1, &event);
237
+ }
238
+
239
+ template <class T, class L, class A>
240
+ typename std::enable_if<is_numeric<T>::value>::type
241
+ prod(ublas::vector<T, A> const &a,
242
+ ublas::matrix<T, L, A> const &b,
243
+ ublas::vector<T, A> &result,
244
+ compute::command_queue &queue)
245
+ {
246
+ ublas::vector<T, opencl::storage> adev(a, queue);
247
+ ublas::matrix<T, L, opencl::storage> bdev(b, queue);
248
+ ublas::vector<T, opencl::storage> rdev(b.size2(), queue.get_context());
249
+ prod(adev, bdev, rdev, queue);
250
+ rdev.to_host(result, queue);
251
+ }
252
+
253
+ template <class T, class L, class A>
254
+ typename std::enable_if<is_numeric<T>::value, ublas::vector<T, A>>::type
255
+ prod(ublas::vector<T, A> const &a,
256
+ ublas::matrix<T, L, A> const &b,
257
+ compute::command_queue &queue)
258
+ {
259
+ ublas::vector<T, A> result(b.size2());
260
+ prod(a, b, result, queue);
261
+ return result;
262
+ }
263
+
264
+ template<class T>
265
+ typename std::enable_if<std::is_fundamental<T>::value, T>::type
266
+ inner_prod(ublas::vector<T, opencl::storage> const &a,
267
+ ublas::vector<T, opencl::storage> const &b,
268
+ compute::command_queue &queue)
269
+ {
270
+ assert(a.device() == b.device() && a.device() == queue.get_device());
271
+ assert(a.size() == b.size());
272
+ return compute::inner_product(a.begin(), a.end(), b.begin(), T(0), queue);
273
+ }
274
+
275
+ template<class T, class A>
276
+ typename std::enable_if<std::is_fundamental<T>::value, T>::type
277
+ inner_prod(ublas::vector<T, A> const &a,
278
+ ublas::vector<T, A> const &b,
279
+ compute::command_queue& queue)
280
+ {
281
+ ublas::vector<T, opencl::storage> adev(a, queue);
282
+ ublas::vector<T, opencl::storage> bdev(b, queue);
283
+ return inner_prod(adev, bdev, queue);
284
+ }
285
+
286
+ template <class T, class L>
287
+ typename std::enable_if<is_numeric<T>::value>::type
288
+ outer_prod(ublas::vector<T, opencl::storage> const &a,
289
+ ublas::vector<T, opencl::storage> const &b,
290
+ ublas::matrix<T, L, opencl::storage> &result,
291
+ compute::command_queue & queue)
292
+ {
293
+ assert(a.device() == b.device() &&
294
+ a.device() == result.device() &&
295
+ a.device() == queue.get_device());
296
+ result.fill(0, queue);
297
+ cl_event event = NULL;
298
+ clblasOrder Order = std::is_same<L, ublas::basic_row_major<> >::value ? clblasRowMajor : clblasColumnMajor;
299
+ size_t lda = Order == clblasRowMajor ? 1 : a.size();
300
+ size_t ldb = Order == clblasRowMajor ? b.size() : 1;
301
+ size_t ldc = Order == clblasRowMajor ? b.size() : a.size();
302
+
303
+ if (std::is_same<T, float>::value)
304
+ clblasSgemm(Order, clblasNoTrans, clblasNoTrans,
305
+ a.size(), b.size(), 1,
306
+ 1, a.begin().get_buffer().get(), 0, lda,
307
+ b.begin().get_buffer().get(), 0, ldb, 1,
308
+ result.begin().get_buffer().get(), 0, ldc,
309
+ 1, &(queue.get()), 0, NULL, &event);
310
+ else if (std::is_same<T, double>::value)
311
+ clblasDgemm(Order, clblasNoTrans, clblasNoTrans,
312
+ a.size(), b.size(), 1,
313
+ 1, a.begin().get_buffer().get(), 0, lda,
314
+ b.begin().get_buffer().get(), 0, ldb, 1,
315
+ result.begin().get_buffer().get(), 0, ldc,
316
+ 1, &(queue.get()), 0, NULL, &event);
317
+ else if (std::is_same<T, std::complex<float>>::value)
318
+ clblasCgemm(Order, clblasNoTrans, clblasNoTrans,
319
+ a.size(), b.size(), 1,
320
+ ONE_FLOAT_COMPLEX, a.begin().get_buffer().get(), 0, lda,
321
+ b.begin().get_buffer().get(), 0, ldb, ONE_FLOAT_COMPLEX,
322
+ result.begin().get_buffer().get(), 0, ldc,
323
+ 1, &(queue.get()), 0, NULL, &event);
324
+ else if (std::is_same<T, std::complex<double>>::value)
325
+ clblasZgemm(Order, clblasNoTrans, clblasNoTrans,
326
+ a.size(), b.size(), 1,
327
+ ONE_DOUBLE_COMPLEX, a.begin().get_buffer().get(), 0, lda,
328
+ b.begin().get_buffer().get(), 0, ldb, ONE_DOUBLE_COMPLEX,
329
+ result.begin().get_buffer().get(), 0, ldc,
330
+ 1, &(queue.get()), 0, NULL, &event);
331
+ clWaitForEvents(1, &event);
332
+ }
333
+
334
+ template <class T, class L, class A>
335
+ typename std::enable_if<is_numeric<T>::value>::type
336
+ outer_prod(ublas::vector<T, A> const &a,
337
+ ublas::vector<T, A> const &b,
338
+ ublas::matrix<T, L, A> &result,
339
+ compute::command_queue &queue)
340
+ {
341
+ ublas::vector<T, opencl::storage> adev(a, queue);
342
+ ublas::vector<T, opencl::storage> bdev(b, queue);
343
+ ublas::matrix<T, L, opencl::storage> rdev(a.size(), b.size(), queue.get_context());
344
+ outer_prod(adev, bdev, rdev, queue);
345
+ rdev.to_host(result, queue);
346
+ }
347
+
348
+ template <class T,class L = ublas::basic_row_major<>, class A>
349
+ typename std::enable_if<is_numeric<T>::value, ublas::matrix<T, L, A>>::type
350
+ outer_prod(ublas::vector<T, A> const &a,
351
+ ublas::vector<T, A> const &b,
352
+ compute::command_queue &queue)
353
+ {
354
+ ublas::matrix<T, L, A> result(a.size(), b.size());
355
+ outer_prod(a, b, result, queue);
356
+ return result;
357
+ }
358
+
359
+ #undef ONE_DOUBLE_COMPLEX
360
+ #undef ONE_FLOAT_COMPLEX
361
+
362
+ }}}}
363
+
364
+ #endif