Algorithm-Networksort-Chooser
view release on metacpan or search on metacpan
lib/Algorithm/Networksort/Chooser.pm view on Meta::CPAN
package Algorithm::Networksort::Chooser;
our $VERSION = '0.110';
use common::sense;
use Math::Combinatorics;
sub silence_carps {
local *Algorithm::Networksort::carp = sub {};
shift->();
}
sub build_selection_network {
my ($network, $selection) = @_;
my $pinned = {};
$pinned->{$_} = 1 foreach (@$selection);
my @reversed_network = reverse @$network;
my @reversed_output;
foreach my $comparator (@reversed_network) {
if ($pinned->{$comparator->[0]} || $pinned->{$comparator->[1]}) {
$pinned->{$comparator->[0]} = $pinned->{$comparator->[1]} = 1;
push @reversed_output, $comparator;
}
}
return [ reverse @reversed_output ];
}
sub average_swaps_zero_one {
my ($n, $network) = @_;
my $sum = 0;
my $count = 0;
for my $i (0 .. (2**$n - 1)) {
my $p = [ split //, sprintf("%0${n}b", $i) ];
$count++;
Algorithm::Networksort::nw_sort($network, $p);
my %stats = Algorithm::Networksort::nw_sort_stats();
$sum += $stats{swaps};
}
return $sum / $count;
}
sub average_swaps_permutation {
my ($n, $network) = @_;
my $sum = 0;
my $count = 0;
for my $p (Math::Combinatorics::permute(0 .. ($n-1))) {
$count++;
Algorithm::Networksort::nw_sort($network, $p);
my %stats = Algorithm::Networksort::nw_sort_stats();
$sum += $stats{swaps};
}
return $sum / $count;
}
1;
=encoding utf-8
=head1 NAME
( run in 1.358 second using v1.01-cache-2.11-cpan-d7f47b0818f )