use crate::rocblas::Handle;
use crate::rocblas::ffi as rocblas_ffi;
use crate::rocblas::types::{Operation, Side};
use crate::rocsolver::bindings;
use crate::rocsolver::error::{Error, Result};
use crate::rocsolver::types::{Complex32, Complex64};
type RocblasHandle = rocblas_ffi::rocblas_handle;
type RocblasStatus = rocblas_ffi::rocblas_status;
#[inline]
fn cast_handle(handle: RocblasHandle) -> bindings::rocblas_handle {
handle as bindings::rocblas_handle
}
pub trait OrgqrType: Sized + Copy {
unsafe fn orgqr(
handle: RocblasHandle,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
) -> RocblasStatus;
}
pub trait OrmqrType: Sized + Copy {
unsafe fn ormqr(
handle: RocblasHandle,
side: rocblas_ffi::rocblas_side,
trans: rocblas_ffi::rocblas_operation,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
C: *mut Self,
ldc: i32,
) -> RocblasStatus;
}
pub trait UngqrType: Sized + Copy {
unsafe fn ungqr(
handle: RocblasHandle,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
) -> RocblasStatus;
}
pub trait UnmqrType: Sized + Copy {
unsafe fn unmqr(
handle: RocblasHandle,
side: rocblas_ffi::rocblas_side,
trans: rocblas_ffi::rocblas_operation,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
C: *mut Self,
ldc: i32,
) -> RocblasStatus;
}
impl OrgqrType for f32 {
unsafe fn orgqr(
handle: RocblasHandle,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
) -> RocblasStatus {
bindings::rocsolver_sorgqr(cast_handle(handle), m, n, k, A, lda, ipiv)
}
}
impl OrmqrType for f32 {
unsafe fn ormqr(
handle: RocblasHandle,
side: rocblas_ffi::rocblas_side,
trans: rocblas_ffi::rocblas_operation,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
C: *mut Self,
ldc: i32,
) -> RocblasStatus {
bindings::rocsolver_sormqr(
cast_handle(handle),
side,
trans,
m,
n,
k,
A,
lda,
ipiv,
C,
ldc,
)
}
}
impl OrgqrType for f64 {
unsafe fn orgqr(
handle: RocblasHandle,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
) -> RocblasStatus {
bindings::rocsolver_dorgqr(cast_handle(handle), m, n, k, A, lda, ipiv)
}
}
impl OrmqrType for f64 {
unsafe fn ormqr(
handle: RocblasHandle,
side: rocblas_ffi::rocblas_side,
trans: rocblas_ffi::rocblas_operation,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
C: *mut Self,
ldc: i32,
) -> RocblasStatus {
bindings::rocsolver_dormqr(
cast_handle(handle),
side,
trans,
m,
n,
k,
A,
lda,
ipiv,
C,
ldc,
)
}
}
impl UngqrType for Complex32 {
unsafe fn ungqr(
handle: RocblasHandle,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
) -> RocblasStatus {
bindings::rocsolver_cungqr(
cast_handle(handle),
m,
n,
k,
A,
lda,
ipiv,
)
}
}
impl UnmqrType for Complex32 {
unsafe fn unmqr(
handle: RocblasHandle,
side: rocblas_ffi::rocblas_side,
trans: rocblas_ffi::rocblas_operation,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
C: *mut Self,
ldc: i32,
) -> RocblasStatus {
bindings::rocsolver_cunmqr(
cast_handle(handle),
side,
trans,
m,
n,
k,
A,
lda,
ipiv,
C,
ldc,
)
}
}
impl UngqrType for Complex64 {
unsafe fn ungqr(
handle: RocblasHandle,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
) -> RocblasStatus {
bindings::rocsolver_zungqr(
cast_handle(handle),
m,
n,
k,
A,
lda,
ipiv,
)
}
}
impl UnmqrType for Complex64 {
unsafe fn unmqr(
handle: RocblasHandle,
side: rocblas_ffi::rocblas_side,
trans: rocblas_ffi::rocblas_operation,
m: i32,
n: i32,
k: i32,
A: *mut Self,
lda: i32,
ipiv: *mut Self,
C: *mut Self,
ldc: i32,
) -> RocblasStatus {
bindings::rocsolver_zunmqr(
cast_handle(handle),
side,
trans,
m,
n,
k,
A,
lda,
ipiv,
C,
ldc,
)
}
}
#[inline]
pub fn orgqr<T: OrgqrType>(
handle: &Handle,
m: i32,
n: i32,
k: i32,
A: *mut T,
lda: i32,
ipiv: *mut T,
) -> Result<()> {
let status = unsafe { T::orgqr(handle.as_raw(), m, n, k, A, lda, ipiv) };
Error::from_status(status)
}
#[inline]
pub fn ormqr<T: OrmqrType>(
handle: &Handle,
side: Side,
trans: Operation,
m: i32,
n: i32,
k: i32,
A: *mut T,
lda: i32,
ipiv: *mut T,
C: *mut T,
ldc: i32,
) -> Result<()> {
let status = unsafe {
T::ormqr(
handle.as_raw(),
side.into(),
trans.into(),
m,
n,
k,
A,
lda,
ipiv,
C,
ldc,
)
};
Error::from_status(status)
}
#[inline]
pub fn ungqr<T: UngqrType>(
handle: &Handle,
m: i32,
n: i32,
k: i32,
A: *mut T,
lda: i32,
ipiv: *mut T,
) -> Result<()> {
let status = unsafe { T::ungqr(handle.as_raw(), m, n, k, A, lda, ipiv) };
Error::from_status(status)
}
#[inline]
pub fn unmqr<T: UnmqrType>(
handle: &Handle,
side: Side,
trans: Operation,
m: i32,
n: i32,
k: i32,
A: *mut T,
lda: i32,
ipiv: *mut T,
C: *mut T,
ldc: i32,
) -> Result<()> {
let status = unsafe {
T::unmqr(
handle.as_raw(),
side.into(),
trans.into(),
m,
n,
k,
A,
lda,
ipiv,
C,
ldc,
)
};
Error::from_status(status)
}