Add ratio comparison menu action

This commit is contained in:
2026-07-22 00:16:24 +02:00
parent 955cc0a0e4
commit a2bd19b6e2
2 changed files with 94 additions and 3 deletions
+93 -3
View File
@@ -308,6 +308,94 @@ my %handlers = (
0, @entries );
},
'11b. Compare to Baseline' => sub {
my $baseline = Util::select_experiment(0);
my @selected_experiments = Util::select_experiment(1);
# TODO: Fails silently if not every selected experiment has this datafile
my $resultsdata_csv =
Util::pick_data_file( "$local_archive_dir/$baseline", "resultsdata" );
my %all_results;
foreach my $experiment ( $baseline, @selected_experiments ) {
my $data = Text::CSV_XS::csv(
in => "$local_archive_dir/$experiment/$resultsdata_csv",
headers => 'auto'
);
foreach my $row (@$data) {
$all_results{$experiment}{ $row->{benchmark} }
{ $row->{resulttype} } = $row->{faults};
}
}
my @benchs = ( 'ip', 'mem', 'regs' );
my @markers = (
'OK_MARKER', 'FAIL_MARKER',
'DETECTED_MARKER', 'TIMEOUT',
'TRAP', 'WRITE_TEXTSEGMENT',
'ACCESS_OUTERSPACE', 'GROUP1_MARKER'
);
my $heading = sprintf( "%5s %20s %50s ", "BENCH", "TYPE", $baseline );
my $subheading = sprintf( "%5s %20s %50s ",
"", "", Util::read_experiment_info($baseline) );
foreach my $experiment (@selected_experiments) {
$heading .= sprintf( "%50s ", $experiment );
$subheading .=
sprintf( "%50s ", Util::read_experiment_info($experiment) );
}
my @entries = ( $heading, $subheading, "" );
foreach my $benchmark (@benchs) {
foreach my $marker (@markers) {
my $entry = sprintf( "%5s %20s ", $benchmark, $marker );
if ( exists $all_results{$baseline}{$benchmark}{$marker} ) {
$entry .= sprintf(
"%50s ",
Util::format_number_sep(
$all_results{$baseline}{$benchmark}{$marker}
)
);
}
else {
$entry .= sprintf( "%50s ", "" );
}
foreach my $experiment (@selected_experiments) {
if ( exists $all_results{$baseline}{$benchmark}{$marker}
and
exists $all_results{$experiment}{$benchmark}{$marker}
and $all_results{$baseline}{$benchmark}{$marker} != 0 )
{
my $factor =
$all_results{$experiment}{$benchmark}{$marker} /
$all_results{$baseline}{$benchmark}{$marker};
$entry .=
sprintf( "%50s ", sprintf( "%.2fx", $factor ) );
}
else {
$entry .= sprintf( "%50s ", "" );
}
}
push @entries, $entry;
}
push @entries, "";
}
TUI::select_from_list(
"Baseline: $baseline — Comparing "
. scalar(@selected_experiments)
. " Experiments",
0, @entries
);
},
'12. Open Experiment in BinaryNinja' => sub {
my @selected_experiments = Util::select_experiment(1);
my @paths =
@@ -487,7 +575,8 @@ my %handlers = (
# Need to know which chart uses which datafile
my @faults_charts = grep { /heatmap|scatter|sankey/ } @selected_charts;
my @resultsdata_charts =
grep { /result$|combined_comparison/ } @selected_charts;
grep { /result$|combined_comparison|ratio_comparison|ratio_correlation/ }
@selected_charts;
my $faults_csv;
my $resultsdata_csv;
@@ -519,7 +608,8 @@ my %handlers = (
}
}
my @combined_charts = grep { /combined/ } @selected_charts;
my @combined_charts =
grep { /combined|ratio_comparison|ratio_correlation/ } @selected_charts;
my $print_experiments = join " ", @selected_experiments;
my @path_experiments =
map { "$local_archive_dir/$_" } @selected_experiments;
@@ -531,7 +621,7 @@ my %handlers = (
if defined $faults_csv && $chart =~ /heatmap|scatter|sankey/;
push @r_args, $resultsdata_csv
if defined $resultsdata_csv
&& $chart =~ /result$|combined_comparison/;
&& $chart =~ /result$|combined_comparison|ratio_comparison|ratio_correlation/;
system(@r_args);
}
},