Skip to content

Commit 1b5da67

Browse files
author
andrei.papou
committed
All the PR issues are fixed. Tests are needed.
1 parent 2a8a7c7 commit 1b5da67

File tree

1 file changed

+40
-123
lines changed

1 file changed

+40
-123
lines changed

src/arrayformat.rs

Lines changed: 40 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
// option. This file may not be copied, modified, or distributed
77
// except according to those terms.
88
use std::fmt;
9-
use std::slice::Iter;
109
use super::{
1110
ArrayBase,
1211
Data,
@@ -16,63 +15,8 @@ use super::{
1615
};
1716
use crate::dimension::IntoDimension;
1817

19-
#[derive(Debug, PartialEq)]
20-
enum ArrayDisplayMode {
21-
// Array is small enough to be printed without omitting any values.
22-
Full,
23-
// Omit central values of the nth axis.
24-
OmitV,
25-
// Omit central values of certain axes (but not the last one).
26-
// Vector is guaranteed to be non-empty.
27-
OmitH(Vec<Ix>),
28-
// Both `OmitV` and `OmitH` hold.
29-
OmitBoth(Vec<Ix>),
30-
}
31-
3218
const PRINT_ELEMENTS_LIMIT: Ix = 2;
3319

34-
impl ArrayDisplayMode {
35-
36-
fn from_shape(shape: &[Ix], limit: Ix) -> ArrayDisplayMode {
37-
let last_dim = match shape.len().checked_sub(1) {
38-
Some(v) => v,
39-
None => {
40-
return ArrayDisplayMode::Full;
41-
}
42-
};
43-
44-
let last_axis_ovf = shape[last_dim] >= 2 * limit + 1;
45-
let mut overflow_axes: Vec<Ix> = Vec::with_capacity(shape.len());
46-
for (axis, axis_size) in shape.iter().enumerate().rev() {
47-
if axis == last_dim {
48-
continue;
49-
}
50-
if *axis_size >= 2 * limit + 1 {
51-
overflow_axes.push(axis);
52-
}
53-
}
54-
55-
if !overflow_axes.is_empty() && last_axis_ovf {
56-
ArrayDisplayMode::OmitBoth(overflow_axes)
57-
} else if !overflow_axes.is_empty() {
58-
ArrayDisplayMode::OmitH(overflow_axes)
59-
} else if last_axis_ovf {
60-
ArrayDisplayMode::OmitV
61-
} else {
62-
ArrayDisplayMode::Full
63-
}
64-
}
65-
66-
fn h_axes_iter(&self) -> Option<Iter<Ix>> {
67-
match self {
68-
ArrayDisplayMode::OmitH(v) | ArrayDisplayMode::OmitBoth(v) => {
69-
Some(v.iter())
70-
},
71-
_ => None
72-
}
73-
}
74-
}
75-
7620
fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
7721
f: &mut fmt::Formatter,
7822
mut format: F,
@@ -81,19 +25,27 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
8125
D: Dimension,
8226
S: Data<Elem=A>,
8327
{
84-
let display_mode = ArrayDisplayMode::from_shape(view.shape(), limit);
28+
if view.shape().is_empty() {
29+
// Handle weird 0-dimensional array case first
30+
return writeln!(f, "[]")
31+
}
32+
33+
let overflow_axes: Vec<Ix> = view.shape().iter()
34+
.enumerate()
35+
.rev()
36+
.filter(|(_, axis_size)| **axis_size > 2 * limit)
37+
.map(|(axis, _)| axis)
38+
.collect();
8539

8640
let ndim = view.dim().into_dimension().slice().len();
87-
let nth_idx_max = if ndim > 0 { Some(view.shape().iter().last().unwrap()) } else { None };
41+
let nth_idx_max = view.shape().iter().last().unwrap();
8842

8943
// None will be an empty iter.
9044
let mut last_index = match view.dim().into_dimension().first_index() {
9145
None => view.dim().into_dimension().clone(),
9246
Some(ix) => ix,
9347
};
94-
for _ in 0..ndim {
95-
write!(f, "[")?;
96-
}
48+
write!(f, "{}", "[".repeat(ndim))?;
9749
let mut first = true;
9850
// Shows if ellipses for vertical split were printed.
9951
let mut printed_ellipses_v = false;
@@ -109,18 +61,17 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
10961
let take_n = if ndim == 0 { 1 } else { ndim - 1 };
11062
let mut update_index = false;
11163

112-
let skip_row_for_axis = match display_mode.h_axes_iter() {
113-
Some(iter) => {
114-
iter.filter(|axis| {
115-
let sa_idx_max = view.shape().iter().skip(**axis).next().unwrap();
116-
let sa_idx_val = index.slice().iter().skip(**axis).next().unwrap();
117-
sa_idx_val >= &limit && sa_idx_val < &(sa_idx_max - &limit)
118-
})
119-
.min()
120-
.map(|v| *v)
121-
},
122-
None => None
123-
};
64+
let skip_row_for_axis = overflow_axes.iter()
65+
.filter(|axis| {
66+
if **axis == ndim - 1 {
67+
return false
68+
};
69+
let sa_idx_max = view.shape().iter().skip(**axis).next().unwrap();
70+
let sa_idx_val = index.slice().iter().skip(**axis).next().unwrap();
71+
sa_idx_val >= &limit && sa_idx_val < &(sa_idx_max - &limit)
72+
})
73+
.min()
74+
.map(|v| *v);
12475
if let Some(_) = skip_row_for_axis {
12576
no_rows_after_skip_yet = true;
12677
}
@@ -139,31 +90,19 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
13990
// # of ['s needed
14091
let n = ndim - i - 1;
14192
if !no_rows_after_skip_yet {
142-
for _ in 0..n {
143-
write!(f, "]")?;
144-
}
145-
write!(f, ",")?;
146-
write!(f, "\n")?;
93+
write!(f, "{}", "]".repeat(n))?;
94+
writeln!(f, ",")?;
14795
}
14896
no_rows_after_skip_yet = false;
149-
for _ in 0..ndim - n {
150-
write!(f, " ")?;
151-
}
152-
for _ in 0..n {
153-
write!(f, "[")?;
154-
}
97+
write!(f, "{}", " ".repeat(ndim - n))?;
98+
write!(f, "{}", "[".repeat(n))?;
15599
} else if !printed_ellipses_h[skip_row_for_axis.unwrap()] {
156100
let ax = skip_row_for_axis.unwrap();
157101
let n = ndim - i - 1;
158-
for _ in 0..n {
159-
write!(f, "]")?;
160-
}
161-
write!(f, ",")?;
162-
write!(f, "\n")?;
163-
for _ in 0..(ax + 1) {
164-
write!(f, " ")?;
165-
}
166-
write!(f, "...,\n")?;
102+
write!(f, "{}", "]".repeat(n))?;
103+
writeln!(f, ",")?;
104+
write!(f, "{}", " ".repeat(ax + 1))?;
105+
writeln!(f, "...,")?;
167106
printed_ellipses_h[ax] = true;
168107
}
169108
first = true;
@@ -175,18 +114,15 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
175114
if skip_row_for_axis.is_none() {
176115
let mut print_elt = true;
177116
let nth_idx_op = index.slice().iter().last();
178-
match display_mode {
179-
ArrayDisplayMode::OmitV | ArrayDisplayMode::OmitBoth(_) => {
180-
let nth_idx_val = nth_idx_op.unwrap();
181-
if nth_idx_val >= &limit && nth_idx_val < &(nth_idx_max.unwrap() - &limit) {
182-
print_elt = false;
183-
if !printed_ellipses_v {
184-
write!(f, ", ...")?;
185-
printed_ellipses_v = true;
186-
}
117+
if overflow_axes.contains(&(ndim - 1)) {
118+
let nth_idx_val = nth_idx_op.unwrap();
119+
if nth_idx_val >= &limit && nth_idx_val < &(nth_idx_max - &limit) {
120+
print_elt = false;
121+
if !printed_ellipses_v {
122+
write!(f, ", ...")?;
123+
printed_ellipses_v = true;
187124
}
188125
}
189-
_ => {}
190126
}
191127

192128
if print_elt {
@@ -202,9 +138,7 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
202138
last_index = index;
203139
}
204140
}
205-
for _ in 0..ndim {
206-
write!(f, "]")?;
207-
}
141+
write!(f, "{}", "]".repeat(ndim))?;
208142
Ok(())
209143
}
210144

@@ -356,20 +290,3 @@ impl<'a, A: fmt::Binary, S, D: Dimension> fmt::Binary for ArrayBase<S, D>
356290
format_array(self, f, <_>::fmt)
357291
}
358292
}
359-
360-
#[cfg(test)]
361-
mod format_tests {
362-
use super::*;
363-
364-
#[test]
365-
fn test_array_display_mode_from_shape() {
366-
let mode = ArrayDisplayMode::from_shape(&[4, 4], 2);
367-
assert_eq!(mode, ArrayDisplayMode::Full);
368-
369-
let mode = ArrayDisplayMode::from_shape(&[3, 6], 2);
370-
assert_eq!(mode, ArrayDisplayMode::OmitV);
371-
372-
let mode = ArrayDisplayMode::from_shape(&[5, 6, 3], 2);
373-
assert_eq!(mode, ArrayDisplayMode::OmitH(vec![1, 0]));
374-
}
375-
}

0 commit comments

Comments
 (0)