@@ -65,9 +65,12 @@ impl Report for SuccessRateHeatmapReport {
6565 fn get_metadata ( & self , data : & [ ( & ProblemSpec , BenchmarkResults ) ] ) -> ReportMetadata {
6666 let mut all_optimizers = std:: collections:: HashSet :: new ( ) ;
6767 let problem_count = data. len ( ) ;
68+ let mut total_data_points = 0 ;
69+
6870 for ( _, results) in data {
6971 for result in & results. results {
7072 all_optimizers. insert ( result. optimizer_name . clone ( ) ) ;
73+ total_data_points += 1 ;
7174 }
7275 }
7376 let mut metadata = HashMap :: new ( ) ;
@@ -81,8 +84,8 @@ impl Report for SuccessRateHeatmapReport {
8184 report_type : "success_rate_heatmap" . to_string ( ) ,
8285 generated_at : Default :: default ( ) ,
8386 problem_count,
84- optimizer_count : 10 ,
85- data_points : 10 ,
87+ optimizer_count : all_optimizers . len ( ) ,
88+ data_points : total_data_points ,
8689 }
8790 }
8891 fn supported_formats ( & self ) -> Vec < ReportFormat > {
@@ -377,20 +380,13 @@ Quickly identifies which optimizers work on which problem types.
377380pub fn generate_success_rate_heatmap_table_content (
378381 all_results : & [ ( & ProblemSpec , BenchmarkResults ) ] ,
379382) -> anyhow:: Result < String > {
380- // Similar logic as generate_success_rate_heatmap_latex_table but return just the table content
381- let mut all_optimizers = std:: collections:: HashSet :: new ( ) ;
382- let mut all_problems = Vec :: new ( ) ;
383- for ( problem, results) in all_results {
384- all_problems. push ( problem. get_name ( ) ) ;
385- for result in & results. results {
386- all_optimizers. insert ( result. optimizer_name . clone ( ) ) ;
387- }
388- }
389- let mut optimizers: Vec < _ > = all_optimizers. into_iter ( ) . collect ( ) ;
390- optimizers. sort ( ) ;
391- if optimizers. is_empty ( ) || all_problems. is_empty ( ) {
383+ let report = SuccessRateHeatmapReport :: new ( ) ;
384+ let ( optimizers, all_problems) = report. collect_optimizers_and_problems ( all_results) ;
385+
386+ if optimizers. is_empty ( ) || all_problems. is_empty ( ) {
392387 return Ok ( String :: new ( ) ) ;
393388 }
389+
394390 let mut content = format ! (
395391 r#"\begin{{table}}[H]
396392\centering
@@ -412,44 +408,16 @@ pub fn generate_success_rate_heatmap_table_content(
412408 . collect:: <Vec <_>>( )
413409 . join( " " )
414410 ) ;
415- // Same calculation logic as the standalone table
411+
416412 for ( problem, results) in all_results {
417413 let problem_name = problem. get_name ( ) ;
418414 content. push_str ( & format ! (
419415 "\\ textbf{{{}}} " ,
420416 report_generator:: escape_latex( & problem_name)
421417 ) ) ;
422418 for optimizer in & optimizers {
423- let optimizer_results: Vec < _ > = results
424- . results
425- . iter ( )
426- . filter ( |r| r. optimizer_name == * optimizer)
427- . collect ( ) ;
428- let success_rate = if optimizer_results. is_empty ( ) {
429- 0.0
430- } else {
431- let successful = optimizer_results
432- . iter ( )
433- . filter ( |r| r. convergence_achieved )
434- . count ( ) ;
435- successful as f64 / optimizer_results. len ( ) as f64 * 100.0
436- } ;
437- let ( color, text_color) = if success_rate >= 90.0 {
438- ( "green!70" , "black" )
439- } else if success_rate >= 50.0 {
440- ( "yellow!70" , "black" )
441- } else if success_rate >= 10.0 {
442- ( "orange!70" , "black" )
443- } else {
444- ( "red!70" , "white" )
445- } ;
446- let cell_content = if optimizer_results. is_empty ( ) {
447- "& \\ cellcolor{gray!30}\\ textcolor{white}{N/A}" . to_string ( )
448- } else {
449- format ! (
450- "& \\ cellcolor{{{color}}}\\ textcolor{{{text_color}}}{{{success_rate:.0}\\ %}}"
451- )
452- } ;
419+ let ( success_rate, has_data) = report. calculate_success_rate ( results, optimizer) ;
420+ let cell_content = report. get_latex_cell_content ( success_rate, has_data) ;
453421 content. push_str ( & cell_content) ;
454422 }
455423 content. push_str ( " \\ \\ \n " ) ;
@@ -476,21 +444,13 @@ pub fn generate_success_rate_heatmap_latex_table(
476444 all_results : & [ ( & ProblemSpec , BenchmarkResults ) ] ,
477445 latex_dir : & Path ,
478446) -> anyhow:: Result < ( ) > {
479- // Collect all optimizers and problems
480- let mut all_optimizers = std:: collections:: HashSet :: new ( ) ;
481- let mut all_problems = Vec :: new ( ) ;
482- for ( problem, results) in all_results {
483- all_problems. push ( problem. get_name ( ) ) ;
484- for result in & results. results {
485- all_optimizers. insert ( result. optimizer_name . clone ( ) ) ;
486- }
487- }
488- let mut optimizers: Vec < _ > = all_optimizers. into_iter ( ) . collect ( ) ;
489- optimizers. sort ( ) ;
490- if optimizers. is_empty ( ) || all_problems. is_empty ( ) {
447+ let report = SuccessRateHeatmapReport :: new ( ) ;
448+ let ( optimizers, all_problems) = report. collect_optimizers_and_problems ( all_results) ;
449+
450+ if optimizers. is_empty ( ) || all_problems. is_empty ( ) {
491451 return Ok ( ( ) ) ;
492452 }
493- // Calculate column specification dynamically
453+
494454 let col_spec = format ! ( "l{}" , "c" . repeat( optimizers. len( ) ) ) ;
495455
496456 let mut latex_content = String :: from (
@@ -522,44 +482,16 @@ pub fn generate_success_rate_heatmap_latex_table(
522482 . collect:: <Vec <_>>( )
523483 . join( " " )
524484 ) ) ;
525- // Calculate success rates for each problem-optimizer combination
485+
526486 for ( problem, results) in all_results {
527487 let problem_name = problem. get_name ( ) ;
528488 latex_content. push_str ( & format ! (
529489 "\\ textbf{{{}}} " ,
530490 report_generator:: escape_latex( & problem_name)
531491 ) ) ;
532492 for optimizer in & optimizers {
533- let optimizer_results: Vec < _ > = results
534- . results
535- . iter ( )
536- . filter ( |r| r. optimizer_name == * optimizer)
537- . collect ( ) ;
538- let success_rate = if optimizer_results. is_empty ( ) {
539- 0.0
540- } else {
541- let successful = optimizer_results
542- . iter ( )
543- . filter ( |r| r. convergence_achieved )
544- . count ( ) ;
545- successful as f64 / optimizer_results. len ( ) as f64 * 100.0
546- } ;
547- let ( color, text_color) = if success_rate >= 90.0 {
548- ( "green!70" , "black" )
549- } else if success_rate >= 50.0 {
550- ( "yellow!70" , "black" )
551- } else if success_rate >= 10.0 {
552- ( "orange!70" , "black" )
553- } else {
554- ( "red!70" , "white" )
555- } ;
556- let cell_content = if optimizer_results. is_empty ( ) {
557- "& \\ cellcolor{gray!30}\\ textcolor{white}{N/A}" . to_string ( )
558- } else {
559- format ! (
560- "& \\ cellcolor{{{color}}}\\ textcolor{{{text_color}}}{{{success_rate:.0}\\ %}}"
561- )
562- } ;
493+ let ( success_rate, has_data) = report. calculate_success_rate ( results, optimizer) ;
494+ let cell_content = report. get_latex_cell_content ( success_rate, has_data) ;
563495 latex_content. push_str ( & cell_content) ;
564496 }
565497 latex_content. push_str ( " \\ \\ \n " ) ;
@@ -601,4 +533,4 @@ mod tests {
601533 let report = SuccessRateHeatmapReport :: new ( ) ;
602534 UnifiedReportTestSuite :: test_report ( & report) . unwrap ( ) ;
603535 }
604- }
536+ }
0 commit comments