Code: Select all
your move, robert
go
time limit 0:30.
depth time eval variation (s 2)
1 0:00 -0.221 e5 Nc3 ...
1-> 0:00 -0.221 e5 Nc3 ...
2 0:00 -0.221 e5 Nc3 ...
2-> 0:00 -0.221 e5 Nc3 ...
3 0:00 -0.045 e5 Nf3 Nc6
3-> 0:00 -0.045 e5 Nf3 Nc6
4 0:00 -0.211 e5 Nf3 Nc6 Nc3
4-> 0:00 -0.211 e5 Nf3 Nc6 Nc3
5 0:00 -0.081 e5 Nf3 Nc6 d4 d6
5a 0:00 ++0 d5
5 0:00 -0.026 d5 Nf3 Nc6 Nc3 e5 ...
5-> 0:00 -0.026 d5 Nf3 Nc6 Nc3 e5 ...
6 0:00 -0.170 d5 Nf3 Nc6 d4 Nf6 Nc3
6-> 0:00 -0.170 d5 Nf3 Nc6 d4 Nf6 Nc3
7 0:00 -0.071 d5 Nf3 Nc6 d4 Nf6 Nc3 e6
7a 0:00 ++0 Nf6
7 0:00 -0.030 Nf6 Nf3 d6 Nc3 Nbd7 d4 e5
7-> 0:00 -0.030 Nf6 Nf3 d6 Nc3 Nbd7 d4 e5
8 0:00 -0.066 Nf6 Nf3 Nc6 d4 d5 Nc3 e6 Bf4
8-> 0:00 -0.066 Nf6 Nf3 Nc6 d4 d5 Nc3 e6 Bf4
9 0:01 -0.014 Nf6 Nf3 Nc6 d4 d5 Nc3 e6 Bf4 Bb4
9-> 0:01 -0.014 Nf6 Nf3 Nc6 d4 d5 Nc3 e6 Bf4 Bb4
10 0:03 -0.055 Nf6 Nf3 Nc6 d4 d5 Nc3 e6 Be3 Bb4 Qd3
10-> 0:04 -0.055 Nf6 Nf3 Nc6 d4 d5 Nc3 e6 Be3 Bb4 Qd3
time: 0:04 0:00 1.0p nodes: 3342072 h 9% 85% 80% 829298 nps
my move 1. ... Nf6
time control phase one reached ( 0:30 per move).
clock time was 0:04
your move, robert
1. I got the book code to work. It does not read PGN, PGN didn't exist back then. What it wants is a simple string of SAN moves. then, if there is an alternative to one of those moves in the string, you enter the move number of the alternative and then a string of moves that represent an alternative to that move path. example:
e4 e5 nf3 Nc6 Bb5 a6 Ba4
5 Bc4 Bc5
2 c5 Nf3 e6
Note that the "numbers" are absolute move numbers where the first white move is move 1, the first black move is move 2, etc. Messy, but that's life.
You can just enter a ton of games that look like this:
1 e4 e5 nf3 nc6 etc
1 e4 c5 nf3 d6 etc
and so forth so you could probably produce a workable book input file from a PGN file with some luck. I can't, for the life of me, locate the book input we used. I have no idea why it was not in the source files we found at the Ala supercomputer site, but I have so far not been able to find 'em. So this would be issue 1.
2. the "hs" command changes the hash size but it does not work on modern unix systems. we used the "sbrk()" facility but it does not work. If wanted, someone could use the fortran-90 pointer mechanism to make the hash tables (there are 3, normal hash, king safety and pawn structure) work through pointers rather than using an array.
3. I did not try to figure out the way to get time in fortran. we always had a CPU time component, and I just made it use CPU time everywhere. If someone wants to add elapsed time, cptime.f is where this goes.
4. I thought this version (1991 was the date on the backup so that is probably correct) used the non-recursive null-move (one per path). It doesn't, it uses what we use today, except that it defaults to R=1. But I noticed that I had already added the ability to test R=2, probably because Murray Campbell had written a paper that suggested that R=2 needed more investigation. I tried "nm=2" and it worked just fine, but it won't accept anything larger than 2 unless options.f is modified.
Otherwise, it _seems_ to be working. I compiled it with the free Intel fortran compiler for linux and have run several tests.
I'd like to tar it up and send it to you for you to do with as you wish. Aha, one other note. This version is multiple-cpu capable but it will not work without a few changes. Cray used something called "task common" that was process-specific local data. Normal fortran does not have that. Most modern fortran compilers have the ability to say "this common is local" or "this common is global, all others are local" but I did not try to figure that out. Ditto for starting threads. But the 1991-era DTS code is there, although it was modified quite a bit between 1992-1994 as we began to use more and more CPUs.
Also, the singular extension additions are not present. They were added in 1992, 1993 and into 1994, so those are probably lost unless something else is discovered somewhere else. The listing I sent you appears to match this version although I have made a fair number of changes to make it compile. I did have to tell the compiler to default to integers are 8 bytes, to match the Cray, but that works fine on my core-2.
If you have any questions, feel free. Note there is no documentation although one can look up the commands in options.f, or type "help" for a list. There's lots of things I don't remember. Much of the code is pretty messy. Harry was bad about discovering that part of a function was burning a lot of time, so he would convert that into a new function and then rewrite it in assembly. But it left the pure fortran version looking pretty messy. I can tell you that for every question "why was this done like this?" there is an answer that is based on performance issues on the Cray.
I was quite surprised at the speed. It is nowhere near as fast as crafty, but it can easily hit 500-800K nodes per second, even with all the array-based stuff we did to use vectors on the cray. I can include the cray assembly language parts if you want, although they are essentially useless except for historical analysis.