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.
- package/README.md +29 -2
- package/boost/cast.hpp +20 -0
- package/boost/numeric/conversion/bounds.hpp +24 -0
- package/boost/numeric/conversion/cast.hpp +61 -0
- package/boost/numeric/conversion/conversion_traits.hpp +32 -0
- package/boost/numeric/conversion/converter.hpp +68 -0
- package/boost/numeric/conversion/converter_policies.hpp +194 -0
- package/boost/numeric/conversion/detail/bounds.hpp +58 -0
- package/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
- package/boost/numeric/conversion/detail/converter.hpp +593 -0
- package/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
- package/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
- package/boost/numeric/conversion/detail/meta.hpp +120 -0
- package/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
- package/boost/numeric/conversion/detail/old_numeric_cast.hpp +308 -0
- package/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
- package/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
- package/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
- package/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
- package/boost/numeric/conversion/int_float_mixture.hpp +30 -0
- package/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
- package/boost/numeric/conversion/is_subranged.hpp +27 -0
- package/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
- package/boost/numeric/conversion/sign_mixture.hpp +30 -0
- package/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
- package/boost/numeric/conversion/udt_builtin_mixture.hpp +28 -0
- package/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
- package/boost/numeric/interval/arith.hpp +305 -0
- package/boost/numeric/interval/arith2.hpp +304 -0
- package/boost/numeric/interval/arith3.hpp +69 -0
- package/boost/numeric/interval/checking.hpp +130 -0
- package/boost/numeric/interval/compare/certain.hpp +113 -0
- package/boost/numeric/interval/compare/explicit.hpp +248 -0
- package/boost/numeric/interval/compare/lexicographic.hpp +122 -0
- package/boost/numeric/interval/compare/possible.hpp +113 -0
- package/boost/numeric/interval/compare/set.hpp +101 -0
- package/boost/numeric/interval/compare/tribool.hpp +138 -0
- package/boost/numeric/interval/compare.hpp +19 -0
- package/boost/numeric/interval/constants.hpp +85 -0
- package/boost/numeric/interval/detail/alpha_rounding_control.hpp +113 -0
- package/boost/numeric/interval/detail/bcc_rounding_control.hpp +57 -0
- package/boost/numeric/interval/detail/bugs.hpp +48 -0
- package/boost/numeric/interval/detail/c99_rounding_control.hpp +50 -0
- package/boost/numeric/interval/detail/c99sub_rounding_control.hpp +43 -0
- package/boost/numeric/interval/detail/division.hpp +194 -0
- package/boost/numeric/interval/detail/ia64_rounding_control.hpp +83 -0
- package/boost/numeric/interval/detail/interval_prototype.hpp +41 -0
- package/boost/numeric/interval/detail/msvc_rounding_control.hpp +113 -0
- package/boost/numeric/interval/detail/ppc_rounding_control.hpp +99 -0
- package/boost/numeric/interval/detail/sparc_rounding_control.hpp +112 -0
- package/boost/numeric/interval/detail/test_input.hpp +76 -0
- package/boost/numeric/interval/detail/x86_rounding_control.hpp +108 -0
- package/boost/numeric/interval/detail/x86gcc_rounding_control.hpp +51 -0
- package/boost/numeric/interval/ext/integer.hpp +70 -0
- package/boost/numeric/interval/ext/x86_fast_rounding_control.hpp +70 -0
- package/boost/numeric/interval/hw_rounding.hpp +73 -0
- package/boost/numeric/interval/interval.hpp +450 -0
- package/boost/numeric/interval/io.hpp +41 -0
- package/boost/numeric/interval/limits.hpp +49 -0
- package/boost/numeric/interval/policies.hpp +75 -0
- package/boost/numeric/interval/rounded_arith.hpp +120 -0
- package/boost/numeric/interval/rounded_transc.hpp +140 -0
- package/boost/numeric/interval/rounding.hpp +101 -0
- package/boost/numeric/interval/transc.hpp +232 -0
- package/boost/numeric/interval/utility.hpp +335 -0
- package/boost/numeric/interval/utility_fwd.hpp +172 -0
- package/boost/numeric/interval.hpp +32 -0
- package/boost/numeric/odeint/algebra/algebra_dispatcher.hpp +86 -0
- package/boost/numeric/odeint/algebra/array_algebra.hpp +293 -0
- package/boost/numeric/odeint/algebra/default_operations.hpp +599 -0
- package/boost/numeric/odeint/algebra/detail/extract_value_type.hpp +51 -0
- package/boost/numeric/odeint/algebra/detail/for_each.hpp +165 -0
- package/boost/numeric/odeint/algebra/detail/macros.hpp +35 -0
- package/boost/numeric/odeint/algebra/detail/norm_inf.hpp +46 -0
- package/boost/numeric/odeint/algebra/fusion_algebra.hpp +216 -0
- package/boost/numeric/odeint/algebra/fusion_algebra_dispatcher.hpp +48 -0
- package/boost/numeric/odeint/algebra/multi_array_algebra.hpp +146 -0
- package/boost/numeric/odeint/algebra/norm_result_type.hpp +33 -0
- package/boost/numeric/odeint/algebra/operations_dispatcher.hpp +41 -0
- package/boost/numeric/odeint/algebra/range_algebra.hpp +142 -0
- package/boost/numeric/odeint/algebra/vector_space_algebra.hpp +175 -0
- package/boost/numeric/odeint/config.hpp +53 -0
- package/boost/numeric/odeint/external/blaze/blaze_algebra_dispatcher.hpp +55 -0
- package/boost/numeric/odeint/external/blaze/blaze_resize.hpp +64 -0
- package/boost/numeric/odeint/external/compute/compute.hpp +27 -0
- package/boost/numeric/odeint/external/compute/compute_algebra.hpp +65 -0
- package/boost/numeric/odeint/external/compute/compute_algebra_dispatcher.hpp +41 -0
- package/boost/numeric/odeint/external/compute/compute_operations.hpp +198 -0
- package/boost/numeric/odeint/external/compute/compute_operations_dispatcher.hpp +44 -0
- package/boost/numeric/odeint/external/compute/compute_resize.hpp +92 -0
- package/boost/numeric/odeint/external/eigen/eigen.hpp +27 -0
- package/boost/numeric/odeint/external/eigen/eigen_algebra.hpp +98 -0
- package/boost/numeric/odeint/external/eigen/eigen_algebra_dispatcher.hpp +49 -0
- package/boost/numeric/odeint/external/eigen/eigen_resize.hpp +103 -0
- package/boost/numeric/odeint/external/gsl/gsl_wrapper.hpp +228 -0
- package/boost/numeric/odeint/external/mkl/mkl_operations.hpp +181 -0
- package/boost/numeric/odeint/external/mpi/mpi.hpp +25 -0
- package/boost/numeric/odeint/external/mpi/mpi_nested_algebra.hpp +62 -0
- package/boost/numeric/odeint/external/mpi/mpi_state.hpp +113 -0
- package/boost/numeric/odeint/external/mpi/mpi_vector_state.hpp +95 -0
- package/boost/numeric/odeint/external/mtl4/implicit_euler_mtl4.hpp +161 -0
- package/boost/numeric/odeint/external/mtl4/mtl4.hpp +23 -0
- package/boost/numeric/odeint/external/mtl4/mtl4_algebra_dispatcher.hpp +99 -0
- package/boost/numeric/odeint/external/mtl4/mtl4_resize.hpp +134 -0
- package/boost/numeric/odeint/external/nt2/nt2_algebra_dispatcher.hpp +25 -0
- package/boost/numeric/odeint/external/nt2/nt2_copy.hpp +33 -0
- package/boost/numeric/odeint/external/nt2/nt2_norm_inf.hpp +31 -0
- package/boost/numeric/odeint/external/nt2/nt2_resize.hpp +54 -0
- package/boost/numeric/odeint/external/openmp/openmp.hpp +31 -0
- package/boost/numeric/odeint/external/openmp/openmp_nested_algebra.hpp +281 -0
- package/boost/numeric/odeint/external/openmp/openmp_range_algebra.hpp +276 -0
- package/boost/numeric/odeint/external/openmp/openmp_state.hpp +172 -0
- package/boost/numeric/odeint/external/thrust/thrust.hpp +27 -0
- package/boost/numeric/odeint/external/thrust/thrust_algebra.hpp +217 -0
- package/boost/numeric/odeint/external/thrust/thrust_algebra_dispatcher.hpp +118 -0
- package/boost/numeric/odeint/external/thrust/thrust_operations.hpp +233 -0
- package/boost/numeric/odeint/external/thrust/thrust_operations_dispatcher.hpp +118 -0
- package/boost/numeric/odeint/external/thrust/thrust_resize.hpp +197 -0
- package/boost/numeric/odeint/external/vexcl/vexcl.hpp +28 -0
- package/boost/numeric/odeint/external/vexcl/vexcl_abs.hpp +61 -0
- package/boost/numeric/odeint/external/vexcl/vexcl_algebra_dispatcher.hpp +51 -0
- package/boost/numeric/odeint/external/vexcl/vexcl_copy.hpp +55 -0
- package/boost/numeric/odeint/external/vexcl/vexcl_norm_inf.hpp +68 -0
- package/boost/numeric/odeint/external/vexcl/vexcl_resize.hpp +96 -0
- package/boost/numeric/odeint/external/vexcl/vexcl_same_instance.hpp +58 -0
- package/boost/numeric/odeint/external/viennacl/viennacl_operations.hpp +226 -0
- package/boost/numeric/odeint/external/viennacl/viennacl_resize.hpp +68 -0
- package/boost/numeric/odeint/integrate/check_adapter.hpp +222 -0
- package/boost/numeric/odeint/integrate/detail/functors.hpp +70 -0
- package/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp +161 -0
- package/boost/numeric/odeint/integrate/detail/integrate_const.hpp +167 -0
- package/boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp +161 -0
- package/boost/numeric/odeint/integrate/detail/integrate_times.hpp +179 -0
- package/boost/numeric/odeint/integrate/integrate.hpp +133 -0
- package/boost/numeric/odeint/integrate/integrate_adaptive.hpp +127 -0
- package/boost/numeric/odeint/integrate/integrate_const.hpp +195 -0
- package/boost/numeric/odeint/integrate/integrate_n_steps.hpp +178 -0
- package/boost/numeric/odeint/integrate/integrate_times.hpp +220 -0
- package/boost/numeric/odeint/integrate/max_step_checker.hpp +114 -0
- package/boost/numeric/odeint/integrate/null_observer.hpp +38 -0
- package/boost/numeric/odeint/integrate/observer_collection.hpp +55 -0
- package/boost/numeric/odeint/iterator/adaptive_iterator.hpp +183 -0
- package/boost/numeric/odeint/iterator/adaptive_time_iterator.hpp +175 -0
- package/boost/numeric/odeint/iterator/const_step_iterator.hpp +180 -0
- package/boost/numeric/odeint/iterator/const_step_time_iterator.hpp +173 -0
- package/boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp +199 -0
- package/boost/numeric/odeint/iterator/impl/adaptive_iterator_impl.hpp +251 -0
- package/boost/numeric/odeint/iterator/impl/const_step_iterator_impl.hpp +228 -0
- package/boost/numeric/odeint/iterator/impl/n_step_iterator_impl.hpp +239 -0
- package/boost/numeric/odeint/iterator/impl/times_iterator_impl.hpp +369 -0
- package/boost/numeric/odeint/iterator/integrate/detail/functors.hpp +70 -0
- package/boost/numeric/odeint/iterator/integrate/detail/integrate_adaptive.hpp +121 -0
- package/boost/numeric/odeint/iterator/integrate/detail/integrate_const.hpp +111 -0
- package/boost/numeric/odeint/iterator/integrate/detail/integrate_n_steps.hpp +107 -0
- package/boost/numeric/odeint/iterator/integrate/detail/integrate_times.hpp +67 -0
- package/boost/numeric/odeint/iterator/integrate/integrate.hpp +111 -0
- package/boost/numeric/odeint/iterator/integrate/integrate_adaptive.hpp +127 -0
- package/boost/numeric/odeint/iterator/integrate/integrate_const.hpp +158 -0
- package/boost/numeric/odeint/iterator/integrate/integrate_n_steps.hpp +123 -0
- package/boost/numeric/odeint/iterator/integrate/integrate_times.hpp +131 -0
- package/boost/numeric/odeint/iterator/integrate/null_observer.hpp +38 -0
- package/boost/numeric/odeint/iterator/integrate/observer_collection.hpp +55 -0
- package/boost/numeric/odeint/iterator/n_step_iterator.hpp +168 -0
- package/boost/numeric/odeint/iterator/n_step_time_iterator.hpp +169 -0
- package/boost/numeric/odeint/iterator/times_iterator.hpp +189 -0
- package/boost/numeric/odeint/iterator/times_time_iterator.hpp +193 -0
- package/boost/numeric/odeint/stepper/adams_bashforth.hpp +418 -0
- package/boost/numeric/odeint/stepper/adams_bashforth_moulton.hpp +313 -0
- package/boost/numeric/odeint/stepper/adams_moulton.hpp +201 -0
- package/boost/numeric/odeint/stepper/adaptive_adams_bashforth_moulton.hpp +237 -0
- package/boost/numeric/odeint/stepper/base/algebra_stepper_base.hpp +91 -0
- package/boost/numeric/odeint/stepper/base/explicit_error_stepper_base.hpp +588 -0
- package/boost/numeric/odeint/stepper/base/explicit_error_stepper_fsal_base.hpp +677 -0
- package/boost/numeric/odeint/stepper/base/explicit_stepper_base.hpp +415 -0
- package/boost/numeric/odeint/stepper/base/symplectic_rkn_stepper_base.hpp +431 -0
- package/boost/numeric/odeint/stepper/bulirsch_stoer.hpp +642 -0
- package/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp +838 -0
- package/boost/numeric/odeint/stepper/controlled_adams_bashforth_moulton.hpp +322 -0
- package/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp +1018 -0
- package/boost/numeric/odeint/stepper/controlled_step_result.hpp +42 -0
- package/boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp +476 -0
- package/boost/numeric/odeint/stepper/detail/adams_bashforth_call_algebra.hpp +148 -0
- package/boost/numeric/odeint/stepper/detail/adams_bashforth_coefficients.hpp +168 -0
- package/boost/numeric/odeint/stepper/detail/adams_moulton_call_algebra.hpp +148 -0
- package/boost/numeric/odeint/stepper/detail/adams_moulton_coefficients.hpp +168 -0
- package/boost/numeric/odeint/stepper/detail/adaptive_adams_coefficients.hpp +207 -0
- package/boost/numeric/odeint/stepper/detail/generic_rk_algorithm.hpp +247 -0
- package/boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp +263 -0
- package/boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp +252 -0
- package/boost/numeric/odeint/stepper/detail/pid_step_adjuster.hpp +199 -0
- package/boost/numeric/odeint/stepper/detail/pid_step_adjuster_coefficients.hpp +180 -0
- package/boost/numeric/odeint/stepper/detail/rotating_buffer.hpp +84 -0
- package/boost/numeric/odeint/stepper/euler.hpp +166 -0
- package/boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp +255 -0
- package/boost/numeric/odeint/stepper/explicit_generic_rk.hpp +246 -0
- package/boost/numeric/odeint/stepper/extrapolation_stepper.hpp +288 -0
- package/boost/numeric/odeint/stepper/generation/generation_controlled_adams_bashforth_moulton.hpp +59 -0
- package/boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp +61 -0
- package/boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp +65 -0
- package/boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp +79 -0
- package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_cash_karp54.hpp +47 -0
- package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_cash_karp54_classic.hpp +48 -0
- package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_dopri5.hpp +56 -0
- package/boost/numeric/odeint/stepper/generation/generation_runge_kutta_fehlberg78.hpp +46 -0
- package/boost/numeric/odeint/stepper/generation/make_controlled.hpp +103 -0
- package/boost/numeric/odeint/stepper/generation/make_dense_output.hpp +100 -0
- package/boost/numeric/odeint/stepper/generation.hpp +37 -0
- package/boost/numeric/odeint/stepper/implicit_euler.hpp +170 -0
- package/boost/numeric/odeint/stepper/modified_midpoint.hpp +315 -0
- package/boost/numeric/odeint/stepper/rosenbrock4.hpp +346 -0
- package/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp +240 -0
- package/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp +204 -0
- package/boost/numeric/odeint/stepper/runge_kutta4.hpp +181 -0
- package/boost/numeric/odeint/stepper/runge_kutta4_classic.hpp +232 -0
- package/boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp +231 -0
- package/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp +289 -0
- package/boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp +403 -0
- package/boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp +374 -0
- package/boost/numeric/odeint/stepper/stepper_categories.hpp +66 -0
- package/boost/numeric/odeint/stepper/symplectic_euler.hpp +136 -0
- package/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp +160 -0
- package/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp +162 -0
- package/boost/numeric/odeint/stepper/velocity_verlet.hpp +375 -0
- package/boost/numeric/odeint/tools/assert.hpp +30 -0
- package/boost/numeric/odeint/tools/is_standalone.hpp +21 -0
- package/boost/numeric/odeint/tools/traits.hpp +39 -0
- package/boost/numeric/odeint/util/bind.hpp +35 -0
- package/boost/numeric/odeint/util/copy.hpp +88 -0
- package/boost/numeric/odeint/util/detail/is_range.hpp +127 -0
- package/boost/numeric/odeint/util/detail/less_with_sign.hpp +78 -0
- package/boost/numeric/odeint/util/is_pair.hpp +42 -0
- package/boost/numeric/odeint/util/is_resizeable.hpp +84 -0
- package/boost/numeric/odeint/util/multi_array_adaption.hpp +131 -0
- package/boost/numeric/odeint/util/n_ary_helper.hpp +96 -0
- package/boost/numeric/odeint/util/odeint_error.hpp +77 -0
- package/boost/numeric/odeint/util/resize.hpp +120 -0
- package/boost/numeric/odeint/util/resizer.hpp +94 -0
- package/boost/numeric/odeint/util/same_instance.hpp +56 -0
- package/boost/numeric/odeint/util/same_size.hpp +117 -0
- package/boost/numeric/odeint/util/split.hpp +64 -0
- package/boost/numeric/odeint/util/split_adaptor.hpp +103 -0
- package/boost/numeric/odeint/util/state_wrapper.hpp +50 -0
- package/boost/numeric/odeint/util/stepper_traits.hpp +63 -0
- package/boost/numeric/odeint/util/ublas_matrix_expression.patch +6 -0
- package/boost/numeric/odeint/util/ublas_wrapper.hpp +297 -0
- package/boost/numeric/odeint/util/unit_helper.hpp +151 -0
- package/boost/numeric/odeint/util/unwrap_reference.hpp +141 -0
- package/boost/numeric/odeint/version.hpp +55 -0
- package/boost/numeric/odeint.hpp +87 -0
- package/boost/numeric/ublas/assignment.hpp +1288 -0
- package/boost/numeric/ublas/banded.hpp +2372 -0
- package/boost/numeric/ublas/blas.hpp +499 -0
- package/boost/numeric/ublas/detail/concepts.hpp +1465 -0
- package/boost/numeric/ublas/detail/config.hpp +304 -0
- package/boost/numeric/ublas/detail/definitions.hpp +212 -0
- package/boost/numeric/ublas/detail/documentation.hpp +33 -0
- package/boost/numeric/ublas/detail/duff.hpp +56 -0
- package/boost/numeric/ublas/detail/iterator.hpp +1448 -0
- package/boost/numeric/ublas/detail/matrix_assign.hpp +1785 -0
- package/boost/numeric/ublas/detail/raw.hpp +878 -0
- package/boost/numeric/ublas/detail/returntype_deduction.hpp +174 -0
- package/boost/numeric/ublas/detail/temporary.hpp +33 -0
- package/boost/numeric/ublas/detail/vector_assign.hpp +609 -0
- package/boost/numeric/ublas/doxydoc.hpp +58 -0
- package/boost/numeric/ublas/exception.hpp +297 -0
- package/boost/numeric/ublas/experimental/sparse_view.hpp +317 -0
- package/boost/numeric/ublas/expression_types.hpp +506 -0
- package/boost/numeric/ublas/functional.hpp +2112 -0
- package/boost/numeric/ublas/fwd.hpp +229 -0
- package/boost/numeric/ublas/hermitian.hpp +2633 -0
- package/boost/numeric/ublas/io.hpp +355 -0
- package/boost/numeric/ublas/lu.hpp +350 -0
- package/boost/numeric/ublas/matrix.hpp +6013 -0
- package/boost/numeric/ublas/matrix_expression.hpp +5693 -0
- package/boost/numeric/ublas/matrix_proxy.hpp +5457 -0
- package/boost/numeric/ublas/matrix_sparse.hpp +5773 -0
- package/boost/numeric/ublas/matrix_vector.hpp +406 -0
- package/boost/numeric/ublas/opencl/elementwise.hpp +508 -0
- package/boost/numeric/ublas/opencl/library.hpp +38 -0
- package/boost/numeric/ublas/opencl/matrix.hpp +123 -0
- package/boost/numeric/ublas/opencl/misc.hpp +182 -0
- package/boost/numeric/ublas/opencl/operations.hpp +18 -0
- package/boost/numeric/ublas/opencl/prod.hpp +364 -0
- package/boost/numeric/ublas/opencl/transpose.hpp +142 -0
- package/boost/numeric/ublas/opencl/vector.hpp +90 -0
- package/boost/numeric/ublas/opencl.hpp +16 -0
- package/boost/numeric/ublas/operation/begin.hpp +318 -0
- package/boost/numeric/ublas/operation/c_array.hpp +41 -0
- package/boost/numeric/ublas/operation/end.hpp +318 -0
- package/boost/numeric/ublas/operation/num_columns.hpp +45 -0
- package/boost/numeric/ublas/operation/num_rows.hpp +44 -0
- package/boost/numeric/ublas/operation/size.hpp +350 -0
- package/boost/numeric/ublas/operation.hpp +830 -0
- package/boost/numeric/ublas/operation_blocked.hpp +266 -0
- package/boost/numeric/ublas/operation_sparse.hpp +198 -0
- package/boost/numeric/ublas/operations.hpp +26 -0
- package/boost/numeric/ublas/storage.hpp +2131 -0
- package/boost/numeric/ublas/storage_sparse.hpp +578 -0
- package/boost/numeric/ublas/symmetric.hpp +2309 -0
- package/boost/numeric/ublas/tags.hpp +37 -0
- package/boost/numeric/ublas/tensor/algorithms.hpp +345 -0
- package/boost/numeric/ublas/tensor/expression.hpp +181 -0
- package/boost/numeric/ublas/tensor/expression_evaluation.hpp +288 -0
- package/boost/numeric/ublas/tensor/extents.hpp +335 -0
- package/boost/numeric/ublas/tensor/functions.hpp +558 -0
- package/boost/numeric/ublas/tensor/index.hpp +89 -0
- package/boost/numeric/ublas/tensor/multi_index.hpp +110 -0
- package/boost/numeric/ublas/tensor/multi_index_utility.hpp +364 -0
- package/boost/numeric/ublas/tensor/multiplication.hpp +945 -0
- package/boost/numeric/ublas/tensor/operators_arithmetic.hpp +244 -0
- package/boost/numeric/ublas/tensor/operators_comparison.hpp +175 -0
- package/boost/numeric/ublas/tensor/ostream.hpp +122 -0
- package/boost/numeric/ublas/tensor/storage_traits.hpp +84 -0
- package/boost/numeric/ublas/tensor/strides.hpp +251 -0
- package/boost/numeric/ublas/tensor/tensor.hpp +734 -0
- package/boost/numeric/ublas/tensor.hpp +26 -0
- package/boost/numeric/ublas/traits/c_array.hpp +110 -0
- package/boost/numeric/ublas/traits/const_iterator_type.hpp +127 -0
- package/boost/numeric/ublas/traits/iterator_type.hpp +126 -0
- package/boost/numeric/ublas/traits.hpp +753 -0
- package/boost/numeric/ublas/triangular.hpp +2775 -0
- package/boost/numeric/ublas/vector.hpp +2947 -0
- package/boost/numeric/ublas/vector_expression.hpp +1762 -0
- package/boost/numeric/ublas/vector_of_vector.hpp +1347 -0
- package/boost/numeric/ublas/vector_proxy.hpp +1697 -0
- package/boost/numeric/ublas/vector_sparse.hpp +2246 -0
- 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_
|