@@ -42,7 +42,7 @@ fn sub_cycle<'a>(c: &[&'a str], i: usize, j: usize) -> Vec<&'a str> {
42
42
43
43
pub ( crate ) fn minimize_cycle < ' a > (
44
44
graph : & HashMap < String , HashSet < String > > ,
45
- cycle : Vec < & ' a str > ,
45
+ cycle : & [ & ' a str ] ,
46
46
) -> Vec < & ' a str > {
47
47
// all the None cases can be simplified with a base case of
48
48
// embiggen = (-1, 0, cycle.len())
@@ -63,8 +63,8 @@ pub(crate) fn minimize_cycle<'a>(
63
63
}
64
64
}
65
65
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 ( ) ,
68
68
}
69
69
}
70
70
pub ( crate ) fn minimize_cycles ( cycles_results_file : String ) {
@@ -74,26 +74,28 @@ pub(crate) fn minimize_cycles(cycles_results_file: String) {
74
74
fs:: read_to_string ( cycles_results_file) . expect ( "Should have been able to read the file" ) ;
75
75
let mut cycles = contents
76
76
. 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
+ } )
78
91
. collect :: < Vec < Vec < & str > > > ( ) ;
79
92
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
- ) ;
91
93
// sort cycles by length, since larger cycles are likelier to be minimized, and this
92
94
// makes it easier to grok the results and logs
93
95
cycles. sort_by_key ( |a| a. len ( ) ) ;
94
96
95
97
let mut minimal_cycles = Vec :: < Vec < & str > > :: new ( ) ;
96
- for cycle in cycles {
98
+ for cycle in & cycles {
97
99
minimal_cycles. push ( minimize_cycle ( & graph, cycle) ) ;
98
100
}
99
101
@@ -103,7 +105,19 @@ pub(crate) fn minimize_cycles(cycles_results_file: String) {
103
105
println ! ( "{}" , cycle. join( " -> " ) ) ;
104
106
}
105
107
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" ) ;
107
121
println ! ( "# cycles : {}" , unique_minimal_cycles. len( ) ) ;
108
122
println ! (
109
123
"total cycle length: {}" ,
@@ -172,16 +186,16 @@ mod tests {
172
186
fn test_minimize_cycle_simple ( ) {
173
187
let graph = HashMap :: from ( [ ( "b" . to_string ( ) , HashSet :: from ( [ "a" . to_string ( ) ] ) ) ] ) ;
174
188
// 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" ] ) ;
177
191
// 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" ] ) ;
179
193
assert_eq ! (
180
- minimize_cycle( & graph, vec! [ "b" , "c" , "e" , "a" , "d" ] ) ,
194
+ minimize_cycle( & graph, & [ "b" , "c" , "e" , "a" , "d" ] ) ,
181
195
[ "a" , "d" , "b" ]
182
196
) ;
183
197
// 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" ] ) ;
185
199
186
200
// these have multiple options, and should find the best one
187
201
}
@@ -201,32 +215,32 @@ mod tests {
201
215
] ) ;
202
216
// three shortcuts: j -> a (cuts 3), b -> a (cuts 1)
203
217
assert_eq ! (
204
- minimize_cycle( & graph, vec! [ "a" , "j" , "k" , "b" , "l" ] ) ,
218
+ minimize_cycle( & graph, & [ "a" , "j" , "k" , "b" , "l" ] ) ,
205
219
[ "a" , "j" ]
206
220
) ;
207
221
// two shortcuts: k -> j (cuts 1), n -> l (cuts 2)
208
222
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" ] ) ,
210
224
[ "a" , "k" , "m" , "n" , "l" ]
211
225
) ;
212
226
// two contained cycles: l -> r -> j, and a -> b
213
227
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" ] ) ,
215
229
[ "a" , "b" ]
216
230
) ;
217
231
// two contained cycles: l -> j, and a -> r -> b
218
232
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" ] ) ,
220
234
[ "j" , "l" ]
221
235
) ;
222
236
// one shortcut: q -> a (cuts 6), one contained cycle: l -> l1 -> l2 -> j (cuts 2)
223
237
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" ] ) ,
225
239
[ "a" , "q" , "b" ]
226
240
) ;
227
241
// one shortcut: q -> a (cuts 3), one contained cycle: l -> l1 -> j (cuts 4)
228
242
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" ] ) ,
230
244
[ "j" , "l" , "l1" ]
231
245
) ;
232
246
}
0 commit comments