Skip to content

Commit efc877d

Browse files
committed
Use lapack_sys in qr.rs
1 parent bd6f3fe commit efc877d

File tree

1 file changed

+98
-48
lines changed

1 file changed

+98
-48
lines changed

lax/src/qr.rs

Lines changed: 98 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub trait QR_: Sized {
2121
macro_rules! impl_qr {
2222
($scalar:ty, $qrf:path, $lqf:path, $gqr:path, $glq:path) => {
2323
impl QR_ for $scalar {
24-
fn householder(l: MatrixLayout, mut a: &mut [Self]) -> Result<Vec<Self>> {
24+
fn householder(l: MatrixLayout, a: &mut [Self]) -> Result<Vec<Self>> {
2525
let m = l.lda();
2626
let n = l.len();
2727
let k = m.min(n);
@@ -33,41 +33,59 @@ macro_rules! impl_qr {
3333
unsafe {
3434
match l {
3535
MatrixLayout::F { .. } => {
36-
$qrf(m, n, &mut a, m, &mut tau, &mut work_size, -1, &mut info);
36+
$qrf(
37+
&m,
38+
&n,
39+
AsPtr::as_mut_ptr(a),
40+
&m,
41+
AsPtr::as_mut_ptr(&mut tau),
42+
AsPtr::as_mut_ptr(&mut work_size),
43+
&(-1),
44+
&mut info,
45+
);
3746
}
3847
MatrixLayout::C { .. } => {
39-
$lqf(m, n, &mut a, m, &mut tau, &mut work_size, -1, &mut info);
48+
$lqf(
49+
&m,
50+
&n,
51+
AsPtr::as_mut_ptr(a),
52+
&m,
53+
AsPtr::as_mut_ptr(&mut tau),
54+
AsPtr::as_mut_ptr(&mut work_size),
55+
&(-1),
56+
&mut info,
57+
);
4058
}
4159
}
4260
}
4361
info.as_lapack_result()?;
4462

4563
// calc
4664
let lwork = work_size[0].to_usize().unwrap();
47-
let mut work = unsafe { vec_uninit(lwork) };
65+
let mut work: Vec<Self> = unsafe { vec_uninit(lwork) };
4866
unsafe {
4967
match l {
5068
MatrixLayout::F { .. } => {
5169
$qrf(
52-
m,
53-
n,
54-
&mut a,
55-
m,
56-
&mut tau,
57-
&mut work,
58-
lwork as i32,
70+
&m,
71+
&n,
72+
AsPtr::as_mut_ptr(a),
73+
&m,
74+
AsPtr::as_mut_ptr(&mut tau),
75+
AsPtr::as_mut_ptr(&mut work),
76+
&(lwork as i32),
5977
&mut info,
6078
);
6179
}
6280
MatrixLayout::C { .. } => {
6381
$lqf(
64-
m,
65-
n,
66-
&mut a,
67-
m,
68-
&mut tau,
69-
&mut work,
70-
lwork as i32,
82+
&m,
83+
&n,
84+
AsPtr::as_mut_ptr(a),
85+
&m,
86+
AsPtr::as_mut_ptr(&mut tau),
87+
AsPtr::as_mut_ptr(&mut work),
88+
&(lwork as i32),
7189
&mut info,
7290
);
7391
}
@@ -78,7 +96,7 @@ macro_rules! impl_qr {
7896
Ok(tau)
7997
}
8098

81-
fn q(l: MatrixLayout, mut a: &mut [Self], tau: &[Self]) -> Result<()> {
99+
fn q(l: MatrixLayout, a: &mut [Self], tau: &[Self]) -> Result<()> {
82100
let m = l.lda();
83101
let n = l.len();
84102
let k = m.min(n);
@@ -89,26 +107,58 @@ macro_rules! impl_qr {
89107
let mut work_size = [Self::zero()];
90108
unsafe {
91109
match l {
92-
MatrixLayout::F { .. } => {
93-
$gqr(m, k, k, &mut a, m, &tau, &mut work_size, -1, &mut info)
94-
}
95-
MatrixLayout::C { .. } => {
96-
$glq(k, n, k, &mut a, m, &tau, &mut work_size, -1, &mut info)
97-
}
110+
MatrixLayout::F { .. } => $gqr(
111+
&m,
112+
&k,
113+
&k,
114+
AsPtr::as_mut_ptr(a),
115+
&m,
116+
AsPtr::as_ptr(&tau),
117+
AsPtr::as_mut_ptr(&mut work_size),
118+
&(-1),
119+
&mut info,
120+
),
121+
MatrixLayout::C { .. } => $glq(
122+
&k,
123+
&n,
124+
&k,
125+
AsPtr::as_mut_ptr(a),
126+
&m,
127+
AsPtr::as_ptr(&tau),
128+
AsPtr::as_mut_ptr(&mut work_size),
129+
&(-1),
130+
&mut info,
131+
),
98132
}
99133
};
100134

101135
// calc
102136
let lwork = work_size[0].to_usize().unwrap();
103-
let mut work = unsafe { vec_uninit(lwork) };
137+
let mut work: Vec<Self> = unsafe { vec_uninit(lwork) };
104138
unsafe {
105139
match l {
106-
MatrixLayout::F { .. } => {
107-
$gqr(m, k, k, &mut a, m, &tau, &mut work, lwork as i32, &mut info)
108-
}
109-
MatrixLayout::C { .. } => {
110-
$glq(k, n, k, &mut a, m, &tau, &mut work, lwork as i32, &mut info)
111-
}
140+
MatrixLayout::F { .. } => $gqr(
141+
&m,
142+
&k,
143+
&k,
144+
AsPtr::as_mut_ptr(a),
145+
&m,
146+
AsPtr::as_ptr(&tau),
147+
AsPtr::as_mut_ptr(&mut work),
148+
&(lwork as i32),
149+
&mut info,
150+
),
151+
MatrixLayout::C { .. } => $glq(
152+
&k,
153+
&n,
154+
&k,
155+
AsPtr::as_mut_ptr(a),
156+
&m,
157+
AsPtr::as_ptr(&tau),
158+
AsPtr::as_mut_ptr(&mut work),
159+
&(lwork as i32),
160+
&mut info,
161+
),
112162
}
113163
}
114164
info.as_lapack_result()?;
@@ -127,29 +177,29 @@ macro_rules! impl_qr {
127177

128178
impl_qr!(
129179
f64,
130-
lapack::dgeqrf,
131-
lapack::dgelqf,
132-
lapack::dorgqr,
133-
lapack::dorglq
180+
lapack_sys::dgeqrf_,
181+
lapack_sys::dgelqf_,
182+
lapack_sys::dorgqr_,
183+
lapack_sys::dorglq_
134184
);
135185
impl_qr!(
136186
f32,
137-
lapack::sgeqrf,
138-
lapack::sgelqf,
139-
lapack::sorgqr,
140-
lapack::sorglq
187+
lapack_sys::sgeqrf_,
188+
lapack_sys::sgelqf_,
189+
lapack_sys::sorgqr_,
190+
lapack_sys::sorglq_
141191
);
142192
impl_qr!(
143193
c64,
144-
lapack::zgeqrf,
145-
lapack::zgelqf,
146-
lapack::zungqr,
147-
lapack::zunglq
194+
lapack_sys::zgeqrf_,
195+
lapack_sys::zgelqf_,
196+
lapack_sys::zungqr_,
197+
lapack_sys::zunglq_
148198
);
149199
impl_qr!(
150200
c32,
151-
lapack::cgeqrf,
152-
lapack::cgelqf,
153-
lapack::cungqr,
154-
lapack::cunglq
201+
lapack_sys::cgeqrf_,
202+
lapack_sys::cgelqf_,
203+
lapack_sys::cungqr_,
204+
lapack_sys::cunglq_
155205
);

0 commit comments

Comments
 (0)