The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use Test::More tests => 252;
use Algorithm::ClusterPoints;

use Data::Dumper;

sub some_partition;

my $out;

for my $dim (2, 3, 5) {
    for my $n (1, 5, 30, 100) {
        my @points = map rand, 1..$n*$dim;
        my $clp = Algorithm::ClusterPoints->new(radius => 1, ordered => 1, minimum_size => 1, dimension => $dim);
        $clp->add_points(@points);
        for my $ir (1, 10, 100) {
            my $r = 1/$ir;
            $clp->radius($r);
            for my $min_size (1, 2, 10) {
                for (1..(($dim-1) || 1)) {
                    $clp->dimensional_groups(some_partition($dim));
                    my @clusters = $clp->clusters_ix;
                    my @bfclusters = $clp->brute_force_clusters_ix;
                    # print STDERR Data::Dumper->Dump([$r, \@clusters, \@bfclusters], [qw(r clusters bfclusters)]);
                    unless (is_deeply(\@clusters, \@bfclusters, "dim: $dim, n: $n, ir: $ir")) {
                        diag "dimensional groups: ". Algorithm::ClusterPoints::_hypercylinder_id($clp->dimensional_groups);
                        unless ($out) {
                            open $out, '> /tmp/acp.out' or next;
                            require Data::Dumper;
                        }
                        print $out Data::Dumper->Dump([$clp, \@bfclusters], [qw($clp $bfc)]);
                    }
                }
            }
        }
    }
}

sub some_partition {
    my $n = shift;
    my @part;
    for my $ix (0..$n-1) {
        push @{$part[(@part+1) * rand] ||= []}, $ix;
    }
    return @part;
}