use crate::prelude_dev::*;
use core::ffi::c_char;
use rstsr_cblas_base::*;
use serde::{Deserialize, Serialize};
pub trait ChangeableDefault {
unsafe fn change_default(val: Self);
fn get_default() -> Self;
}
macro_rules! impl_changeable_default {
($struct:ty, $val:ident, $default:expr) => {
static mut $val: $struct = $default;
impl ChangeableDefault for $struct {
unsafe fn change_default(val: Self) {
$val = val;
}
fn get_default() -> Self {
return unsafe { $val };
}
}
impl Default for $struct
where
Self: ChangeableDefault,
{
fn default() -> Self {
<$struct>::get_default()
}
}
};
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FlagOrder {
#[serde(rename = "RowMajor")]
C = 101,
#[serde(rename = "ColMajor")]
F = 102,
}
#[allow(non_upper_case_globals)]
impl FlagOrder {
pub const RowMajor: Self = FlagOrder::C;
pub const ColMajor: Self = FlagOrder::F;
}
#[allow(clippy::derivable_impls)]
impl Default for FlagOrder {
fn default() -> Self {
if cfg!(feature = "col_major") {
return FlagOrder::F;
} else {
return FlagOrder::C;
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TensorIterOrder {
#[serde(rename = "RowMajor")]
C,
#[serde(rename = "ColMajor")]
F,
#[serde(rename = "Auto")]
A,
#[serde(rename = "Greedy")]
K,
#[serde(rename = "GreedyInplace")]
G,
#[serde(rename = "Sequential")]
B,
}
impl_changeable_default!(TensorIterOrder, DEFAULT_TENSOR_ITER_ORDER, TensorIterOrder::K);
pub mod TensorCopyPolicy {
#![allow(non_snake_case)]
pub type FlagCopy = u8;
pub const COPY_NEEDED: FlagCopy = 0;
pub const COPY_TRUE: FlagCopy = 1;
pub const COPY_FALSE: FlagCopy = 2;
pub const COPY_DEFAULT: FlagCopy = COPY_NEEDED;
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FlagTrans {
#[serde(rename = "NoTrans")]
N = 111,
#[serde(rename = "Trans")]
T = 112,
#[serde(rename = "ConjTrans")]
C = 113,
#[serde(rename = "Conj")]
CN = 114,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FlagSide {
#[serde(rename = "Left")]
L = 141,
#[serde(rename = "Right")]
R = 142,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FlagUpLo {
#[serde(rename = "Upper")]
U = 121,
#[serde(rename = "Lower")]
L = 122,
}
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FlagDiag {
#[serde(rename = "NonUnit")]
N = 131,
#[serde(rename = "Unit")]
U = 132,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FlagSymm {
#[serde(rename = "Symmetric")]
Sy,
#[serde(rename = "Hermitian")]
He,
#[serde(rename = "AntiSymmetric")]
Ay,
#[serde(rename = "AntiHermitian")]
Ah,
#[serde(rename = "NonSymmetric")]
N,
}
pub type TensorOrder = FlagOrder;
pub type TensorDiag = FlagDiag;
pub type TensorSide = FlagSide;
pub type TensorUpLo = FlagUpLo;
pub type TensorTrans = FlagTrans;
pub type TensorSymm = FlagSymm;
pub use FlagTrans::C as ConjTrans;
pub use FlagTrans::N as NoTrans;
pub use FlagTrans::T as Trans;
pub use FlagSide::L as Left;
pub use FlagSide::R as Right;
pub use FlagUpLo::L as Lower;
pub use FlagUpLo::U as Upper;
pub use FlagDiag::N as NonUnit;
pub use FlagDiag::U as Unit;
pub use FlagOrder::C as RowMajor;
pub use FlagOrder::F as ColMajor;
impl From<char> for FlagTrans {
fn from(val: char) -> Self {
match val {
'N' | 'n' => FlagTrans::N,
'T' | 't' => FlagTrans::T,
'C' | 'c' => FlagTrans::C,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<FlagTrans> for char {
fn from(val: FlagTrans) -> Self {
match val {
FlagTrans::N => 'N',
FlagTrans::T => 'T',
FlagTrans::C => 'C',
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<FlagTrans> for c_char {
fn from(val: FlagTrans) -> Self {
match val {
FlagTrans::N => b'N' as c_char,
FlagTrans::T => b'T' as c_char,
FlagTrans::C => b'C' as c_char,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<c_char> for FlagTrans {
fn from(val: c_char) -> Self {
match val as u8 {
b'N' => FlagTrans::N,
b'T' => FlagTrans::T,
b'C' => FlagTrans::C,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<CBLAS_TRANSPOSE> for FlagTrans {
fn from(val: CBLAS_TRANSPOSE) -> Self {
match val {
CBLAS_TRANSPOSE::CblasNoTrans => FlagTrans::N,
CBLAS_TRANSPOSE::CblasTrans => FlagTrans::T,
CBLAS_TRANSPOSE::CblasConjTrans => FlagTrans::C,
}
}
}
impl From<FlagTrans> for CBLAS_TRANSPOSE {
fn from(val: FlagTrans) -> Self {
match val {
FlagTrans::N => CBLAS_TRANSPOSE::CblasNoTrans,
FlagTrans::T => CBLAS_TRANSPOSE::CblasTrans,
FlagTrans::C => CBLAS_TRANSPOSE::CblasConjTrans,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<char> for FlagDiag {
fn from(val: char) -> Self {
match val {
'N' | 'n' => FlagDiag::N,
'U' | 'u' => FlagDiag::U,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<FlagDiag> for char {
fn from(val: FlagDiag) -> Self {
match val {
FlagDiag::N => 'N',
FlagDiag::U => 'U',
}
}
}
impl From<FlagDiag> for c_char {
fn from(val: FlagDiag) -> Self {
match val {
FlagDiag::N => b'N' as c_char,
FlagDiag::U => b'U' as c_char,
}
}
}
impl From<c_char> for FlagDiag {
fn from(val: c_char) -> Self {
match val as u8 {
b'N' => FlagDiag::N,
b'U' => FlagDiag::U,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<CBLAS_DIAG> for FlagDiag {
fn from(val: CBLAS_DIAG) -> Self {
match val {
CBLAS_DIAG::CblasNonUnit => FlagDiag::N,
CBLAS_DIAG::CblasUnit => FlagDiag::U,
}
}
}
impl From<FlagDiag> for CBLAS_DIAG {
fn from(val: FlagDiag) -> Self {
match val {
FlagDiag::N => CBLAS_DIAG::CblasNonUnit,
FlagDiag::U => CBLAS_DIAG::CblasUnit,
}
}
}
impl From<char> for FlagSide {
fn from(val: char) -> Self {
match val {
'L' | 'l' => FlagSide::L,
'R' | 'r' => FlagSide::R,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<FlagSide> for char {
fn from(val: FlagSide) -> Self {
match val {
FlagSide::L => 'L',
FlagSide::R => 'R',
}
}
}
impl From<FlagSide> for c_char {
fn from(val: FlagSide) -> Self {
match val {
FlagSide::L => b'L' as c_char,
FlagSide::R => b'R' as c_char,
}
}
}
impl From<c_char> for FlagSide {
fn from(val: c_char) -> Self {
match val as u8 {
b'L' => FlagSide::L,
b'R' => FlagSide::R,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<CBLAS_SIDE> for FlagSide {
fn from(val: CBLAS_SIDE) -> Self {
match val {
CBLAS_SIDE::CblasLeft => FlagSide::L,
CBLAS_SIDE::CblasRight => FlagSide::R,
}
}
}
impl From<FlagSide> for CBLAS_SIDE {
fn from(val: FlagSide) -> Self {
match val {
FlagSide::L => CBLAS_SIDE::CblasLeft,
FlagSide::R => CBLAS_SIDE::CblasRight,
}
}
}
impl From<char> for FlagUpLo {
fn from(val: char) -> Self {
match val {
'U' | 'u' => FlagUpLo::U,
'L' | 'l' => FlagUpLo::L,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<FlagUpLo> for char {
fn from(val: FlagUpLo) -> Self {
match val {
FlagUpLo::U => 'U',
FlagUpLo::L => 'L',
}
}
}
impl From<FlagUpLo> for c_char {
fn from(val: FlagUpLo) -> Self {
match val {
FlagUpLo::U => b'U' as c_char,
FlagUpLo::L => b'L' as c_char,
}
}
}
impl From<c_char> for FlagUpLo {
fn from(val: c_char) -> Self {
match val as u8 {
b'U' => FlagUpLo::U,
b'L' => FlagUpLo::L,
_ => rstsr_invalid!(val).unwrap(),
}
}
}
impl From<CBLAS_UPLO> for FlagUpLo {
fn from(val: CBLAS_UPLO) -> Self {
match val {
CBLAS_UPLO::CblasUpper => FlagUpLo::U,
CBLAS_UPLO::CblasLower => FlagUpLo::L,
}
}
}
impl From<FlagUpLo> for CBLAS_UPLO {
fn from(val: FlagUpLo) -> Self {
match val {
FlagUpLo::U => CBLAS_UPLO::CblasUpper,
FlagUpLo::L => CBLAS_UPLO::CblasLower,
}
}
}
impl From<CBLAS_LAYOUT> for FlagOrder {
fn from(val: CBLAS_LAYOUT) -> Self {
match val {
CBLAS_LAYOUT::CblasRowMajor => FlagOrder::C,
CBLAS_LAYOUT::CblasColMajor => FlagOrder::F,
}
}
}
impl From<FlagOrder> for CBLAS_LAYOUT {
fn from(val: FlagOrder) -> Self {
match val {
FlagOrder::C => CBLAS_LAYOUT::CblasRowMajor,
FlagOrder::F => CBLAS_LAYOUT::CblasColMajor,
}
}
}
impl FlagOrder {
pub fn flip(&self) -> Self {
match self {
FlagOrder::C => FlagOrder::F,
FlagOrder::F => FlagOrder::C,
}
}
}
impl FlagTrans {
pub fn flip(&self, hermi: bool) -> Result<Self> {
match self {
FlagTrans::N => match hermi {
true => Ok(FlagTrans::C),
false => Ok(FlagTrans::T),
},
FlagTrans::T => Ok(FlagTrans::N),
FlagTrans::C => Ok(FlagTrans::N),
_ => rstsr_invalid!(self)?,
}
}
}
impl FlagSide {
pub fn flip(&self) -> Self {
match self {
FlagSide::L => FlagSide::R,
FlagSide::R => FlagSide::L,
}
}
}
impl FlagUpLo {
pub fn flip(&self) -> Self {
match self {
FlagUpLo::U => FlagUpLo::L,
FlagUpLo::L => FlagUpLo::U,
}
}
}