(
slf: &Bound<'_, PyArray<N, D>>,
)
| 1419 | |
| 1420 | #[cfg(feature = "nalgebra")] |
| 1421 | fn try_as_matrix_shape_strides<N, D, R, C, RStride, CStride>( |
| 1422 | slf: &Bound<'_, PyArray<N, D>>, |
| 1423 | ) -> Option<((R, C), (RStride, CStride))> |
| 1424 | where |
| 1425 | N: nalgebra::Scalar + Element, |
| 1426 | D: Dimension, |
| 1427 | R: nalgebra::Dim, |
| 1428 | C: nalgebra::Dim, |
| 1429 | RStride: nalgebra::Dim, |
| 1430 | CStride: nalgebra::Dim, |
| 1431 | { |
| 1432 | let ndim = slf.ndim(); |
| 1433 | let shape = slf.shape(); |
| 1434 | let strides = slf.strides(); |
| 1435 | |
| 1436 | if ndim != 1 && ndim != 2 { |
| 1437 | return None; |
| 1438 | } |
| 1439 | |
| 1440 | if strides.iter().any(|strides| *strides < 0) { |
| 1441 | return None; |
| 1442 | } |
| 1443 | |
| 1444 | let rows = shape[0]; |
| 1445 | let cols = *shape.get(1).unwrap_or(&1); |
| 1446 | |
| 1447 | if R::try_to_usize().map(|expected| rows == expected) == Some(false) { |
| 1448 | return None; |
| 1449 | } |
| 1450 | |
| 1451 | if C::try_to_usize().map(|expected| cols == expected) == Some(false) { |
| 1452 | return None; |
| 1453 | } |
| 1454 | |
| 1455 | let row_stride = strides[0] as usize / mem::size_of::<N>(); |
| 1456 | let col_stride = strides |
| 1457 | .get(1) |
| 1458 | .map_or(rows, |stride| *stride as usize / mem::size_of::<N>()); |
| 1459 | |
| 1460 | if RStride::try_to_usize().map(|expected| row_stride == expected) == Some(false) { |
| 1461 | return None; |
| 1462 | } |
| 1463 | |
| 1464 | if CStride::try_to_usize().map(|expected| col_stride == expected) == Some(false) { |
| 1465 | return None; |
| 1466 | } |
| 1467 | |
| 1468 | let shape = (R::from_usize(rows), C::from_usize(cols)); |
| 1469 | |
| 1470 | let strides = ( |
| 1471 | RStride::from_usize(row_stride), |
| 1472 | CStride::from_usize(col_stride), |
| 1473 | ); |
| 1474 | |
| 1475 | Some((shape, strides)) |
| 1476 | } |
| 1477 | |
| 1478 | impl<'py, T, D> PyArrayMethods<'py, T, D> for Bound<'py, PyArray<T, D>> { |
no test coverage detected