From 10214514028215b7326d363e4adfab063e7e7c41 Mon Sep 17 00:00:00 2001 From: "Yu-Hsiang M. Tsai" Date: Wed, 29 Apr 2026 21:34:23 +0200 Subject: [PATCH] use legacy pattern --- include/spblas/concepts.hpp | 4 +- include/spblas/detail/view_inspectors.hpp | 48 +++++++++++++++++++ .../spblas/vendor/onemkl_sycl/spmm_impl.hpp | 3 +- include/spblas/views/matrix_view.hpp | 16 +++++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/include/spblas/concepts.hpp b/include/spblas/concepts.hpp index bdf8dbd..9dfdb4e 100644 --- a/include/spblas/concepts.hpp +++ b/include/spblas/concepts.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include namespace spblas { @@ -18,7 +19,8 @@ namespace spblas { */ template -concept matrix = __detail::is_csr_view_v || __detail::is_csc_view_v || +concept matrix = matrix_view::is_legacy_pattern_v || + __detail::is_csr_view_v || __detail::is_csc_view_v || __detail::is_matrix_mdspan_v || __detail::matrix; /* diff --git a/include/spblas/detail/view_inspectors.hpp b/include/spblas/detail/view_inspectors.hpp index 4432ef8..f999056 100644 --- a/include/spblas/detail/view_inspectors.hpp +++ b/include/spblas/detail/view_inspectors.hpp @@ -5,6 +5,7 @@ #include #include +#include namespace spblas { @@ -110,6 +111,28 @@ auto get_ultimate_base(T&& t) { } } +template +auto get_ultimate_base_or_matrix_opt(T&& t) { + if constexpr (is_matrix_opt_v) { + return t; + } else if constexpr (has_base) { + return get_ultimate_base_or_matrix_opt(t.base()); + } else { + return t; + } +} + +template +auto get_ultimate_base_or_matrix(T&& t) { + if constexpr (matrix_view::is_legacy_pattern_v) { + return t; + } else if constexpr (has_base) { + return get_ultimate_base_or_matrix(t.base()); + } else { + return t; + } +} + template bool has_matrix_opt(T&& t) { if constexpr (is_matrix_opt_v) { @@ -121,6 +144,17 @@ bool has_matrix_opt(T&& t) { } } +template +bool has_legacy_pattern(T&& t) { + if constexpr (matrix_view::is_legacy_pattern_v) { + return true; + } else if constexpr (has_base) { + return has_legacy_pattern(t.base()); + } else { + return false; + } +} + template using ultimate_base_type_t = decltype(get_ultimate_base(std::declval())); @@ -137,6 +171,20 @@ template concept has_contiguous_range_base = spblas::__ranges::contiguous_range>; +template +using ultimate_base_or_matrix_type_t = + decltype(get_ultimate_base_or_matrix(std::declval())); + +template +concept has_legacy_pattern_d = + matrix_view::is_legacy_pattern_v>; + +template +concept has_full = + !has_legacy_pattern_d || + std::is_same_v::uplo, + matrix_view::uplo::full>; + } // namespace __detail } // namespace spblas diff --git a/include/spblas/vendor/onemkl_sycl/spmm_impl.hpp b/include/spblas/vendor/onemkl_sycl/spmm_impl.hpp index 441ce28..b7d11ee 100644 --- a/include/spblas/vendor/onemkl_sycl/spmm_impl.hpp +++ b/include/spblas/vendor/onemkl_sycl/spmm_impl.hpp @@ -92,7 +92,8 @@ template std::is_same_v::layout_type, __mdspan::layout_right> && std::is_same_v::layout_type, - __mdspan::layout_right>) + __mdspan::layout_right> && + __detail::has_full) void multiply(ExecutionPolicy&& policy, operation_info_t& info, A&& a, X&& x, Y&& y) { log_trace(""); diff --git a/include/spblas/views/matrix_view.hpp b/include/spblas/views/matrix_view.hpp index fac1310..5589357 100644 --- a/include/spblas/views/matrix_view.hpp +++ b/include/spblas/views/matrix_view.hpp @@ -93,6 +93,22 @@ class legacy_pattern : public spblas::view_base { matrix_opt& obj; }; +template +struct is_instantiation_of_legacy_pattern { + static constexpr bool value = false; +}; + +template +struct is_instantiation_of_legacy_pattern< + legacy_pattern> { + static constexpr bool value = true; +}; + +template +static constexpr bool is_legacy_pattern_v = + is_instantiation_of_legacy_pattern>::value; + template auto conjugate(matrix_opt&& matrix) { return legacy_pattern(matrix);