@@ -17,6 +17,42 @@ use crate::dimension::IntoDimension;
17
17
18
18
const PRINT_ELEMENTS_LIMIT : Ix = 3 ;
19
19
20
+ fn get_overflow_axes ( shape : & [ Ix ] , limit : usize ) -> Vec < usize > {
21
+ shape. iter ( )
22
+ . enumerate ( )
23
+ . rev ( )
24
+ . filter ( |( _, axis_size) | * * axis_size > 2 * limit)
25
+ . map ( |( axis, _) | axis)
26
+ . collect ( )
27
+ }
28
+
29
+ fn get_highest_axis_to_skip ( overflow_axes : & Vec < usize > ,
30
+ shape : & [ Ix ] ,
31
+ index : & [ Ix ] ,
32
+ limit : & usize ) -> Option < usize > {
33
+ overflow_axes. iter ( )
34
+ . filter ( |axis| {
35
+ if * * axis == shape. len ( ) - 1 {
36
+ return false
37
+ } ;
38
+ let sa_idx_max = shape. iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
39
+ let sa_idx_val = index. iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
40
+ sa_idx_val >= limit && sa_idx_val < & ( sa_idx_max - limit)
41
+ } )
42
+ . min ( )
43
+ . map ( |v| * v)
44
+ }
45
+
46
+ fn get_highest_changed_axis ( index : & [ Ix ] , prev_index : & [ Ix ] ) -> Option < usize > {
47
+ index. iter ( )
48
+ . take ( index. len ( ) - 1 )
49
+ . zip ( prev_index. iter ( ) )
50
+ . enumerate ( )
51
+ . filter ( |( _, ( a, b) ) | a != b)
52
+ . map ( |( i, _) | i)
53
+ . next ( )
54
+ }
55
+
20
56
fn format_array < A , S , D , F > ( view : & ArrayBase < S , D > ,
21
57
f : & mut fmt:: Formatter ,
22
58
mut format : F ,
@@ -30,12 +66,7 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
30
66
return format ( view. iter ( ) . next ( ) . unwrap ( ) , f)
31
67
}
32
68
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 ( ) ;
69
+ let overflow_axes: Vec < Ix > = get_overflow_axes ( view. shape ( ) , limit) ;
39
70
40
71
let ndim = view. ndim ( ) ;
41
72
let nth_idx_max = view. shape ( ) [ ndim-1 ] ;
@@ -46,9 +77,6 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
46
77
Some ( ix) => ix,
47
78
} ;
48
79
write ! ( f, "{}" , "[" . repeat( ndim) ) ?;
49
- let mut first = true ;
50
- // Shows if ellipses for vertical split were printed.
51
- let mut printed_ellipses_v = false ;
52
80
// Shows if ellipses for horizontal split were printed.
53
81
let mut printed_ellipses_h = vec ! [ false ; ndim] ;
54
82
// Shows if the row was printed for the first time after horizontal split.
@@ -58,83 +86,60 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
58
86
// as cues for when to add []'s and how many to add.
59
87
for ( index, elt) in view. indexed_iter ( ) {
60
88
let index = index. into_dimension ( ) ;
61
- let mut update_index = false ;
62
-
63
- let skip_row_for_axis = overflow_axes. iter ( )
64
- . filter ( |axis| {
65
- if * * axis == ndim - 1 {
66
- return false
67
- } ;
68
- let sa_idx_max = view. shape ( ) . iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
69
- let sa_idx_val = index. slice ( ) . iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
70
- sa_idx_val >= & limit && sa_idx_val < & ( sa_idx_max - & limit)
71
- } )
72
- . min ( )
73
- . map ( |v| * v) ;
74
- if let Some ( _) = skip_row_for_axis {
89
+
90
+ let skip_row_for_axis = get_highest_axis_to_skip (
91
+ & overflow_axes,
92
+ view. shape ( ) ,
93
+ index. slice ( ) ,
94
+ & limit
95
+ ) ;
96
+ if skip_row_for_axis. is_some ( ) {
75
97
no_rows_after_skip_yet = true ;
76
98
}
77
99
78
- for ( i, ( a, b) ) in index. slice ( )
79
- . iter ( )
80
- . take ( ndim-1 )
81
- . zip ( last_index. slice ( ) . iter ( ) )
82
- . enumerate ( ) {
83
- if a != b {
84
- printed_ellipses_h. iter_mut ( ) . skip ( i + 1 ) . for_each ( |e| { * e = false ; } ) ;
85
-
86
- if skip_row_for_axis. is_none ( ) {
87
- printed_ellipses_v = false ;
88
- // New row.
89
- // # of ['s needed
90
- let n = ndim - i - 1 ;
91
- if !no_rows_after_skip_yet {
92
- write ! ( f, "{}" , "]" . repeat( n) ) ?;
93
- writeln ! ( f, "," ) ?;
94
- }
95
- no_rows_after_skip_yet = false ;
96
- write ! ( f, "{}" , " " . repeat( ndim - n) ) ?;
97
- write ! ( f, "{}" , "[" . repeat( n) ) ?;
98
- } else if !printed_ellipses_h[ skip_row_for_axis. unwrap ( ) ] {
99
- let ax = skip_row_for_axis. unwrap ( ) ;
100
- let n = ndim - i - 1 ;
100
+ let max_changed_idx = get_highest_changed_axis ( index. slice ( ) , last_index. slice ( ) ) ;
101
+ if let Some ( i) = max_changed_idx {
102
+ printed_ellipses_h. iter_mut ( ) . skip ( i + 1 ) . for_each ( |e| { * e = false ; } ) ;
103
+
104
+ if skip_row_for_axis. is_none ( ) {
105
+ // New row.
106
+ // # of ['s needed
107
+ let n = ndim - i - 1 ;
108
+ if !no_rows_after_skip_yet {
101
109
write ! ( f, "{}" , "]" . repeat( n) ) ?;
102
110
writeln ! ( f, "," ) ?;
103
- write ! ( f, "{}" , " " . repeat( ax + 1 ) ) ?;
104
- writeln ! ( f, "...," ) ?;
105
- printed_ellipses_h[ ax] = true ;
106
111
}
107
- first = true ;
108
- update_index = true ;
109
- break ;
112
+ no_rows_after_skip_yet = false ;
113
+ write ! ( f, "{}" , " " . repeat( ndim - n) ) ?;
114
+ write ! ( f, "{}" , "[" . repeat( n) ) ?;
115
+ } else if !printed_ellipses_h[ skip_row_for_axis. unwrap ( ) ] {
116
+ let ax = skip_row_for_axis. unwrap ( ) ;
117
+ let n = ndim - i - 1 ;
118
+ write ! ( f, "{}" , "]" . repeat( n) ) ?;
119
+ writeln ! ( f, "," ) ?;
120
+ write ! ( f, "{}" , " " . repeat( ax + 1 ) ) ?;
121
+ writeln ! ( f, "...," ) ?;
122
+ printed_ellipses_h[ ax] = true ;
110
123
}
124
+ last_index = index. clone ( ) ;
111
125
}
112
126
113
127
if skip_row_for_axis. is_none ( ) {
114
- let mut print_elt = true ;
115
128
let nth_idx_op = index. slice ( ) . iter ( ) . last ( ) ;
116
129
if overflow_axes. contains ( & ( ndim - 1 ) ) {
117
130
let nth_idx_val = nth_idx_op. unwrap ( ) ;
118
131
if nth_idx_val >= & limit && nth_idx_val < & ( nth_idx_max - & limit) {
119
- print_elt = false ;
120
- if !printed_ellipses_v {
132
+ if nth_idx_val == & limit {
121
133
write ! ( f, ", ..." ) ?;
122
- printed_ellipses_v = true ;
123
134
}
135
+ continue ;
124
136
}
125
137
}
126
138
127
- if print_elt {
128
- if !first {
129
- write ! ( f, ", " ) ?;
130
- }
131
- first = false ;
132
- format ( elt, f) ?;
139
+ if max_changed_idx. is_none ( ) && !index. slice ( ) . iter ( ) . all ( |x| * x == 0 ) {
140
+ write ! ( f, ", " ) ?;
133
141
}
134
- }
135
-
136
- if update_index {
137
- last_index = index;
142
+ format ( elt, f) ?;
138
143
}
139
144
}
140
145
write ! ( f, "{}" , "]" . repeat( ndim) ) ?;
0 commit comments