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 )