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,288 @@
|
|
|
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_EXPRESSIONS_EVALUATION_HPP_
|
|
13
|
+
#define _BOOST_UBLAS_TENSOR_EXPRESSIONS_EVALUATION_HPP_
|
|
14
|
+
|
|
15
|
+
#include <type_traits>
|
|
16
|
+
#include <stdexcept>
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
namespace boost::numeric::ublas {
|
|
20
|
+
|
|
21
|
+
template<class element_type, class storage_format, class storage_type>
|
|
22
|
+
class tensor;
|
|
23
|
+
|
|
24
|
+
template<class size_type>
|
|
25
|
+
class basic_extents;
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
namespace boost::numeric::ublas::detail {
|
|
30
|
+
|
|
31
|
+
template<class T, class D>
|
|
32
|
+
struct tensor_expression;
|
|
33
|
+
|
|
34
|
+
template<class T, class EL, class ER, class OP>
|
|
35
|
+
struct binary_tensor_expression;
|
|
36
|
+
|
|
37
|
+
template<class T, class E, class OP>
|
|
38
|
+
struct unary_tensor_expression;
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
namespace boost::numeric::ublas::detail {
|
|
43
|
+
|
|
44
|
+
template<class T, class E>
|
|
45
|
+
struct has_tensor_types
|
|
46
|
+
{ static constexpr bool value = false; };
|
|
47
|
+
|
|
48
|
+
template<class T>
|
|
49
|
+
struct has_tensor_types<T,T>
|
|
50
|
+
{ static constexpr bool value = true; };
|
|
51
|
+
|
|
52
|
+
template<class T, class D>
|
|
53
|
+
struct has_tensor_types<T, tensor_expression<T,D>>
|
|
54
|
+
{ static constexpr bool value = std::is_same<T,D>::value || has_tensor_types<T,D>::value; };
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
template<class T, class EL, class ER, class OP>
|
|
58
|
+
struct has_tensor_types<T, binary_tensor_expression<T,EL,ER,OP>>
|
|
59
|
+
{ static constexpr bool value = std::is_same<T,EL>::value || std::is_same<T,ER>::value || has_tensor_types<T,EL>::value || has_tensor_types<T,ER>::value; };
|
|
60
|
+
|
|
61
|
+
template<class T, class E, class OP>
|
|
62
|
+
struct has_tensor_types<T, unary_tensor_expression<T,E,OP>>
|
|
63
|
+
{ static constexpr bool value = std::is_same<T,E>::value || has_tensor_types<T,E>::value; };
|
|
64
|
+
|
|
65
|
+
} // namespace boost::numeric::ublas::detail
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
namespace boost::numeric::ublas::detail {
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
/** @brief Retrieves extents of the tensor
|
|
75
|
+
*
|
|
76
|
+
*/
|
|
77
|
+
template<class T, class F, class A>
|
|
78
|
+
auto retrieve_extents(tensor<T,F,A> const& t)
|
|
79
|
+
{
|
|
80
|
+
return t.extents();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** @brief Retrieves extents of the tensor expression
|
|
84
|
+
*
|
|
85
|
+
* @note tensor expression must be a binary tree with at least one tensor type
|
|
86
|
+
*
|
|
87
|
+
* @returns extents of the child expression if it is a tensor or extents of one child of its child.
|
|
88
|
+
*/
|
|
89
|
+
template<class T, class D>
|
|
90
|
+
auto retrieve_extents(tensor_expression<T,D> const& expr)
|
|
91
|
+
{
|
|
92
|
+
static_assert(detail::has_tensor_types<T,tensor_expression<T,D>>::value,
|
|
93
|
+
"Error in boost::numeric::ublas::detail::retrieve_extents: Expression to evaluate should contain tensors.");
|
|
94
|
+
|
|
95
|
+
auto const& cast_expr = static_cast<D const&>(expr);
|
|
96
|
+
|
|
97
|
+
if constexpr ( std::is_same<T,D>::value )
|
|
98
|
+
return cast_expr.extents();
|
|
99
|
+
else
|
|
100
|
+
return retrieve_extents(cast_expr);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** @brief Retrieves extents of the binary tensor expression
|
|
104
|
+
*
|
|
105
|
+
* @note tensor expression must be a binary tree with at least one tensor type
|
|
106
|
+
*
|
|
107
|
+
* @returns extents of the (left and if necessary then right) child expression if it is a tensor or extents of a child of its (left and if necessary then right) child.
|
|
108
|
+
*/
|
|
109
|
+
template<class T, class EL, class ER, class OP>
|
|
110
|
+
auto retrieve_extents(binary_tensor_expression<T,EL,ER,OP> const& expr)
|
|
111
|
+
{
|
|
112
|
+
static_assert(detail::has_tensor_types<T,binary_tensor_expression<T,EL,ER,OP>>::value,
|
|
113
|
+
"Error in boost::numeric::ublas::detail::retrieve_extents: Expression to evaluate should contain tensors.");
|
|
114
|
+
|
|
115
|
+
if constexpr ( std::is_same<T,EL>::value )
|
|
116
|
+
return expr.el.extents();
|
|
117
|
+
|
|
118
|
+
if constexpr ( std::is_same<T,ER>::value )
|
|
119
|
+
return expr.er.extents();
|
|
120
|
+
|
|
121
|
+
else if constexpr ( detail::has_tensor_types<T,EL>::value )
|
|
122
|
+
return retrieve_extents(expr.el);
|
|
123
|
+
|
|
124
|
+
else if constexpr ( detail::has_tensor_types<T,ER>::value )
|
|
125
|
+
return retrieve_extents(expr.er);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** @brief Retrieves extents of the binary tensor expression
|
|
129
|
+
*
|
|
130
|
+
* @note tensor expression must be a binary tree with at least one tensor type
|
|
131
|
+
*
|
|
132
|
+
* @returns extents of the child expression if it is a tensor or extents of a child of its child.
|
|
133
|
+
*/
|
|
134
|
+
template<class T, class E, class OP>
|
|
135
|
+
auto retrieve_extents(unary_tensor_expression<T,E,OP> const& expr)
|
|
136
|
+
{
|
|
137
|
+
|
|
138
|
+
static_assert(detail::has_tensor_types<T,unary_tensor_expression<T,E,OP>>::value,
|
|
139
|
+
"Error in boost::numeric::ublas::detail::retrieve_extents: Expression to evaluate should contain tensors.");
|
|
140
|
+
|
|
141
|
+
if constexpr ( std::is_same<T,E>::value )
|
|
142
|
+
return expr.e.extents();
|
|
143
|
+
|
|
144
|
+
else if constexpr ( detail::has_tensor_types<T,E>::value )
|
|
145
|
+
return retrieve_extents(expr.e);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
} // namespace boost::numeric::ublas::detail
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
///////////////
|
|
152
|
+
|
|
153
|
+
namespace boost::numeric::ublas::detail {
|
|
154
|
+
|
|
155
|
+
template<class T, class F, class A, class S>
|
|
156
|
+
auto all_extents_equal(tensor<T,F,A> const& t, basic_extents<S> const& extents)
|
|
157
|
+
{
|
|
158
|
+
return extents == t.extents();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
template<class T, class D, class S>
|
|
162
|
+
auto all_extents_equal(tensor_expression<T,D> const& expr, basic_extents<S> const& extents)
|
|
163
|
+
{
|
|
164
|
+
static_assert(detail::has_tensor_types<T,tensor_expression<T,D>>::value,
|
|
165
|
+
"Error in boost::numeric::ublas::detail::all_extents_equal: Expression to evaluate should contain tensors.");
|
|
166
|
+
auto const& cast_expr = static_cast<D const&>(expr);
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
if constexpr ( std::is_same<T,D>::value )
|
|
170
|
+
if( extents != cast_expr.extents() )
|
|
171
|
+
return false;
|
|
172
|
+
|
|
173
|
+
if constexpr ( detail::has_tensor_types<T,D>::value )
|
|
174
|
+
if ( !all_extents_equal(cast_expr, extents))
|
|
175
|
+
return false;
|
|
176
|
+
|
|
177
|
+
return true;
|
|
178
|
+
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
template<class T, class EL, class ER, class OP, class S>
|
|
182
|
+
auto all_extents_equal(binary_tensor_expression<T,EL,ER,OP> const& expr, basic_extents<S> const& extents)
|
|
183
|
+
{
|
|
184
|
+
static_assert(detail::has_tensor_types<T,binary_tensor_expression<T,EL,ER,OP>>::value,
|
|
185
|
+
"Error in boost::numeric::ublas::detail::all_extents_equal: Expression to evaluate should contain tensors.");
|
|
186
|
+
|
|
187
|
+
if constexpr ( std::is_same<T,EL>::value )
|
|
188
|
+
if(extents != expr.el.extents())
|
|
189
|
+
return false;
|
|
190
|
+
|
|
191
|
+
if constexpr ( std::is_same<T,ER>::value )
|
|
192
|
+
if(extents != expr.er.extents())
|
|
193
|
+
return false;
|
|
194
|
+
|
|
195
|
+
if constexpr ( detail::has_tensor_types<T,EL>::value )
|
|
196
|
+
if(!all_extents_equal(expr.el, extents))
|
|
197
|
+
return false;
|
|
198
|
+
|
|
199
|
+
if constexpr ( detail::has_tensor_types<T,ER>::value )
|
|
200
|
+
if(!all_extents_equal(expr.er, extents))
|
|
201
|
+
return false;
|
|
202
|
+
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
template<class T, class E, class OP, class S>
|
|
208
|
+
auto all_extents_equal(unary_tensor_expression<T,E,OP> const& expr, basic_extents<S> const& extents)
|
|
209
|
+
{
|
|
210
|
+
|
|
211
|
+
static_assert(detail::has_tensor_types<T,unary_tensor_expression<T,E,OP>>::value,
|
|
212
|
+
"Error in boost::numeric::ublas::detail::all_extents_equal: Expression to evaluate should contain tensors.");
|
|
213
|
+
|
|
214
|
+
if constexpr ( std::is_same<T,E>::value )
|
|
215
|
+
if(extents != expr.e.extents())
|
|
216
|
+
return false;
|
|
217
|
+
|
|
218
|
+
if constexpr ( detail::has_tensor_types<T,E>::value )
|
|
219
|
+
if(!all_extents_equal(expr.e, extents))
|
|
220
|
+
return false;
|
|
221
|
+
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
} // namespace boost::numeric::ublas::detail
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
namespace boost::numeric::ublas::detail {
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
/** @brief Evaluates expression for a tensor
|
|
232
|
+
*
|
|
233
|
+
* Assigns the results of the expression to the tensor.
|
|
234
|
+
*
|
|
235
|
+
* \note Checks if shape of the tensor matches those of all tensors within the expression.
|
|
236
|
+
*/
|
|
237
|
+
template<class tensor_type, class derived_type>
|
|
238
|
+
void eval(tensor_type& lhs, tensor_expression<tensor_type, derived_type> const& expr)
|
|
239
|
+
{
|
|
240
|
+
if constexpr (detail::has_tensor_types<tensor_type, tensor_expression<tensor_type,derived_type> >::value )
|
|
241
|
+
if(!detail::all_extents_equal(expr, lhs.extents() ))
|
|
242
|
+
throw std::runtime_error("Error in boost::numeric::ublas::tensor: expression contains tensors with different shapes.");
|
|
243
|
+
|
|
244
|
+
#pragma omp parallel for
|
|
245
|
+
for(auto i = 0u; i < lhs.size(); ++i)
|
|
246
|
+
lhs(i) = expr()(i);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** @brief Evaluates expression for a tensor
|
|
250
|
+
*
|
|
251
|
+
* Applies a unary function to the results of the expressions before the assignment.
|
|
252
|
+
* Usually applied needed for unary operators such as A += C;
|
|
253
|
+
*
|
|
254
|
+
* \note Checks if shape of the tensor matches those of all tensors within the expression.
|
|
255
|
+
*/
|
|
256
|
+
template<class tensor_type, class derived_type, class unary_fn>
|
|
257
|
+
void eval(tensor_type& lhs, tensor_expression<tensor_type, derived_type> const& expr, unary_fn const fn)
|
|
258
|
+
{
|
|
259
|
+
|
|
260
|
+
if constexpr (detail::has_tensor_types< tensor_type, tensor_expression<tensor_type,derived_type> >::value )
|
|
261
|
+
if(!detail::all_extents_equal( expr, lhs.extents() ))
|
|
262
|
+
throw std::runtime_error("Error in boost::numeric::ublas::tensor: expression contains tensors with different shapes.");
|
|
263
|
+
|
|
264
|
+
#pragma omp parallel for
|
|
265
|
+
for(auto i = 0u; i < lhs.size(); ++i)
|
|
266
|
+
fn(lhs(i), expr()(i));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
/** @brief Evaluates expression for a tensor
|
|
272
|
+
*
|
|
273
|
+
* Applies a unary function to the results of the expressions before the assignment.
|
|
274
|
+
* Usually applied needed for unary operators such as A += C;
|
|
275
|
+
*
|
|
276
|
+
* \note Checks if shape of the tensor matches those of all tensors within the expression.
|
|
277
|
+
*/
|
|
278
|
+
template<class tensor_type, class unary_fn>
|
|
279
|
+
void eval(tensor_type& lhs, unary_fn const fn)
|
|
280
|
+
{
|
|
281
|
+
#pragma omp parallel for
|
|
282
|
+
for(auto i = 0u; i < lhs.size(); ++i)
|
|
283
|
+
fn(lhs(i));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
}
|
|
288
|
+
#endif
|
|
@@ -0,0 +1,335 @@
|
|
|
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_NUMERIC_UBLAS_TENSOR_EXTENTS_HPP
|
|
14
|
+
#define BOOST_NUMERIC_UBLAS_TENSOR_EXTENTS_HPP
|
|
15
|
+
|
|
16
|
+
#include <algorithm>
|
|
17
|
+
#include <initializer_list>
|
|
18
|
+
#include <limits>
|
|
19
|
+
#include <numeric>
|
|
20
|
+
#include <stdexcept>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include <cassert>
|
|
24
|
+
|
|
25
|
+
namespace boost {
|
|
26
|
+
namespace numeric {
|
|
27
|
+
namespace ublas {
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
/** @brief Template class for storing tensor extents with runtime variable size.
|
|
31
|
+
*
|
|
32
|
+
* Proxy template class of std::vector<int_type>.
|
|
33
|
+
*
|
|
34
|
+
*/
|
|
35
|
+
template<class int_type>
|
|
36
|
+
class basic_extents
|
|
37
|
+
{
|
|
38
|
+
static_assert( std::numeric_limits<typename std::vector<int_type>::value_type>::is_integer, "Static error in basic_layout: type must be of type integer.");
|
|
39
|
+
static_assert(!std::numeric_limits<typename std::vector<int_type>::value_type>::is_signed, "Static error in basic_layout: type must be of type unsigned integer.");
|
|
40
|
+
|
|
41
|
+
public:
|
|
42
|
+
using base_type = std::vector<int_type>;
|
|
43
|
+
using value_type = typename base_type::value_type;
|
|
44
|
+
using const_reference = typename base_type::const_reference;
|
|
45
|
+
using reference = typename base_type::reference;
|
|
46
|
+
using size_type = typename base_type::size_type;
|
|
47
|
+
using const_pointer = typename base_type::const_pointer;
|
|
48
|
+
using const_iterator = typename base_type::const_iterator;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
/** @brief Default constructs basic_extents
|
|
52
|
+
*
|
|
53
|
+
* @code auto ex = basic_extents<unsigned>{};
|
|
54
|
+
*/
|
|
55
|
+
constexpr explicit basic_extents()
|
|
56
|
+
: _base{}
|
|
57
|
+
{
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** @brief Copy constructs basic_extents from a one-dimensional container
|
|
61
|
+
*
|
|
62
|
+
* @code auto ex = basic_extents<unsigned>( std::vector<unsigned>(3u,3u) );
|
|
63
|
+
*
|
|
64
|
+
* @note checks if size > 1 and all elements > 0
|
|
65
|
+
*
|
|
66
|
+
* @param b one-dimensional std::vector<int_type> container
|
|
67
|
+
*/
|
|
68
|
+
explicit basic_extents(base_type const& b)
|
|
69
|
+
: _base(b)
|
|
70
|
+
{
|
|
71
|
+
if (!this->valid()){
|
|
72
|
+
throw std::length_error("Error in basic_extents::basic_extents() : shape tuple is not a valid permutation: has zero elements.");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** @brief Move constructs basic_extents from a one-dimensional container
|
|
77
|
+
*
|
|
78
|
+
* @code auto ex = basic_extents<unsigned>( std::vector<unsigned>(3u,3u) );
|
|
79
|
+
*
|
|
80
|
+
* @note checks if size > 1 and all elements > 0
|
|
81
|
+
*
|
|
82
|
+
* @param b one-dimensional container of type std::vector<int_type>
|
|
83
|
+
*/
|
|
84
|
+
explicit basic_extents(base_type && b)
|
|
85
|
+
: _base(std::move(b))
|
|
86
|
+
{
|
|
87
|
+
if (!this->valid()){
|
|
88
|
+
throw std::length_error("Error in basic_extents::basic_extents() : shape tuple is not a valid permutation: has zero elements.");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** @brief Constructs basic_extents from an initializer list
|
|
93
|
+
*
|
|
94
|
+
* @code auto ex = basic_extents<unsigned>{3,2,4};
|
|
95
|
+
*
|
|
96
|
+
* @note checks if size > 1 and all elements > 0
|
|
97
|
+
*
|
|
98
|
+
* @param l one-dimensional list of type std::initializer<int_type>
|
|
99
|
+
*/
|
|
100
|
+
basic_extents(std::initializer_list<value_type> l)
|
|
101
|
+
: basic_extents( base_type(std::move(l)) )
|
|
102
|
+
{
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** @brief Constructs basic_extents from a range specified by two iterators
|
|
106
|
+
*
|
|
107
|
+
* @code auto ex = basic_extents<unsigned>(a.begin(), a.end());
|
|
108
|
+
*
|
|
109
|
+
* @note checks if size > 1 and all elements > 0
|
|
110
|
+
*
|
|
111
|
+
* @param first iterator pointing to the first element
|
|
112
|
+
* @param last iterator pointing to the next position after the last element
|
|
113
|
+
*/
|
|
114
|
+
basic_extents(const_iterator first, const_iterator last)
|
|
115
|
+
: basic_extents ( base_type( first,last ) )
|
|
116
|
+
{
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** @brief Copy constructs basic_extents */
|
|
120
|
+
basic_extents(basic_extents const& l )
|
|
121
|
+
: _base(l._base)
|
|
122
|
+
{
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** @brief Move constructs basic_extents */
|
|
126
|
+
basic_extents(basic_extents && l ) noexcept
|
|
127
|
+
: _base(std::move(l._base))
|
|
128
|
+
{
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
~basic_extents() = default;
|
|
132
|
+
|
|
133
|
+
basic_extents& operator=(basic_extents other) noexcept
|
|
134
|
+
{
|
|
135
|
+
swap (*this, other);
|
|
136
|
+
return *this;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
friend void swap(basic_extents& lhs, basic_extents& rhs) {
|
|
140
|
+
std::swap(lhs._base , rhs._base );
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
/** @brief Returns true if this has a scalar shape
|
|
146
|
+
*
|
|
147
|
+
* @returns true if (1,1,[1,...,1])
|
|
148
|
+
*/
|
|
149
|
+
bool is_scalar() const
|
|
150
|
+
{
|
|
151
|
+
return
|
|
152
|
+
_base.size() != 0 &&
|
|
153
|
+
std::all_of(_base.begin(), _base.end(),
|
|
154
|
+
[](const_reference a){ return a == 1;});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** @brief Returns true if this has a vector shape
|
|
158
|
+
*
|
|
159
|
+
* @returns true if (1,n,[1,...,1]) or (n,1,[1,...,1]) with n > 1
|
|
160
|
+
*/
|
|
161
|
+
bool is_vector() const
|
|
162
|
+
{
|
|
163
|
+
if(_base.size() == 0){
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if(_base.size() == 1){
|
|
168
|
+
return _base.at(0) > 1;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
auto greater_one = [](const_reference a){ return a > 1;};
|
|
172
|
+
auto equal_one = [](const_reference a){ return a == 1;};
|
|
173
|
+
|
|
174
|
+
return
|
|
175
|
+
std::any_of(_base.begin(), _base.begin()+2, greater_one) &&
|
|
176
|
+
std::any_of(_base.begin(), _base.begin()+2, equal_one ) &&
|
|
177
|
+
std::all_of(_base.begin()+2, _base.end(), equal_one);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** @brief Returns true if this has a matrix shape
|
|
181
|
+
*
|
|
182
|
+
* @returns true if (m,n,[1,...,1]) with m > 1 and n > 1
|
|
183
|
+
*/
|
|
184
|
+
bool is_matrix() const
|
|
185
|
+
{
|
|
186
|
+
if(_base.size() < 2){
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
auto greater_one = [](const_reference a){ return a > 1;};
|
|
191
|
+
auto equal_one = [](const_reference a){ return a == 1;};
|
|
192
|
+
|
|
193
|
+
return
|
|
194
|
+
std::all_of(_base.begin(), _base.begin()+2, greater_one) &&
|
|
195
|
+
std::all_of(_base.begin()+2, _base.end(), equal_one );
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** @brief Returns true if this is has a tensor shape
|
|
199
|
+
*
|
|
200
|
+
* @returns true if !empty() && !is_scalar() && !is_vector() && !is_matrix()
|
|
201
|
+
*/
|
|
202
|
+
bool is_tensor() const
|
|
203
|
+
{
|
|
204
|
+
if(_base.size() < 3){
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
auto greater_one = [](const_reference a){ return a > 1;};
|
|
209
|
+
|
|
210
|
+
return std::any_of(_base.begin()+2, _base.end(), greater_one);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const_pointer data() const
|
|
214
|
+
{
|
|
215
|
+
return this->_base.data();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const_reference operator[] (size_type p) const
|
|
219
|
+
{
|
|
220
|
+
return this->_base[p];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const_reference at (size_type p) const
|
|
224
|
+
{
|
|
225
|
+
return this->_base.at(p);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
reference operator[] (size_type p)
|
|
229
|
+
{
|
|
230
|
+
return this->_base[p];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
reference at (size_type p)
|
|
234
|
+
{
|
|
235
|
+
return this->_base.at(p);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
bool empty() const
|
|
240
|
+
{
|
|
241
|
+
return this->_base.empty();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
size_type size() const
|
|
245
|
+
{
|
|
246
|
+
return this->_base.size();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** @brief Returns true if size > 1 and all elements > 0 */
|
|
250
|
+
bool valid() const
|
|
251
|
+
{
|
|
252
|
+
return
|
|
253
|
+
this->size() > 1 &&
|
|
254
|
+
std::none_of(_base.begin(), _base.end(),
|
|
255
|
+
[](const_reference a){ return a == value_type(0); });
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** @brief Returns the number of elements a tensor holds with this */
|
|
259
|
+
size_type product() const
|
|
260
|
+
{
|
|
261
|
+
if(_base.empty()){
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return std::accumulate(_base.begin(), _base.end(), 1ul, std::multiplies<>());
|
|
266
|
+
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
/** @brief Eliminates singleton dimensions when size > 2
|
|
271
|
+
*
|
|
272
|
+
* squeeze { 1,1} -> { 1,1}
|
|
273
|
+
* squeeze { 2,1} -> { 2,1}
|
|
274
|
+
* squeeze { 1,2} -> { 1,2}
|
|
275
|
+
*
|
|
276
|
+
* squeeze {1,2,3} -> { 2,3}
|
|
277
|
+
* squeeze {2,1,3} -> { 2,3}
|
|
278
|
+
* squeeze {1,3,1} -> { 3,1}
|
|
279
|
+
*
|
|
280
|
+
*/
|
|
281
|
+
basic_extents squeeze() const
|
|
282
|
+
{
|
|
283
|
+
if(this->size() <= 2){
|
|
284
|
+
return *this;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
auto new_extent = basic_extents{};
|
|
288
|
+
auto insert_iter = std::back_insert_iterator<typename basic_extents::base_type>(new_extent._base);
|
|
289
|
+
std::remove_copy(this->_base.begin(), this->_base.end(), insert_iter ,value_type{1});
|
|
290
|
+
return new_extent;
|
|
291
|
+
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
void clear()
|
|
295
|
+
{
|
|
296
|
+
this->_base.clear();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
bool operator == (basic_extents const& b) const
|
|
300
|
+
{
|
|
301
|
+
return _base == b._base;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
bool operator != (basic_extents const& b) const
|
|
305
|
+
{
|
|
306
|
+
return !( _base == b._base );
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const_iterator
|
|
310
|
+
begin() const
|
|
311
|
+
{
|
|
312
|
+
return _base.begin();
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const_iterator
|
|
316
|
+
end() const
|
|
317
|
+
{
|
|
318
|
+
return _base.end();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
base_type const& base() const { return _base; }
|
|
322
|
+
|
|
323
|
+
private:
|
|
324
|
+
|
|
325
|
+
base_type _base;
|
|
326
|
+
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
using shape = basic_extents<std::size_t>;
|
|
330
|
+
|
|
331
|
+
} // namespace ublas
|
|
332
|
+
} // namespace numeric
|
|
333
|
+
} // namespace boost
|
|
334
|
+
|
|
335
|
+
#endif
|