@@ -42,7 +42,7 @@ fn sub_cycle<'a>(c: &[&'a str], i: usize, j: usize) -> Vec<&'a str> {
4242
4343pub ( crate ) fn minimize_cycle < ' a > (
4444 graph : & HashMap < String , HashSet < String > > ,
45- cycle : Vec < & ' a str > ,
45+ cycle : & [ & ' a str ] ,
4646) -> Vec < & ' a str > {
4747 // all the None cases can be simplified with a base case of
4848 // embiggen = (-1, 0, cycle.len())
@@ -63,8 +63,8 @@ pub(crate) fn minimize_cycle<'a>(
6363 }
6464 }
6565 match emsmallen {
66- Some ( ( i, j, _) ) => sub_cycle ( & cycle, i, j) ,
67- None => cycle,
66+ Some ( ( i, j, _) ) => sub_cycle ( cycle, i, j) ,
67+ None => cycle. to_vec ( ) ,
6868 }
6969}
7070pub ( crate ) fn minimize_cycles ( cycles_results_file : String ) {
@@ -74,26 +74,28 @@ pub(crate) fn minimize_cycles(cycles_results_file: String) {
7474 fs:: read_to_string ( cycles_results_file) . expect ( "Should have been able to read the file" ) ;
7575 let mut cycles = contents
7676 . split ( "\n " )
77- . filter_map ( |l| l. find ( " -> " ) . map ( |_| l. split ( " -> " ) . collect ( ) ) )
77+ . filter_map ( |l| {
78+ // pylint's format is
79+ // file_name:lno:cno: R0401: Cyclic import(<cycle details>) (cyclic-import)
80+ l. find ( " -> " ) . map ( |_| {
81+ l. split ( "(" )
82+ . nth ( 1 )
83+ . unwrap ( )
84+ . split ( ")" )
85+ . next ( )
86+ . unwrap ( )
87+ . split ( " -> " )
88+ . collect ( )
89+ } )
90+ } )
7891 . collect :: < Vec < Vec < & str > > > ( ) ;
7992
80- println ! ( "Pre-minimization" ) ;
81- println ! ( "# cycles : {}" , cycles. len( ) ) ;
82- println ! (
83- "total cycle length: {}" ,
84- cycles. iter( ) . map( |c| c. len( ) ) . sum:: <usize >( )
85- ) ;
86-
87- println ! (
88- "longest cycle : {}" ,
89- cycles. iter( ) . map( |c| c. len( ) ) . max( ) . unwrap( )
90- ) ;
9193 // sort cycles by length, since larger cycles are likelier to be minimized, and this
9294 // makes it easier to grok the results and logs
9395 cycles. sort_by_key ( |a| a. len ( ) ) ;
9496
9597 let mut minimal_cycles = Vec :: < Vec < & str > > :: new ( ) ;
96- for cycle in cycles {
98+ for cycle in & cycles {
9799 minimal_cycles. push ( minimize_cycle ( & graph, cycle) ) ;
98100 }
99101
@@ -103,7 +105,19 @@ pub(crate) fn minimize_cycles(cycles_results_file: String) {
103105 println ! ( "{}" , cycle. join( " -> " ) ) ;
104106 }
105107
106- println ! ( "\n Post-minimization" ) ;
108+ println ! ( ) ;
109+ println ! ( "Pre-minimization" ) ;
110+ println ! ( "# cycles : {}" , cycles. len( ) ) ;
111+ println ! (
112+ "total cycle length: {}" ,
113+ cycles. iter( ) . map( |c| c. len( ) ) . sum:: <usize >( )
114+ ) ;
115+ println ! (
116+ "longest cycle : {}" ,
117+ cycles. iter( ) . map( |c| c. len( ) ) . max( ) . unwrap( )
118+ ) ;
119+ println ! ( ) ;
120+ println ! ( "Post-minimization" ) ;
107121 println ! ( "# cycles : {}" , unique_minimal_cycles. len( ) ) ;
108122 println ! (
109123 "total cycle length: {}" ,
@@ -172,16 +186,16 @@ mod tests {
172186 fn test_minimize_cycle_simple ( ) {
173187 let graph = HashMap :: from ( [ ( "b" . to_string ( ) , HashSet :: from ( [ "a" . to_string ( ) ] ) ) ] ) ;
174188 // unchanged cycle
175- assert_eq ! ( minimize_cycle( & graph, vec! [ "j" , "k" , "l" ] ) , [ "j" , "k" , "l" ] ) ;
176- assert_eq ! ( minimize_cycle( & graph, vec! [ "a" , "j" , "b" ] ) , [ "a" , "j" , "b" ] ) ;
189+ assert_eq ! ( minimize_cycle( & graph, & [ "j" , "k" , "l" ] ) , [ "j" , "k" , "l" ] ) ;
190+ assert_eq ! ( minimize_cycle( & graph, & [ "a" , "j" , "b" ] ) , [ "a" , "j" , "b" ] ) ;
177191 // should shortcut
178- assert_eq ! ( minimize_cycle( & graph, vec! [ "a" , "b" , "c" ] ) , [ "a" , "b" ] ) ;
192+ assert_eq ! ( minimize_cycle( & graph, & [ "a" , "b" , "c" ] ) , [ "a" , "b" ] ) ;
179193 assert_eq ! (
180- minimize_cycle( & graph, vec! [ "b" , "c" , "e" , "a" , "d" ] ) ,
194+ minimize_cycle( & graph, & [ "b" , "c" , "e" , "a" , "d" ] ) ,
181195 [ "a" , "d" , "b" ]
182196 ) ;
183197 // should get contained cycle
184- assert_eq ! ( minimize_cycle( & graph, vec! [ "c" , "a" , "b" , "d" ] ) , [ "a" , "b" ] ) ;
198+ assert_eq ! ( minimize_cycle( & graph, & [ "c" , "a" , "b" , "d" ] ) , [ "a" , "b" ] ) ;
185199
186200 // these have multiple options, and should find the best one
187201 }
@@ -201,32 +215,32 @@ mod tests {
201215 ] ) ;
202216 // three shortcuts: j -> a (cuts 3), b -> a (cuts 1)
203217 assert_eq ! (
204- minimize_cycle( & graph, vec! [ "a" , "j" , "k" , "b" , "l" ] ) ,
218+ minimize_cycle( & graph, & [ "a" , "j" , "k" , "b" , "l" ] ) ,
205219 [ "a" , "j" ]
206220 ) ;
207221 // two shortcuts: k -> j (cuts 1), n -> l (cuts 2)
208222 assert_eq ! (
209- minimize_cycle( & graph, vec! [ "a" , "k" , "m" , "n" , "b1" , "b2" , "l" ] ) ,
223+ minimize_cycle( & graph, & [ "a" , "k" , "m" , "n" , "b1" , "b2" , "l" ] ) ,
210224 [ "a" , "k" , "m" , "n" , "l" ]
211225 ) ;
212226 // two contained cycles: l -> r -> j, and a -> b
213227 assert_eq ! (
214- minimize_cycle( & graph, vec! [ "q" , "d" , "l" , "r" , "j" , "a" , "b" ] ) ,
228+ minimize_cycle( & graph, & [ "q" , "d" , "l" , "r" , "j" , "a" , "b" ] ) ,
215229 [ "a" , "b" ]
216230 ) ;
217231 // two contained cycles: l -> j, and a -> r -> b
218232 assert_eq ! (
219- minimize_cycle( & graph, vec! [ "q" , "d" , "l" , "j" , "a" , "r" , "b" ] ) ,
233+ minimize_cycle( & graph, & [ "q" , "d" , "l" , "j" , "a" , "r" , "b" ] ) ,
220234 [ "j" , "l" ]
221235 ) ;
222236 // one shortcut: q -> a (cuts 6), one contained cycle: l -> l1 -> l2 -> j (cuts 2)
223237 assert_eq ! (
224- minimize_cycle( & graph, vec! [ "a" , "q" , "b" , "l" , "l1" , "l2" , "j" ] ) ,
238+ minimize_cycle( & graph, & [ "a" , "q" , "b" , "l" , "l1" , "l2" , "j" ] ) ,
225239 [ "a" , "q" , "b" ]
226240 ) ;
227241 // one shortcut: q -> a (cuts 3), one contained cycle: l -> l1 -> j (cuts 4)
228242 assert_eq ! (
229- minimize_cycle( & graph, vec! [ "a" , "q1" , "q" , "b" , "l" , "l1" , "j" ] ) ,
243+ minimize_cycle( & graph, & [ "a" , "q1" , "q" , "b" , "l" , "l1" , "j" ] ) ,
230244 [ "j" , "l" , "l1" ]
231245 ) ;
232246 }
0 commit comments