@@ -17,6 +17,42 @@ use crate::dimension::IntoDimension;
1717
1818const PRINT_ELEMENTS_LIMIT : Ix = 3 ;
1919
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+
2056fn format_array < A , S , D , F > ( view : & ArrayBase < S , D > ,
2157 f : & mut fmt:: Formatter ,
2258 mut format : F ,
@@ -30,12 +66,7 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
3066 return format ( view. iter ( ) . next ( ) . unwrap ( ) , f)
3167 }
3268
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) ;
3970
4071 let ndim = view. ndim ( ) ;
4172 let nth_idx_max = view. shape ( ) [ ndim-1 ] ;
@@ -46,9 +77,6 @@ fn format_array<A, S, D, F>(view: &ArrayBase<S, D>,
4677 Some ( ix) => ix,
4778 } ;
4879 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 ;
5280 // Shows if ellipses for horizontal split were printed.
5381 let mut printed_ellipses_h = vec ! [ false ; ndim] ;
5482 // 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>,
5886 // as cues for when to add []'s and how many to add.
5987 for ( index, elt) in view. indexed_iter ( ) {
6088 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 ( ) {
7597 no_rows_after_skip_yet = true ;
7698 }
7799
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 {
101109 write ! ( f, "{}" , "]" . repeat( n) ) ?;
102110 writeln ! ( f, "," ) ?;
103- write ! ( f, "{}" , " " . repeat( ax + 1 ) ) ?;
104- writeln ! ( f, "...," ) ?;
105- printed_ellipses_h[ ax] = true ;
106111 }
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 ;
110123 }
124+ last_index = index. clone ( ) ;
111125 }
112126
113127 if skip_row_for_axis. is_none ( ) {
114- let mut print_elt = true ;
115128 let nth_idx_op = index. slice ( ) . iter ( ) . last ( ) ;
116129 if overflow_axes. contains ( & ( ndim - 1 ) ) {
117130 let nth_idx_val = nth_idx_op. unwrap ( ) ;
118131 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 {
121133 write ! ( f, ", ..." ) ?;
122- printed_ellipses_v = true ;
123134 }
135+ continue ;
124136 }
125137 }
126138
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, ", " ) ?;
133141 }
134- }
135-
136- if update_index {
137- last_index = index;
142+ format ( elt, f) ?;
138143 }
139144 }
140145 write ! ( f, "{}" , "]" . repeat( ndim) ) ?;
0 commit comments