mathru/algebra/abstr/
scalar.rs

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/// comparisons, basic numeric operations, and string conversion.
12#[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/// comparisons, basic numeric operations, and string conversion.
48#[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}