1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use crate::prelude_dev::*;
impl<S> TensorBase<S, Ix2> {
pub fn nrow(&self) -> usize {
self.shape()[0]
}
pub fn ncol(&self) -> usize {
self.shape()[1]
}
/// Leading dimension in row-major order case.
///
/// This function will not return any value if the layout is not row-major.
pub fn ld_row(&self) -> Option<usize> {
if !self.c_prefer() {
// leading dimension is only defined if not c-prefer
return None;
} else if self.shape()[0] == 1 {
// col-vector, leading dimension must be larger than dimension of col
return Some(self.shape()[1]);
} else {
// usual definition that leading dimension is stride of row
return Some(self.stride()[0] as usize);
}
}
/// Leading dimension in column-major order case.
///
/// This function will not return any value if the layout is not
/// column-major.
pub fn ld_col(&self) -> Option<usize> {
if !self.f_prefer() {
// leading dimension is only defined if not f-prefer
return None;
} else if self.shape()[1] == 1 {
// row-vector, leading dimension must be larger than dimension of row
return Some(self.shape()[0]);
} else {
// usual definition that leading dimension is stride of col
return Some(self.stride()[1] as usize);
}
}
/// Leading dimension by order.
pub fn ld(&self, order: FlagOrder) -> Option<usize> {
match order {
ColMajor => self.ld_col(),
RowMajor => self.ld_row(),
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn playground() {
let l = Layout::new([6, 1], [100, 10], 0).unwrap();
println!("{:?}", l.f_prefer());
println!("{:?}", l.c_prefer());
println!("{l:?}");
}
}