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,734 @@
|
|
|
1
|
+
// Copyright (c) 2018-2019
|
|
2
|
+
// Cem Bassoy
|
|
3
|
+
//
|
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
|
5
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
|
6
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
|
7
|
+
//
|
|
8
|
+
// The authors gratefully acknowledge the support of
|
|
9
|
+
// Fraunhofer and Google in producing this work
|
|
10
|
+
// which started as a Google Summer of Code project.
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/// \file tensor.hpp Definition for the tensor template class
|
|
15
|
+
|
|
16
|
+
#ifndef BOOST_UBLAS_TENSOR_IMPL_HPP
|
|
17
|
+
#define BOOST_UBLAS_TENSOR_IMPL_HPP
|
|
18
|
+
|
|
19
|
+
#include <boost/config.hpp>
|
|
20
|
+
|
|
21
|
+
#include <initializer_list>
|
|
22
|
+
|
|
23
|
+
#include "algorithms.hpp"
|
|
24
|
+
#include "expression.hpp"
|
|
25
|
+
#include "expression_evaluation.hpp"
|
|
26
|
+
#include "extents.hpp"
|
|
27
|
+
#include "strides.hpp"
|
|
28
|
+
#include "index.hpp"
|
|
29
|
+
|
|
30
|
+
namespace boost { namespace numeric { namespace ublas {
|
|
31
|
+
|
|
32
|
+
template<class T, class F, class A>
|
|
33
|
+
class tensor;
|
|
34
|
+
|
|
35
|
+
template<class T, class F, class A>
|
|
36
|
+
class matrix;
|
|
37
|
+
|
|
38
|
+
template<class T, class A>
|
|
39
|
+
class vector;
|
|
40
|
+
|
|
41
|
+
///** \brief Base class for Tensor container models
|
|
42
|
+
// *
|
|
43
|
+
// * it does not model the Tensor concept but all derived types should.
|
|
44
|
+
// * The class defines a common base type and some common interface for all
|
|
45
|
+
// * statically derived Tensor classes
|
|
46
|
+
// * We implement the casts to the statically derived type.
|
|
47
|
+
// */
|
|
48
|
+
//template<class C>
|
|
49
|
+
//class tensor_container:
|
|
50
|
+
// public detail::tensor_expression<C>
|
|
51
|
+
//{
|
|
52
|
+
//public:
|
|
53
|
+
// static const unsigned complexity = 0;
|
|
54
|
+
// typedef C container_type;
|
|
55
|
+
// typedef tensor_tag type_category;
|
|
56
|
+
|
|
57
|
+
// BOOST_UBLAS_INLINE
|
|
58
|
+
// const container_type &operator () () const {
|
|
59
|
+
// return *static_cast<const container_type *> (this);
|
|
60
|
+
// }
|
|
61
|
+
// BOOST_UBLAS_INLINE
|
|
62
|
+
// container_type &operator () () {
|
|
63
|
+
// return *static_cast<container_type *> (this);
|
|
64
|
+
// }
|
|
65
|
+
//};
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/** @brief A dense tensor of values of type \c T.
|
|
70
|
+
*
|
|
71
|
+
* For a \f$n\f$-dimensional tensor \f$v\f$ and \f$0\leq i < n\f$ every element \f$v_i\f$ is mapped
|
|
72
|
+
* to the \f$i\f$-th element of the container. A storage type \c A can be specified which defaults to \c unbounded_array.
|
|
73
|
+
* Elements are constructed by \c A, which need not initialise their value.
|
|
74
|
+
*
|
|
75
|
+
* @tparam T type of the objects stored in the tensor (like int, double, complex,...)
|
|
76
|
+
* @tparam A The type of the storage array of the tensor. Default is \c unbounded_array<T>. \c <bounded_array<T> and \c std::vector<T> can also be used
|
|
77
|
+
*/
|
|
78
|
+
template<class T, class F = first_order, class A = std::vector<T,std::allocator<T>> >
|
|
79
|
+
class tensor:
|
|
80
|
+
public detail::tensor_expression<tensor<T, F, A>,tensor<T, F, A>>
|
|
81
|
+
{
|
|
82
|
+
|
|
83
|
+
static_assert( std::is_same<F,first_order>::value ||
|
|
84
|
+
std::is_same<F,last_order >::value, "boost::numeric::tensor template class only supports first- or last-order storage formats.");
|
|
85
|
+
|
|
86
|
+
using self_type = tensor<T, F, A>;
|
|
87
|
+
public:
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
template<class derived_type>
|
|
92
|
+
using tensor_expression_type = detail::tensor_expression<self_type,derived_type>;
|
|
93
|
+
|
|
94
|
+
template<class derived_type>
|
|
95
|
+
using matrix_expression_type = matrix_expression<derived_type>;
|
|
96
|
+
|
|
97
|
+
template<class derived_type>
|
|
98
|
+
using vector_expression_type = vector_expression<derived_type>;
|
|
99
|
+
|
|
100
|
+
using super_type = tensor_expression_type<self_type>;
|
|
101
|
+
|
|
102
|
+
// static_assert(std::is_same_v<tensor_expression_type<self_type>, detail::tensor_expression<tensor<T,F,A>,tensor<T,F,A>>>, "tensor_expression_type<self_type>");
|
|
103
|
+
|
|
104
|
+
using array_type = A;
|
|
105
|
+
using layout_type = F;
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
using size_type = typename array_type::size_type;
|
|
109
|
+
using difference_type = typename array_type::difference_type;
|
|
110
|
+
using value_type = typename array_type::value_type;
|
|
111
|
+
|
|
112
|
+
using reference = typename array_type::reference;
|
|
113
|
+
using const_reference = typename array_type::const_reference;
|
|
114
|
+
|
|
115
|
+
using pointer = typename array_type::pointer;
|
|
116
|
+
using const_pointer = typename array_type::const_pointer;
|
|
117
|
+
|
|
118
|
+
using iterator = typename array_type::iterator;
|
|
119
|
+
using const_iterator = typename array_type::const_iterator;
|
|
120
|
+
|
|
121
|
+
using reverse_iterator = typename array_type::reverse_iterator;
|
|
122
|
+
using const_reverse_iterator = typename array_type::const_reverse_iterator;
|
|
123
|
+
|
|
124
|
+
using tensor_temporary_type = self_type;
|
|
125
|
+
using storage_category = dense_tag;
|
|
126
|
+
|
|
127
|
+
using strides_type = basic_strides<std::size_t,layout_type>;
|
|
128
|
+
using extents_type = shape;
|
|
129
|
+
|
|
130
|
+
using matrix_type = matrix<value_type,layout_type,array_type>;
|
|
131
|
+
using vector_type = vector<value_type,array_type>;
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
/** @brief Constructs a tensor.
|
|
135
|
+
*
|
|
136
|
+
* @note the tensor is empty.
|
|
137
|
+
* @note the tensor needs to reshaped for further use.
|
|
138
|
+
*
|
|
139
|
+
*/
|
|
140
|
+
BOOST_UBLAS_INLINE
|
|
141
|
+
constexpr tensor ()
|
|
142
|
+
: tensor_expression_type<self_type>() // container_type
|
|
143
|
+
, extents_()
|
|
144
|
+
, strides_()
|
|
145
|
+
, data_()
|
|
146
|
+
{
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
/** @brief Constructs a tensor with an initializer list
|
|
151
|
+
*
|
|
152
|
+
* By default, its elements are initialized to 0.
|
|
153
|
+
*
|
|
154
|
+
* @code tensor<float> A{4,2,3}; @endcode
|
|
155
|
+
*
|
|
156
|
+
* @param l initializer list for setting the dimension extents of the tensor
|
|
157
|
+
*/
|
|
158
|
+
explicit BOOST_UBLAS_INLINE
|
|
159
|
+
tensor (std::initializer_list<size_type> l)
|
|
160
|
+
: tensor_expression_type<self_type>()
|
|
161
|
+
, extents_ (std::move(l))
|
|
162
|
+
, strides_ (extents_)
|
|
163
|
+
, data_ (extents_.product())
|
|
164
|
+
{
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
/** @brief Constructs a tensor with a \c shape
|
|
169
|
+
*
|
|
170
|
+
* By default, its elements are initialized to 0.
|
|
171
|
+
*
|
|
172
|
+
* @code tensor<float> A{extents{4,2,3}}; @endcode
|
|
173
|
+
*
|
|
174
|
+
* @param s initial tensor dimension extents
|
|
175
|
+
*/
|
|
176
|
+
explicit BOOST_UBLAS_INLINE
|
|
177
|
+
tensor (extents_type const& s)
|
|
178
|
+
: tensor_expression_type<self_type>() //tensor_container<self_type>()
|
|
179
|
+
, extents_ (s)
|
|
180
|
+
, strides_ (extents_)
|
|
181
|
+
, data_ (extents_.product())
|
|
182
|
+
{}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
/** @brief Constructs a tensor with a \c shape and initiates it with one-dimensional data
|
|
186
|
+
*
|
|
187
|
+
* @code tensor<float> A{extents{4,2,3}, array }; @endcode
|
|
188
|
+
*
|
|
189
|
+
*
|
|
190
|
+
* @param s initial tensor dimension extents
|
|
191
|
+
* @param a container of \c array_type that is copied according to the storage layout
|
|
192
|
+
*/
|
|
193
|
+
BOOST_UBLAS_INLINE
|
|
194
|
+
tensor (extents_type const& s, const array_type &a)
|
|
195
|
+
: tensor_expression_type<self_type>() //tensor_container<self_type>()
|
|
196
|
+
, extents_ (s)
|
|
197
|
+
, strides_ (extents_)
|
|
198
|
+
, data_ (a)
|
|
199
|
+
{
|
|
200
|
+
if(this->extents_.product() != this->data_.size())
|
|
201
|
+
throw std::runtime_error("Error in boost::numeric::ublas::tensor: size of provided data and specified extents do not match.");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
/** @brief Constructs a tensor using a shape tuple and initiates it with a value.
|
|
207
|
+
*
|
|
208
|
+
* @code tensor<float> A{extents{4,2,3}, 1 }; @endcode
|
|
209
|
+
*
|
|
210
|
+
* @param e initial tensor dimension extents
|
|
211
|
+
* @param i initial value of all elements of type \c value_type
|
|
212
|
+
*/
|
|
213
|
+
BOOST_UBLAS_INLINE
|
|
214
|
+
tensor (extents_type const& e, const value_type &i)
|
|
215
|
+
: tensor_expression_type<self_type>() //tensor_container<self_type> ()
|
|
216
|
+
, extents_ (e)
|
|
217
|
+
, strides_ (extents_)
|
|
218
|
+
, data_ (extents_.product(), i)
|
|
219
|
+
{}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
/** @brief Constructs a tensor from another tensor
|
|
224
|
+
*
|
|
225
|
+
* @param v tensor to be copied.
|
|
226
|
+
*/
|
|
227
|
+
BOOST_UBLAS_INLINE
|
|
228
|
+
tensor (const tensor &v)
|
|
229
|
+
: tensor_expression_type<self_type>()
|
|
230
|
+
, extents_ (v.extents_)
|
|
231
|
+
, strides_ (v.strides_)
|
|
232
|
+
, data_ (v.data_ )
|
|
233
|
+
{}
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
/** @brief Constructs a tensor from another tensor
|
|
238
|
+
*
|
|
239
|
+
* @param v tensor to be moved.
|
|
240
|
+
*/
|
|
241
|
+
BOOST_UBLAS_INLINE
|
|
242
|
+
tensor (tensor &&v)
|
|
243
|
+
: tensor_expression_type<self_type>() //tensor_container<self_type> ()
|
|
244
|
+
, extents_ (std::move(v.extents_))
|
|
245
|
+
, strides_ (std::move(v.strides_))
|
|
246
|
+
, data_ (std::move(v.data_ ))
|
|
247
|
+
{}
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
/** @brief Constructs a tensor with a matrix
|
|
251
|
+
*
|
|
252
|
+
* \note Initially the tensor will be two-dimensional.
|
|
253
|
+
*
|
|
254
|
+
* @param v matrix to be copied.
|
|
255
|
+
*/
|
|
256
|
+
BOOST_UBLAS_INLINE
|
|
257
|
+
tensor (const matrix_type &v)
|
|
258
|
+
: tensor_expression_type<self_type>()
|
|
259
|
+
, extents_ ()
|
|
260
|
+
, strides_ ()
|
|
261
|
+
, data_ (v.data())
|
|
262
|
+
{
|
|
263
|
+
if(!data_.empty()){
|
|
264
|
+
extents_ = extents_type{v.size1(),v.size2()};
|
|
265
|
+
strides_ = strides_type(extents_);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** @brief Constructs a tensor with a matrix
|
|
270
|
+
*
|
|
271
|
+
* \note Initially the tensor will be two-dimensional.
|
|
272
|
+
*
|
|
273
|
+
* @param v matrix to be moved.
|
|
274
|
+
*/
|
|
275
|
+
BOOST_UBLAS_INLINE
|
|
276
|
+
tensor (matrix_type &&v)
|
|
277
|
+
: tensor_expression_type<self_type>()
|
|
278
|
+
, extents_ {}
|
|
279
|
+
, strides_ {}
|
|
280
|
+
, data_ {}
|
|
281
|
+
{
|
|
282
|
+
if(v.size1()*v.size2() != 0){
|
|
283
|
+
extents_ = extents_type{v.size1(),v.size2()};
|
|
284
|
+
strides_ = strides_type(extents_);
|
|
285
|
+
data_ = std::move(v.data());
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** @brief Constructs a tensor using a \c vector
|
|
290
|
+
*
|
|
291
|
+
* @note It is assumed that vector is column vector
|
|
292
|
+
* @note Initially the tensor will be one-dimensional.
|
|
293
|
+
*
|
|
294
|
+
* @param v vector to be copied.
|
|
295
|
+
*/
|
|
296
|
+
BOOST_UBLAS_INLINE
|
|
297
|
+
tensor (const vector_type &v)
|
|
298
|
+
: tensor_expression_type<self_type>()
|
|
299
|
+
, extents_ ()
|
|
300
|
+
, strides_ ()
|
|
301
|
+
, data_ (v.data())
|
|
302
|
+
{
|
|
303
|
+
if(!data_.empty()){
|
|
304
|
+
extents_ = extents_type{data_.size(),1};
|
|
305
|
+
strides_ = strides_type(extents_);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** @brief Constructs a tensor using a \c vector
|
|
310
|
+
*
|
|
311
|
+
* @param v vector to be moved.
|
|
312
|
+
*/
|
|
313
|
+
BOOST_UBLAS_INLINE
|
|
314
|
+
tensor (vector_type &&v)
|
|
315
|
+
: tensor_expression_type<self_type>()
|
|
316
|
+
, extents_ {}
|
|
317
|
+
, strides_ {}
|
|
318
|
+
, data_ {}
|
|
319
|
+
{
|
|
320
|
+
if(v.size() != 0){
|
|
321
|
+
extents_ = extents_type{v.size(),1};
|
|
322
|
+
strides_ = strides_type(extents_);
|
|
323
|
+
data_ = std::move(v.data());
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
/** @brief Constructs a tensor with another tensor with a different layout
|
|
329
|
+
*
|
|
330
|
+
* @param other tensor with a different layout to be copied.
|
|
331
|
+
*/
|
|
332
|
+
BOOST_UBLAS_INLINE
|
|
333
|
+
template<class other_layout>
|
|
334
|
+
tensor (const tensor<value_type, other_layout> &other)
|
|
335
|
+
: tensor_expression_type<self_type> ()
|
|
336
|
+
, extents_ (other.extents())
|
|
337
|
+
, strides_ (other.extents())
|
|
338
|
+
, data_ (other.extents().product())
|
|
339
|
+
{
|
|
340
|
+
copy(this->rank(), this->extents().data(),
|
|
341
|
+
this->data(), this->strides().data(),
|
|
342
|
+
other.data(), other.strides().data());
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/** @brief Constructs a tensor with an tensor expression
|
|
346
|
+
*
|
|
347
|
+
* @code tensor<float> A = B + 3 * C; @endcode
|
|
348
|
+
*
|
|
349
|
+
* @note type must be specified of tensor must be specified.
|
|
350
|
+
* @note dimension extents are extracted from tensors within the expression.
|
|
351
|
+
*
|
|
352
|
+
* @param expr tensor expression
|
|
353
|
+
*/
|
|
354
|
+
BOOST_UBLAS_INLINE
|
|
355
|
+
template<class derived_type>
|
|
356
|
+
tensor (const tensor_expression_type<derived_type> &expr)
|
|
357
|
+
: tensor_expression_type<self_type> ()
|
|
358
|
+
, extents_ ( detail::retrieve_extents(expr) )
|
|
359
|
+
, strides_ ( extents_ )
|
|
360
|
+
, data_ ( extents_.product() )
|
|
361
|
+
{
|
|
362
|
+
static_assert( detail::has_tensor_types<self_type, tensor_expression_type<derived_type>>::value,
|
|
363
|
+
"Error in boost::numeric::ublas::tensor: expression does not contain a tensor. cannot retrieve shape.");
|
|
364
|
+
detail::eval( *this, expr );
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** @brief Constructs a tensor with a matrix expression
|
|
368
|
+
*
|
|
369
|
+
* @code tensor<float> A = B + 3 * C; @endcode
|
|
370
|
+
*
|
|
371
|
+
* @note matrix expression is evaluated and pushed into a temporary matrix before assignment.
|
|
372
|
+
* @note extents are automatically extracted from the temporary matrix
|
|
373
|
+
*
|
|
374
|
+
* @param expr matrix expression
|
|
375
|
+
*/
|
|
376
|
+
BOOST_UBLAS_INLINE
|
|
377
|
+
template<class derived_type>
|
|
378
|
+
tensor (const matrix_expression_type<derived_type> &expr)
|
|
379
|
+
: tensor( matrix_type ( expr ) )
|
|
380
|
+
{
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/** @brief Constructs a tensor with a vector expression
|
|
384
|
+
*
|
|
385
|
+
* @code tensor<float> A = b + 3 * b; @endcode
|
|
386
|
+
*
|
|
387
|
+
* @note matrix expression is evaluated and pushed into a temporary matrix before assignment.
|
|
388
|
+
* @note extents are automatically extracted from the temporary matrix
|
|
389
|
+
*
|
|
390
|
+
* @param expr vector expression
|
|
391
|
+
*/
|
|
392
|
+
BOOST_UBLAS_INLINE
|
|
393
|
+
template<class derived_type>
|
|
394
|
+
tensor (const vector_expression_type<derived_type> &expr)
|
|
395
|
+
: tensor( vector_type ( expr ) )
|
|
396
|
+
{
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/** @brief Evaluates the tensor_expression and assigns the results to the tensor
|
|
400
|
+
*
|
|
401
|
+
* @code A = B + C * 2; @endcode
|
|
402
|
+
*
|
|
403
|
+
* @note rank and dimension extents of the tensors in the expressions must conform with this tensor.
|
|
404
|
+
*
|
|
405
|
+
* @param expr expression that is evaluated.
|
|
406
|
+
*/
|
|
407
|
+
BOOST_UBLAS_INLINE
|
|
408
|
+
template<class derived_type>
|
|
409
|
+
tensor &operator = (const tensor_expression_type<derived_type> &expr)
|
|
410
|
+
{
|
|
411
|
+
detail::eval(*this, expr);
|
|
412
|
+
return *this;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
tensor& operator=(tensor other)
|
|
416
|
+
{
|
|
417
|
+
swap (*this, other);
|
|
418
|
+
return *this;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
tensor& operator=(const_reference v)
|
|
422
|
+
{
|
|
423
|
+
std::fill(this->begin(), this->end(), v);
|
|
424
|
+
return *this;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/** @brief Returns true if the tensor is empty (\c size==0) */
|
|
428
|
+
BOOST_UBLAS_INLINE
|
|
429
|
+
bool empty () const {
|
|
430
|
+
return this->data_.empty();
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
/** @brief Returns the size of the tensor */
|
|
435
|
+
BOOST_UBLAS_INLINE
|
|
436
|
+
size_type size () const {
|
|
437
|
+
return this->data_.size ();
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/** @brief Returns the size of the tensor */
|
|
441
|
+
BOOST_UBLAS_INLINE
|
|
442
|
+
size_type size (size_type r) const {
|
|
443
|
+
return this->extents_.at(r);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/** @brief Returns the number of dimensions/modes of the tensor */
|
|
447
|
+
BOOST_UBLAS_INLINE
|
|
448
|
+
size_type rank () const {
|
|
449
|
+
return this->extents_.size();
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/** @brief Returns the number of dimensions/modes of the tensor */
|
|
453
|
+
BOOST_UBLAS_INLINE
|
|
454
|
+
size_type order () const {
|
|
455
|
+
return this->extents_.size();
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** @brief Returns the strides of the tensor */
|
|
459
|
+
BOOST_UBLAS_INLINE
|
|
460
|
+
strides_type const& strides () const {
|
|
461
|
+
return this->strides_;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/** @brief Returns the extents of the tensor */
|
|
465
|
+
BOOST_UBLAS_INLINE
|
|
466
|
+
extents_type const& extents () const {
|
|
467
|
+
return this->extents_;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
/** @brief Returns a \c const reference to the container. */
|
|
472
|
+
BOOST_UBLAS_INLINE
|
|
473
|
+
const_pointer data () const {
|
|
474
|
+
return this->data_.data();
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/** @brief Returns a \c const reference to the container. */
|
|
478
|
+
BOOST_UBLAS_INLINE
|
|
479
|
+
pointer data () {
|
|
480
|
+
return this->data_.data();
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/** @brief Element access using a single index.
|
|
484
|
+
*
|
|
485
|
+
* @code auto a = A[i]; @endcode
|
|
486
|
+
*
|
|
487
|
+
* @param i zero-based index where 0 <= i < this->size()
|
|
488
|
+
*/
|
|
489
|
+
BOOST_UBLAS_INLINE
|
|
490
|
+
const_reference operator [] (size_type i) const {
|
|
491
|
+
return this->data_[i];
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/** @brief Element access using a single index.
|
|
495
|
+
*
|
|
496
|
+
*
|
|
497
|
+
* @code A[i] = a; @endcode
|
|
498
|
+
*
|
|
499
|
+
* @param i zero-based index where 0 <= i < this->size()
|
|
500
|
+
*/
|
|
501
|
+
BOOST_UBLAS_INLINE
|
|
502
|
+
reference operator [] (size_type i)
|
|
503
|
+
{
|
|
504
|
+
return this->data_[i];
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
/** @brief Element access using a multi-index or single-index.
|
|
509
|
+
*
|
|
510
|
+
*
|
|
511
|
+
* @code auto a = A.at(i,j,k); @endcode or
|
|
512
|
+
* @code auto a = A.at(i); @endcode
|
|
513
|
+
*
|
|
514
|
+
* @param i zero-based index where 0 <= i < this->size() if sizeof...(is) == 0, else 0<= i < this->size(0)
|
|
515
|
+
* @param is zero-based indices where 0 <= is[r] < this->size(r) where 0 < r < this->rank()
|
|
516
|
+
*/
|
|
517
|
+
template<class ... size_types>
|
|
518
|
+
BOOST_UBLAS_INLINE
|
|
519
|
+
const_reference at (size_type i, size_types ... is) const {
|
|
520
|
+
if constexpr (sizeof...(is) == 0)
|
|
521
|
+
return this->data_[i];
|
|
522
|
+
else
|
|
523
|
+
return this->data_[detail::access<0ul>(size_type(0),this->strides_,i,std::forward<size_types>(is)...)];
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/** @brief Element access using a multi-index or single-index.
|
|
527
|
+
*
|
|
528
|
+
*
|
|
529
|
+
* @code A.at(i,j,k) = a; @endcode or
|
|
530
|
+
* @code A.at(i) = a; @endcode
|
|
531
|
+
*
|
|
532
|
+
* @param i zero-based index where 0 <= i < this->size() if sizeof...(is) == 0, else 0<= i < this->size(0)
|
|
533
|
+
* @param is zero-based indices where 0 <= is[r] < this->size(r) where 0 < r < this->rank()
|
|
534
|
+
*/
|
|
535
|
+
BOOST_UBLAS_INLINE
|
|
536
|
+
template<class ... size_types>
|
|
537
|
+
reference at (size_type i, size_types ... is) {
|
|
538
|
+
if constexpr (sizeof...(is) == 0)
|
|
539
|
+
return this->data_[i];
|
|
540
|
+
else
|
|
541
|
+
return this->data_[detail::access<0ul>(size_type(0),this->strides_,i,std::forward<size_types>(is)...)];
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
/** @brief Element access using a single index.
|
|
548
|
+
*
|
|
549
|
+
*
|
|
550
|
+
* @code A(i) = a; @endcode
|
|
551
|
+
*
|
|
552
|
+
* @param i zero-based index where 0 <= i < this->size()
|
|
553
|
+
*/
|
|
554
|
+
BOOST_UBLAS_INLINE
|
|
555
|
+
const_reference operator()(size_type i) const {
|
|
556
|
+
return this->data_[i];
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
/** @brief Element access using a single index.
|
|
561
|
+
*
|
|
562
|
+
* @code A(i) = a; @endcode
|
|
563
|
+
*
|
|
564
|
+
* @param i zero-based index where 0 <= i < this->size()
|
|
565
|
+
*/
|
|
566
|
+
BOOST_UBLAS_INLINE
|
|
567
|
+
reference operator()(size_type i){
|
|
568
|
+
return this->data_[i];
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
/** @brief Generates a tensor index for tensor contraction
|
|
575
|
+
*
|
|
576
|
+
*
|
|
577
|
+
* @code auto Ai = A(_i,_j,k); @endcode
|
|
578
|
+
*
|
|
579
|
+
* @param i placeholder
|
|
580
|
+
* @param is zero-based indices where 0 <= is[r] < this->size(r) where 0 < r < this->rank()
|
|
581
|
+
*/
|
|
582
|
+
BOOST_UBLAS_INLINE
|
|
583
|
+
template<std::size_t I, class ... index_types>
|
|
584
|
+
decltype(auto) operator() (index::index_type<I> p, index_types ... ps) const
|
|
585
|
+
{
|
|
586
|
+
constexpr auto N = sizeof...(ps)+1;
|
|
587
|
+
if( N != this->rank() )
|
|
588
|
+
throw std::runtime_error("Error in boost::numeric::ublas::operator(): size of provided index_types does not match with the rank.");
|
|
589
|
+
|
|
590
|
+
return std::make_pair( std::cref(*this), std::make_tuple( p, std::forward<index_types>(ps)... ) );
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
/** @brief Reshapes the tensor
|
|
598
|
+
*
|
|
599
|
+
*
|
|
600
|
+
* (1) @code A.reshape(extents{m,n,o}); @endcode or
|
|
601
|
+
* (2) @code A.reshape(extents{m,n,o},4); @endcode
|
|
602
|
+
*
|
|
603
|
+
* If the size of this smaller than the specified extents than
|
|
604
|
+
* default constructed (1) or specified (2) value is appended.
|
|
605
|
+
*
|
|
606
|
+
* @note rank of the tensor might also change.
|
|
607
|
+
*
|
|
608
|
+
* @param e extents with which the tensor is reshaped.
|
|
609
|
+
* @param v value which is appended if the tensor is enlarged.
|
|
610
|
+
*/
|
|
611
|
+
BOOST_UBLAS_INLINE
|
|
612
|
+
void reshape (extents_type const& e, value_type v = value_type{})
|
|
613
|
+
{
|
|
614
|
+
this->extents_ = e;
|
|
615
|
+
this->strides_ = strides_type(this->extents_);
|
|
616
|
+
|
|
617
|
+
if(e.product() != this->size())
|
|
618
|
+
this->data_.resize (this->extents_.product(), v);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
friend void swap(tensor& lhs, tensor& rhs) {
|
|
626
|
+
std::swap(lhs.data_ , rhs.data_ );
|
|
627
|
+
std::swap(lhs.extents_, rhs.extents_);
|
|
628
|
+
std::swap(lhs.strides_, rhs.strides_);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
/// \brief return an iterator on the first element of the tensor
|
|
633
|
+
BOOST_UBLAS_INLINE
|
|
634
|
+
const_iterator begin () const {
|
|
635
|
+
return data_.begin ();
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/// \brief return an iterator on the first element of the tensor
|
|
639
|
+
BOOST_UBLAS_INLINE
|
|
640
|
+
const_iterator cbegin () const {
|
|
641
|
+
return data_.cbegin ();
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/// \brief return an iterator after the last element of the tensor
|
|
645
|
+
BOOST_UBLAS_INLINE
|
|
646
|
+
const_iterator end () const {
|
|
647
|
+
return data_.end();
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/// \brief return an iterator after the last element of the tensor
|
|
651
|
+
BOOST_UBLAS_INLINE
|
|
652
|
+
const_iterator cend () const {
|
|
653
|
+
return data_.cend ();
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/// \brief Return an iterator on the first element of the tensor
|
|
657
|
+
BOOST_UBLAS_INLINE
|
|
658
|
+
iterator begin () {
|
|
659
|
+
return data_.begin();
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/// \brief Return an iterator at the end of the tensor
|
|
663
|
+
BOOST_UBLAS_INLINE
|
|
664
|
+
iterator end () {
|
|
665
|
+
return data_.end();
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/// \brief Return a const reverse iterator before the first element of the reversed tensor (i.e. end() of normal tensor)
|
|
669
|
+
BOOST_UBLAS_INLINE
|
|
670
|
+
const_reverse_iterator rbegin () const {
|
|
671
|
+
return data_.rbegin();
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/// \brief Return a const reverse iterator before the first element of the reversed tensor (i.e. end() of normal tensor)
|
|
675
|
+
BOOST_UBLAS_INLINE
|
|
676
|
+
const_reverse_iterator crbegin () const {
|
|
677
|
+
return data_.crbegin();
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/// \brief Return a const reverse iterator on the end of the reverse tensor (i.e. first element of the normal tensor)
|
|
681
|
+
BOOST_UBLAS_INLINE
|
|
682
|
+
const_reverse_iterator rend () const {
|
|
683
|
+
return data_.rend();
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/// \brief Return a const reverse iterator on the end of the reverse tensor (i.e. first element of the normal tensor)
|
|
687
|
+
BOOST_UBLAS_INLINE
|
|
688
|
+
const_reverse_iterator crend () const {
|
|
689
|
+
return data_.crend();
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/// \brief Return a const reverse iterator before the first element of the reversed tensor (i.e. end() of normal tensor)
|
|
693
|
+
BOOST_UBLAS_INLINE
|
|
694
|
+
reverse_iterator rbegin () {
|
|
695
|
+
return data_.rbegin();
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/// \brief Return a const reverse iterator on the end of the reverse tensor (i.e. first element of the normal tensor)
|
|
699
|
+
BOOST_UBLAS_INLINE
|
|
700
|
+
reverse_iterator rend () {
|
|
701
|
+
return data_.rend();
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
#if 0
|
|
706
|
+
// -------------
|
|
707
|
+
// Serialization
|
|
708
|
+
// -------------
|
|
709
|
+
|
|
710
|
+
/// Serialize a tensor into and archive as defined in Boost
|
|
711
|
+
/// \param ar Archive object. Can be a flat file, an XML file or any other stream
|
|
712
|
+
/// \param file_version Optional file version (not yet used)
|
|
713
|
+
template<class Archive>
|
|
714
|
+
void serialize(Archive & ar, const unsigned int /* file_version */){
|
|
715
|
+
ar & serialization::make_nvp("data",data_);
|
|
716
|
+
}
|
|
717
|
+
#endif
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
private:
|
|
722
|
+
|
|
723
|
+
extents_type extents_;
|
|
724
|
+
strides_type strides_;
|
|
725
|
+
array_type data_;
|
|
726
|
+
};
|
|
727
|
+
|
|
728
|
+
}}} // namespaces
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
#endif
|