Algorithm-Networksort
view release on metacpan or search on metacpan
lib/Algorithm/Networksort.pm view on Meta::CPAN
#
# Show a sorting network formatted by group (using _dflt_formatted() above).
#
sub _stringify
{
my $self = shift;
my @grouped = $self->group();
my $string = "[";
for my $grp (@grouped)
{
$string .= $self->_dflt_formatted($grp) . "\n";
}
substr($string, -2) = ']'; # Overwrite the trailing ",\n".
return $string;
}
=head3 formatted()
$string = $nw->formatted();
Returns a formatted string that represents the list of comparators.
If no formats have been provided via the L<formats()> method, the default
format will be used: an array of arrays as represented in Perl.
Likewise, the network sorting pairs are zero-based. If you want the
pairs written out for some sequence other than 0, 1, 2, ... then you can
provide that using L<inputs_base()>.
B<Example 0: you want a string in the default format.>
print $nw->formatted();
B<Example 1: you want the output to look like the default format, but
one-based instead of zero-based.>
$nw->index_base([1..$inputs]);
print $nw->formatted();
B<Example 2: you want a simple list of SWAP macros.>
$nw->formats([ "SWAP(%d, %d);\n" ]);
print $nw->formatted();
B<Example 3: as with example 2, but the SWAP values need to be one-based instead of zero-based.>
$nw->index_base([1..$inputs]);
$nw->formats([ "SWAP(%d, %d);\n" ]);
print $nw->formatted();
B<Example 4: you want a series of comparison and swap statements.>
$nw->formats([ "if (v[%d] < v[%d]) then\n",
" exchange(v, %d, %d)\nend if\n" ]);
print $nw->formatted();
B<Example 5: you want the default format to use letters, not numbers.>
$nw->index_base( [('a'..'z')[0..$inputs]] );
$nw->formats([ "[%s,%s]," ]); # Note that we're using the string flag.
my $string = '[' . $nw->formatted();
substr($string, -1, 1) = ']'; # Overwrite the trailing comma.
print $string, "\n";
=cut
sub formatted
{
my $self = shift;
my $network = $self->network();
my $string = '';
#
# Got comparators?
##### $network
#
if (scalar @$network == 0)
{
carp "No network to format.\n";
return "";
}
#
# Got formats?
# If not, produce a single string with no ending newline.
#
my(@formats) = $self->formats? @{ $self->formats() }: ();
unless (scalar @formats)
{
$string = $self->_dflt_formatted($network);
chop $string; # Remove trailing comma
return '[' . $string . ']';
}
my $index_base = $self->index_base();
for my $cmptr (@$network)
{
@$cmptr = @$index_base[@$cmptr] if (defined $index_base);
for my $fmt (@formats)
{
$string .= sprintf($fmt, @$cmptr);
}
}
return $string;
}
=head3 group()
Takes the comparator list and returns a list of comparator lists, each
sub-list representing a group of comparators that can be operate without
interfering with each other, depending on what is needed for
interference-free grouping.
There is one option available, 'grouping', that will produce a grouping
( run in 2.239 seconds using v1.01-cache-2.11-cpan-524268b4103 )