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,830 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright (c) 2000-2002
|
|
3
|
+
// Joerg Walter, Mathias Koch
|
|
4
|
+
//
|
|
5
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
|
6
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
|
7
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
|
8
|
+
//
|
|
9
|
+
// The authors gratefully acknowledge the support of
|
|
10
|
+
// GeNeSys mbH & Co. KG in producing this work.
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
#ifndef _BOOST_UBLAS_OPERATION_
|
|
14
|
+
#define _BOOST_UBLAS_OPERATION_
|
|
15
|
+
|
|
16
|
+
#include <boost/numeric/ublas/matrix_proxy.hpp>
|
|
17
|
+
|
|
18
|
+
/** \file operation.hpp
|
|
19
|
+
* \brief This file contains some specialized products.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// axpy-based products
|
|
23
|
+
// Alexei Novakov had a lot of ideas to improve these. Thanks.
|
|
24
|
+
// Hendrik Kueck proposed some new kernel. Thanks again.
|
|
25
|
+
|
|
26
|
+
namespace boost { namespace numeric { namespace ublas {
|
|
27
|
+
|
|
28
|
+
template<class V, class T1, class L1, class IA1, class TA1, class E2>
|
|
29
|
+
BOOST_UBLAS_INLINE
|
|
30
|
+
V &
|
|
31
|
+
axpy_prod (const compressed_matrix<T1, L1, 0, IA1, TA1> &e1,
|
|
32
|
+
const vector_expression<E2> &e2,
|
|
33
|
+
V &v, row_major_tag) {
|
|
34
|
+
typedef typename V::size_type size_type;
|
|
35
|
+
typedef typename V::value_type value_type;
|
|
36
|
+
|
|
37
|
+
for (size_type i = 0; i < e1.filled1 () -1; ++ i) {
|
|
38
|
+
size_type begin = e1.index1_data () [i];
|
|
39
|
+
size_type end = e1.index1_data () [i + 1];
|
|
40
|
+
value_type t (v (i));
|
|
41
|
+
for (size_type j = begin; j < end; ++ j)
|
|
42
|
+
t += e1.value_data () [j] * e2 () (e1.index2_data () [j]);
|
|
43
|
+
v (i) = t;
|
|
44
|
+
}
|
|
45
|
+
return v;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
template<class V, class T1, class L1, class IA1, class TA1, class E2>
|
|
49
|
+
BOOST_UBLAS_INLINE
|
|
50
|
+
V &
|
|
51
|
+
axpy_prod (const compressed_matrix<T1, L1, 0, IA1, TA1> &e1,
|
|
52
|
+
const vector_expression<E2> &e2,
|
|
53
|
+
V &v, column_major_tag) {
|
|
54
|
+
typedef typename V::size_type size_type;
|
|
55
|
+
|
|
56
|
+
for (size_type j = 0; j < e1.filled1 () -1; ++ j) {
|
|
57
|
+
size_type begin = e1.index1_data () [j];
|
|
58
|
+
size_type end = e1.index1_data () [j + 1];
|
|
59
|
+
for (size_type i = begin; i < end; ++ i)
|
|
60
|
+
v (e1.index2_data () [i]) += e1.value_data () [i] * e2 () (j);
|
|
61
|
+
}
|
|
62
|
+
return v;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Dispatcher
|
|
66
|
+
template<class V, class T1, class L1, class IA1, class TA1, class E2>
|
|
67
|
+
BOOST_UBLAS_INLINE
|
|
68
|
+
V &
|
|
69
|
+
axpy_prod (const compressed_matrix<T1, L1, 0, IA1, TA1> &e1,
|
|
70
|
+
const vector_expression<E2> &e2,
|
|
71
|
+
V &v, bool init = true) {
|
|
72
|
+
typedef typename V::value_type value_type;
|
|
73
|
+
typedef typename L1::orientation_category orientation_category;
|
|
74
|
+
|
|
75
|
+
if (init)
|
|
76
|
+
v.assign (zero_vector<value_type> (e1.size1 ()));
|
|
77
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
78
|
+
vector<value_type> cv (v);
|
|
79
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
80
|
+
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
|
|
81
|
+
indexing_vector_assign<scalar_plus_assign> (cv, prod (e1, e2));
|
|
82
|
+
#endif
|
|
83
|
+
axpy_prod (e1, e2, v, orientation_category ());
|
|
84
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
85
|
+
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
|
|
86
|
+
#endif
|
|
87
|
+
return v;
|
|
88
|
+
}
|
|
89
|
+
template<class V, class T1, class L1, class IA1, class TA1, class E2>
|
|
90
|
+
BOOST_UBLAS_INLINE
|
|
91
|
+
V
|
|
92
|
+
axpy_prod (const compressed_matrix<T1, L1, 0, IA1, TA1> &e1,
|
|
93
|
+
const vector_expression<E2> &e2) {
|
|
94
|
+
typedef V vector_type;
|
|
95
|
+
|
|
96
|
+
vector_type v (e1.size1 ());
|
|
97
|
+
return axpy_prod (e1, e2, v, true);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
template<class V, class T1, class L1, class IA1, class TA1, class E2>
|
|
101
|
+
BOOST_UBLAS_INLINE
|
|
102
|
+
V &
|
|
103
|
+
axpy_prod (const coordinate_matrix<T1, L1, 0, IA1, TA1> &e1,
|
|
104
|
+
const vector_expression<E2> &e2,
|
|
105
|
+
V &v, bool init = true) {
|
|
106
|
+
typedef typename V::size_type size_type;
|
|
107
|
+
typedef typename V::value_type value_type;
|
|
108
|
+
typedef L1 layout_type;
|
|
109
|
+
|
|
110
|
+
size_type size1 = e1.size1();
|
|
111
|
+
size_type size2 = e1.size2();
|
|
112
|
+
|
|
113
|
+
if (init) {
|
|
114
|
+
noalias(v) = zero_vector<value_type>(size1);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
for (size_type i = 0; i < e1.nnz(); ++i) {
|
|
118
|
+
size_type row_index = layout_type::index_M( e1.index1_data () [i], e1.index2_data () [i] );
|
|
119
|
+
size_type col_index = layout_type::index_m( e1.index1_data () [i], e1.index2_data () [i] );
|
|
120
|
+
v( row_index ) += e1.value_data () [i] * e2 () (col_index);
|
|
121
|
+
}
|
|
122
|
+
return v;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
template<class V, class E1, class E2>
|
|
126
|
+
BOOST_UBLAS_INLINE
|
|
127
|
+
V &
|
|
128
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
129
|
+
const vector_expression<E2> &e2,
|
|
130
|
+
V &v, packed_random_access_iterator_tag, row_major_tag) {
|
|
131
|
+
typedef const E1 expression1_type;
|
|
132
|
+
typedef typename V::size_type size_type;
|
|
133
|
+
|
|
134
|
+
typename expression1_type::const_iterator1 it1 (e1 ().begin1 ());
|
|
135
|
+
typename expression1_type::const_iterator1 it1_end (e1 ().end1 ());
|
|
136
|
+
while (it1 != it1_end) {
|
|
137
|
+
size_type index1 (it1.index1 ());
|
|
138
|
+
#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
|
|
139
|
+
typename expression1_type::const_iterator2 it2 (it1.begin ());
|
|
140
|
+
typename expression1_type::const_iterator2 it2_end (it1.end ());
|
|
141
|
+
#else
|
|
142
|
+
typename expression1_type::const_iterator2 it2 (boost::numeric::ublas::begin (it1, iterator1_tag ()));
|
|
143
|
+
typename expression1_type::const_iterator2 it2_end (boost::numeric::ublas::end (it1, iterator1_tag ()));
|
|
144
|
+
#endif
|
|
145
|
+
while (it2 != it2_end) {
|
|
146
|
+
v (index1) += *it2 * e2 () (it2.index2 ());
|
|
147
|
+
++ it2;
|
|
148
|
+
}
|
|
149
|
+
++ it1;
|
|
150
|
+
}
|
|
151
|
+
return v;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
template<class V, class E1, class E2>
|
|
155
|
+
BOOST_UBLAS_INLINE
|
|
156
|
+
V &
|
|
157
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
158
|
+
const vector_expression<E2> &e2,
|
|
159
|
+
V &v, packed_random_access_iterator_tag, column_major_tag) {
|
|
160
|
+
typedef const E1 expression1_type;
|
|
161
|
+
typedef typename V::size_type size_type;
|
|
162
|
+
|
|
163
|
+
typename expression1_type::const_iterator2 it2 (e1 ().begin2 ());
|
|
164
|
+
typename expression1_type::const_iterator2 it2_end (e1 ().end2 ());
|
|
165
|
+
while (it2 != it2_end) {
|
|
166
|
+
size_type index2 (it2.index2 ());
|
|
167
|
+
#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
|
|
168
|
+
typename expression1_type::const_iterator1 it1 (it2.begin ());
|
|
169
|
+
typename expression1_type::const_iterator1 it1_end (it2.end ());
|
|
170
|
+
#else
|
|
171
|
+
typename expression1_type::const_iterator1 it1 (boost::numeric::ublas::begin (it2, iterator2_tag ()));
|
|
172
|
+
typename expression1_type::const_iterator1 it1_end (boost::numeric::ublas::end (it2, iterator2_tag ()));
|
|
173
|
+
#endif
|
|
174
|
+
while (it1 != it1_end) {
|
|
175
|
+
v (it1.index1 ()) += *it1 * e2 () (index2);
|
|
176
|
+
++ it1;
|
|
177
|
+
}
|
|
178
|
+
++ it2;
|
|
179
|
+
}
|
|
180
|
+
return v;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
template<class V, class E1, class E2>
|
|
184
|
+
BOOST_UBLAS_INLINE
|
|
185
|
+
V &
|
|
186
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
187
|
+
const vector_expression<E2> &e2,
|
|
188
|
+
V &v, sparse_bidirectional_iterator_tag) {
|
|
189
|
+
typedef const E2 expression2_type;
|
|
190
|
+
|
|
191
|
+
typename expression2_type::const_iterator it (e2 ().begin ());
|
|
192
|
+
typename expression2_type::const_iterator it_end (e2 ().end ());
|
|
193
|
+
while (it != it_end) {
|
|
194
|
+
v.plus_assign (column (e1 (), it.index ()) * *it);
|
|
195
|
+
++ it;
|
|
196
|
+
}
|
|
197
|
+
return v;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Dispatcher
|
|
201
|
+
template<class V, class E1, class E2>
|
|
202
|
+
BOOST_UBLAS_INLINE
|
|
203
|
+
V &
|
|
204
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
205
|
+
const vector_expression<E2> &e2,
|
|
206
|
+
V &v, packed_random_access_iterator_tag) {
|
|
207
|
+
typedef typename E1::orientation_category orientation_category;
|
|
208
|
+
return axpy_prod (e1, e2, v, packed_random_access_iterator_tag (), orientation_category ());
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
/** \brief computes <tt>v += A x</tt> or <tt>v = A x</tt> in an
|
|
213
|
+
optimized fashion.
|
|
214
|
+
|
|
215
|
+
\param e1 the matrix expression \c A
|
|
216
|
+
\param e2 the vector expression \c x
|
|
217
|
+
\param v the result vector \c v
|
|
218
|
+
\param init a boolean parameter
|
|
219
|
+
|
|
220
|
+
<tt>axpy_prod(A, x, v, init)</tt> implements the well known
|
|
221
|
+
axpy-product. Setting \a init to \c true is equivalent to call
|
|
222
|
+
<tt>v.clear()</tt> before <tt>axpy_prod</tt>. Currently \a init
|
|
223
|
+
defaults to \c true, but this may change in the future.
|
|
224
|
+
|
|
225
|
+
Up to now there are some specialisation for compressed
|
|
226
|
+
matrices that give a large speed up compared to prod.
|
|
227
|
+
|
|
228
|
+
\ingroup blas2
|
|
229
|
+
|
|
230
|
+
\internal
|
|
231
|
+
|
|
232
|
+
template parameters:
|
|
233
|
+
\param V type of the result vector \c v
|
|
234
|
+
\param E1 type of a matrix expression \c A
|
|
235
|
+
\param E2 type of a vector expression \c x
|
|
236
|
+
*/
|
|
237
|
+
template<class V, class E1, class E2>
|
|
238
|
+
BOOST_UBLAS_INLINE
|
|
239
|
+
V &
|
|
240
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
241
|
+
const vector_expression<E2> &e2,
|
|
242
|
+
V &v, bool init = true) {
|
|
243
|
+
typedef typename V::value_type value_type;
|
|
244
|
+
typedef typename E2::const_iterator::iterator_category iterator_category;
|
|
245
|
+
|
|
246
|
+
if (init)
|
|
247
|
+
v.assign (zero_vector<value_type> (e1 ().size1 ()));
|
|
248
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
249
|
+
vector<value_type> cv (v);
|
|
250
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
251
|
+
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
|
|
252
|
+
indexing_vector_assign<scalar_plus_assign> (cv, prod (e1, e2));
|
|
253
|
+
#endif
|
|
254
|
+
axpy_prod (e1, e2, v, iterator_category ());
|
|
255
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
256
|
+
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
|
|
257
|
+
#endif
|
|
258
|
+
return v;
|
|
259
|
+
}
|
|
260
|
+
template<class V, class E1, class E2>
|
|
261
|
+
BOOST_UBLAS_INLINE
|
|
262
|
+
V
|
|
263
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
264
|
+
const vector_expression<E2> &e2) {
|
|
265
|
+
typedef V vector_type;
|
|
266
|
+
|
|
267
|
+
vector_type v (e1 ().size1 ());
|
|
268
|
+
return axpy_prod (e1, e2, v, true);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
template<class V, class E1, class T2, class IA2, class TA2>
|
|
272
|
+
BOOST_UBLAS_INLINE
|
|
273
|
+
V &
|
|
274
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
275
|
+
const compressed_matrix<T2, column_major, 0, IA2, TA2> &e2,
|
|
276
|
+
V &v, column_major_tag) {
|
|
277
|
+
typedef typename V::size_type size_type;
|
|
278
|
+
typedef typename V::value_type value_type;
|
|
279
|
+
|
|
280
|
+
for (size_type j = 0; j < e2.filled1 () -1; ++ j) {
|
|
281
|
+
size_type begin = e2.index1_data () [j];
|
|
282
|
+
size_type end = e2.index1_data () [j + 1];
|
|
283
|
+
value_type t (v (j));
|
|
284
|
+
for (size_type i = begin; i < end; ++ i)
|
|
285
|
+
t += e2.value_data () [i] * e1 () (e2.index2_data () [i]);
|
|
286
|
+
v (j) = t;
|
|
287
|
+
}
|
|
288
|
+
return v;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
template<class V, class E1, class T2, class IA2, class TA2>
|
|
292
|
+
BOOST_UBLAS_INLINE
|
|
293
|
+
V &
|
|
294
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
295
|
+
const compressed_matrix<T2, row_major, 0, IA2, TA2> &e2,
|
|
296
|
+
V &v, row_major_tag) {
|
|
297
|
+
typedef typename V::size_type size_type;
|
|
298
|
+
|
|
299
|
+
for (size_type i = 0; i < e2.filled1 () -1; ++ i) {
|
|
300
|
+
size_type begin = e2.index1_data () [i];
|
|
301
|
+
size_type end = e2.index1_data () [i + 1];
|
|
302
|
+
for (size_type j = begin; j < end; ++ j)
|
|
303
|
+
v (e2.index2_data () [j]) += e2.value_data () [j] * e1 () (i);
|
|
304
|
+
}
|
|
305
|
+
return v;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Dispatcher
|
|
309
|
+
template<class V, class E1, class T2, class L2, class IA2, class TA2>
|
|
310
|
+
BOOST_UBLAS_INLINE
|
|
311
|
+
V &
|
|
312
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
313
|
+
const compressed_matrix<T2, L2, 0, IA2, TA2> &e2,
|
|
314
|
+
V &v, bool init = true) {
|
|
315
|
+
typedef typename V::value_type value_type;
|
|
316
|
+
typedef typename L2::orientation_category orientation_category;
|
|
317
|
+
|
|
318
|
+
if (init)
|
|
319
|
+
v.assign (zero_vector<value_type> (e2.size2 ()));
|
|
320
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
321
|
+
vector<value_type> cv (v);
|
|
322
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
323
|
+
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
|
|
324
|
+
indexing_vector_assign<scalar_plus_assign> (cv, prod (e1, e2));
|
|
325
|
+
#endif
|
|
326
|
+
axpy_prod (e1, e2, v, orientation_category ());
|
|
327
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
328
|
+
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
|
|
329
|
+
#endif
|
|
330
|
+
return v;
|
|
331
|
+
}
|
|
332
|
+
template<class V, class E1, class T2, class L2, class IA2, class TA2>
|
|
333
|
+
BOOST_UBLAS_INLINE
|
|
334
|
+
V
|
|
335
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
336
|
+
const compressed_matrix<T2, L2, 0, IA2, TA2> &e2) {
|
|
337
|
+
typedef V vector_type;
|
|
338
|
+
|
|
339
|
+
vector_type v (e2.size2 ());
|
|
340
|
+
return axpy_prod (e1, e2, v, true);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
template<class V, class E1, class E2>
|
|
344
|
+
BOOST_UBLAS_INLINE
|
|
345
|
+
V &
|
|
346
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
347
|
+
const matrix_expression<E2> &e2,
|
|
348
|
+
V &v, packed_random_access_iterator_tag, column_major_tag) {
|
|
349
|
+
typedef const E2 expression2_type;
|
|
350
|
+
typedef typename V::size_type size_type;
|
|
351
|
+
|
|
352
|
+
typename expression2_type::const_iterator2 it2 (e2 ().begin2 ());
|
|
353
|
+
typename expression2_type::const_iterator2 it2_end (e2 ().end2 ());
|
|
354
|
+
while (it2 != it2_end) {
|
|
355
|
+
size_type index2 (it2.index2 ());
|
|
356
|
+
#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
|
|
357
|
+
typename expression2_type::const_iterator1 it1 (it2.begin ());
|
|
358
|
+
typename expression2_type::const_iterator1 it1_end (it2.end ());
|
|
359
|
+
#else
|
|
360
|
+
typename expression2_type::const_iterator1 it1 (boost::numeric::ublas::begin (it2, iterator2_tag ()));
|
|
361
|
+
typename expression2_type::const_iterator1 it1_end (boost::numeric::ublas::end (it2, iterator2_tag ()));
|
|
362
|
+
#endif
|
|
363
|
+
while (it1 != it1_end) {
|
|
364
|
+
v (index2) += *it1 * e1 () (it1.index1 ());
|
|
365
|
+
++ it1;
|
|
366
|
+
}
|
|
367
|
+
++ it2;
|
|
368
|
+
}
|
|
369
|
+
return v;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
template<class V, class E1, class E2>
|
|
373
|
+
BOOST_UBLAS_INLINE
|
|
374
|
+
V &
|
|
375
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
376
|
+
const matrix_expression<E2> &e2,
|
|
377
|
+
V &v, packed_random_access_iterator_tag, row_major_tag) {
|
|
378
|
+
typedef const E2 expression2_type;
|
|
379
|
+
typedef typename V::size_type size_type;
|
|
380
|
+
|
|
381
|
+
typename expression2_type::const_iterator1 it1 (e2 ().begin1 ());
|
|
382
|
+
typename expression2_type::const_iterator1 it1_end (e2 ().end1 ());
|
|
383
|
+
while (it1 != it1_end) {
|
|
384
|
+
size_type index1 (it1.index1 ());
|
|
385
|
+
#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
|
|
386
|
+
typename expression2_type::const_iterator2 it2 (it1.begin ());
|
|
387
|
+
typename expression2_type::const_iterator2 it2_end (it1.end ());
|
|
388
|
+
#else
|
|
389
|
+
typename expression2_type::const_iterator2 it2 (boost::numeric::ublas::begin (it1, iterator1_tag ()));
|
|
390
|
+
typename expression2_type::const_iterator2 it2_end (boost::numeric::ublas::end (it1, iterator1_tag ()));
|
|
391
|
+
#endif
|
|
392
|
+
while (it2 != it2_end) {
|
|
393
|
+
v (it2.index2 ()) += *it2 * e1 () (index1);
|
|
394
|
+
++ it2;
|
|
395
|
+
}
|
|
396
|
+
++ it1;
|
|
397
|
+
}
|
|
398
|
+
return v;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
template<class V, class E1, class E2>
|
|
402
|
+
BOOST_UBLAS_INLINE
|
|
403
|
+
V &
|
|
404
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
405
|
+
const matrix_expression<E2> &e2,
|
|
406
|
+
V &v, sparse_bidirectional_iterator_tag) {
|
|
407
|
+
typedef const E1 expression1_type;
|
|
408
|
+
|
|
409
|
+
typename expression1_type::const_iterator it (e1 ().begin ());
|
|
410
|
+
typename expression1_type::const_iterator it_end (e1 ().end ());
|
|
411
|
+
while (it != it_end) {
|
|
412
|
+
v.plus_assign (*it * row (e2 (), it.index ()));
|
|
413
|
+
++ it;
|
|
414
|
+
}
|
|
415
|
+
return v;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Dispatcher
|
|
419
|
+
template<class V, class E1, class E2>
|
|
420
|
+
BOOST_UBLAS_INLINE
|
|
421
|
+
V &
|
|
422
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
423
|
+
const matrix_expression<E2> &e2,
|
|
424
|
+
V &v, packed_random_access_iterator_tag) {
|
|
425
|
+
typedef typename E2::orientation_category orientation_category;
|
|
426
|
+
return axpy_prod (e1, e2, v, packed_random_access_iterator_tag (), orientation_category ());
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
/** \brief computes <tt>v += A<sup>T</sup> x</tt> or <tt>v = A<sup>T</sup> x</tt> in an
|
|
431
|
+
optimized fashion.
|
|
432
|
+
|
|
433
|
+
\param e1 the vector expression \c x
|
|
434
|
+
\param e2 the matrix expression \c A
|
|
435
|
+
\param v the result vector \c v
|
|
436
|
+
\param init a boolean parameter
|
|
437
|
+
|
|
438
|
+
<tt>axpy_prod(x, A, v, init)</tt> implements the well known
|
|
439
|
+
axpy-product. Setting \a init to \c true is equivalent to call
|
|
440
|
+
<tt>v.clear()</tt> before <tt>axpy_prod</tt>. Currently \a init
|
|
441
|
+
defaults to \c true, but this may change in the future.
|
|
442
|
+
|
|
443
|
+
Up to now there are some specialisation for compressed
|
|
444
|
+
matrices that give a large speed up compared to prod.
|
|
445
|
+
|
|
446
|
+
\ingroup blas2
|
|
447
|
+
|
|
448
|
+
\internal
|
|
449
|
+
|
|
450
|
+
template parameters:
|
|
451
|
+
\param V type of the result vector \c v
|
|
452
|
+
\param E1 type of a vector expression \c x
|
|
453
|
+
\param E2 type of a matrix expression \c A
|
|
454
|
+
*/
|
|
455
|
+
template<class V, class E1, class E2>
|
|
456
|
+
BOOST_UBLAS_INLINE
|
|
457
|
+
V &
|
|
458
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
459
|
+
const matrix_expression<E2> &e2,
|
|
460
|
+
V &v, bool init = true) {
|
|
461
|
+
typedef typename V::value_type value_type;
|
|
462
|
+
typedef typename E1::const_iterator::iterator_category iterator_category;
|
|
463
|
+
|
|
464
|
+
if (init)
|
|
465
|
+
v.assign (zero_vector<value_type> (e2 ().size2 ()));
|
|
466
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
467
|
+
vector<value_type> cv (v);
|
|
468
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
469
|
+
real_type verrorbound (norm_1 (v) + norm_1 (e1) * norm_1 (e2));
|
|
470
|
+
indexing_vector_assign<scalar_plus_assign> (cv, prod (e1, e2));
|
|
471
|
+
#endif
|
|
472
|
+
axpy_prod (e1, e2, v, iterator_category ());
|
|
473
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
474
|
+
BOOST_UBLAS_CHECK (norm_1 (v - cv) <= 2 * std::numeric_limits<real_type>::epsilon () * verrorbound, internal_logic ());
|
|
475
|
+
#endif
|
|
476
|
+
return v;
|
|
477
|
+
}
|
|
478
|
+
template<class V, class E1, class E2>
|
|
479
|
+
BOOST_UBLAS_INLINE
|
|
480
|
+
V
|
|
481
|
+
axpy_prod (const vector_expression<E1> &e1,
|
|
482
|
+
const matrix_expression<E2> &e2) {
|
|
483
|
+
typedef V vector_type;
|
|
484
|
+
|
|
485
|
+
vector_type v (e2 ().size2 ());
|
|
486
|
+
return axpy_prod (e1, e2, v, true);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
template<class M, class E1, class E2, class TRI>
|
|
490
|
+
BOOST_UBLAS_INLINE
|
|
491
|
+
M &
|
|
492
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
493
|
+
const matrix_expression<E2> &e2,
|
|
494
|
+
M &m, TRI,
|
|
495
|
+
dense_proxy_tag, row_major_tag) {
|
|
496
|
+
|
|
497
|
+
typedef typename M::size_type size_type;
|
|
498
|
+
|
|
499
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
500
|
+
typedef typename M::value_type value_type;
|
|
501
|
+
matrix<value_type, row_major> cm (m);
|
|
502
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
503
|
+
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
|
|
504
|
+
indexing_matrix_assign<scalar_plus_assign> (cm, prod (e1, e2), row_major_tag ());
|
|
505
|
+
#endif
|
|
506
|
+
size_type size1 (e1 ().size1 ());
|
|
507
|
+
size_type size2 (e1 ().size2 ());
|
|
508
|
+
for (size_type i = 0; i < size1; ++ i)
|
|
509
|
+
for (size_type j = 0; j < size2; ++ j)
|
|
510
|
+
row (m, i).plus_assign (e1 () (i, j) * row (e2 (), j));
|
|
511
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
512
|
+
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
|
|
513
|
+
#endif
|
|
514
|
+
return m;
|
|
515
|
+
}
|
|
516
|
+
template<class M, class E1, class E2, class TRI>
|
|
517
|
+
BOOST_UBLAS_INLINE
|
|
518
|
+
M &
|
|
519
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
520
|
+
const matrix_expression<E2> &e2,
|
|
521
|
+
M &m, TRI,
|
|
522
|
+
sparse_proxy_tag, row_major_tag) {
|
|
523
|
+
|
|
524
|
+
typedef TRI triangular_restriction;
|
|
525
|
+
typedef const E1 expression1_type;
|
|
526
|
+
typedef const E2 expression2_type;
|
|
527
|
+
|
|
528
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
529
|
+
typedef typename M::value_type value_type;
|
|
530
|
+
matrix<value_type, row_major> cm (m);
|
|
531
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
532
|
+
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
|
|
533
|
+
indexing_matrix_assign<scalar_plus_assign> (cm, prod (e1, e2), row_major_tag ());
|
|
534
|
+
#endif
|
|
535
|
+
typename expression1_type::const_iterator1 it1 (e1 ().begin1 ());
|
|
536
|
+
typename expression1_type::const_iterator1 it1_end (e1 ().end1 ());
|
|
537
|
+
while (it1 != it1_end) {
|
|
538
|
+
#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
|
|
539
|
+
typename expression1_type::const_iterator2 it2 (it1.begin ());
|
|
540
|
+
typename expression1_type::const_iterator2 it2_end (it1.end ());
|
|
541
|
+
#else
|
|
542
|
+
typename expression1_type::const_iterator2 it2 (boost::numeric::ublas::begin (it1, iterator1_tag ()));
|
|
543
|
+
typename expression1_type::const_iterator2 it2_end (boost::numeric::ublas::end (it1, iterator1_tag ()));
|
|
544
|
+
#endif
|
|
545
|
+
while (it2 != it2_end) {
|
|
546
|
+
// row (m, it1.index1 ()).plus_assign (*it2 * row (e2 (), it2.index2 ()));
|
|
547
|
+
matrix_row<expression2_type> mr (e2 (), it2.index2 ());
|
|
548
|
+
typename matrix_row<expression2_type>::const_iterator itr (mr.begin ());
|
|
549
|
+
typename matrix_row<expression2_type>::const_iterator itr_end (mr.end ());
|
|
550
|
+
while (itr != itr_end) {
|
|
551
|
+
if (triangular_restriction::other (it1.index1 (), itr.index ()))
|
|
552
|
+
m (it1.index1 (), itr.index ()) += *it2 * *itr;
|
|
553
|
+
++ itr;
|
|
554
|
+
}
|
|
555
|
+
++ it2;
|
|
556
|
+
}
|
|
557
|
+
++ it1;
|
|
558
|
+
}
|
|
559
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
560
|
+
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
|
|
561
|
+
#endif
|
|
562
|
+
return m;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
template<class M, class E1, class E2, class TRI>
|
|
566
|
+
BOOST_UBLAS_INLINE
|
|
567
|
+
M &
|
|
568
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
569
|
+
const matrix_expression<E2> &e2,
|
|
570
|
+
M &m, TRI,
|
|
571
|
+
dense_proxy_tag, column_major_tag) {
|
|
572
|
+
typedef typename M::size_type size_type;
|
|
573
|
+
|
|
574
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
575
|
+
typedef typename M::value_type value_type;
|
|
576
|
+
matrix<value_type, column_major> cm (m);
|
|
577
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
578
|
+
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
|
|
579
|
+
indexing_matrix_assign<scalar_plus_assign> (cm, prod (e1, e2), column_major_tag ());
|
|
580
|
+
#endif
|
|
581
|
+
size_type size1 (e2 ().size1 ());
|
|
582
|
+
size_type size2 (e2 ().size2 ());
|
|
583
|
+
for (size_type j = 0; j < size2; ++ j)
|
|
584
|
+
for (size_type i = 0; i < size1; ++ i)
|
|
585
|
+
column (m, j).plus_assign (e2 () (i, j) * column (e1 (), i));
|
|
586
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
587
|
+
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
|
|
588
|
+
#endif
|
|
589
|
+
return m;
|
|
590
|
+
}
|
|
591
|
+
template<class M, class E1, class E2, class TRI>
|
|
592
|
+
BOOST_UBLAS_INLINE
|
|
593
|
+
M &
|
|
594
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
595
|
+
const matrix_expression<E2> &e2,
|
|
596
|
+
M &m, TRI,
|
|
597
|
+
sparse_proxy_tag, column_major_tag) {
|
|
598
|
+
typedef TRI triangular_restriction;
|
|
599
|
+
typedef const E1 expression1_type;
|
|
600
|
+
typedef const E2 expression2_type;
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
604
|
+
typedef typename M::value_type value_type;
|
|
605
|
+
matrix<value_type, column_major> cm (m);
|
|
606
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
607
|
+
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
|
|
608
|
+
indexing_matrix_assign<scalar_plus_assign> (cm, prod (e1, e2), column_major_tag ());
|
|
609
|
+
#endif
|
|
610
|
+
typename expression2_type::const_iterator2 it2 (e2 ().begin2 ());
|
|
611
|
+
typename expression2_type::const_iterator2 it2_end (e2 ().end2 ());
|
|
612
|
+
while (it2 != it2_end) {
|
|
613
|
+
#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
|
|
614
|
+
typename expression2_type::const_iterator1 it1 (it2.begin ());
|
|
615
|
+
typename expression2_type::const_iterator1 it1_end (it2.end ());
|
|
616
|
+
#else
|
|
617
|
+
typename expression2_type::const_iterator1 it1 (boost::numeric::ublas::begin (it2, iterator2_tag ()));
|
|
618
|
+
typename expression2_type::const_iterator1 it1_end (boost::numeric::ublas::end (it2, iterator2_tag ()));
|
|
619
|
+
#endif
|
|
620
|
+
while (it1 != it1_end) {
|
|
621
|
+
// column (m, it2.index2 ()).plus_assign (*it1 * column (e1 (), it1.index1 ()));
|
|
622
|
+
matrix_column<expression1_type> mc (e1 (), it1.index1 ());
|
|
623
|
+
typename matrix_column<expression1_type>::const_iterator itc (mc.begin ());
|
|
624
|
+
typename matrix_column<expression1_type>::const_iterator itc_end (mc.end ());
|
|
625
|
+
while (itc != itc_end) {
|
|
626
|
+
if(triangular_restriction::other (itc.index (), it2.index2 ()))
|
|
627
|
+
m (itc.index (), it2.index2 ()) += *it1 * *itc;
|
|
628
|
+
++ itc;
|
|
629
|
+
}
|
|
630
|
+
++ it1;
|
|
631
|
+
}
|
|
632
|
+
++ it2;
|
|
633
|
+
}
|
|
634
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
635
|
+
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
|
|
636
|
+
#endif
|
|
637
|
+
return m;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// Dispatcher
|
|
641
|
+
template<class M, class E1, class E2, class TRI>
|
|
642
|
+
BOOST_UBLAS_INLINE
|
|
643
|
+
M &
|
|
644
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
645
|
+
const matrix_expression<E2> &e2,
|
|
646
|
+
M &m, TRI, bool init = true) {
|
|
647
|
+
typedef typename M::value_type value_type;
|
|
648
|
+
typedef typename M::storage_category storage_category;
|
|
649
|
+
typedef typename M::orientation_category orientation_category;
|
|
650
|
+
typedef TRI triangular_restriction;
|
|
651
|
+
|
|
652
|
+
if (init)
|
|
653
|
+
m.assign (zero_matrix<value_type> (e1 ().size1 (), e2 ().size2 ()));
|
|
654
|
+
return axpy_prod (e1, e2, m, triangular_restriction (), storage_category (), orientation_category ());
|
|
655
|
+
}
|
|
656
|
+
template<class M, class E1, class E2, class TRI>
|
|
657
|
+
BOOST_UBLAS_INLINE
|
|
658
|
+
M
|
|
659
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
660
|
+
const matrix_expression<E2> &e2,
|
|
661
|
+
TRI) {
|
|
662
|
+
typedef M matrix_type;
|
|
663
|
+
typedef TRI triangular_restriction;
|
|
664
|
+
|
|
665
|
+
matrix_type m (e1 ().size1 (), e2 ().size2 ());
|
|
666
|
+
return axpy_prod (e1, e2, m, triangular_restriction (), true);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/** \brief computes <tt>M += A X</tt> or <tt>M = A X</tt> in an
|
|
670
|
+
optimized fashion.
|
|
671
|
+
|
|
672
|
+
\param e1 the matrix expression \c A
|
|
673
|
+
\param e2 the matrix expression \c X
|
|
674
|
+
\param m the result matrix \c M
|
|
675
|
+
\param init a boolean parameter
|
|
676
|
+
|
|
677
|
+
<tt>axpy_prod(A, X, M, init)</tt> implements the well known
|
|
678
|
+
axpy-product. Setting \a init to \c true is equivalent to call
|
|
679
|
+
<tt>M.clear()</tt> before <tt>axpy_prod</tt>. Currently \a init
|
|
680
|
+
defaults to \c true, but this may change in the future.
|
|
681
|
+
|
|
682
|
+
Up to now there are no specialisations.
|
|
683
|
+
|
|
684
|
+
\ingroup blas3
|
|
685
|
+
|
|
686
|
+
\internal
|
|
687
|
+
|
|
688
|
+
template parameters:
|
|
689
|
+
\param M type of the result matrix \c M
|
|
690
|
+
\param E1 type of a matrix expression \c A
|
|
691
|
+
\param E2 type of a matrix expression \c X
|
|
692
|
+
*/
|
|
693
|
+
template<class M, class E1, class E2>
|
|
694
|
+
BOOST_UBLAS_INLINE
|
|
695
|
+
M &
|
|
696
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
697
|
+
const matrix_expression<E2> &e2,
|
|
698
|
+
M &m, bool init = true) {
|
|
699
|
+
typedef typename M::value_type value_type;
|
|
700
|
+
typedef typename M::storage_category storage_category;
|
|
701
|
+
typedef typename M::orientation_category orientation_category;
|
|
702
|
+
|
|
703
|
+
if (init)
|
|
704
|
+
m.assign (zero_matrix<value_type> (e1 ().size1 (), e2 ().size2 ()));
|
|
705
|
+
return axpy_prod (e1, e2, m, full (), storage_category (), orientation_category ());
|
|
706
|
+
}
|
|
707
|
+
template<class M, class E1, class E2>
|
|
708
|
+
BOOST_UBLAS_INLINE
|
|
709
|
+
M
|
|
710
|
+
axpy_prod (const matrix_expression<E1> &e1,
|
|
711
|
+
const matrix_expression<E2> &e2) {
|
|
712
|
+
typedef M matrix_type;
|
|
713
|
+
|
|
714
|
+
matrix_type m (e1 ().size1 (), e2 ().size2 ());
|
|
715
|
+
return axpy_prod (e1, e2, m, full (), true);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
|
|
719
|
+
template<class M, class E1, class E2>
|
|
720
|
+
BOOST_UBLAS_INLINE
|
|
721
|
+
M &
|
|
722
|
+
opb_prod (const matrix_expression<E1> &e1,
|
|
723
|
+
const matrix_expression<E2> &e2,
|
|
724
|
+
M &m,
|
|
725
|
+
dense_proxy_tag, row_major_tag) {
|
|
726
|
+
typedef typename M::size_type size_type;
|
|
727
|
+
typedef typename M::value_type value_type;
|
|
728
|
+
|
|
729
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
730
|
+
matrix<value_type, row_major> cm (m);
|
|
731
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
732
|
+
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
|
|
733
|
+
indexing_matrix_assign<scalar_plus_assign> (cm, prod (e1, e2), row_major_tag ());
|
|
734
|
+
#endif
|
|
735
|
+
size_type size (BOOST_UBLAS_SAME (e1 ().size2 (), e2 ().size1 ()));
|
|
736
|
+
for (size_type k = 0; k < size; ++ k) {
|
|
737
|
+
vector<value_type> ce1 (column (e1 (), k));
|
|
738
|
+
vector<value_type> re2 (row (e2 (), k));
|
|
739
|
+
m.plus_assign (outer_prod (ce1, re2));
|
|
740
|
+
}
|
|
741
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
742
|
+
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
|
|
743
|
+
#endif
|
|
744
|
+
return m;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
template<class M, class E1, class E2>
|
|
748
|
+
BOOST_UBLAS_INLINE
|
|
749
|
+
M &
|
|
750
|
+
opb_prod (const matrix_expression<E1> &e1,
|
|
751
|
+
const matrix_expression<E2> &e2,
|
|
752
|
+
M &m,
|
|
753
|
+
dense_proxy_tag, column_major_tag) {
|
|
754
|
+
typedef typename M::size_type size_type;
|
|
755
|
+
typedef typename M::value_type value_type;
|
|
756
|
+
|
|
757
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
758
|
+
matrix<value_type, column_major> cm (m);
|
|
759
|
+
typedef typename type_traits<value_type>::real_type real_type;
|
|
760
|
+
real_type merrorbound (norm_1 (m) + norm_1 (e1) * norm_1 (e2));
|
|
761
|
+
indexing_matrix_assign<scalar_plus_assign> (cm, prod (e1, e2), column_major_tag ());
|
|
762
|
+
#endif
|
|
763
|
+
size_type size (BOOST_UBLAS_SAME (e1 ().size2 (), e2 ().size1 ()));
|
|
764
|
+
for (size_type k = 0; k < size; ++ k) {
|
|
765
|
+
vector<value_type> ce1 (column (e1 (), k));
|
|
766
|
+
vector<value_type> re2 (row (e2 (), k));
|
|
767
|
+
m.plus_assign (outer_prod (ce1, re2));
|
|
768
|
+
}
|
|
769
|
+
#if BOOST_UBLAS_TYPE_CHECK
|
|
770
|
+
BOOST_UBLAS_CHECK (norm_1 (m - cm) <= 2 * std::numeric_limits<real_type>::epsilon () * merrorbound, internal_logic ());
|
|
771
|
+
#endif
|
|
772
|
+
return m;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
// Dispatcher
|
|
776
|
+
|
|
777
|
+
/** \brief computes <tt>M += A X</tt> or <tt>M = A X</tt> in an
|
|
778
|
+
optimized fashion.
|
|
779
|
+
|
|
780
|
+
\param e1 the matrix expression \c A
|
|
781
|
+
\param e2 the matrix expression \c X
|
|
782
|
+
\param m the result matrix \c M
|
|
783
|
+
\param init a boolean parameter
|
|
784
|
+
|
|
785
|
+
<tt>opb_prod(A, X, M, init)</tt> implements the well known
|
|
786
|
+
axpy-product. Setting \a init to \c true is equivalent to call
|
|
787
|
+
<tt>M.clear()</tt> before <tt>opb_prod</tt>. Currently \a init
|
|
788
|
+
defaults to \c true, but this may change in the future.
|
|
789
|
+
|
|
790
|
+
This function may give a speedup if \c A has less columns than
|
|
791
|
+
rows, because the product is computed as a sum of outer
|
|
792
|
+
products.
|
|
793
|
+
|
|
794
|
+
\ingroup blas3
|
|
795
|
+
|
|
796
|
+
\internal
|
|
797
|
+
|
|
798
|
+
template parameters:
|
|
799
|
+
\param M type of the result matrix \c M
|
|
800
|
+
\param E1 type of a matrix expression \c A
|
|
801
|
+
\param E2 type of a matrix expression \c X
|
|
802
|
+
*/
|
|
803
|
+
template<class M, class E1, class E2>
|
|
804
|
+
BOOST_UBLAS_INLINE
|
|
805
|
+
M &
|
|
806
|
+
opb_prod (const matrix_expression<E1> &e1,
|
|
807
|
+
const matrix_expression<E2> &e2,
|
|
808
|
+
M &m, bool init = true) {
|
|
809
|
+
typedef typename M::value_type value_type;
|
|
810
|
+
typedef typename M::storage_category storage_category;
|
|
811
|
+
typedef typename M::orientation_category orientation_category;
|
|
812
|
+
|
|
813
|
+
if (init)
|
|
814
|
+
m.assign (zero_matrix<value_type> (e1 ().size1 (), e2 ().size2 ()));
|
|
815
|
+
return opb_prod (e1, e2, m, storage_category (), orientation_category ());
|
|
816
|
+
}
|
|
817
|
+
template<class M, class E1, class E2>
|
|
818
|
+
BOOST_UBLAS_INLINE
|
|
819
|
+
M
|
|
820
|
+
opb_prod (const matrix_expression<E1> &e1,
|
|
821
|
+
const matrix_expression<E2> &e2) {
|
|
822
|
+
typedef M matrix_type;
|
|
823
|
+
|
|
824
|
+
matrix_type m (e1 ().size1 (), e2 ().size2 ());
|
|
825
|
+
return opb_prod (e1, e2, m, true);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
}}}
|
|
829
|
+
|
|
830
|
+
#endif
|