view release on metacpan or search on metacpan
Makefile.PL view on Meta::CPAN
PREREQ_PM => {
'common::sense' => 0,
'Getopt::Long' => 0,
'Math::Combinatorics' => 0,
## Assumes default when there is no best to be batcher, changed to this in 1.30
'Algorithm::Networksort' => 1.30,
},
LIBS => [],
DEFINE => '',
LICENSE => 'perl',
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
#ifndef IVSIZE
# ifdef LONGSIZE
# define IVSIZE LONGSIZE
# else
# define IVSIZE 4 /* A bold guess, but the best we can make. */
# endif
#endif
#ifndef UVTYPE
# define UVTYPE unsigned IVTYPE
#endif
#ifndef PERL_MAGIC_ext
# define PERL_MAGIC_ext '~'
#endif
/* That's the best we can do... */
#ifndef sv_catpvn_nomg
# define sv_catpvn_nomg sv_catpvn
#endif
#ifndef sv_catsv_nomg
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/Pair/Best2.pm view on Meta::CPAN
# initial items as passed to us
for (my $idx = 0; $idx < @w_idxs; $idx += 2) {
$score += $self->get_score($w_idxs[$idx], $w_idxs[$idx + 1]);
}
# pair this window
($score, @w_idxs) = $self->_r_best(0, $score, @w_idxs);
### my $combs = 1;
### map { $combs *= (2 * $_ - 1) } (1 .. @w_idxs / 2);
### print scalar keys %all, ' combinations';
### print " (should be $combs)" if ($combs != scalar keys %all);
lib/Algorithm/Pair/Best2.pm view on Meta::CPAN
}
return wantarray ? @results : \@results;
}
# find best pairing of @idxs. try the first item in @idxs against every
# other item in the array. after picking the first and the current second
# item, recursively find the best arrangement of all the remaining items.
# the return values are the score followed by the new arrangment.
sub _r_best {
my ($self, $depth, $best_score, @idxs) = @_;
if (@idxs <= 2) {
croak sprintf("%d items left", scalar @idxs) if (@idxs <= 1);
return ($self->get_score(@idxs), @idxs);
}
my @best_trial = @idxs; # copy in case there is no improvement
my ($trial_0, $trial_1, @tail) = @idxs; # working copy
### push @head, $trial_0;
for my $idx (0 .. @idxs - 2) {
### push @head, $trial_1;
### $all{$self->make_key(@head, @tail)} = 0 if (@tail == 2); # collect every combination
# recursively get best pairing for tail
my ($trial_score, @trial_tail) = $self->_r_best($depth + 1, $best_score, @tail);
# add score for top pair
$trial_score += $self->get_score($trial_0, $trial_1); # first pair
### print join(', ', $trial_0, $trial_1, @trial_tail, $self->make_key($trial_0, $trial_1, @trial_tail)), "\n" if ($depth == 0);
### $self->dbg_hash($self->make_key($trial_0, $trial_1, @trial_tail), $trial_score);
if ($trial_score < $best_score) {
# aha! a potential candidate. save it
$best_score = $trial_score;
@best_trial = ($trial_0, $trial_1, @trial_tail);
## printf "%2d %2d Best %8.5f idxs %s\n",
## $depth,
## $idx,
## $best_score,
## $self->print_items(@best_trial) if ($depth < 2);
}
else {
## printf "%2d %2d Not best %8.5f idxs %s\n",
## $depth,
## $idx,
## $trial_score,
## $self->print_items($trial_0, $trial_1, @trial_tail) if ($depth < 2);
}
lib/Algorithm/Pair/Best2.pm view on Meta::CPAN
push @tail, $trial_1; # add second item to end of tail
$trial_1 = shift @tail; # move third item into second slot
### pop @head;
}
### pop @head;
### my $key = $self->make_key(@best_trial);
### print "best: $key = $best_score\n" if ($depth == 0);
return ($best_score, @best_trial);
}
1;
__END__
lib/Algorithm/Pair/Best2.pm view on Meta::CPAN
items to the list of items (i.e: players) to be paired. The final list
must contain an even number of items or B<pick>ing the pairs will throw an
exception.
Algorithm::Pair::Best2-E<gt>B<pick> explores all combinations of items and
returns the pairing list with the best (lowest) score. This can be an
expensive proposition - the number of combinations goes up very fast with
respect to the number of items:
items combinations
2 1 (1)
lib/Algorithm/Pair/Best2.pm view on Meta::CPAN
$pair->pick($window);
The list should be at least partially sorted so that reasonable
pairing candidates are within the 'sliding window' of each other.
Otherwise the final results may not be globally 'best', but only
locally good. For (e.g.) a tournament, sorting by rank is sufficient.
Here's how a window value of 5 works: the best list for items 1
through 10 (5 pairs) is found. Save the pairing for the top two items
and then slide the window down to pair items 2 through 12. Save the
top pairing from this result and slide down again to items 4 through
14. Keep sliding the window down until we reach the last 10 items
(which are completed in one iteration). In this way, a large number
lib/Algorithm/Pair/Best2.pm view on Meta::CPAN
or reference. They will be passed (a pair at a time) to the B<scoreSub>
callback.
=item @new_pairs = $pair-E<gt>B<pick> ( ?$window? )
Returns the best pairing found using the sliding window technique as
discussed in DESCRIPTION above. B<window> is the number of pairs in the
sliding window. If no B<window> argument is passed, the B<window> selected
in the B<new>, or the default value is used.
B<pick> returns the list (or a reference to the list in scalar context) of
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/Pair/Swiss.pm view on Meta::CPAN
}
}
=item @pairs = $pairer-E<gt>B<pairs>
Returns the best pairings found as a list of arrayref's, each containing
one pair of parties.
=cut
sub pairs {
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/QuineMcCluskey.pm view on Meta::CPAN
return [ reverse sort @prefix ] unless (keys %primes);
#
# Find a term (there may be more than one) that has the least
# number of prime implicants covering it, and a list of those
# prime implicants. Use that list to figure out the best set
# to cover the rest of the terms.
#
##### recurse_solve() Primes after loop
##### primes: "\n" . chart(\%primes, $self->width)
#
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/RabinKarp.pm view on Meta::CPAN
The results of this hash encodes information about the next k values in
the stream (hense k-gram.) This means for any given stream of length n
integer values (or characters), you will get back n - k + 1 hash
values.
For best results, you will want to create a code generator that filters
your data to remove all unnecessary information. For example, in a large
english document, you should probably remove all white space, as well
as removing all capitalization.
=head1 INTENT
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
view all matches for this distribution
view release on metacpan or search on metacpan
CODE_OF_CONDUCT.md view on Meta::CPAN
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/RectanglesContainingDot.pm view on Meta::CPAN
$div = $div->[(($dir eq 'x') ? ($x <= $div->[3]) : ($y <= $div->[3])) ? 1 : 2];
}
}
sub _find_best_div {
my ($dr, $rects, $off) = @_;
my @v0 = map { @{$rects}[$_*4+$off] } @$dr;
my @v1 = map { @{$rects}[$_*4+2+$off] } @$dr;
@v0 = sort { $a <=> $b } @v0;
@v1 = sort { $a <=> $b } @v1;
my $med = 0.5 * @$dr;
my $op = 0;
my $cl = 0;
my $best = @$dr * @$dr;
my $bestv;
# my ($bestop, $bestcl);
while (@v0 and @v1) {
my $v = ($v0[0] <= $v1[0]) ? $v0[0] : $v1[0];
while (@v0 and $v0[0] == $v) {
$op++;
shift @v0;
lib/Algorithm/RectanglesContainingDot.pm view on Meta::CPAN
my $l = $op - $med;
my $r = @$dr - $cl - $med;
my $good = $l * $l + $r * $r;
#{ no warnings; print STDERR "med: $med, op: $op, cl: $cl, good: $good, best: $best, bestv: $bestv\n"; }
if ($good < $best) {
$best = $good;
$bestv = $v;
# $bestop = $op;
# $bestcl = $cl;
}
}
# print "off: $off, best: $best, bestv: $bestv, bestop: $bestop, bestcl: $bestcl, size-bestcl: ".(@$dr-$bestcl)."\n";
return ($best, $bestv);
}
sub _divide_rects {
my ($div, $rects) = @_;
my $dr = $div->[4];
return $div->[0] = 'n' if (@$dr <= $MIN_DIV);
my $bestreq = 0.24 * @$dr * @$dr;
my ($bestx, $bestxx) = _find_best_div($dr, $rects, 0);
my ($besty, $bestyy) = ($bestx == 0) ? 1 : _find_best_div($dr, $rects, 1);
# print "bestx: $bestx, bestxx: $bestxx, besty: $besty, bestyy: $bestyy, bestreq: $bestreq\n";
if ($bestx < $besty) {
if ($bestx < $bestreq) {
@{$div}[1,2] = _part_rects($dr, $rects, $bestxx, 0);
$div->[3] = $bestxx;
pop @$div;
return $div->[0] = 'x';
}
}
else {
if ($besty < $bestreq) {
@{$div}[1,2] = _part_rects($dr, $rects, $bestyy, 1);
$div->[3] = $bestyy;
pop @$div;
return $div->[0] = 'y';
}
}
return $div->[0] = 'n';
}
sub _part_rects {
my ($dr, $rects, $bestv, $off) = @_;
my (@l, @r);
for (@$dr) {
push @l, $_ if ($bestv >= $rects->[$_ * 4 + $off]);
push @r, $_ if ($bestv < $rects->[$_ * 4 + $off + 2]);
}
# print "off: $off, left: ".scalar(@l).", right: ".scalar(@r)."\n";
return ([undef, undef, undef, undef, \@l],
[undef, undef, undef, undef, \@r])
}
view all matches for this distribution
view release on metacpan or search on metacpan
RectanglesContainingDot_XS.xs view on Meta::CPAN
return algo->div = div;
}
double
find_best_cut(pTHX_ struct rectangle **rects, int size, int dir,
double *bestv, int *sizel, int *sizer) {
double **v0, **v1, **vc0, **vc1;
double v, med, best;
int op, cl;
int i;
my_assert(bestv);
my_assert(sizel);
my_assert(sizer);
Newy(v0, size + 1, double *);
Newy(v1, size + 1, double *);
RectanglesContainingDot_XS.xs view on Meta::CPAN
sort_inplace(aTHX_ v0, size);
sort_inplace(aTHX_ v1, size);
op = cl = 0;
med = 0.5 * size;
best = (double)size * (double)size;
my_assert(best >= 0);
while (*v0 && *v1) {
double v, good;
double l, r;
RectanglesContainingDot_XS.xs view on Meta::CPAN
r = size - cl - med;
good = (double)l * (double)l + (double)r * (double)r;
my_assert(good >= 0);
if (good < best) {
best = good;
*bestv = v;
*sizel = op;
*sizer = size - cl;
}
}
Safefry(vc0);
Safefry(vc1);
return best;
}
void
part_division(pTHX_ struct rectangle **rects, int size,
double cut, int dir,
RectanglesContainingDot_XS.xs view on Meta::CPAN
my_assert(div);
size = div->size;
if (size > MIN_DIVISION) {
struct rectangle **rects = div->rects;
double bestreq = 0.24 * size * size;
double bestx, bestxx, besty, bestyy;
int sizelx, sizerx, sizely, sizery;
bestx = find_best_cut(aTHX_ rects, size, 'x', &bestxx, &sizelx, &sizerx);
if (bestx > 0)
besty = find_best_cut(aTHX_ rects, size, 'y', &bestyy, &sizely, &sizery);
else
besty = 1;
if (bestx < besty) {
if (bestx < bestreq) {
// fprintf(stderr, "bestx: %f, bestreq: %f\n", bestx, bestreq);
part_division(aTHX_ rects, size, bestxx, 'x', &(div->left), sizelx, &(div->right), sizerx);
div->cut = bestxx;
Safefry(div->rects);
div->rects = NULL;
return div->dir = 'x';
}
}
else {
if (besty < bestreq) {
// fprintf(stderr, "besty: %f, bestreq: %f\n", besty, bestreq);
part_division(aTHX_ rects, size, bestyy, 'y', &(div->left), sizely, &(div->right), sizery);
div->cut = bestyy;
Safefry(div->rects);
div->rects = NULL;
return div->dir = 'y';
}
}
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
-------
If you find a bug, please report it to the author along with the
following information:
* version of Perl (output of 'perl -V' is best)
* version of Algorithm::SVM
* operating system type and version
* exact text of error message or description of problem
* example model files/data being classified
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/SVMLight.pm view on Meta::CPAN
-- http://svmlight.joachims.org/
=back
Support Vector Machines in general, and SVMLight specifically,
represent some of the best-performing Machine Learning approaches in
domains such as text categorization, image recognition, bioinformatics
string processing, and others.
For efficiency reasons, the underlying SVMLight engine indexes features by integers, not
strings. Since features are commonly thought of by name (e.g. the
lib/Algorithm/SVMLight.pm view on Meta::CPAN
=item predict(attributes => \%y)
After C<train()> has been called, the model may be applied to
previously-unseen combinations of attributes. The C<predict()> method
accepts an C<attributes> parameter just like C<add_instance()>, and
returns its best prediction of the label that would apply to the given
attributes. The sign of the returned label (positive or negative)
indicates whether the new instance is considered a positive or
negative instance, and the magnitude of the label corresponds in some
way to the confidence with which the model is making that assertion.
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/SlidingWindow/Dynamic.pm view on Meta::CPAN
sub shortest_subarray_at_least_k {
my ($nums, $k) = @_;
my $w = Algorithm::SlidingWindow::Dynamic->new;
my $sum = 0;
my $best;
for my $x (@$nums) {
die "negative values not supported" if $x < 0;
$w->push($x);
$sum += $x;
while ($w->size > 0 && $sum >= $k) {
my $len = $w->size;
$best = $len if !defined($best) || $len < $best;
my $removed = $w->shift;
$sum -= $removed;
}
}
return defined($best) ? $best : -1;
}
print shortest_subarray_at_least_k([2, 3, 1, 2, 4, 3], 7), "\n"; # prints 2
=head2 Fixed-Length Rolling Window Using slide()
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to humanity, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/SpatialIndex/Strategy/MedianQuadTree.pm view on Meta::CPAN
tree if the distribution of data is very different from uniformity. If in doubt,
benchmark.
=item *
If the data is uniform but inserted in random order, the MQT will at best be
equal in performance to a quad tree.
=item *
Filling a dynamically growing MQT has slightly more overhead than filling a dynamically
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/SpiralSearch.pm view on Meta::CPAN
my $y_inc = $grad_y[1] - $grad_y[0];
my $maximize = $max_or_min =~ /^\s*MIN\s*$/i ? -1 : 1;
my $ret_val = 0;
my $new_ret_val = 0;
my $theta = 0;
my $best_x = 0;
my $best_y = 0;
my $out_of_bounds = 0;
# Increase the radius of the search by the following factor
# if a better function evaluation is not found.
my $rad_inc = 1.2;
lib/Algorithm/SpiralSearch.pm view on Meta::CPAN
} else {
$nrv_ary[$t-1] = 0;
}
}
# Find the best return value and its corresponding input coordinates.
{
my $m = 0;
for (my $i = 0; $i < @nrv_ary; $i++) {
if ($maximize * $nrv_ary[$i] >= $maximize * $m) {
$best_x = $x[$i];
$best_y = $y[$i];
$m = $nrv_ary[$i];
}
}
}
return($best_x, $best_y);
}
1;
__END__
view all matches for this distribution
view release on metacpan or search on metacpan
#ifndef IVSIZE
# ifdef LONGSIZE
# define IVSIZE LONGSIZE
# else
# define IVSIZE 4 /* A bold guess, but the best we can make. */
# endif
#endif
#ifndef UVTYPE
# define UVTYPE unsigned IVTYPE
#endif
#ifndef PERL_MAGIC_ext
# define PERL_MAGIC_ext '~'
#endif
/* That's the best we can do... */
#ifndef sv_catpvn_nomg
# define sv_catpvn_nomg sv_catpvn
#endif
#ifndef sv_catsv_nomg
view all matches for this distribution
view release on metacpan or search on metacpan
#ifndef IVSIZE
# ifdef LONGSIZE
# define IVSIZE LONGSIZE
# else
# define IVSIZE 4 /* A bold guess, but the best we can make. */
# endif
#endif
#ifndef UVTYPE
# define UVTYPE unsigned IVTYPE
#endif
#ifndef PERL_MAGIC_ext
# define PERL_MAGIC_ext '~'
#endif
/* That's the best we can do... */
#ifndef sv_catpvn_nomg
# define sv_catpvn_nomg sv_catpvn
#endif
#ifndef sv_catsv_nomg
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/TicketClusterer.pm view on Meta::CPAN
When this parameter is set, the module prints out information regarding what columns
of the spreadsheet it is extracting information from, the headers for those columns,
the index of the column that contains the textual content of the tickets, and of the
column that contains the unique integer identifier for each ticket. If you are
dealing with spreadsheets with a large number of tickets, it is best to pipe the
output of the module into a file to see the debugging information.
=item I<debug2:>
When this parameter is set, you will see how WordNet is being utilized to generate
lib/Algorithm/TicketClusterer.pm view on Meta::CPAN
=back
=head1 HOW THE MATCHING TICKETS ARE RETRIEVED
It is the method C<retrieve_similar_tickets_with_vsm()> that returns the best ticket
matches for a given query ticket. What this method returns is a hash reference; the
keys in this hash are the integer IDs of the matching tickets and the values the
cosine similarity distance between the query ticket and the matching tickets. The
number of matching tickets returned by C<retrieve_similar_tickets_with_vsm()> is set
by the constructor parameter C<how_many_retrievals>. Note that
lib/Algorithm/TicketClusterer.pm view on Meta::CPAN
By a production-quality tool, I mean a software package that you can I<actually> use
in a production environment for automated or semi-automated ticket routing in your
organization. I am assuming you already have the tools in place that insert in
real-time the new tickets in an Excel spreadsheet.
Turning this module into a production tool will require that you find the best values
to use for the following three parameters that are needed by the constructor: (1)
C<min_idf_threshold> for the minimum C<idf> value for the words in a query ticket in
order for them to be considered for matching with the other tickets; (2)
C<min_word_length> for discarding words that are too short; and (3)
C<max_num_syn_words> for how many synonyms to retain for a word if the number of
synonyms returned by WordNet is too large. In addition, you must also come up with a
misspelled-words file that is appropriate to your application domain and a stop-words
file.
In order to find the best values to use for the parameters that are mentioned above,
I suggest creating a graphical front-end for this module that would allow for
altering the values of the three parameters listed above in response to the
prevailing mis-routing rates for the tickets. The front-end will display to an
operator the latest ticket that needs to be routed and a small set of the
best-matching previously routed tickets as returned by this module. Used either in a
fully-automated mode or a semi-automated mode, this front-end would contain a
feedback recorder that would keep track of mis-routed tickets --- the mis-routed
tickets would presumably bounce back to the central operator monitoring the
front-end. The front-end display could be equipped with slider controls for altering
the values used for the three parameters. Obviously, as a parameter is changed, some
view all matches for this distribution
view release on metacpan or search on metacpan
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
view all matches for this distribution
view release on metacpan or search on metacpan
lib/Algorithm/Toy/HashSC.pm view on Meta::CPAN
=head1 BUGS
=head2 Reporting Bugs
Bugs, patches, and whatnot might best be applied towards:
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Algorithm-Toy-HashSC>
L<https://github.com/thrig/Algorithm-Toy-HashSC>
view all matches for this distribution