MUDA
Loading...
Searching...
No Matches
bcoo_vector_view.h
1#pragma once
2
3#include <muda/ext/linear_system/doublet_vector_view.h>
4#include <muda/ext/linear_system/bcoo_vector_viewer.h>
5
6namespace muda
7{
8template <typename T, int N>
9using BCOOVectorView = DoubletVectorView<T, N>;
10template <typename T, int N>
11using CBCOOVectorView = CDoubletVectorView<T, N>;
12} // namespace muda
13
14namespace muda
15{
16template <bool IsConst, typename T>
17class COOVectorViewBase : public ViewBase<IsConst>
18{
19 using Base = ViewBase<IsConst>;
20 template <typename U>
21 using auto_const_t = typename Base::template auto_const_t<U>;
22
23 public:
24 static_assert(!std::is_const_v<T>, "T must be non-const");
28
31 using ThisViewer = std::conditional_t<IsConst, CViewer, Viewer>;
32
33 protected:
34 // vector info
35 int m_size = 0;
36
37 //doublet info
38 int m_doublet_index_offset = 0;
39 int m_doublet_count = 0;
40 int m_total_doublet_count = 0;
41
42 // data
43 auto_const_t<int>* m_indices = nullptr;
44 auto_const_t<T>* m_values = nullptr;
45
46 mutable cusparseSpVecDescr_t m_descr = nullptr;
47
48 public:
49 MUDA_GENERIC COOVectorViewBase() = default;
50 MUDA_GENERIC COOVectorViewBase(int size,
51 int doublet_index_offset,
52 int doublet_count,
53 int total_doublet_count,
54 auto_const_t<int>* indices,
55 auto_const_t<T>* values,
56 cusparseSpVecDescr_t descr)
57 : m_size(size)
58 , m_doublet_index_offset(doublet_index_offset)
59 , m_doublet_count(doublet_count)
60 , m_total_doublet_count(total_doublet_count)
61 , m_indices(indices)
62 , m_values(values)
63 , m_descr(descr)
64 {
65 MUDA_KERNEL_ASSERT(doublet_index_offset + doublet_count <= total_doublet_count,
66 "COOVectorView: out of range, m_total_doublet_count=%d, "
67 "your doublet_index_offset=%d, doublet_count=%d",
68 total_doublet_count,
69 doublet_index_offset,
70 doublet_count);
71 }
72
73 // implicit conversion
74
75 MUDA_GENERIC auto as_const() const -> ConstView
76 {
77 return ConstView{m_size,
78 m_doublet_index_offset,
79 m_doublet_count,
80 m_total_doublet_count,
81 m_indices,
82 m_values,
83 m_descr};
84 }
85
86 MUDA_GENERIC operator ConstView() const { return as_const(); }
87
88 // non-const accessor
89
90 MUDA_GENERIC auto viewer()
91 {
92 return ThisViewer{
93 m_size, m_doublet_index_offset, m_doublet_count, m_total_doublet_count, m_indices, m_values};
94 }
95
96 MUDA_GENERIC auto subview(int offset, int count)
97 {
98 return ThisView{m_size,
99 m_doublet_index_offset + offset,
100 count,
101 m_total_doublet_count,
102 m_indices,
103 m_values,
104 m_descr};
105 }
106
107 MUDA_GENERIC auto subview(int offset)
108 {
109 return subview(offset, m_doublet_count - offset);
110 }
111
112 // const accessor
113
114 MUDA_GENERIC ConstView subview(int offset, int count) const
115 {
116 return remove_const(*this).subview(offset, count);
117 }
118
119 MUDA_GENERIC ConstView subview(int offset) const
120 {
121 return remove_const(*this).subview(offset);
122 }
123
124 MUDA_GENERIC auto cviewer() const { return remove_const(*this).viewer(); }
125
126
127 MUDA_GENERIC auto vector_size() const { return m_size; }
128
129 MUDA_GENERIC auto doublet_index_offset() const
130 {
131 return m_doublet_index_offset;
132 }
133
134 MUDA_GENERIC auto doublet_count() const { return m_doublet_count; }
135
136 MUDA_GENERIC auto total_doublet_count() const
137 {
138 return m_total_doublet_count;
139 }
140
141 MUDA_GENERIC auto descr() const { return m_descr; }
142};
143
144template <typename T>
146template <typename T>
148} // namespace muda
149
150namespace muda
151{
152template <typename T>
154{
155 using type = CCOOVectorView<T>;
156};
157
158template <typename T>
160{
161 using type = COOVectorView<T>;
162};
163} // namespace muda
164
165#include "details/bcoo_vector_view.inl"
Definition doublet_vector_viewer.h:148
Definition bcoo_vector_view.h:18
Definition view_base.h:8
Definition type_modifier.h:22
Definition type_modifier.h:28