1use crate::algebra::abstr::Complex;
2use crate::algebra::abstr::{
3 cast::{FromPrimitive, NumCast, ToPrimitive},
4 Sign,
5};
6use std::fmt::{Debug, Display};
7
8#[cfg(feature = "lapack")]
9use crate::algebra::abstr::Zero;
10
11#[cfg(feature = "native")]
13pub trait Scalar<Rhs = Self, Output = Self>:
14 Sized
15 + Display
16 + ToPrimitive
17 + FromPrimitive
18 + NumCast
19 + Debug
20 + Copy
21 + PartialOrd
22 + Sign
23 + MatrixMultiply
24{
25}
26
27#[cfg(feature = "native")]
28pub trait MatrixMultiply {
29 fn xgemm(
30 m: usize,
31 k: usize,
32 n: usize,
33 alpha: Self,
34 a: *const Self,
35 rsa: isize,
36 csa: isize,
37 b: *const Self,
38 rsb: isize,
39 csb: isize,
40 beta: Self,
41 c: *mut Self,
42 rsc: isize,
43 csc: isize,
44 );
45}
46
47#[cfg(feature = "lapack")]
49pub trait Scalar<Rhs = Self, Output = Self>:
50 Sized
51 + Display
52 + ToPrimitive
53 + FromPrimitive
54 + NumCast
55 + Debug
56 + Copy
57 + PartialOrd
58 + Sign
59 + Blas
60 + Lapack
61{
62}
63
64macro_rules! impl_scalar {
65 ($t:ty) => {
66 impl Scalar for $t {}
67 };
68}
69
70impl_scalar!(f32);
71impl_scalar!(f64);
72impl_scalar!(Complex<f32>);
73impl_scalar!(Complex<f64>);
74
75#[cfg(feature = "lapack")]
76pub trait Lapack: Sized + Zero {
77 fn xgehrd(
78 n: i32,
79 ilo: i32,
80 ihi: i32,
81 a: &mut [Self],
82 lda: i32,
83 tau: &mut [Self],
84 work: &mut [Self],
85 lwork: i32,
86 info: &mut i32,
87 );
88
89 fn xgehrd_work_size(
90 n: i32,
91 ilo: i32,
92 ihi: i32,
93 a: &mut [Self],
94 lda: i32,
95 tau: &mut [Self],
96 info: &mut i32,
97 ) -> i32;
98
99 fn xorghr(
100 n: i32,
101 ilo: i32,
102 ihi: i32,
103 a: &mut [Self],
104 lda: i32,
105 tau: &[Self],
106 work: &mut [Self],
107 lwork: i32,
108 info: &mut i32,
109 );
110
111 fn xorghr_work_size(
112 n: i32,
113 ilo: i32,
114 ihi: i32,
115 a: &mut [Self],
116 lda: i32,
117 tau: &[Self],
118 info: &mut i32,
119 ) -> i32;
120
121 fn xgeev(
122 jobvl: u8,
123 jobvr: u8,
124 n: i32,
125 a: &mut [Self],
126 lda: i32,
127 w: &mut [Self],
128 vl: &mut [Self],
129 ldvl: i32,
130 vr: &mut [Self],
131 ldvr: i32,
132 work: &mut [Self],
133 lwork: i32,
134 info: &mut i32,
135 );
136
137 fn xgeev_work_size(
138 jobvl: u8,
139 jobvr: u8,
140 n: i32,
141 a: &mut [Self],
142 lda: i32,
143 w: &mut [Self],
144 vl: &mut [Self],
145 ldvl: i32,
146 vr: &mut [Self],
147 ldvr: i32,
148 info: &mut i32,
149 ) -> i32;
150
151 fn xgetrf(m: i32, n: i32, a: &mut [Self], lda: i32, ipiv: &mut [i32], info: &mut i32);
152
153 fn xgeqrf(
154 m: i32,
155 n: i32,
156 a: &mut [Self],
157 lda: i32,
158 tau: &mut [Self],
159 work: &mut [Self],
160 lwork: i32,
161 info: &mut i32,
162 );
163
164 fn xgeqrf_work_size(
165 m: i32,
166 n: i32,
167 a: &mut [Self],
168 lda: i32,
169 tau: &mut [Self],
170 info: &mut i32,
171 ) -> i32;
172
173 fn xorgqr(
174 m: i32,
175 n: i32,
176 k: i32,
177 a: &mut [Self],
178 lda: i32,
179 tau: &mut [Self],
180 work: &mut [Self],
181 lwork: i32,
182 info: &mut i32,
183 );
184
185 fn xorgqr_work_size(
186 m: i32,
187 n: i32,
188 k: i32,
189 a: &mut [Self],
190 lda: i32,
191 tau: &mut [Self],
192 info: &mut i32,
193 ) -> i32;
194
195 fn xgetri(
196 n: i32,
197 a: &mut [Self],
198 lda: i32,
199 ipiv: &[i32],
200 work: &mut [Self],
201 lwork: i32,
202 info: &mut i32,
203 );
204
205 fn xgetri_work_size(n: i32, a: &mut [Self], lda: i32, ipiv: &[i32], info: &mut i32) -> i32;
206
207 fn xpotrf(uplo: char, n: i32, a: &mut [Self], lda: i32, info: &mut i32);
208
209 fn xgetrs(
210 n: i32,
211 nrhs: i32,
212 a: &mut [Self],
213 lda: i32,
214 ipiv: &mut [i32],
215 b: &mut [Self],
216 ldb: i32,
217 info: &mut i32,
218 );
219}
220
221#[cfg(feature = "lapack")]
222pub trait Blas: Sized + Zero {
223 fn xgemm(
224 transa: u8,
225 transb: u8,
226 m: i32,
227 n: i32,
228 k: i32,
229 alpha: Self,
230 a: &[Self],
231 lda: i32,
232 b: &[Self],
233 ldb: i32,
234 beta: Self,
235 c: &mut [Self],
236 ldc: i32,
237 );
238
239 fn xtrsm(
240 side: char,
241 uplo: char,
242 transa: char,
243 diag: char,
244 m: i32,
245 n: i32,
246 alpha: Self,
247 a: &[Self],
248 lda: i32,
249 b: &mut [Self],
250 ldb: i32,
251 );
252
253 fn xscal(n: i32, a: Self, x: &mut [Self], inc: i32);
254
255 fn xaxpy(n: i32, a: Self, x: &[Self], incx: i32, y: &mut [Self], incy: i32);
256
257 fn xtrmm(
258 side: char,
259 uplo: char,
260 transa: char,
261 diag: char,
262 m: i32,
263 n: i32,
264 alpha: Self,
265 a: &[Self],
266 lda: i32,
267 b: &mut [Self],
268 ldb: i32,
269 );
270}