Skip to content

Commit ce582c2

Browse files
committed
wip
1 parent 3dfdbca commit ce582c2

3 files changed

Lines changed: 36 additions & 105 deletions

File tree

process_results_tex.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ while IFS= read -r -d '' tex_file; do
3939
# Use pdflatex to compile TeX to PDF
4040
# Run in the directory containing the TeX file to handle relative paths
4141
pushd "$tex_dir"
42-
pdflatex -interaction=nonstopmode "${base_name}.tex" > /dev/null 2>&1
43-
pdflatex -interaction=nonstopmode "${base_name}.tex" > /dev/null 2>&1
42+
pdflatex -interaction=nonstopmode "${base_name}.tex" > /dev/null 2>&1 && pdflatex -interaction=nonstopmode "${base_name}.tex" > /dev/null 2>&1
4443
if [ $? -eq 0 ]; then
4544
log "Successfully converted: $tex_file -> $output_file"
4645
# Clean up auxiliary files created by pdflatex

src/experiment_runner/reports/comparison_matrix.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub fn generate_comparison_matrix_latex_table(
4848
"#,
4949
);
5050
// Calculate column specification dynamically
51-
let col_spec = format!("l{}", "c".repeat(non_qqn_optimizers.len()));
51+
let col_spec = format!("l{}", "c".repeat(qqn_optimizers.len()));
5252

5353
latex_content.push_str(&format!(
5454
r#"\begin{{table}}[htbp]
@@ -58,10 +58,10 @@ pub fn generate_comparison_matrix_latex_table(
5858
\adjustbox{{width=\textwidth,center}}{{
5959
\begin{{tabular}}{{{col_spec}}}
6060
\toprule
61-
\textbf{{QQN Optimizer}} {}\\
61+
\textbf{{Non-QQN Optimizer}} {}\\
6262
\midrule
6363
"#,
64-
non_qqn_optimizers
64+
qqn_optimizers
6565
.iter()
6666
.map(|opt| format!("& \\textbf{{{}}}", report_generator::escape_latex_safe(opt)))
6767
.collect::<Vec<_>>()
@@ -80,12 +80,12 @@ pub fn generate_comparison_matrix_latex_table(
8080
.push(result);
8181
}
8282
}
83-
for qqn_opt in &qqn_optimizers {
83+
for non_qqn_opt in &non_qqn_optimizers {
8484
latex_content.push_str(&format!(
8585
"\\textbf{{{}}} ",
86-
report_generator::escape_latex_safe(qqn_opt)
86+
report_generator::escape_latex_safe(non_qqn_opt)
8787
));
88-
for non_qqn_opt in &non_qqn_optimizers {
88+
for qqn_opt in &qqn_optimizers {
8989
let mut wins = 0;
9090
let mut losses = 0;
9191
let mut ties = 0;
@@ -194,11 +194,11 @@ pub fn generate_comparison_matrix_table_content(
194194
\adjustbox{{width=\textwidth,center}}{{
195195
\begin{{tabular}}{{l{}}}
196196
\toprule
197-
\textbf{{QQN Optimizer}} {}\\
197+
\textbf{{Non-QQN Optimizer}} {}\\
198198
\midrule
199199
"#,
200-
"c".repeat(non_qqn_optimizers.len()),
201-
non_qqn_optimizers
200+
"c".repeat(qqn_optimizers.len()),
201+
qqn_optimizers
202202
.iter()
203203
.map(|opt| format!("& \\textbf{{{}}}", report_generator::escape_latex(opt)))
204204
.collect::<Vec<_>>()
@@ -217,12 +217,12 @@ pub fn generate_comparison_matrix_table_content(
217217
.push(result);
218218
}
219219
}
220-
for qqn_opt in &qqn_optimizers {
220+
for non_qqn_opt in &non_qqn_optimizers {
221221
content.push_str(&format!(
222222
"\\textbf{{{}}} ",
223-
report_generator::escape_latex(qqn_opt)
223+
report_generator::escape_latex(non_qqn_opt)
224224
));
225-
for non_qqn_opt in &non_qqn_optimizers {
225+
for qqn_opt in &qqn_optimizers {
226226
let mut wins = 0;
227227
let mut losses = 0;
228228
let mut ties = 0;
@@ -570,4 +570,4 @@ pub fn generate_family_comparison_matrix_latex_table(
570570
latex_path.display()
571571
);
572572
Ok(())
573-
}
573+
}

src/experiment_runner/reports/heatmap.rs

Lines changed: 22 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
377380
pub 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

Comments
 (0)