1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#!/usr/bin/perl
@data = ( " main.o root.o search.o draw.o hash.o dynamic.o ",
" generate.o see.o move.o movesup.o ",
" eval.o pawnhash.o bitboard.o ",
" command.o script.o input.o vars.o util.o list.o fbsd.o gamelist.o ",
" board.o ics.o san.o fen.o book.o bench.o mersenne.o ",
" piece.o sig.o data.o probe.o egtb.o" );
$num_permutations = factorial(scalar @data);
for ($i = 0; $i < $num_permutations; $i++)
{
open(OBJS, ">_object_files.$i") || die $!;
print OBJS "OBJS=\t\t";
my @permutation = @data[n2perm($i, $#data)];
print OBJS "@permutation\n";
close(OBJS);
system("cp _object_files.$i _objs_");
system("make");
system("cp typhoon typhoon.$i");
}
# Utility function: factorial with memoizing
BEGIN {
my @fact = (1);
sub factorial($) {
my $n = shift;
return $fact[$n] if defined $fact[$n];
$fact[$n] = $n * factorial($n - 1);
}
}
# n2pat($N, $len) : produce the $N-th pattern of length $len
sub n2pat
{
my $i = 1;
my $N = shift;
my $len = shift;
my @pat;
while ($i <= $len + 1) { # Should really be just while ($N) { ...
push @pat, $N % $i;
$N = int($N/$i);
$i++;
}
return @pat;
}
# pat2perm(@pat) : turn pattern returned by n2pat() into
# permutation of integers. XXX: splice is already O(N)
sub pat2perm
{
my @pat = @_;
my @source = (0 .. $#pat);
my @perm;
push @perm, splice(@source, (pop @pat), 1) while @pat;
return @perm;
}
# n2perm($N, $len) : generate the Nth permutation of $len objects
sub n2perm {
pat2perm(n2pat(@_));
}
|