summaryrefslogtreecommitdiff
path: root/src/layout.pl
blob: c4fe0f2a7cd9623f0f39141ed6d5d295907cbeae (plain)
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(@_));
}